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

[plc4x] 01/02: Merge branch 'develop' into feature/string_enum_mspec

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

hutcheb pushed a commit to branch feature/string_enum_mspec
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 5857e91b2d2d09002c128b2429378ec5a7c8000e
Merge: 1431989 4b41850
Author: hutcheb <be...@gmail.com>
AuthorDate: Mon Mar 15 05:29:37 2021 -0400

    Merge branch 'develop' into feature/string_enum_mspec

 .editorconfig                                      |     6 +
 .../BaseFreemarkerLanguageTemplateHelper.java      |     1 -
 .../resources/templates/c/data-io-template-c.ftlh  |     2 +-
 .../resources/templates/c/pojo-template-c.ftlh     |    14 +-
 .../language/go/GoLanguageTemplateHelper.java      |    65 +-
 .../resources/templates/go/data-io-template.ftlh   |   312 +-
 .../main/resources/templates/go/enum-template.ftlh |   118 +-
 .../resources/templates/go/model-template.ftlh     |  1149 +-
 .../templates/go/parser-factory-template.ftlh      |    47 +-
 .../templates/go/xml-parser-factory-template.ftlh  |    33 +-
 .../language/java/JavaLanguageTemplateHelper.java  |   146 +-
 .../resources/templates/java/pojo-template.ftlh    |     4 +
 plc4go/Makefile                                    |    95 +
 .../protocols/ads/AdsDiscoverySerializerTest.xml   |   377 +
 .../testing}/protocols/ads/DriverTestsuite.xml     |    14 +-
 .../protocols/ads/ParserSerializerTestsuite.xml    |   414 +
 .../testing/protocols/modbus/DriverTestsuite.xml   |     8 +-
 .../testing/protocols/s7/DriverTestsuite.xml       |     8 +-
 plc4go/cmd/main/drivers/knxnetip_test.go           |   525 -
 plc4go/cmd/main/drivers/modbus_test.go             |   213 -
 .../{modbus_driver_test.go => ads_driver_test.go}  |    13 +-
 ...lizer_test.go => ads_parser_serializer_test.go} |    11 +-
 .../cmd/main/drivers/tests/knx_discovery_test.go   |   613 -
 .../cmd/main/drivers/tests/modbus_driver_test.go   |    10 +-
 .../drivers/tests/modbus_parser_serializer_test.go |     8 +-
 .../{modbus_driver_test.go => s7_driver_test.go}   |    13 +-
 ...alizer_test.go => s7_parser_serializer_test.go} |    11 +-
 .../discovery/hello_world_plc4go_knx_discovery.go  |    99 -
 .../discovery/hello_world_plc4go_knx_discovery.go  |   165 +
 .../hello_world_plc4go_knx_read_group_address.go}  |    35 +-
 .../hello_world_plc4go_knx_subscription.go         |   114 +
 plc4go/examples/read/hello_world_plc4go_read.go    |    10 +-
 plc4go/examples/write/hello_world_plc4go_write.go  |    10 +-
 plc4go/go.mod                                      |     4 +-
 plc4go/go.sum                                      |    21 +-
 .../plc4go/ads/AdsDriver.go}                       |    28 +-
 .../plc4go/ads/AdsFieldHandler.go}                 |    22 +-
 .../internal/plc4go/ads/readwrite/ParserHelper.go  |    67 +
 .../plc4go/ads/readwrite/XmlParserHelper.go        |   113 +
 .../model/AdsAddDeviceNotificationRequest.go       |   335 +
 .../model/AdsAddDeviceNotificationResponse.go      |   195 +
 .../internal/plc4go/ads/readwrite/model/AdsData.go |   448 +
 .../plc4go/ads/readwrite/model/AdsDataType.go      |   702 +
 .../model/AdsDeleteDeviceNotificationRequest.go    |   168 +
 .../model/AdsDeleteDeviceNotificationResponse.go   |   167 +
 .../model/AdsDeviceNotificationRequest.go          |   242 +
 .../model/AdsDeviceNotificationResponse.go         |   139 +
 .../readwrite/model/AdsInvalidRequest.go}          |    91 +-
 .../ads/readwrite/model/AdsInvalidResponse.go      |   139 +
 .../ads/readwrite/model/AdsMultiRequestItem.go     |   209 +
 .../ads/readwrite/model/AdsMultiRequestItemRead.go |   220 +
 .../model/AdsMultiRequestItemReadWrite.go          |   248 +
 .../readwrite/model/AdsMultiRequestItemWrite.go    |   220 +
 .../ads/readwrite/model/AdsNotificationSample.go   |   213 +
 .../readwrite/model/AdsReadDeviceInfoRequest.go    |   139 +
 .../readwrite/model/AdsReadDeviceInfoResponse.go   |   298 +
 .../plc4go/ads/readwrite/model/AdsReadRequest.go   |   224 +
 .../plc4go/ads/readwrite/model/AdsReadResponse.go  |   230 +
 .../ads/readwrite/model/AdsReadStateRequest.go     |   139 +
 .../ads/readwrite/model/AdsReadStateResponse.go    |   223 +
 .../ads/readwrite/model/AdsReadWriteRequest.go     |   335 +
 .../ads/readwrite/model/AdsReadWriteResponse.go    |   230 +
 .../plc4go/ads/readwrite/model/AdsStampHeader.go   |   212 +
 .../plc4go/ads/readwrite/model/AdsStaticHelper.go} |    14 +-
 .../ads/readwrite/model/AdsWriteControlRequest.go  |   259 +
 .../ads/readwrite/model/AdsWriteControlResponse.go |   167 +
 .../plc4go/ads/readwrite/model/AdsWriteRequest.go  |   259 +
 .../readwrite/model/AdsWriteResponse.go}           |    97 +-
 .../plc4go/ads/readwrite/model/AmsNetId.go         |   272 +
 .../plc4go/ads/readwrite/model/AmsPacket.go        |   361 +
 .../readwrite/model/AmsSerialAcknowledgeFrame.go   |   272 +
 .../plc4go/ads/readwrite/model/AmsSerialFrame.go   |   297 +
 .../ads/readwrite/model/AmsSerialResetFrame.go     |   272 +
 .../plc4go/ads/readwrite/model/AmsTCPPacket.go     |   183 +
 .../plc4go/ads/readwrite/model/CommandId.go        |   153 +
 .../plc4go/ads/readwrite/model/DataItem.go         |   339 +
 .../ads/readwrite/model/ReservedIndexGroups.go     |   293 +
 .../plc4go/ads/readwrite/model/ReturnCode.go       |   937 +
 .../internal/plc4go/ads/readwrite/model/State.go   |   376 +
 .../plc4go/bacnetip/readwrite/ParserHelper.go      |   105 +-
 .../plc4go/bacnetip/readwrite/XmlParserHelper.go   |   185 +-
 .../plc4go/bacnetip/readwrite/model/APDU.go        |   437 +-
 .../plc4go/bacnetip/readwrite/model/APDUAbort.go   |   350 +-
 .../bacnetip/readwrite/model/APDUComplexAck.go     |   546 +-
 .../readwrite/model/APDUConfirmedRequest.go        |   708 +-
 .../plc4go/bacnetip/readwrite/model/APDUError.go   |   294 +-
 .../plc4go/bacnetip/readwrite/model/APDUReject.go  |   296 +-
 .../bacnetip/readwrite/model/APDUSegmentAck.go     |   458 +-
 .../bacnetip/readwrite/model/APDUSimpleAck.go      |   296 +-
 .../readwrite/model/APDUUnconfirmedRequest.go      |   240 +-
 .../bacnetip/readwrite/model/ApplicationTag.go     |   240 +-
 .../bacnetip/readwrite/model/BACnetAddress.go      |   243 +-
 .../readwrite/model/BACnetConfirmedServiceACK.go   |   605 +-
 .../BACnetConfirmedServiceACKAtomicReadFile.go     |   132 +-
 .../BACnetConfirmedServiceACKAtomicWriteFile.go    |   132 +-
 ...tConfirmedServiceACKConfirmedPrivateTransfer.go |   132 +-
 .../model/BACnetConfirmedServiceACKCreateObject.go |   132 +-
 .../BACnetConfirmedServiceACKGetAlarmSummary.go    |   132 +-
 ...ACnetConfirmedServiceACKGetEnrollmentSummary.go |   132 +-
 ...BACnetConfirmedServiceACKGetEventInformation.go |   132 +-
 .../model/BACnetConfirmedServiceACKReadProperty.go |   132 +-
 ...ACnetConfirmedServiceACKReadPropertyMultiple.go |   132 +-
 .../model/BACnetConfirmedServiceACKReadRange.go    |   132 +-
 ...BACnetConfirmedServiceACKRemovedAuthenticate.go |   132 +-
 ...rmedServiceACKRemovedReadPropertyConditional.go |   132 +-
 .../model/BACnetConfirmedServiceACKVTData.go       |   132 +-
 .../model/BACnetConfirmedServiceACKVTOpen.go       |   132 +-
 .../model/BACnetConfirmedServiceRequest.go         |  1081 +-
 ...ACnetConfirmedServiceRequestAcknowledgeAlarm.go |   132 +-
 .../BACnetConfirmedServiceRequestAddListElement.go |   132 +-
 .../BACnetConfirmedServiceRequestAtomicReadFile.go |   132 +-
 ...BACnetConfirmedServiceRequestAtomicWriteFile.go |   132 +-
 ...firmedServiceRequestConfirmedCOVNotification.go |   853 +-
 ...rviceRequestConfirmedCOVNotificationMultiple.go |   132 +-
 ...rmedServiceRequestConfirmedEventNotification.go |   132 +-
 ...firmedServiceRequestConfirmedPrivateTransfer.go |   132 +-
 ...tConfirmedServiceRequestConfirmedTextMessage.go |   132 +-
 .../BACnetConfirmedServiceRequestCreateObject.go   |   132 +-
 .../BACnetConfirmedServiceRequestDeleteObject.go   |   132 +-
 ...rmedServiceRequestDeviceCommunicationControl.go |   132 +-
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |   132 +-
 ...etConfirmedServiceRequestGetEventInformation.go |   132 +-
 ...etConfirmedServiceRequestLifeSafetyOperation.go |   132 +-
 .../BACnetConfirmedServiceRequestReadProperty.go   |   461 +-
 ...tConfirmedServiceRequestReadPropertyMultiple.go |   132 +-
 .../BACnetConfirmedServiceRequestReadRange.go      |   132 +-
 ...netConfirmedServiceRequestReinitializeDevice.go |   132 +-
 ...CnetConfirmedServiceRequestRemoveListElement.go |   132 +-
 ...etConfirmedServiceRequestRemovedAuthenticate.go |   132 +-
 ...ServiceRequestRemovedReadPropertyConditional.go |   132 +-
 ...CnetConfirmedServiceRequestRemovedRequestKey.go |   132 +-
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   |   671 +-
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |   132 +-
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |   132 +-
 .../model/BACnetConfirmedServiceRequestVTClose.go  |   132 +-
 .../model/BACnetConfirmedServiceRequestVTData.go   |   132 +-
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |   132 +-
 .../BACnetConfirmedServiceRequestWriteProperty.go  |   661 +-
 ...ConfirmedServiceRequestWritePropertyMultiple.go |   132 +-
 .../plc4go/bacnetip/readwrite/model/BACnetError.go |   605 +-
 .../readwrite/model/BACnetErrorAtomicReadFile.go   |   132 +-
 .../readwrite/model/BACnetErrorAtomicWriteFile.go  |   132 +-
 .../model/BACnetErrorConfirmedPrivateTransfer.go   |   132 +-
 .../readwrite/model/BACnetErrorCreateObject.go     |   132 +-
 .../readwrite/model/BACnetErrorGetAlarmSummary.go  |   132 +-
 .../model/BACnetErrorGetEnrollmentSummary.go       |   132 +-
 .../model/BACnetErrorGetEventInformation.go        |   132 +-
 .../readwrite/model/BACnetErrorReadProperty.go     |   495 +-
 .../model/BACnetErrorReadPropertyMultiple.go       |   132 +-
 .../readwrite/model/BACnetErrorReadRange.go        |   132 +-
 .../model/BACnetErrorRemovedAuthenticate.go        |   132 +-
 .../BACnetErrorRemovedReadPropertyConditional.go   |   132 +-
 .../bacnetip/readwrite/model/BACnetErrorVTData.go  |   132 +-
 .../bacnetip/readwrite/model/BACnetErrorVTOpen.go  |   132 +-
 .../bacnetip/readwrite/model/BACnetNetworkType.go  |   212 +-
 .../bacnetip/readwrite/model/BACnetNodeType.go     |   366 +-
 .../bacnetip/readwrite/model/BACnetNotifyType.go   |   100 +-
 .../bacnetip/readwrite/model/BACnetObjectType.go   |   884 +-
 .../bacnetip/readwrite/model/BACnetServiceAck.go   |   605 +-
 .../model/BACnetServiceAckAtomicReadFile.go        |   132 +-
 .../model/BACnetServiceAckAtomicWriteFile.go       |   132 +-
 .../BACnetServiceAckConfirmedPrivateTransfer.go    |   132 +-
 .../model/BACnetServiceAckCreateObject.go          |   132 +-
 .../model/BACnetServiceAckGetAlarmSummary.go       |   132 +-
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |   132 +-
 .../model/BACnetServiceAckGetEventInformation.go   |   132 +-
 .../model/BACnetServiceAckReadProperty.go          |   581 +-
 .../model/BACnetServiceAckReadPropertyMultiple.go  |   132 +-
 .../readwrite/model/BACnetServiceAckReadRange.go   |   132 +-
 .../model/BACnetServiceAckRemovedAuthenticate.go   |   132 +-
 ...CnetServiceAckRemovedReadPropertyConditional.go |   132 +-
 .../readwrite/model/BACnetServiceAckVTData.go      |   132 +-
 .../readwrite/model/BACnetServiceAckVTOpen.go      |   132 +-
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |   849 +-
 .../model/BACnetTagApplicationBitString.go         |   293 +-
 .../readwrite/model/BACnetTagApplicationBoolean.go |   140 +-
 .../model/BACnetTagApplicationCharacterString.go   |   140 +-
 .../readwrite/model/BACnetTagApplicationDate.go    |   140 +-
 .../readwrite/model/BACnetTagApplicationDouble.go  |   198 +-
 .../model/BACnetTagApplicationEnumerated.go        |   239 +-
 .../readwrite/model/BACnetTagApplicationNull.go    |   140 +-
 .../model/BACnetTagApplicationObjectIdentifier.go  |   140 +-
 .../model/BACnetTagApplicationOctetString.go       |   140 +-
 .../readwrite/model/BACnetTagApplicationReal.go    |   198 +-
 .../model/BACnetTagApplicationSignedInteger.go     |   239 +-
 .../readwrite/model/BACnetTagApplicationTime.go    |   140 +-
 .../model/BACnetTagApplicationUnsignedInteger.go   |   239 +-
 .../bacnetip/readwrite/model/BACnetTagContext.go   |   239 +-
 .../readwrite/model/BACnetTagWithContent.go        |   601 +-
 .../model/BACnetUnconfirmedServiceRequest.go       |   549 +-
 .../model/BACnetUnconfirmedServiceRequestIAm.go    |   637 +-
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |   132 +-
 ...UnconfirmedServiceRequestTimeSynchronization.go |   132 +-
 ...onfirmedServiceRequestUTCTimeSynchronization.go |   132 +-
 ...rmedServiceRequestUnconfirmedCOVNotification.go |   132 +-
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |   132 +-
 ...edServiceRequestUnconfirmedEventNotification.go |   132 +-
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go |   479 +-
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |   132 +-
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |   529 +-
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |   495 +-
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |   132 +-
 .../plc4go/bacnetip/readwrite/model/BVLC.go        |   651 +-
 .../model/BVLCDeleteForeignDeviceTableEntry.go     |   132 +-
 .../model/BVLCDistributeBroadcastToNetwork.go      |   132 +-
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |   330 +-
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   |   186 +-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     |   186 +-
 .../model/BVLCReadBroadcastDistributionTable.go    |   132 +-
 .../model/BVLCReadBroadcastDistributionTableAck.go |   132 +-
 .../readwrite/model/BVLCReadForeignDeviceTable.go  |   132 +-
 .../model/BVLCReadForeignDeviceTableAck.go         |   132 +-
 .../readwrite/model/BVLCRegisterForeignDevice.go   |   132 +-
 .../plc4go/bacnetip/readwrite/model/BVLCResult.go  |   132 +-
 .../bacnetip/readwrite/model/BVLCSecureBVLL.go     |   132 +-
 .../model/BVLCWideBroadcastDistributionTable.go    |   132 +-
 .../plc4go/bacnetip/readwrite/model/NLM.go         |   345 +-
 .../readwrite/model/NLMIAmRouterToNetwork.go       |   228 +-
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     |   228 +-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |  1149 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpBrowser.go |   365 +-
 .../internal/plc4go/knxnetip/KnxNetIpConnection.go |  2131 +-
 .../internal/plc4go/knxnetip/KnxNetIpDiscoverer.go |     4 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpField.go   |   562 +-
 .../plc4go/knxnetip/KnxNetIpFieldHandler.go        |   203 +-
 .../plc4go/knxnetip/KnxNetIpMessageCodec.go        |    48 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpReader.go  |   506 +-
 .../internal/plc4go/knxnetip/KnxNetIpSubscriber.go |   179 +-
 .../plc4go/knxnetip/KnxNetIpValueDecoder.go}       |    33 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpWriter.go  |     4 +-
 plc4go/internal/plc4go/knxnetip/Utils.go           |    56 +-
 .../plc4go/knxnetip/readwrite/ParserHelper.go      |   186 +-
 .../plc4go/knxnetip/readwrite/XmlParserHelper.go   |   465 +-
 .../plc4go/knxnetip/readwrite/model/AccessLevel.go |   177 +
 .../plc4go/knxnetip/readwrite/model/Apdu.go        |   361 +-
 .../plc4go/knxnetip/readwrite/model/ApduControl.go |   329 +-
 .../knxnetip/readwrite/model/ApduControlAck.go     |   132 +-
 .../knxnetip/readwrite/model/ApduControlConnect.go |   132 +-
 .../readwrite/model/ApduControlContainer.go        |   188 +-
 .../readwrite/model/ApduControlDisconnect.go       |   132 +-
 .../knxnetip/readwrite/model/ApduControlNack.go    |   132 +-
 .../plc4go/knxnetip/readwrite/model/ApduData.go    |   661 +-
 .../knxnetip/readwrite/model/ApduDataAdcRead.go    |   132 +-
 .../readwrite/model/ApduDataAdcResponse.go         |   132 +-
 .../knxnetip/readwrite/model/ApduDataContainer.go  |   188 +-
 .../model/ApduDataDeviceDescriptorRead.go          |   192 +-
 .../model/ApduDataDeviceDescriptorResponse.go      |   283 +-
 .../plc4go/knxnetip/readwrite/model/ApduDataExt.go |  1361 +-
 .../readwrite/model/ApduDataExtAuthorizeRequest.go |   209 +-
 .../model/ApduDataExtAuthorizeResponse.go          |   165 +-
 .../model/ApduDataExtDomainAddressRead.go          |   132 +-
 .../model/ApduDataExtDomainAddressResponse.go      |   132 +-
 .../model/ApduDataExtDomainAddressSelectiveRead.go |   132 +-
 .../ApduDataExtDomainAddressSerialNumberRead.go    |   132 +-
 ...ApduDataExtDomainAddressSerialNumberResponse.go |   132 +-
 .../ApduDataExtDomainAddressSerialNumberWrite.go   |   132 +-
 .../model/ApduDataExtDomainAddressWrite.go         |   132 +-
 .../model/ApduDataExtFileStreamInfoReport.go       |   132 +-
 .../ApduDataExtGroupPropertyValueInfoReport.go     |   132 +-
 .../model/ApduDataExtGroupPropertyValueRead.go     |   132 +-
 .../model/ApduDataExtGroupPropertyValueResponse.go |   132 +-
 .../model/ApduDataExtGroupPropertyValueWrite.go    |   132 +-
 ...ApduDataExtIndividualAddressSerialNumberRead.go |   132 +-
 ...DataExtIndividualAddressSerialNumberResponse.go |   132 +-
 ...pduDataExtIndividualAddressSerialNumberWrite.go |   132 +-
 .../readwrite/model/ApduDataExtKeyResponse.go      |   132 +-
 .../readwrite/model/ApduDataExtKeyWrite.go         |   132 +-
 .../readwrite/model/ApduDataExtLinkRead.go         |   132 +-
 .../readwrite/model/ApduDataExtLinkResponse.go     |   132 +-
 .../readwrite/model/ApduDataExtLinkWrite.go        |   132 +-
 .../readwrite/model/ApduDataExtMemoryBitWrite.go   |   132 +-
 .../model/ApduDataExtNetworkParameterRead.go       |   132 +-
 .../model/ApduDataExtNetworkParameterResponse.go   |   132 +-
 .../model/ApduDataExtNetworkParameterWrite.go      |   132 +-
 .../model/ApduDataExtOpenRoutingTableRequest.go    |   132 +-
 .../model/ApduDataExtPropertyDescriptionRead.go    |   221 +-
 .../ApduDataExtPropertyDescriptionResponse.go      |   407 +-
 .../model/ApduDataExtPropertyValueRead.go          |   354 +-
 .../model/ApduDataExtPropertyValueResponse.go      |   440 +-
 .../model/ApduDataExtPropertyValueWrite.go         |   293 +-
 .../model/ApduDataExtReadRouterMemoryRequest.go    |   132 +-
 .../model/ApduDataExtReadRouterMemoryResponse.go   |   132 +-
 .../model/ApduDataExtReadRouterStatusRequest.go    |   132 +-
 .../model/ApduDataExtReadRouterStatusResponse.go   |   132 +-
 .../model/ApduDataExtReadRoutingTableRequest.go    |   132 +-
 .../model/ApduDataExtReadRoutingTableResponse.go   |   132 +-
 .../model/ApduDataExtWriteRouterMemoryRequest.go   |   132 +-
 .../model/ApduDataExtWriteRouterStatusRequest.go   |   132 +-
 .../model/ApduDataExtWriteRoutingTableRequest.go   |   132 +-
 .../readwrite/model/ApduDataGroupValueRead.go      |   161 +-
 .../readwrite/model/ApduDataGroupValueResponse.go  |   216 +-
 .../readwrite/model/ApduDataGroupValueWrite.go     |   283 +-
 .../model/ApduDataIndividualAddressRead.go         |   132 +-
 .../model/ApduDataIndividualAddressResponse.go     |   132 +-
 .../model/ApduDataIndividualAddressWrite.go        |   132 +-
 .../knxnetip/readwrite/model/ApduDataMemoryRead.go |   246 +-
 .../readwrite/model/ApduDataMemoryResponse.go      |   308 +-
 .../readwrite/model/ApduDataMemoryWrite.go         |   132 +-
 .../knxnetip/readwrite/model/ApduDataOther.go      |   186 +-
 .../knxnetip/readwrite/model/ApduDataRestart.go    |   132 +-
 .../readwrite/model/ApduDataUserMessage.go         |   132 +-
 .../plc4go/knxnetip/readwrite/model/CEMI.go        |   857 +-
 .../readwrite/model/CEMIAdditionalInformation.go   |   273 +-
 .../CEMIAdditionalInformationBusmonitorInfo.go     |   498 +-
 .../CEMIAdditionalInformationRelativeTimestamp.go  |   226 +-
 .../knxnetip/readwrite/model/CEMIPriority.go       |   114 +-
 .../knxnetip/readwrite/model/ChannelInformation.go |   207 +-
 .../knxnetip/readwrite/model/ComObjectTable.go     |   209 +
 .../readwrite/model/ComObjectTableAddresses.go     | 18858 ++++++++++++++++
 .../model/ComObjectTableRealisationType1.go        |   238 +
 .../model/ComObjectTableRealisationType2.go        |   238 +
 .../model/ComObjectTableRealisationType6.go        |   163 +
 .../knxnetip/readwrite/model/ComObjectValueType.go |   257 +
 .../knxnetip/readwrite/model/ConnectionRequest.go  |   294 +-
 .../model/ConnectionRequestInformation.go          |   307 +-
 ...ConnectionRequestInformationDeviceManagement.go |   132 +-
 ...ConnectionRequestInformationTunnelConnection.go |   240 +-
 .../knxnetip/readwrite/model/ConnectionResponse.go |   370 +-
 .../readwrite/model/ConnectionResponseDataBlock.go |   307 +-
 .../ConnectionResponseDataBlockDeviceManagement.go |   132 +-
 .../ConnectionResponseDataBlockTunnelConnection.go |   186 +-
 .../readwrite/model/ConnectionStateRequest.go      |   294 +-
 .../readwrite/model/ConnectionStateResponse.go     |   244 +-
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      |   650 +-
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |   285 +-
 .../knxnetip/readwrite/model/DescriptionRequest.go |   186 +-
 .../readwrite/model/DescriptionResponse.go         |   242 +-
 .../readwrite/model/DeviceConfigurationAck.go      |   186 +-
 .../model/DeviceConfigurationAckDataBlock.go       |   289 +-
 .../readwrite/model/DeviceConfigurationRequest.go  |   242 +-
 .../model/DeviceConfigurationRequestDataBlock.go   |   291 +-
 .../knxnetip/readwrite/model/DeviceDescriptor.go   |   537 +
 .../readwrite/model/DeviceDescriptorMediumType.go  |   142 +-
 .../readwrite/model/DeviceDescriptorType0.go       |   476 -
 .../readwrite/model/DeviceDescriptorType2.go       |   603 +-
 .../knxnetip/readwrite/model/DeviceStatus.go       |   211 +-
 .../knxnetip/readwrite/model/DisconnectRequest.go  |   294 +-
 .../knxnetip/readwrite/model/DisconnectResponse.go |   244 +-
 .../knxnetip/readwrite/model/FirmwareType.go       |   313 +-
 .../model/GroupObjectDescriptorRealisationType1.go |   348 +
 .../model/GroupObjectDescriptorRealisationType2.go |   348 +
 .../model/GroupObjectDescriptorRealisationType6.go |   115 +
 .../model/GroupObjectDescriptorRealisationType7.go |   348 +
 .../model/GroupObjectDescriptorRealisationTypeB.go |   322 +
 .../readwrite/model/HPAIControlEndpoint.go         |   287 +-
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |   287 +-
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |   287 +-
 .../knxnetip/readwrite/model/HostProtocolCode.go   |    86 +-
 .../plc4go/knxnetip/readwrite/model/IPAddress.go   |   198 +-
 .../plc4go/knxnetip/readwrite/model/KnxAddress.go  |   261 +-
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 22389 +++++++++----------
 .../readwrite/model/KnxDatapointMainType.go        |  2183 +-
 .../knxnetip/readwrite/model/KnxDatapointType.go   | 12278 +++++-----
 .../knxnetip/readwrite/model/KnxGroupAddress.go    |   273 +-
 .../readwrite/model/KnxGroupAddress2Level.go       |   246 +-
 .../readwrite/model/KnxGroupAddress3Level.go       |   300 +-
 .../readwrite/model/KnxGroupAddressFreeLevel.go    |   192 +-
 .../readwrite/model/KnxInterfaceObjectProperty.go  |  9183 ++++----
 .../readwrite/model/KnxInterfaceObjectType.go      |   785 +-
 .../plc4go/knxnetip/readwrite/model/KnxLayer.go    |   100 +-
 .../knxnetip/readwrite/model/KnxManufacturer.go    | 15254 +++++++------
 .../plc4go/knxnetip/readwrite/model/KnxMedium.go   |   142 +-
 .../knxnetip/readwrite/model/KnxNetIpCore.go       |   192 +-
 .../readwrite/model/KnxNetIpDeviceManagement.go    |   192 +-
 .../knxnetip/readwrite/model/KnxNetIpMessage.go    |   765 +-
 .../knxnetip/readwrite/model/KnxNetIpRouting.go    |     2 +
 .../knxnetip/readwrite/model/KnxNetIpTunneling.go  |   192 +-
 .../knxnetip/readwrite/model/KnxNetObjectServer.go |   192 +-
 .../model/KnxNetRemoteConfigurationAndDiagnosis.go |   192 +-
 .../readwrite/model/KnxNetRemoteLogging.go         |   192 +-
 .../plc4go/knxnetip/readwrite/model/KnxProperty.go |  2787 +--
 .../readwrite/model/KnxPropertyDataType.go         |  1848 +-
 .../plc4go/knxnetip/readwrite/model/LBusmonInd.go  |   396 +-
 .../plc4go/knxnetip/readwrite/model/LDataCon.go    |   342 +-
 .../knxnetip/readwrite/model/LDataExtended.go      |   535 +-
 .../plc4go/knxnetip/readwrite/model/LDataFrame.go  |   587 +-
 .../knxnetip/readwrite/model/LDataFrameACK.go      |   144 +-
 .../plc4go/knxnetip/readwrite/model/LDataInd.go    |   342 +-
 .../plc4go/knxnetip/readwrite/model/LDataReq.go    |   342 +-
 .../plc4go/knxnetip/readwrite/model/LPollData.go   |   395 +-
 .../knxnetip/readwrite/model/LPollDataCon.go       |   132 +-
 .../knxnetip/readwrite/model/LPollDataReq.go       |   132 +-
 .../plc4go/knxnetip/readwrite/model/LRawCon.go     |   132 +-
 .../plc4go/knxnetip/readwrite/model/LRawInd.go     |   132 +-
 .../plc4go/knxnetip/readwrite/model/LRawReq.go     |   132 +-
 .../plc4go/knxnetip/readwrite/model/MACAddress.go  |   198 +-
 .../readwrite/model/MFuncPropCommandReq.go         |   132 +-
 .../knxnetip/readwrite/model/MFuncPropCon.go       |   132 +-
 .../readwrite/model/MFuncPropStateReadReq.go       |   132 +-
 .../knxnetip/readwrite/model/MPropInfoInd.go       |   132 +-
 .../knxnetip/readwrite/model/MPropReadCon.go       |   462 +-
 .../knxnetip/readwrite/model/MPropReadReq.go       |   408 +-
 .../knxnetip/readwrite/model/MPropWriteCon.go      |   132 +-
 .../knxnetip/readwrite/model/MPropWriteReq.go      |   132 +-
 .../plc4go/knxnetip/readwrite/model/MResetInd.go   |   132 +-
 .../plc4go/knxnetip/readwrite/model/MResetReq.go   |   132 +-
 .../model/ProjectInstallationIdentifier.go         |   207 +-
 .../knxnetip/readwrite/model/RelativeTimestamp.go  |   157 +-
 .../knxnetip/readwrite/model/RoutingIndication.go  |   132 +-
 .../knxnetip/readwrite/model/SearchRequest.go      |   186 +-
 .../knxnetip/readwrite/model/SearchResponse.go     |   294 +-
 .../plc4go/knxnetip/readwrite/model/ServiceId.go   |     6 +-
 .../plc4go/knxnetip/readwrite/model/Status.go      |   226 +-
 .../readwrite/model/SupportedPhysicalMedia.go      |   673 +-
 .../knxnetip/readwrite/model/TDataConnectedInd.go  |   132 +-
 .../knxnetip/readwrite/model/TDataConnectedReq.go  |   132 +-
 .../knxnetip/readwrite/model/TDataIndividualInd.go |   132 +-
 .../knxnetip/readwrite/model/TDataIndividualReq.go |   132 +-
 .../knxnetip/readwrite/model/TunnelingRequest.go   |   242 +-
 .../readwrite/model/TunnelingRequestDataBlock.go   |   291 +-
 .../knxnetip/readwrite/model/TunnelingResponse.go  |   186 +-
 .../readwrite/model/TunnelingResponseDataBlock.go  |   289 +-
 .../knxnetip/readwrite/model/UnknownMessage.go     |   229 +-
 plc4go/internal/plc4go/modbus/ModbusConnection.go  |    10 +
 plc4go/internal/plc4go/modbus/ModbusField.go       |    17 +
 .../plc4go/modbus/readwrite/ParserHelper.go        |    73 +-
 .../plc4go/modbus/readwrite/XmlParserHelper.go     |   129 +-
 .../plc4go/modbus/readwrite/model/DataItem.go      |     2 +
 .../modbus/readwrite/model/ModbusConstants.go      |   145 +-
 .../modbus/readwrite/model/ModbusDataType.go       |     2 +
 .../modbus/readwrite/model/ModbusErrorCode.go      |   198 +-
 .../plc4go/modbus/readwrite/model/ModbusPDU.go     |  1335 +-
 .../readwrite/model/ModbusPDUDiagnosticRequest.go  |   250 +-
 .../readwrite/model/ModbusPDUDiagnosticResponse.go |   250 +-
 .../modbus/readwrite/model/ModbusPDUError.go       |   196 +-
 .../model/ModbusPDUGetComEventCounterRequest.go    |   136 +-
 .../model/ModbusPDUGetComEventCounterResponse.go   |   250 +-
 .../model/ModbusPDUGetComEventLogRequest.go        |   136 +-
 .../model/ModbusPDUGetComEventLogResponse.go       |   425 +-
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |   304 +-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |   304 +-
 .../readwrite/model/ModbusPDUReadCoilsRequest.go   |   250 +-
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  |   263 +-
 .../ModbusPDUReadDeviceIdentificationRequest.go    |   136 +-
 .../ModbusPDUReadDeviceIdentificationResponse.go   |   136 +-
 .../model/ModbusPDUReadDiscreteInputsRequest.go    |   250 +-
 .../model/ModbusPDUReadDiscreteInputsResponse.go   |   263 +-
 .../model/ModbusPDUReadExceptionStatusRequest.go   |   136 +-
 .../model/ModbusPDUReadExceptionStatusResponse.go  |   196 +-
 .../model/ModbusPDUReadFifoQueueRequest.go         |   196 +-
 .../model/ModbusPDUReadFifoQueueResponse.go        |   288 +-
 .../model/ModbusPDUReadFileRecordRequest.go        |   280 +-
 .../model/ModbusPDUReadFileRecordRequestItem.go    |   311 +-
 .../model/ModbusPDUReadFileRecordResponse.go       |   280 +-
 .../model/ModbusPDUReadFileRecordResponseItem.go   |   282 +-
 .../model/ModbusPDUReadHoldingRegistersRequest.go  |   250 +-
 .../model/ModbusPDUReadHoldingRegistersResponse.go |   263 +-
 .../model/ModbusPDUReadInputRegistersRequest.go    |   250 +-
 .../model/ModbusPDUReadInputRegistersResponse.go   |   263 +-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |   479 +-
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |   263 +-
 .../model/ModbusPDUReportServerIdRequest.go        |   136 +-
 .../model/ModbusPDUReportServerIdResponse.go       |   263 +-
 .../model/ModbusPDUWriteFileRecordRequest.go       |   280 +-
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |   382 +-
 .../model/ModbusPDUWriteFileRecordResponse.go      |   280 +-
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |   382 +-
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    |   371 +-
 .../model/ModbusPDUWriteMultipleCoilsResponse.go   |   250 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |   371 +-
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |   250 +-
 .../model/ModbusPDUWriteSingleCoilRequest.go       |   250 +-
 .../model/ModbusPDUWriteSingleCoilResponse.go      |   250 +-
 .../model/ModbusPDUWriteSingleRegisterRequest.go   |   250 +-
 .../model/ModbusPDUWriteSingleRegisterResponse.go  |   250 +-
 .../modbus/readwrite/model/ModbusSerialADU.go      |   359 +-
 .../plc4go/modbus/readwrite/model/ModbusTcpADU.go  |   325 +-
 .../internal/plc4go/s7/readwrite/ParserHelper.go   |   123 +-
 .../plc4go/s7/readwrite/XmlParserHelper.go         |   213 +-
 .../plc4go/s7/readwrite/model/COTPPacket.go        |   593 +-
 .../readwrite/model/COTPPacketConnectionRequest.go |   302 +-
 .../model/COTPPacketConnectionResponse.go          |   302 +-
 .../plc4go/s7/readwrite/model/COTPPacketData.go    |   248 +-
 .../readwrite/model/COTPPacketDisconnectRequest.go |   302 +-
 .../model/COTPPacketDisconnectResponse.go          |   248 +-
 .../s7/readwrite/model/COTPPacketTpduError.go      |   248 +-
 .../plc4go/s7/readwrite/model/COTPParameter.go     |   379 +-
 .../s7/readwrite/model/COTPParameterCalledTsap.go  |   192 +-
 .../s7/readwrite/model/COTPParameterCallingTsap.go |   192 +-
 .../s7/readwrite/model/COTPParameterChecksum.go    |   192 +-
 ...COTPParameterDisconnectAdditionalInformation.go |   224 +-
 .../s7/readwrite/model/COTPParameterTpduSize.go    |   192 +-
 .../plc4go/s7/readwrite/model/COTPProtocolClass.go |   128 +-
 .../plc4go/s7/readwrite/model/COTPTpduSize.go      |   219 +-
 .../internal/plc4go/s7/readwrite/model/DataItem.go |   943 +-
 .../s7/readwrite/model/DataTransportErrorCode.go   |   142 +-
 .../plc4go/s7/readwrite/model/DataTransportSize.go |   219 +-
 .../plc4go/s7/readwrite/model/DeviceGroup.go       |   100 +-
 .../plc4go/s7/readwrite/model/MemoryArea.go        |   261 +-
 .../plc4go/s7/readwrite/model/S7Address.go         |   245 +-
 .../plc4go/s7/readwrite/model/S7AddressAny.go      |   512 +-
 .../plc4go/s7/readwrite/model/S7Message.go         |   665 +-
 .../plc4go/s7/readwrite/model/S7MessageRequest.go  |   138 +-
 .../plc4go/s7/readwrite/model/S7MessageResponse.go |   250 +-
 .../s7/readwrite/model/S7MessageResponseData.go    |   250 +-
 .../plc4go/s7/readwrite/model/S7MessageUserData.go |   138 +-
 .../plc4go/s7/readwrite/model/S7Parameter.go       |   383 +-
 .../readwrite/model/S7ParameterReadVarRequest.go   |   264 +-
 .../readwrite/model/S7ParameterReadVarResponse.go  |   194 +-
 .../model/S7ParameterSetupCommunication.go         |   352 +-
 .../s7/readwrite/model/S7ParameterUserData.go      |   264 +-
 .../s7/readwrite/model/S7ParameterUserDataItem.go  |   245 +-
 .../model/S7ParameterUserDataItemCPUFunctions.go   |   654 +-
 .../readwrite/model/S7ParameterWriteVarRequest.go  |   264 +-
 .../readwrite/model/S7ParameterWriteVarResponse.go |   194 +-
 .../plc4go/s7/readwrite/model/S7Payload.go         |   303 +-
 .../s7/readwrite/model/S7PayloadReadVarResponse.go |   240 +-
 .../plc4go/s7/readwrite/model/S7PayloadUserData.go |   234 +-
 .../s7/readwrite/model/S7PayloadUserDataItem.go    |   475 +-
 ...PayloadUserDataItemCpuFunctionReadSzlRequest.go |   140 +-
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go |   300 +-
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go |   240 +-
 .../readwrite/model/S7PayloadWriteVarResponse.go   |   230 +-
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |   368 +-
 .../s7/readwrite/model/S7VarPayloadStatusItem.go   |   157 +-
 .../readwrite/model/S7VarRequestParameterItem.go   |   245 +-
 .../model/S7VarRequestParameterItemAddress.go      |   220 +-
 .../plc4go/s7/readwrite/model/SzlDataTreeItem.go   |   378 +-
 plc4go/internal/plc4go/s7/readwrite/model/SzlId.go |   261 +-
 .../s7/readwrite/model/SzlModuleTypeClass.go       |   114 +-
 .../plc4go/s7/readwrite/model/SzlSublist.go        |   324 +-
 .../plc4go/s7/readwrite/model/TPKTPacket.go        |   275 +-
 .../plc4go/s7/readwrite/model/TransportSize.go     |  2568 ++-
 .../plc4go/spi/errors/TimeoutError.go}             |    14 +-
 .../plc4go/spi/model/DefaultPlcReadRequest.go      |    13 +-
 .../spi/model/DefaultPlcSubscriptionRequest.go     |    29 +-
 .../plc4go/spi/model/DefaultPlcWriteRequest.go     |    25 +-
 .../plc4go/spi/testutils/DriverTestRunner.go       |   125 +-
 plc4go/internal/plc4go/spi/testutils/TestUtils.go  |    10 +-
 plc4go/internal/plc4go/spi/utils/CastUtils.go      |    25 +
 plc4go/internal/plc4go/spi/utils/ReadBuffer.go     |    53 +-
 plc4go/internal/plc4go/spi/utils/WriteBuffer.go    |     5 +
 plc4go/internal/plc4go/spi/values/BINT.go          |   145 +
 plc4go/internal/plc4go/spi/values/BREAL.go         |   173 +
 plc4go/internal/plc4go/spi/values/PlcBitString.go  |     9 +-
 plc4go/internal/plc4go/spi/values/PlcList.go       |     2 +-
 plc4go/internal/plc4go/spi/values/PlcStruct.go     |     2 +-
 .../internal/plc4go/spi/values/PlcValueAdapter.go  |     9 +-
 plc4go/internal/plc4go/spi/values/RawPlcValue.go   |    91 +
 plc4go/pkg/plc4go/connection.go                    |     2 +
 plc4go/pkg/plc4go/drivers/drivers.go               |     9 +
 plc4go/pkg/plc4go/model/plc_browse.go              |     6 +-
 plc4go/pkg/plc4go/model/plc_field.go               |     1 +
 plc4go/pkg/plc4go/model/plc_read.go                |     3 +-
 plc4go/pkg/plc4go/model/plc_response_code.go       |     3 +-
 plc4go/pkg/plc4go/model/plc_subscription.go        |     9 +-
 plc4go/pkg/plc4go/model/plc_write.go               |     3 +-
 plc4go/pkg/plc4go/values/plc_value.go              |    15 +
 plc4go/pom.xml                                     |   136 +-
 .../readwrite/context/FirmataDriverContext.java    |    11 +-
 .../readwrite/protocol/FirmataProtocolLogic.java   |     5 +-
 .../hello-world-plc4x-subscription/pom.xml         |     5 -
 .../subscription/HelloPlc4xSubscription.java       |    13 +-
 plc4j/tools/connection-cache/pom.xml               |     6 +-
 .../plc4x/test/mapper/TestSuiteMappingModule.java  |    44 +-
 .../ads/src/main/resources/protocols/ads/ads.mspec |   122 +-
 .../resources/protocols/ads/DriverTestsuite.xml    |    14 +-
 .../protocols/canopen/CANOpenDriverSDOIT.xml       |    16 +-
 protocols/knxnetip/pom.xml                         |    19 +
 .../plc4x/protocol/knxnetip/KnxNetIpProtocol.java  |    10 +-
 .../resources/protocols/knxnetip/device-info.mspec |  1745 ++
 .../resources/protocols/knxnetip/knxnetip.mspec    |   254 +-
 protocols/knxnetip/src/main/xslt/knx-types.xsl     |    22 +-
 .../protocol/knxnetip/KnxDefinitionsGenerator.java |   141 +
 .../knxnetip/KnxSpecificationStoreUpdater.java     |   184 +
 .../knxnetip/handlers/ManufacturerIdsHandler.java  |    57 +
 .../handlers/ProductDescriptionHandler.java        |    64 +
 .../resources/protocols/modbus/DriverTestsuite.xml |     8 +-
 protocols/plc4x/pom.xml                            |    43 +
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |    19 +
 .../src/main/resources/protocols/plc4x/plc4x.mspec |    37 +-
 protocols/pom.xml                                  |     1 +
 .../resources/protocols/s7/DriverTestsuite.xml     |     8 +-
 src/site/asciidoc/users/adopters.adoc              |     2 +
 .../asciidoc/users/integrations/apache-kafka.adoc  |     4 +-
 .../companies/logo-lebbing-automation-drives.png   |   Bin 0 -> 13626 bytes
 576 files changed, 127081 insertions(+), 87839 deletions(-)

diff --cc build-utils/language-c/src/main/resources/templates/c/data-io-template-c.ftlh
index 04d5907,60236c8..0f30365
--- a/build-utils/language-c/src/main/resources/templates/c/data-io-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/data-io-template-c.ftlh
@@@ -67,7 -67,7 +67,7 @@@
  #include <plc4c/data.h>
  #include <plc4c/utils/list.h>
  #include <plc4c/spi/evaluation_helper.h>
- //#include <plc4c/driver_${helper.getProtocolName()}.h>
 -#include <plc4c/driver_${helper.getProtocolName()}.h>
++
  #include "${helper.camelCaseToSnakeCase(type.name)}.h"
  
  // Parse function.
diff --cc build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index 7eab226,43ac99a..8abf2ab
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@@ -482,27 -457,16 +482,19 @@@ plc4c_return_code ${helper.getCTypeName
          <#case "const">
              <#assign constField = field>
              <#assign simpleTypeReference = constField.type>
--
  <#if indentContent>    </#if>  // Const Field (${constField.name})
  <#if indentContent>    </#if>  ${helper.getWriteBufferWriteMethodCall(constField.type, helper.getCTypeName(baseType.name)?upper_case + "_" + helper.camelCaseToSnakeCase(constField.name)?upper_case + "()")};
              <#break>
          <#case "discriminator">
              <#assign discriminatorField = field>
-         <#if helper.isSimpleField(field)>
-             <#assign simpleTypeReference = discriminatorField.type>
- <#if indentContent>    </#if>  // Discriminator Field (${discriminatorField.name})
- <#if indentContent>    </#if>  ${helper.getWriteBufferWriteMethodCall(discriminatorField.type, helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name)};
-         <#elseif helper.isEnumField(field)>
++        <#if helper.isEnumField(field)>
 +<#if indentContent>    </#if>  // Enumerated Discriminator Field (${discriminatorField.name})
 +<#if indentContent>    </#if>  ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type), helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name)};
 +        <#else>
- <#if indentContent>    </#if>  // Enumerated Discriminator Field (${discriminatorField.name})
-             // ${discriminatorField}
-             // ${discriminatorField.type}
-             // ${discriminatorField.name}
-             // ${helper.getCTypeName(baseType.name)}
+             <#assign simpleTypeReference = discriminatorField.type>
 -
+ <#if indentContent>    </#if>  // Discriminator Field (${discriminatorField.name})
  <#if indentContent>    </#if>  ${helper.getWriteBufferWriteMethodCall(discriminatorField.type, helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name)};
 +        </#if>
              <#break>
          <#case "enum">
              <#assign enumField = field>
diff --cc build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
index d750b4a,213d1c3..2070da3
--- a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
@@@ -203,141 -206,131 +206,269 @@@ func (m *${type.name}) GetTypeName() st
  }
  
  func (m *${type.name}) LengthInBits() uint16 {
++<<<<<<< HEAD
 +    lengthInBits := uint16(0)
 +    <#list type.fields as field>
 +        <#switch field.typeName>
 +            <#case "array">
 +                <#assign arrayField = field>
 +
 +    // Array field
 +    if len(m.${arrayField.name?cap_first}) > 0 {
 +                <#if helper.isSimpleTypeReference(arrayField.type)>
 +                    <#assign simpleTypeReference = arrayField.type>
 +        lengthInBits += ${simpleTypeReference.sizeInBits} * uint16(len(m.${arrayField.name?cap_first}))
 +                <#else>
 +        for _, element := range m.${arrayField.name?cap_first} {
 +            lengthInBits += element.LengthInBits()
 +        }
 +                </#if>
 +    }
 +                <#break>
 +            <#case "checksum">
 +                <#assign checksumField = field>
 +                <#assign simpleTypeReference = checksumField.type>
 +
 +    // Checksum Field (checksum)
 +    lengthInBits += ${simpleTypeReference.sizeInBits}
 +                <#break>
 +            <#case "const">
 +                <#assign constField = field>
 +                <#assign simpleTypeReference = constField.type>
 +
 +    // Const Field (${constField.name})
 +    lengthInBits += ${simpleTypeReference.sizeInBits}
 +                <#break>
 +            <#case "discriminator">
 +                <#assign discriminatorField = field>
 +                <#assign simpleTypeReference = discriminatorField.type>
 +
 +    // Discriminator Field (${discriminatorField.name})
 +                <#if helper.isSimpleTypeReference(simpleTypeReference)>
 +                    <#if helper.getLanguageTypeNameForTypeReference(discriminatorField.type) = "String">
 +    lengthInBits += ${simpleTypeReference.getLength()};
 +                    <#else>
 +    lengthInBits += ${simpleTypeReference.sizeInBits};
 +                    </#if>
 +                <#elseif helper.isEnumField(discriminatorField)>
 +    lengthInBits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits};
 +                <#else>
 +    lengthInBits += ${discriminatorField.name}.getLengthInBits();
 +                </#if>
 +                <#break>
 +            <#case "enum">
 +                <#assign enumField = field>
 +
 +    // Enum Field (${enumField.name})
 +    lengthInBits += ${helper.getEnumBaseTypeReference(enumField.type).sizeInBits}
 +                <#break>
 +            <#case "implicit">
 +                <#assign implicitField = field>
 +                <#assign simpleTypeReference = implicitField.type>
 +
 +    // Implicit Field (${implicitField.name})
 +    lengthInBits += ${simpleTypeReference.sizeInBits}
 +                <#break>
 +            <#case "manualArray">
 +                <#assign manualArrayField = field>
 +
 +    // Manual Array Field (${manualArrayField.name})
 +    lengthInBits += ${helper.toParseExpression(manualArrayField, manualArrayField.lengthExpression, type.parserArguments)} * 8
 +                <#break>
 +            <#case "manual">
 +                <#assign manualField = field>
 +
 +    // Manual Field (${manualField.name})
 +    lengthInBits += ${helper.toParseExpression(manualField, manualField.lengthExpression, type.parserArguments)} * 8
 +                <#break>
 +            <#case "optional">
 +                <#assign optionalField = field>
 +
 +    // Optional Field (${optionalField.name})
 +    if m.${optionalField.name?cap_first} != nil {
 +                <#if helper.isSimpleTypeReference(optionalField.type)>
 +                    <#assign simpleTypeReference = optionalField.type>
 +        lengthInBits += ${simpleTypeReference.sizeInBits}
 +                <#elseif helper.isEnumField(field)>
 +        lengthInBits += ${helper.getEnumBaseTypeReference(optionalField.type).sizeInBits}
 +                <#else>
 +        lengthInBits += (*m.${optionalField.name?cap_first}).LengthInBits()
 +                </#if>
 +    }
 +                <#break>
 +            <#case "padding">
 +                <#assign paddingField = field>
 +                <#assign simpleTypeReference = paddingField.type>
 +
 +    // Padding Field (padding)
 +            <#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
 +    _timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)?replace("lastItem", "false")})
 +    for ;_timesPadding > 0; _timesPadding-- {
 +        lengthInBits += ${simpleTypeReference.sizeInBits}
 +    }
 +                <#break>
 +            <#case "reserved">
 +                <#assign reservedField = field>
 +                <#assign simpleTypeReference = reservedField.type>
 +
 +    // Reserved Field (reserved)
 +    lengthInBits += ${simpleTypeReference.sizeInBits}
 +                <#break>
 +            <#case "simple">
 +                <#assign simpleField = field>
 +
 +    // Simple field (${simpleField.name})
 +                <#if helper.isSimpleTypeReference(simpleField.type)>
 +                    <#assign simpleTypeReference = simpleField.type>
 +    lengthInBits += ${simpleTypeReference.sizeInBits}
 +                <#elseif helper.isEnumField(field)>
 +    lengthInBits += ${helper.getEnumBaseTypeReference(simpleField.type).sizeInBits}
 +                <#else>
 +    lengthInBits += m.${simpleField.name?cap_first}.LengthInBits()
 +                </#if>
 +                <#break>
 +            <#case "switch">
 +                <#assign switchField = field>
 +
 +    // Length of sub-type elements will be added by sub-type...
 +    lengthInBits += m.Child.LengthInBits()
 +                <#break>
 +            <#case "virtual">
 +                <#assign virtualField = field>
 +
 +    // A virtual field doesn't have any in- or output.
 +                <#break>
 +        </#switch>
 +    </#list>
 +
 +    return lengthInBits
++=======
+ 	lengthInBits := uint16(0)
+ 	<#list type.fields as field>
+ 		<#switch field.typeName>
+ 			<#case "array">
+ 				<#assign arrayField = field>
+ 
+ 	// Array field
+ 	if len(m.${arrayField.name?cap_first}) > 0 {
+ 				<#if helper.isSimpleTypeReference(arrayField.type)>
+ 					<#assign simpleTypeReference = arrayField.type>
+ 		lengthInBits += ${simpleTypeReference.sizeInBits} * uint16(len(m.${arrayField.name?cap_first}))
+ 				<#else>
+ 		for _, element := range m.${arrayField.name?cap_first} {
+ 			lengthInBits += element.LengthInBits()
+ 		}
+ 				</#if>
+ 	}
+ 				<#break>
+ 			<#case "checksum">
+ 				<#assign checksumField = field>
+ 				<#assign simpleTypeReference = checksumField.type>
+ 
+ 	// Checksum Field (checksum)
+ 	lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#break>
+ 			<#case "const">
+ 				<#assign constField = field>
+ 				<#assign simpleTypeReference = constField.type>
+ 
+ 	// Const Field (${constField.name})
+ 	lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#break>
+ 			<#case "discriminator">
+ 				<#assign discriminatorField = field>
+ 				<#assign simpleTypeReference = discriminatorField.type>
+ 
+ 	// Discriminator Field (${discriminatorField.name})
+ 	lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#break>
+ 			<#case "enum">
+ 				<#assign enumField = field>
+ 
+ 	// Enum Field (${enumField.name})
+ 	lengthInBits += ${helper.getEnumBaseTypeReference(enumField.type).sizeInBits}
+ 				<#break>
+ 			<#case "implicit">
+ 				<#assign implicitField = field>
+ 				<#assign simpleTypeReference = implicitField.type>
+ 
+ 	// Implicit Field (${implicitField.name})
+ 	lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#break>
+ 			<#case "manualArray">
+ 				<#assign manualArrayField = field>
+ 
+ 	// Manual Array Field (${manualArrayField.name})
+ 	lengthInBits += ${helper.toParseExpression(manualArrayField, manualArrayField.lengthExpression, type.parserArguments)} * 8
+ 				<#break>
+ 			<#case "manual">
+ 				<#assign manualField = field>
+ 
+ 	// Manual Field (${manualField.name})
+ 	lengthInBits += ${helper.toParseExpression(manualField, manualField.lengthExpression, type.parserArguments)} * 8
+ 				<#break>
+ 			<#case "optional">
+ 				<#assign optionalField = field>
+ 
+ 	// Optional Field (${optionalField.name})
+ 	if m.${optionalField.name?cap_first} != nil {
+ 				<#if helper.isSimpleTypeReference(optionalField.type)>
+ 					<#assign simpleTypeReference = optionalField.type>
+ 		lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#elseif helper.isEnumField(field)>
+ 		lengthInBits += ${helper.getEnumBaseTypeReference(optionalField.type).sizeInBits}
+ 				<#else>
+ 		lengthInBits += (*m.${optionalField.name?cap_first}).LengthInBits()
+ 				</#if>
+ 	}
+ 				<#break>
+ 			<#case "padding">
+ 				<#assign paddingField = field>
+ 				<#assign simpleTypeReference = paddingField.type>
+ 
+ 	// Padding Field (padding)
+ 			<#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
+ 	_timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)?replace("lastItem", "false")})
+ 	for ;_timesPadding > 0; _timesPadding-- {
+ 		lengthInBits += ${simpleTypeReference.sizeInBits}
+ 	}
+ 				<#break>
+ 			<#case "reserved">
+ 				<#assign reservedField = field>
+ 				<#assign simpleTypeReference = reservedField.type>
+ 
+ 	// Reserved Field (reserved)
+ 	lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#break>
+ 			<#case "simple">
+ 				<#assign simpleField = field>
+ 
+ 	// Simple field (${simpleField.name})
+ 				<#if helper.isSimpleTypeReference(simpleField.type)>
+ 					<#assign simpleTypeReference = simpleField.type>
+ 	lengthInBits += ${simpleTypeReference.sizeInBits}
+ 				<#elseif helper.isEnumField(field)>
+ 	lengthInBits += ${helper.getEnumBaseTypeReference(simpleField.type).sizeInBits}
+ 				<#else>
+ 	lengthInBits += m.${simpleField.name?cap_first}.LengthInBits()
+ 				</#if>
+ 				<#break>
+ 			<#case "switch">
+ 				<#assign switchField = field>
+ 
+ 	// Length of sub-type elements will be added by sub-type...
+ 	lengthInBits += m.Child.LengthInBits()
+ 				<#break>
+ 			<#case "virtual">
+ 				<#assign virtualField = field>
+ 
+ 	// A virtual field doesn't have any in- or output.
+ 				<#break>
+ 		</#switch>
+ 	</#list>
+ 
+ 	return lengthInBits
++>>>>>>> develop
  }
  
  func (m *${type.name}) LengthInBytes() uint16 {
@@@ -345,331 -338,327 +476,655 @@@
  }
  
  func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>*</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (*<#if type.parentType?has_content>${type.parentType.name}<#else>${type.name}</#if>, error) {
++<<<<<<< HEAD
 +    <#if helper.requiresStartPosAndCurPos()>
 +    var startPos = io.GetPos()
 +    var curPos uint16
 +    </#if>
 +    <#list type.fields as field>
 +        <#switch field.typeName>
 +            <#case "array">
 +                <#assign arrayField = field>
 +
 +    // Array field (${arrayField.name})
 +            <#-- Only update curPos if the length expression uses it -->
 +                <#if arrayField.loopExpression.contains("curPos")>
 +    curPos = io.GetPos() - startPos
 +                </#if>
 +            <#-- If this is a count array, we can directly initialize an array with the given size -->
 +                <#if helper.isCountArrayField(field)>
 +    // Count array
 +    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
 +    for curItem := uint16(0); curItem < uint16(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}); curItem++ {
 +                    <#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>
 +        lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} - 1)
 +                    </#if>
 +        _item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list> [...]
 +        if _err != nil {
 +            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
 +        }
 +        ${arrayField.name}[curItem] = _item
 +    }
 +                <#-- In all other cases do we have to work with a list, that is later converted to an array -->
 +                <#elseif helper.isLengthArrayField(field)>
 +                <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
 +    // Length array
 +    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
 +    _${arrayField.name}Length := ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}
 +    _${arrayField.name}EndPos := io.GetPos() + uint16(_${arrayField.name}Length)
 +    for ;io.GetPos() < _${arrayField.name}EndPos; {
 +        _item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list> [...]
 +        if _err != nil {
 +            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
 +        }
 +        ${arrayField.name} = append(${arrayField.name}, _item)
 +                    <#-- After parsing, update the current position, but only if it's needed -->
 +                    <#if arrayField.loopExpression.contains("curPos")>
 +        curPos = io.GetPos() - startPos
 +                    </#if>
 +    }
 +                    <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
 +                <#elseif helper.isTerminatedArrayField(field)>
 +    // Terminated array
 +    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
 +    for ;!bool(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); {
 +        _item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list> [...]
 +        if _err != nil {
 +            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
 +        }
 +        ${arrayField.name} = append(${arrayField.name}, _item)
 +
 +                    <#-- After parsing, update the current position, but only if it's needed -->
 +                    <#if arrayField.loopExpression.contains("curPos")>
 +        curPos = io.GetPos() - startPos
 +                    </#if>
 +    }
 +                </#if>
 +                <#break>
 +            <#case "checksum">
 +                <#assign checksumField = field>
 +                <#assign simpleTypeReference = checksumField.type>
 +
 +    // Checksum Field (checksum)
 +    {
 +        checksum = ${helper.getNullValueForTypeReference(checksumField.type)}
 +        // Create an array of all the bytes read in this message element so far.
 +        checksumRawData := io.getBytes(startPos, io.GetPos())
 +        checksumRef, _checksumRefErr := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
 +        if _checksumRefErr != nil {
 +            return nil, errors.New("Error parsing 'checksum' field " + _checksumRefErr.Error())
 +        }
 +        checksum, _checksumErr = ${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)}
 +        if _checksumErr != nil {
 +            return nil, errors.New("Error parsing 'checksum' field " + _checksumErr.Error())
 +        }
 +        if checksum != checksumRef {
 +            return nil, errors.New("Checksum verification failed. Expected " + (checksumRef & 0xFFFF) + " but got " + (checksum & 0xFFFF)")
 +        }
 +    }
 +                <#break>
 +            <#case "const">
 +                <#assign constField = field>
 +                <#assign simpleTypeReference = constField.type>
 +
 +    // Const Field (${constField.name})
 +    ${constField.name}, _${constField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
 +    if _${constField.name}Err != nil {
 +        return nil, errors.New("Error parsing '${constField.name}' field " + _${constField.name}Err.Error())
 +    }
 +    if ${constField.name} != ${type.name}_${constField.name?upper_case} {
 +        return nil, errors.New("Expected constant value " + strconv.Itoa(int(${type.name}_${constField.name?upper_case})) + " but got " + strconv.Itoa(int(${constField.name})))
 +    }
 +                <#break>
 +            <#case "discriminator">
 +                <#assign discriminatorField = field>
 +                <#assign simpleTypeReference = discriminatorField.type>
 +
 +    // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
 +            <#if helper.isEnumField(field)>
 +    ${helper.getVariableName(field)}, _${discriminatorField.name}Err := ${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type))}
 +            <#else>
 +    ${helper.getVariableName(field)}, _${discriminatorField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
 +            </#if>
 +    if _${discriminatorField.name}Err != nil {
 +        return nil, errors.New("Error parsing '${discriminatorField.name}' field " + _${discriminatorField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "enum">
 +                <#assign enumField = field>
 +
 +    // Enum field (${enumField.name})
 +    ${enumField.name}, _${enumField.name}Err := ${helper.getLanguageTypeNameForField(field)}Parse(io)
 +    if _${enumField.name}Err != nil {
 +        return nil, errors.New("Error parsing '${enumField.name}' field " + _${enumField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "implicit">
 +                <#assign implicitField = field>
 +                <#assign simpleTypeReference = implicitField.type>
 +
 +    // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
 +    ${helper.getVariableName(field)}, _${implicitField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
 +    if _${implicitField.name}Err != nil {
 +        return nil, errors.New("Error parsing '${implicitField.name}' field " + _${implicitField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "manualArray">
 +                <#assign manualArrayField = field>
 +
 +    // Manual Array Field (${manualArrayField.name})
 +            <#-- Only update curPos if the length expression uses it -->
 +                <#if manualArrayField.loopExpression.contains("curPos")>
 +    curPos = io.GetPos() - startPos
 +                </#if>
 +            <#-- If this is a count array, we can directly initialize an array with the given size -->
 +                <#if helper.isCountArrayField(field)>
 +    // Count array
 +    _${manualArrayField.name}Count := ${helper.toParseExpression(manualArrayField, manualArrayField.loopExpression, type.parserArguments)}
 +    ${helper.getLanguageTypeNameForField(field)}[] ${manualArrayField.name} = new ${helper.getLanguageTypeNameForField(field)}[_${manualArrayField.name}Count]
 +    for i := 0; i < _${manualArrayField.name}Count; i++ {
 +        ${manualArrayField.name}[i] = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualArrayField, manualArrayField.parseExpression, type.parserArguments)})
 +    }
 +                <#-- In all other cases do we have to work with a list, that is later converted to an array -->
 +                <#else>
 +                <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
 +                    <#if helper.isLengthArrayField(field)>
 +    // Length array
 +    _${manualArrayField.name}Length := ${helper.toIntegerParseExpression(16, manualArrayField.loopExpression, type.parserArguments)}
 +    List<${helper.getLanguageTypeNameForField(manualArrayField)}> _${manualArrayField.name}List = new LinkedList<>()
 +    ${manualArrayField.name}EndPos := io.GetPos() + _${manualArrayField.name}Length
 +    for ;io.GetPos() < ${manualArrayField.name}EndPos; {
 +        _${manualArrayField.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualArrayField, manualArrayField.parseExpression, type.parserArguments)}))
 +                    <#-- After parsing, update the current position, but only if it's needed -->
 +                        <#if manualArrayField.loopExpression.contains("curPos")>
 +        curPos = io.GetPos() - startPos
 +                        </#if>
 +    }
 +                    <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
 +                    <#elseif helper.isTerminatedArrayField(field)>
 +    // Terminated array
 +    List<${helper.getLanguageTypeNameForField(manualArrayField)}> _${manualArrayField.name}List = new LinkedList<>()
 +    for ;!((boolean) (${helper.toParseExpression(manualArrayField, manualArrayField.loopExpression, type.parserArguments)})); {
 +        _${manualArrayField.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualArrayField, manualArrayField.parseExpression, type.parserArguments)}))
 +
 +                    <#-- After parsing, update the current position, but only if it's needed -->
 +                        <#if manualArrayField.loopExpression.contains("curPos")>
 +        curPos = io.GetPos() - startPos
 +                        </#if>
 +    }
 +                    </#if>
 +                <#--
 +                    Convert the list into an array. However if the array is of a primitive
 +                    type we have to iterate over it's elements and explicitly cast them.
 +                    Otherwise a simple toArray call is fine.
 +                -->
 +                    <#if helper.isSimpleTypeReference(field.type)>
 +    ${helper.getLanguageTypeNameForField(field)}[] ${manualArrayField.name} = new ${helper.getLanguageTypeNameForField(field)}[_${manualArrayField.name}List.size()]
 +    for i := 0; i < _${manualArrayField.name}List.size(); i++ {
 +        ${manualArrayField.name}[i] = (${helper.getLanguageTypeNameForField(field)}) _${manualArrayField.name}List.get(i)
 +    }
 +                    <#else>
 +    ${helper.getLanguageTypeNameForField(field)}[] ${manualArrayField.name} = _${manualArrayField.name}List.toArray(new ${helper.getLanguageTypeNameForField(manualArrayField)}[0])
 +                    </#if>
 +                </#if>
 +                <#break>
 +            <#case "manual">
 +                <#assign manualField = field>
 +
 +    // Manual Field (${manualField.name})
 +    ${manualField.name}, _${manualField.name}Err = ${helper.toParseExpression(manualField, manualField.parseExpression, type.parserArguments)}
 +    if _${implicitField.name}Err != nil {
 +        return nil, errors.New("Error parsing '${manualField.name}' field " + _${manualField.name}Err.Error())
 +    }
 +            <#break>
 +            <#case "optional">
 +                <#assign optionalField = field>
 +
 +    // Optional Field (${optionalField.name}) (Can be skipped, if a given expression evaluates to false)
 +                <#if optionalField.conditionExpression.contains("curPos")>
 +    curPos = io.GetPos() - startPos
 +                </#if>
 +    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
 +    if ${helper.toBooleanParseExpression(optionalField.conditionExpression, type.parserArguments)} {
 +            <#if helper.isSimpleTypeReference(optionalField.type)>
 +        _val, _err := ${helper.getReadBufferReadMethodCall(optionalField.type)}
 +        if _err != nil {
 +            return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
 +        }
 +        ${optionalField.name} = &_val
 +            <#elseif helper.isEnumField(field)>
 +        _val, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io)
 +        if _err != nil {
 +            return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
 +        }
 +        ${optionalField.name} = &_val
 +            <#else>
 +        _val, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.toTypedParseExpression(helper.getArgumentType(optionalField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
 +        if _err != nil {
 +            return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
 +        }
 +        ${optionalField.name} = _val
 +            </#if>
 +    }
 +                <#break>
 +            <#case "padding">
 +                <#assign paddingField = field>
 +                <#assign simpleTypeReference = paddingField.type>
 +
 +    // Padding Field (padding)
 +    {
 +        _timesPadding := (${helper.toParseExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
 +        for ;(io.HasMore(${helper.getNumBits(simpleTypeReference)})) && (_timesPadding > 0);_timesPadding-- {
 +            // Just read the padding data and ignore it
 +            _, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
 +            if _err != nil {
 +                return nil, errors.New("Error parsing 'padding' field " + _err.Error())
 +            }
 +        }
 +    }
 +                <#break>
 +            <#case "reserved">
 +                <#assign reservedField = field>
 +                <#assign simpleTypeReference = reservedField.type>
 +
 +    // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 +    {
 +        reserved, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
 +        if _err != nil {
 +            return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
 +        }
 +        if reserved != ${helper.getReservedValue(reservedField)} {
 +            log.WithFields(log.Fields{
 +                "expected value": ${helper.getReservedValue(reservedField)},
 +                "got value": reserved,
 +            }).Info("Got unexpected response.")
 +        }
 +    }
 +                <#break>
 +            <#case "simple">
 +                <#assign simpleField = field>
 +
 +    // Simple Field (${simpleField.name})
 +    ${simpleField.name}, _${simpleField.name}Err := <#if helper.isSimpleTypeReference(simpleField.type)>${helper.getReadBufferReadMethodCall(simpleField.type)}<#else>${simpleField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(simpleField.type, parserArgument?index), parserArgument, type.parserA [...]
 +    if _${simpleField.name}Err != nil {
 +            <#if helper.isEnumField(field)>
 +        return nil, errors.New("Error parsing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
 +            <#else>
 +        return nil, errors.New("Error parsing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
 +            </#if>
 +    }
 +                <#break>
 +
 +            <#case "switch">
 +                <#assign switchField = field>
 +
 +    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 +    var _parent *${type.name}
 +    var typeSwitchError error
 +    switch {
 +                <#list switchField.cases as case>
 +    <#if case.discriminatorValues?has_content>case <#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#sep> && </#sep></#list></#if>:
 +        _parent, typeSwitchError = ${case.name}Parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${parserArgument.name}<#sep>, </#sep></#list></#if>)
 +                </#list>
 +    }
 +    if typeSwitchError != nil {
 +        return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
 +    }
 +                <#break>
 +
 +            <#case "virtual">
 +                <#assign virtualField = field>
 +
 +    // Virtual field (Just declare a local variable so we can access it in the parser)
 +    ${virtualField.name}, _${virtualField.name}Err := ${helper.toParseExpression(virtualField, virtualField.valueExpression, type.parserArguments)}
 +    if _${virtualField.name}Err != nil {
 +        return nil, errors.New("Error parsing '${virtualField.name}' field " + _${virtualField.name}Err.Error())
 +    }
 +                <#break>
 +        </#switch>
 +    </#list>
 +
 +    <#if helper.isDiscriminatedParentTypeDefinition()>
 +    // Finish initializing
 +    _parent.Child.InitializeParent(_parent<#if type.propertyFields?has_content>, <#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list></#if>)
 +    return _parent, nil
 +    <#elseif type.parentType?has_content>
 +    // Create a partially initialized instance
 +    _child := &${type.name}{
 +        <#list type.propertyFields as field>
 +        ${field.name?cap_first}: ${field.name},
 +        </#list>
 +        Parent: &${type.parentType.name}{},
 +    }
 +    _child.Parent.Child = _child
 +    return _child.Parent, nil
 +    <#else>
 +    // Create the instance
 +    return New${type.name}(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>), nil
 +    </#if>
++=======
+ 	<#if helper.requiresStartPosAndCurPos()>
+ 	var startPos = io.GetPos()
+ 	var curPos uint16
+ 	</#if>
+ 	<#list type.fields as field>
+ 		<#switch field.typeName>
+ 			<#case "array">
+ 				<#assign arrayField = field>
+ 
+ 	// Array field (${arrayField.name})
+ 			<#-- Only update curPos if the length expression uses it -->
+ 				<#if arrayField.loopExpression.contains("curPos")>
+ 	curPos = io.GetPos() - startPos
+ 				</#if>
+ 			<#-- If this is a count array, we can directly initialize an array with the given size -->
+ 				<#if helper.isCountArrayField(field)>
+ 	// Count array
+ 	${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+ 	for curItem := uint16(0); curItem < uint16(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}); curItem++ {
+ 					<#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>
+ 		lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} - 1)
+ 					</#if>
+ 		_item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)</#if>
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+ 		}
+ 		${arrayField.name}[curItem] = _item
+ 	}
+ 				<#-- In all other cases do we have to work with a list, that is later converted to an array -->
+ 				<#elseif helper.isLengthArrayField(field)>
+ 				<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
+ 	// Length array
+ 	${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
+ 	_${arrayField.name}Length := ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}
+ 	_${arrayField.name}EndPos := io.GetPos() + uint16(_${arrayField.name}Length)
+ 	for ;io.GetPos() < _${arrayField.name}EndPos; {
+ 		_item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)</#if>
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+ 		}
+ 		${arrayField.name} = append(${arrayField.name}, _item)
+ 					<#-- After parsing, update the current position, but only if it's needed -->
+ 					<#if arrayField.loopExpression.contains("curPos")>
+ 		curPos = io.GetPos() - startPos
+ 					</#if>
+ 	}
+ 					<#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
+ 				<#elseif helper.isTerminatedArrayField(field)>
+ 	// Terminated array
+ 	${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
+ 	for ;!bool(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); {
+ 		_item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)</#if>
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+ 		}
+ 		${arrayField.name} = append(${arrayField.name}, _item)
+ 
+ 					<#-- After parsing, update the current position, but only if it's needed -->
+ 					<#if arrayField.loopExpression.contains("curPos")>
+ 		curPos = io.GetPos() - startPos
+ 					</#if>
+ 	}
+ 				</#if>
+ 				<#break>
+ 			<#case "checksum">
+ 				<#assign checksumField = field>
+ 				<#assign simpleTypeReference = checksumField.type>
+ 
+ 	// Checksum Field (checksum)
+ 	{
+ 		checksum = ${helper.getNullValueForTypeReference(checksumField.type)}
+ 		// Create an array of all the bytes read in this message element so far.
+ 		checksumRawData := io.getBytes(startPos, io.GetPos())
+ 		checksumRef, _checksumRefErr := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+ 		if _checksumRefErr != nil {
+ 			return nil, errors.New("Error parsing 'checksum' field " + _checksumRefErr.Error())
+ 		}
+ 		checksum, _checksumErr = ${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)}
+ 		if _checksumErr != nil {
+ 			return nil, errors.New("Error parsing 'checksum' field " + _checksumErr.Error())
+ 		}
+ 		if checksum != checksumRef {
+ 			return nil, errors.New("Checksum verification failed. Expected " + (checksumRef & 0xFFFF) + " but got " + (checksum & 0xFFFF)")
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "const">
+ 				<#assign constField = field>
+ 				<#assign simpleTypeReference = constField.type>
+ 
+ 	// Const Field (${constField.name})
+ 	${constField.name}, _${constField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+ 	if _${constField.name}Err != nil {
+ 		return nil, errors.New("Error parsing '${constField.name}' field " + _${constField.name}Err.Error())
+ 	}
+ 	if ${constField.name} != ${type.name}_${constField.name?upper_case} {
+ 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(${type.name}_${constField.name?upper_case})) + " but got " + strconv.Itoa(int(${constField.name})))
+ 	}
+ 				<#break>
+ 			<#case "discriminator">
+ 				<#assign discriminatorField = field>
+ 				<#assign simpleTypeReference = discriminatorField.type>
+ 
+ 	// Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
+ 	${helper.getVariableName(field)}, _${discriminatorField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+ 	if _${discriminatorField.name}Err != nil {
+ 		return nil, errors.New("Error parsing '${discriminatorField.name}' field " + _${discriminatorField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "enum">
+ 				<#assign enumField = field>
+ 
+ 	// Enum field (${enumField.name})
+ 	${enumField.name}, _${enumField.name}Err := ${helper.getLanguageTypeNameForField(field)}Parse(io)
+ 	if _${enumField.name}Err != nil {
+ 		return nil, errors.New("Error parsing '${enumField.name}' field " + _${enumField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "implicit">
+ 				<#assign implicitField = field>
+ 				<#assign simpleTypeReference = implicitField.type>
+ 
+ 	// Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ 	${helper.getVariableName(field)}, _${implicitField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+ 	if _${implicitField.name}Err != nil {
+ 		return nil, errors.New("Error parsing '${implicitField.name}' field " + _${implicitField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "manualArray">
+ 				<#assign manualArrayField = field>
+ 
+ 	// Manual Array Field (${manualArrayField.name})
+ 			<#-- Only update curPos if the length expression uses it -->
+ 				<#if manualArrayField.loopExpression.contains("curPos")>
+ 	curPos = io.GetPos() - startPos
+ 				</#if>
+ 			<#-- If this is a count array, we can directly initialize an array with the given size -->
+ 				<#if helper.isCountArrayField(field)>
+ 	// Count array
+ 	_${manualArrayField.name}Count := ${helper.toParseExpression(manualArrayField, manualArrayField.loopExpression, type.parserArguments)}
+ 	${helper.getLanguageTypeNameForField(field)}[] ${manualArrayField.name} = new ${helper.getLanguageTypeNameForField(field)}[_${manualArrayField.name}Count]
+ 	for i := 0; i < _${manualArrayField.name}Count; i++ {
+ 		${manualArrayField.name}[i] = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualArrayField, manualArrayField.parseExpression, type.parserArguments)})
+ 	}
+ 				<#-- In all other cases do we have to work with a list, that is later converted to an array -->
+ 				<#else>
+ 				<#-- For a length array, we read data till the read position of the buffer reaches a given position -->
+ 					<#if helper.isLengthArrayField(field)>
+ 	// Length array
+ 	_${manualArrayField.name}Length := ${helper.toIntegerParseExpression(16, manualArrayField.loopExpression, type.parserArguments)}
+ 	List<${helper.getLanguageTypeNameForField(manualArrayField)}> _${manualArrayField.name}List = new LinkedList<>()
+ 	${manualArrayField.name}EndPos := io.GetPos() + _${manualArrayField.name}Length
+ 	for ;io.GetPos() < ${manualArrayField.name}EndPos; {
+ 		_${manualArrayField.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualArrayField, manualArrayField.parseExpression, type.parserArguments)}))
+ 					<#-- After parsing, update the current position, but only if it's needed -->
+ 						<#if manualArrayField.loopExpression.contains("curPos")>
+ 		curPos = io.GetPos() - startPos
+ 						</#if>
+ 	}
+ 					<#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
+ 					<#elseif helper.isTerminatedArrayField(field)>
+ 	// Terminated array
+ 	List<${helper.getLanguageTypeNameForField(manualArrayField)}> _${manualArrayField.name}List = new LinkedList<>()
+ 	for ;!((boolean) (${helper.toParseExpression(manualArrayField, manualArrayField.loopExpression, type.parserArguments)})); {
+ 		_${manualArrayField.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualArrayField, manualArrayField.parseExpression, type.parserArguments)}))
+ 
+ 					<#-- After parsing, update the current position, but only if it's needed -->
+ 						<#if manualArrayField.loopExpression.contains("curPos")>
+ 		curPos = io.GetPos() - startPos
+ 						</#if>
+ 	}
+ 					</#if>
+ 				<#--
+ 					Convert the list into an array. However if the array is of a primitive
+ 					type we have to iterate over it's elements and explicitly cast them.
+ 					Otherwise a simple toArray call is fine.
+ 				-->
+ 					<#if helper.isSimpleTypeReference(field.type)>
+ 	${helper.getLanguageTypeNameForField(field)}[] ${manualArrayField.name} = new ${helper.getLanguageTypeNameForField(field)}[_${manualArrayField.name}List.size()]
+ 	for i := 0; i < _${manualArrayField.name}List.size(); i++ {
+ 		${manualArrayField.name}[i] = (${helper.getLanguageTypeNameForField(field)}) _${manualArrayField.name}List.get(i)
+ 	}
+ 					<#else>
+ 	${helper.getLanguageTypeNameForField(field)}[] ${manualArrayField.name} = _${manualArrayField.name}List.toArray(new ${helper.getLanguageTypeNameForField(manualArrayField)}[0])
+ 					</#if>
+ 				</#if>
+ 				<#break>
+ 			<#case "manual">
+ 				<#assign manualField = field>
+ 
+ 	// Manual Field (${manualField.name})
+ 	${manualField.name}, _${manualField.name}Err = ${helper.toParseExpression(manualField, manualField.parseExpression, type.parserArguments)}
+ 	if _${implicitField.name}Err != nil {
+ 		return nil, errors.New("Error parsing '${manualField.name}' field " + _${manualField.name}Err.Error())
+ 	}
+ 			<#break>
+ 			<#case "optional">
+ 				<#assign optionalField = field>
+ 
+ 	// Optional Field (${optionalField.name}) (Can be skipped, if a given expression evaluates to false)
+ 				<#if optionalField.conditionExpression.contains("curPos")>
+ 	curPos = io.GetPos() - startPos
+ 				</#if>
+ 	var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
+ 	if ${helper.toBooleanParseExpression(optionalField.conditionExpression, type.parserArguments)} {
+ 			<#if helper.isSimpleTypeReference(optionalField.type)>
+ 		_val, _err := ${helper.getReadBufferReadMethodCall(optionalField.type)}
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
+ 		}
+ 		${optionalField.name} = &_val
+ 			<#elseif helper.isEnumField(field)>
+ 		_val, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io)
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
+ 		}
+ 		${optionalField.name} = &_val
+ 			<#else>
+ 		_val, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.toTypedParseExpression(helper.getArgumentType(optionalField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
+ 		}
+ 		${optionalField.name} = _val
+ 			</#if>
+ 	}
+ 				<#break>
+ 			<#case "padding">
+ 				<#assign paddingField = field>
+ 				<#assign simpleTypeReference = paddingField.type>
+ 
+ 	// Padding Field (padding)
+ 	{
+ 		_timesPadding := (${helper.toParseExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
+ 		for ;(io.HasMore(${helper.getNumBits(simpleTypeReference)})) && (_timesPadding > 0);_timesPadding-- {
+ 			// Just read the padding data and ignore it
+ 			_, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+ 			if _err != nil {
+ 				return nil, errors.New("Error parsing 'padding' field " + _err.Error())
+ 			}
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "reserved">
+ 				<#assign reservedField = field>
+ 				<#assign simpleTypeReference = reservedField.type>
+ 
+ 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+ 	{
+ 		reserved, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+ 		if _err != nil {
+ 			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+ 		}
+ 		if ${helper.toTypeSafeCompare(reservedField)} {
+ 			log.Info().Fields(map[string]interface{}{
+ 				"expected value": ${helper.getReservedValue(reservedField)},
+ 				"got value": reserved,
+ 			}).Msg("Got unexpected response.")
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "simple">
+ 				<#assign simpleField = field>
+ 
+ 	// Simple Field (${simpleField.name})
+ 	${simpleField.name}, _${simpleField.name}Err := <#if helper.isSimpleTypeReference(simpleField.type)>${helper.getReadBufferReadMethodCall(simpleField.type)}<#else>${simpleField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*<#elseif helper.needsReferenceForParserArgument(parserArgument.name, helper.getArgumentType(simpleField.type, parserArgument?index))> [...]
+ 	if _${simpleField.name}Err != nil {
+ 			<#if helper.isEnumField(field)>
+ 		return nil, errors.New("Error parsing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
+ 			<#else>
+ 		return nil, errors.New("Error parsing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
+ 			</#if>
+ 	}
+ 				<#break>
+ 
+ 			<#case "switch">
+ 				<#assign switchField = field>
+ 
+ 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+ 	var _parent *${type.name}
+ 	var typeSwitchError error
+ 	switch {
+ 				<#list switchField.cases as case>
+ 	<#if case.discriminatorValues?has_content>case <#list case.discriminatorValues as discriminatorValue><#if helper.isEnumExpression(discriminatorValue)>*</#if>${helper.toParseExpression(null, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == <#if helper.isEnumExpression(discriminatorValue)>${helper.getEnumExpression(discriminatorValue)}<#else>${discriminatorValue}</#if><#sep> && </#sep></#list></#if>:
+ 		_parent, typeSwitchError = ${case.name}Parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+ 				</#list>
+ 	}
+ 	if typeSwitchError != nil {
+ 		return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+ 	}
+ 				<#break>
+ 
+ 			<#case "virtual">
+ 				<#assign virtualField = field>
+ 
+ 	// Virtual field (Just declare a local variable so we can access it in the parser)
+ 	${virtualField.name}, _${virtualField.name}Err := ${helper.toParseExpression(virtualField, virtualField.valueExpression, type.parserArguments)}
+ 	if _${virtualField.name}Err != nil {
+ 		return nil, errors.New("Error parsing '${virtualField.name}' field " + _${virtualField.name}Err.Error())
+ 	}
+ 				<#break>
+ 		</#switch>
+ 	</#list>
+ 
+ 	<#if helper.isDiscriminatedParentTypeDefinition()>
+ 	// Finish initializing
+ 	_parent.Child.InitializeParent(_parent<#if type.propertyFields?has_content>, <#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list></#if>)
+ 	return _parent, nil
+ 	<#elseif type.parentType?has_content>
+ 	// Create a partially initialized instance
+ 	_child := &${type.name}{
+ 		<#list type.propertyFields as field>
+ 		${field.name?cap_first}: ${field.name},
+ 		</#list>
+ 		Parent: &${type.parentType.name}{},
+ 	}
+ 	_child.Parent.Child = _child
+ 	return _child.Parent, nil
+ 	<#else>
+ 	// Create the instance
+ 	return New${type.name}(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>), nil
+ 	</#if>
++>>>>>>> develop
  }
  
  <#if helper.isDiscriminatedParentTypeDefinition()>
@@@ -681,217 -670,213 +1136,427 @@@ func (m *${type.name}) SerializeParent(
  <#else>
  func (m *${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) error {
  </#if>
++<<<<<<< HEAD
 +    <#assign arraySizeInBytesHelpers=helper.requiresHelperFunctions("ARRAY_SIZE_IN_BYTES")>
 +    <#if arraySizeInBytesHelpers?has_content>
 +        <#list arraySizeInBytesHelpers?keys as key>
 +            <#assign typeName=arraySizeInBytesHelpers[key]>
 +    ${key}ArraySizeInBytes := func(items []*${typeName}) uint32 {
 +        var sizeInBytes uint32 = 0
 +        for _, v := range items {
 +            sizeInBytes += uint32(v.LengthInBytes())
 +        }
 +        return sizeInBytes
 +    }
 +        </#list>
 +    </#if>
 +    <#if helper.isDiscriminatedChildTypeDefinition()>
 +    ser := func() error {
 +    </#if>
 +    <#list type.fields as field>
 +        <#switch field.typeName>
 +            <#case "array">
 +                <#assign arrayField = field>
 +                <#assign simpleTypeReference = arrayField.type>
 +
 +    // Array Field (${arrayField.name})
 +    if m.${arrayField.name?cap_first} != nil {
 +                <#if helper.isComplexTypeReference(arrayField.type) && (helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true))>
 +        itemCount := uint16(len(m.${arrayField.name?cap_first}))
 +        var curItem uint16 = 0
 +                </#if>
 +        for _, _element := range m.${arrayField.name?cap_first} {
 +                <#if helper.isSimpleTypeReference(arrayField.type)>
 +                    <#assign simpleTypeReference = arrayField.type>
 +            _elementErr := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
 +                <#else>
 +                    <#assign complexTypeReference = arrayField.type>
 +                    <#if helper.needsVariable(arrayField, "lastItem", true)>
 +            var lastItem bool = curItem == (itemCount - 1)
 +                    </#if>
 +            _elementErr := _element.Serialize(io<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
 +                </#if>
 +            if _elementErr != nil {
 +                return errors.New("Error serializing '${arrayField.name}' field " + _elementErr.Error())
 +            }
 +                <#if helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true)>
 +            curItem++
 +                </#if>
 +        }
 +    }
 +                <#break>
 +            <#case "checksum">
 +                <#assign checksumField = field>
 +                <#assign simpleTypeReference = checksumField.type>
 +
 +    // Checksum Field (checksum) (Calculated)
 +    {
 +        _checksum := ${helper.getLanguageTypeNameForField(field)}(${helper.getNullValueForTypeReference(checksumField.type)})
 +        // Create an array of all the bytes written in this message element so far.
 +        checksumRawData []uint8 = io.getBytes(startPos, io.GetPos())
 +        _checksum = ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
 +        _checksumErr := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")}
 +        if _elementErr != nil {
 +            return errors.New("Error serializing 'checksum' field " + _elementErr.Error())
 +        }
 +    }
 +                <#break>
 +            <#case "const">
 +                <#assign constField = field>
 +                <#assign simpleTypeReference = constField.type>
 +
 +    // Const Field (${constField.name})
 +    _${constField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)}
 +    if _${constField.name}Err != nil {
 +        return errors.New("Error serializing '${constField.name}' field " + _${constField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "discriminator">
 +                <#assign discriminatorField = field>
 +                <#assign simpleTypeReference = discriminatorField.type>
 +
 +    // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
 +    ${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(child.${discriminatorField.name?cap_first}())
 +             <#if helper.isEnumField(field)>
 +     _${discriminatorField.name}Err := ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type), "(" + discriminatorField.name + ")")}
 +            <#else>
 +    _${discriminatorField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
 +            </#if>
 +    if _${discriminatorField.name}Err != nil {
 +        return errors.New("Error serializing '${discriminatorField.name}' field " + _${discriminatorField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "enum">
 +                <#assign enumField = field>
 +
 +    // Enum field (${enumField.name})
 +    ${enumField.name} := Cast${helper.getLanguageTypeNameForField(field)}(m.${enumField.name?cap_first})
 +    _${enumField.name}Err := ${enumField.name}.Serialize(io)
 +    if _${enumField.name}Err != nil {
 +        return errors.New("Error serializing '${enumField.name}' field " + _${enumField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "implicit">
 +                <#assign implicitField = field>
 +                <#assign simpleTypeReference = implicitField.type>
 +
 +    // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
 +    ${implicitField.name} := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)})
 +    _${implicitField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")}
 +    if _${implicitField.name}Err != nil {
 +        return errors.New("Error serializing '${implicitField.name}' field " + _${implicitField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "manualArray">
 +                <#assign manualArrayField = field>
 +
 +    // Manual Array Field (${manualArrayField.name})
 +    if m.${manualArrayField.name?cap_first} != nil {
 +        for(${helper.getLanguageTypeNameForField(field)} element : m.${manualArrayField.name?cap_first}) {
 +            ${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)}
 +        }
 +    }
 +                <#break>
 +            <#case "manual">
 +                <#assign manualField = field>
 +
 +    // Manual Field (${manualField.name})
 +    ${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)}
 +                <#break>
 +            <#case "optional">
 +                <#assign optionalField = field>
 +
 +    // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
 +    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
 +    if m.${optionalField.name?cap_first} != nil {
 +                <#if helper.isSimpleTypeReference(optionalField.type)>
 +                    <#assign simpleTypeReference = optionalField.type>
 +        ${optionalField.name} = m.${optionalField.name?cap_first}
 +        _${optionalField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "*(" + optionalField.name + ")")}
 +                <#else>
 +                    <#assign complexTypeReference = optionalField.type>
 +        ${optionalField.name} = m.${optionalField.name?cap_first}
 +        _${optionalField.name}Err := ${optionalField.name}.Serialize(io)
 +                </#if>
 +        if _${optionalField.name}Err != nil {
 +            return errors.New("Error serializing '${optionalField.name}' field " + _${optionalField.name}Err.Error())
 +        }
 +    }
 +                <#break>
 +            <#case "padding">
 +                <#assign paddingField = field>
 +                <#assign simpleTypeReference = paddingField.type>
 +
 +    // Padding Field (padding)
 +    {
 +        _timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
 +        for ;_timesPadding > 0; _timesPadding-- {
 +            _paddingValue := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)})
 +            _paddingErr := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")}
 +            if _paddingErr != nil {
 +                return errors.New("Error serializing 'padding' field " + _paddingErr.Error())
 +            }
 +        }
 +    }
 +                <#break>
 +            <#case "reserved">
 +                <#assign reservedField = field>
 +                <#assign simpleTypeReference = reservedField.type>
 +
 +    // Reserved Field (reserved)
 +    {
 +        _err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
 +        if _err != nil {
 +            return errors.New("Error serializing 'reserved' field " + _err.Error())
 +        }
 +    }
 +                <#break>
 +            <#case "simple">
 +                <#assign simpleField = field>
 +
 +    // Simple Field (${simpleField.name})
 +                <#if helper.isSimpleTypeReference(simpleField.type)>
 +                    <#assign simpleTypeReference = simpleField.type>
 +    ${simpleField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name?cap_first})
 +    _${simpleField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
 +                <#else>
 +                    <#assign complexTypeReference = simpleField.type>
 +    _${simpleField.name}Err := m.${simpleField.name?cap_first}.Serialize(io)
 +                </#if>
 +    if _${simpleField.name}Err != nil {
 +        return errors.New("Error serializing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
 +    }
 +                <#break>
 +            <#case "switch">
 +                <#assign switchField = field>
 +
 +    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
 +    _typeSwitchErr := serializeChildFunction()
 +    if _typeSwitchErr != nil {
 +        return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
 +    }
 +                <#break>
 +            <#case "virtual">
 +                <#break>
 +        </#switch>
 +    </#list>
 +
 +    <#if helper.isDiscriminatedChildTypeDefinition()>
 +        return nil
 +    }
 +    return m.Parent.SerializeParent(io, m, ser)
 +    <#else>
 +    return nil
 +    </#if>
++=======
+ 	<#assign arraySizeInBytesHelpers=helper.requiresHelperFunctions("ARRAY_SIZE_IN_BYTES")>
+ 	<#if arraySizeInBytesHelpers?has_content>
+ 		<#list arraySizeInBytesHelpers?keys as key>
+ 			<#assign typeName=arraySizeInBytesHelpers[key]>
+ 	${key}ArraySizeInBytes := func(items []*${typeName}) uint32 {
+ 		var sizeInBytes uint32 = 0
+ 		for _, v := range items {
+ 			sizeInBytes += uint32(v.LengthInBytes())
+ 		}
+ 		return sizeInBytes
+ 	}
+ 		</#list>
+ 	</#if>
+ 	<#if helper.isDiscriminatedChildTypeDefinition()>
+ 	ser := func() error {
+ 	</#if>
+ 	<#list type.fields as field>
+ 		<#switch field.typeName>
+ 			<#case "array">
+ 				<#assign arrayField = field>
+ 				<#assign simpleTypeReference = arrayField.type>
+ 
+ 	// Array Field (${arrayField.name})
+ 	if m.${arrayField.name?cap_first} != nil {
+ 				<#if helper.isComplexTypeReference(arrayField.type) && (helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true))>
+ 		itemCount := uint16(len(m.${arrayField.name?cap_first}))
+ 		var curItem uint16 = 0
+ 				</#if>
+ 		for _, _element := range m.${arrayField.name?cap_first} {
+ 				<#if helper.isSimpleTypeReference(arrayField.type)>
+ 					<#assign simpleTypeReference = arrayField.type>
+ 			_elementErr := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
+ 				<#else>
+ 					<#assign complexTypeReference = arrayField.type>
+ 					<#if helper.needsVariable(arrayField, "lastItem", true)>
+ 			var lastItem bool = curItem == (itemCount - 1)
+ 					</#if>
+ 			_elementErr := _element.Serialize(io<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+ 				</#if>
+ 			if _elementErr != nil {
+ 				return errors.New("Error serializing '${arrayField.name}' field " + _elementErr.Error())
+ 			}
+ 				<#if helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true)>
+ 			curItem++
+ 				</#if>
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "checksum">
+ 				<#assign checksumField = field>
+ 				<#assign simpleTypeReference = checksumField.type>
+ 
+ 	// Checksum Field (checksum) (Calculated)
+ 	{
+ 		_checksum := ${helper.getLanguageTypeNameForField(field)}(${helper.getNullValueForTypeReference(checksumField.type)})
+ 		// Create an array of all the bytes written in this message element so far.
+ 		checksumRawData []uint8 = io.getBytes(startPos, io.GetPos())
+ 		_checksum = ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
+ 		_checksumErr := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")}
+ 		if _elementErr != nil {
+ 			return errors.New("Error serializing 'checksum' field " + _elementErr.Error())
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "const">
+ 				<#assign constField = field>
+ 				<#assign simpleTypeReference = constField.type>
+ 
+ 	// Const Field (${constField.name})
+ 	_${constField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)}
+ 	if _${constField.name}Err != nil {
+ 		return errors.New("Error serializing '${constField.name}' field " + _${constField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "discriminator">
+ 				<#assign discriminatorField = field>
+ 				<#assign simpleTypeReference = discriminatorField.type>
+ 
+ 	// Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
+ 	${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(child.${discriminatorField.name?cap_first}())
+ 	_${discriminatorField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
+ 	if _${discriminatorField.name}Err != nil {
+ 		return errors.New("Error serializing '${discriminatorField.name}' field " + _${discriminatorField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "enum">
+ 				<#assign enumField = field>
+ 
+ 	// Enum field (${enumField.name})
+ 	${enumField.name} := Cast${helper.getLanguageTypeNameForField(field)}(m.${enumField.name?cap_first})
+ 	_${enumField.name}Err := ${enumField.name}.Serialize(io)
+ 	if _${enumField.name}Err != nil {
+ 		return errors.New("Error serializing '${enumField.name}' field " + _${enumField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "implicit">
+ 				<#assign implicitField = field>
+ 				<#assign simpleTypeReference = implicitField.type>
+ 
+ 	// Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+ 	${implicitField.name} := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)})
+ 	_${implicitField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")}
+ 	if _${implicitField.name}Err != nil {
+ 		return errors.New("Error serializing '${implicitField.name}' field " + _${implicitField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "manualArray">
+ 				<#assign manualArrayField = field>
+ 
+ 	// Manual Array Field (${manualArrayField.name})
+ 	if m.${manualArrayField.name?cap_first} != nil {
+ 		for(${helper.getLanguageTypeNameForField(field)} element : m.${manualArrayField.name?cap_first}) {
+ 			${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)}
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "manual">
+ 				<#assign manualField = field>
+ 
+ 	// Manual Field (${manualField.name})
+ 	${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)}
+ 				<#break>
+ 			<#case "optional">
+ 				<#assign optionalField = field>
+ 
+ 	// Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
+ 	var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
+ 	if m.${optionalField.name?cap_first} != nil {
+ 				<#if helper.isSimpleTypeReference(optionalField.type)>
+ 					<#assign simpleTypeReference = optionalField.type>
+ 		${optionalField.name} = m.${optionalField.name?cap_first}
+ 		_${optionalField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "*(" + optionalField.name + ")")}
+ 				<#else>
+ 					<#assign complexTypeReference = optionalField.type>
+ 		${optionalField.name} = m.${optionalField.name?cap_first}
+ 		_${optionalField.name}Err := ${optionalField.name}.Serialize(io)
+ 				</#if>
+ 		if _${optionalField.name}Err != nil {
+ 			return errors.New("Error serializing '${optionalField.name}' field " + _${optionalField.name}Err.Error())
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "padding">
+ 				<#assign paddingField = field>
+ 				<#assign simpleTypeReference = paddingField.type>
+ 
+ 	// Padding Field (padding)
+ 	{
+ 		_timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
+ 		for ;_timesPadding > 0; _timesPadding-- {
+ 			_paddingValue := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)})
+ 			_paddingErr := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")}
+ 			if _paddingErr != nil {
+ 				return errors.New("Error serializing 'padding' field " + _paddingErr.Error())
+ 			}
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "reserved">
+ 				<#assign reservedField = field>
+ 				<#assign simpleTypeReference = reservedField.type>
+ 
+ 	// Reserved Field (reserved)
+ 	{
+ 		_err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
+ 		if _err != nil {
+ 			return errors.New("Error serializing 'reserved' field " + _err.Error())
+ 		}
+ 	}
+ 				<#break>
+ 			<#case "simple">
+ 				<#assign simpleField = field>
+ 
+ 	// Simple Field (${simpleField.name})
+ 				<#if helper.isSimpleTypeReference(simpleField.type)>
+ 					<#assign simpleTypeReference = simpleField.type>
+ 	${simpleField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name?cap_first})
+ 	_${simpleField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
+ 				<#else>
+ 					<#assign complexTypeReference = simpleField.type>
+ 	_${simpleField.name}Err := m.${simpleField.name?cap_first}.Serialize(io)
+ 				</#if>
+ 	if _${simpleField.name}Err != nil {
+ 		return errors.New("Error serializing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
+ 	}
+ 				<#break>
+ 			<#case "switch">
+ 				<#assign switchField = field>
+ 
+ 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+ 	_typeSwitchErr := serializeChildFunction()
+ 	if _typeSwitchErr != nil {
+ 		return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
+ 	}
+ 				<#break>
+ 			<#case "virtual">
+ 				<#break>
+ 		</#switch>
+ 	</#list>
+ 
+ 	<#if helper.isDiscriminatedChildTypeDefinition()>
+ 		return nil
+ 	}
+ 	return m.Parent.SerializeParent(io, m, ser)
+ 	<#else>
+ 	return nil
+ 	</#if>
++>>>>>>> develop
  }
  
  func (m *${type.name}) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
diff --cc build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index 188e568,4a538c4..a3b3df7
--- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@@ -26,10 -26,8 +26,10 @@@ import org.apache.plc4x.plugins.codegen
  import org.apache.plc4x.plugins.codegenerator.types.fields.*;
  import org.apache.plc4x.plugins.codegenerator.types.references.*;
  import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
  
- import java.util.*;
+ import java.util.Map;
  import java.util.function.Function;
  
  @SuppressWarnings({"unused", "WeakerAccess"})
@@@ -77,10 -73,18 +77,24 @@@ public class JavaLanguageTemplateHelpe
          return getLanguageTypeNameForTypeReference(typeReference, false);
      }
  
+     public String adjustLiterals(String javaType, String value) {
+         switch (javaType) {
+             case "long":
+             case "Long":
+                 return value + "L";
+             default:
+                 return value;
+         }
+     }
+ 
      public String getLanguageTypeNameForTypeReference(TypeReference typeReference, boolean allowPrimitive) {
++<<<<<<< HEAD
 +        logger.debug("Getting name of Java class for given type reference");
 +        logger.debug("{}", typeReference.toString());
 +        if(typeReference instanceof SimpleTypeReference) {
++=======
+         if (typeReference instanceof SimpleTypeReference) {
++>>>>>>> develop
              SimpleTypeReference simpleTypeReference = (SimpleTypeReference) typeReference;
              switch (simpleTypeReference.getBaseType()) {
                  case BIT: {
diff --cc build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
index 184d99d,5df52aa..8bc6001
--- a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
@@@ -95,12 -95,7 +95,16 @@@ public<#if helper.isDiscriminatedParent
          <#if !helper.isNonDiscriminatorField(discriminatorName)>
      @JsonIgnore
      public ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} get${discriminatorName?cap_first}() {
++<<<<<<< HEAD
 +            <#if !helper.isComplexTypeReference(helper.getDiscriminatorTypes()[discriminatorName])>
 +                return <#if helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName]) = "String"><#if discriminatorValue??>"${discriminatorValue}"<#else>${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}</#if><#else><#if discriminatorValue??>${discriminatorValue}<#else>${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}</#if></#if>;
 +            <#else>
 +                return <#if helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName]) = "String"><#if discriminatorValue??>"${discriminatorValue}"<#else>${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}</#if><#else><#if discriminatorValue??>${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}.${discriminatorValue}<#else>${helper.getLanguageTypeNameForTypeReference(help [...]
 +            </#if>
 +
++=======
+         return <#if discriminatorValue??>${helper.adjustLiterals(helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName]),discriminatorValue)}<#else>${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}</#if>;
++>>>>>>> develop
      }
          </#if>
      </#list>
diff --cc protocols/ads/src/main/resources/protocols/ads/ads.mspec
index a89a279,99b4e24..fdffedc
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@@ -192,13 -192,13 +192,13 @@@
  
  [discriminatedType 'AdsData' [CommandId 'commandId', bit 'response']
      [typeSwitch 'commandId', 'response'
 -        ['CommandId.INVALID', 'false' AdsInvalidRequest]
 -        ['CommandId.INVALID', 'true' AdsInvalidResponse]
 +        ['INVALID', 'false' AdsInvalidRequest]
 +        ['INVALID', 'true' AdsInvalidResponse]
  
 -        ['CommandId.ADS_READ_DEVICE_INFO', 'false' AdsReadDeviceInfoRequest]
 -        ['CommandId.ADS_READ_DEVICE_INFO', 'true' AdsReadDeviceInfoResponse
 +        ['ADS_READ_DEVICE_INFO', 'false' AdsReadDeviceInfoRequest]
 +        ['ADS_READ_DEVICE_INFO', 'true' AdsReadDeviceInfoResponse
              // 4 bytes	ADS error number.
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
              // Version	1 byte	Major version number
              [simple uint 8  'majorVersion']
              // Version	1 byte	Minor version number
@@@ -217,9 -217,9 +217,9 @@@
              // 4 bytes	Length of the data (in bytes) which should be read.
              [simple uint 32 'length']
          ]
 -        ['CommandId.ADS_READ', 'true' AdsReadResponse
 +        ['ADS_READ', 'true' AdsReadResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
              // 4 bytes	Length of data which are supplied back.
              [implicit uint 32 'length' 'COUNT(data)']
              // n bytes	Data which are supplied back.
@@@ -236,15 -236,15 +236,15 @@@
              // n bytes	Data which are written in the ADS device.
              [array int 8 'data' count 'length']
          ]
 -        ['CommandId.ADS_WRITE', 'true' AdsWriteResponse
 +        ['ADS_WRITE', 'true' AdsWriteResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
          ]
  
 -        ['CommandId.ADS_READ_STATE', 'false' AdsReadStateRequest]
 -        ['CommandId.ADS_READ_STATE', 'true' AdsReadStateResponse
 +        ['ADS_READ_STATE', 'false' AdsReadStateRequest]
 +        ['ADS_READ_STATE', 'true' AdsReadStateResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
              // 2 bytes	New ADS status (see data type ADSSTATE of the ADS-DLL).
              [simple uint 16 'adsState']
              // 2 bytes	New device status.
@@@ -261,12 -261,12 +261,12 @@@
              // n bytes	Additional data which are sent to the ADS device
              [array int 8 'data' count 'length']
          ]
 -        ['CommandId.ADS_WRITE_CONTROL', 'true' AdsWriteControlResponse
 +        ['ADS_WRITE_CONTROL', 'true' AdsWriteControlResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
          ]
  
 -        ['CommandId.ADS_ADD_DEVICE_NOTIFICATION', 'false' AdsAddDeviceNotificationRequest
 +        ['ADS_ADD_DEVICE_NOTIFICATION', 'false' AdsAddDeviceNotificationRequest
              // 4 bytes	Index Group of the data, which should be sent per notification.
              [simple uint 32 'indexGroup']
              // 4 bytes	Index Offset of the data, which should be sent per notification.
@@@ -283,9 -283,9 +283,9 @@@
              // 16bytes	Must be set to 0
              [reserved   uint       128       '0x0000' ]
          ]
 -        ['CommandId.ADS_ADD_DEVICE_NOTIFICATION', 'true' AdsAddDeviceNotificationResponse
 +        ['ADS_ADD_DEVICE_NOTIFICATION', 'true' AdsAddDeviceNotificationResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
              // 4 bytes	Handle of notification
              [simple uint 32 'notificationHandle']
          ]
@@@ -294,12 -294,12 +294,12 @@@
              // 4 bytes	Handle of notification
              [simple uint 32 'notificationHandle']
          ]
 -        ['CommandId.ADS_DELETE_DEVICE_NOTIFICATION', 'true' AdsDeleteDeviceNotificationResponse
 +        ['ADS_DELETE_DEVICE_NOTIFICATION', 'true' AdsDeleteDeviceNotificationResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
          ]
  
 -        ['CommandId.ADS_DEVICE_NOTIFICATION', 'false' AdsDeviceNotificationRequest
 +        ['ADS_DEVICE_NOTIFICATION', 'false' AdsDeviceNotificationRequest
              // 4 bytes	Size of data in byte.
              [simple uint 32 'length']
              // 4 bytes	Number of elements of type AdsStampHeader.
@@@ -323,9 -323,9 +323,9 @@@
              // n bytes	Data which are written in the ADS device.
              [array int 8 'data' count 'writeLength - (COUNT(items) * 12)']
          ]
 -        ['CommandId.ADS_READ_WRITE', 'true' AdsReadWriteResponse
 +        ['ADS_READ_WRITE', 'true' AdsReadWriteResponse
              // 4 bytes	ADS error number
-             [enum ReturnCode 'result']
+             [simple ReturnCode 'result']
              // 4 bytes	Length of data in byte.
              [implicit uint 32 'length'  'COUNT(data)']
              // n bytes Additional data which are sent to the ADS device
@@@ -496,10 -497,10 +497,17 @@@
      ]
  ]
  
++<<<<<<< HEAD
 +[enum 'AdsDataType' [uint 8 'numBytes', string '-1' 'dataFormatName']
 +    [BOOL       ['1', 'IEC61131_BOOL']]
 +    [BIT        ['1', 'IEC61131_BOOL']]
 +    [BIT8       ['1', 'IEC61131_BOOL']]
++=======
+ [enum int 8 'AdsDataType' [uint 16 'numBytes', string 'dataFormatName']
+     ['0x01' BOOL       ['1', 'IEC61131_BOOL']]
+     ['0x02' BIT        ['1', 'IEC61131_BOOL']]
+     ['0x03' BIT8       ['1', 'IEC61131_BOOL']]
++>>>>>>> develop
      // -----------------------------------------
      // Bit-strings
      // -----------------------------------------
diff --cc protocols/knxnetip/src/main/xslt/knx-types.xsl
index b9c2ff5,088f016..32a1047
--- a/protocols/knxnetip/src/main/xslt/knx-types.xsl
+++ b/protocols/knxnetip/src/main/xslt/knx-types.xsl
@@@ -103,7 -103,7 +103,11 @@@
      <xsl:apply-templates select="knx:KNX/knx:MasterData/knx:InterfaceObjectProperties/knx:InterfaceObjectProperty"/>
  ]
  
++<<<<<<< HEAD
 +[enum uint 8 'KnxPropertyDataType' [uint 8 'number', uint 8 'sizeInBytes', string '-1' 'name']
++=======
+ [enum uint 6 'KnxPropertyDataType' [uint 8 'number', uint 8 'sizeInBytes', string 'name']
++>>>>>>> develop
      ['0' PDT_UNKNOWN    ['0', '0',  '"Unknown Property Data Type"']]
      <xsl:apply-templates select="knx:KNX/knx:MasterData/knx:PropertyDataTypes/knx:PropertyDataType"/>
  ]
@@@ -445,8 -445,7 +449,12 @@@
                          <xsl:when test="$datapointSubtype/knx:Format/knx:String/@Encoding = 'iso-8859-1'">ISO-8859-1</xsl:when>
                      </xsl:choose>
                  </xsl:variable>
++<<<<<<< HEAD
 +            [reserved uint 8   '0x0']
 +            [simple   string '<xsl:value-of select="$datapointSubtype/knx:Format/knx:String/@Width"/>' '<xsl:value-of select="$encoding"/>' 'value']
++=======
+             [simple   string <xsl:value-of select="$datapointSubtype/knx:Format/knx:String/@Width"/> '<xsl:value-of select="$encoding"/>' 'value']
++>>>>>>> develop
              </xsl:when>
              <xsl:when test="$datapointSubtype/knx:Format/knx:UnsignedInteger">
                  <xsl:choose>