diff --git a/src/ranap/Makefile b/src/ranap/Makefile
new file mode 100644
index 0000000..bcd7fd1
--- /dev/null
+++ b/src/ranap/Makefile
@@ -0,0 +1,1031 @@
+ASN_MODULE_SOURCES=	\
+	RANAP_Criticality.c	\
+	RANAP_Presence.c	\
+	RANAP_PrivateIE-ID.c	\
+	RANAP_ProcedureCode.c	\
+	RANAP_ProtocolExtensionID.c	\
+	RANAP_ProtocolIE-ID.c	\
+	RANAP_TriggeringMessage.c	\
+	RANAP_IE-Extensions.c	\
+	RANAP_AccuracyFulfilmentIndicator.c	\
+	RANAP_AllocationOrRetentionPriority.c	\
+	RANAP_Alt-RAB-Parameters.c	\
+	RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.c	\
+	RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.c	\
+	RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.c	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.c	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.c	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrates.c	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.c	\
+	RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.c	\
+	RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.c	\
+	RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.c	\
+	RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.c	\
+	RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.c	\
+	RANAP_Alt-RAB-Parameter-MaxBitrateInf.c	\
+	RANAP_Alt-RAB-Parameter-MaxBitrateType.c	\
+	RANAP_Alt-RAB-Parameter-MaxBitrates.c	\
+	RANAP_Alt-RAB-Parameter-MaxBitrateList.c	\
+	RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.c	\
+	RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.c	\
+	RANAP_AlternativeRABConfigurationRequest.c	\
+	RANAP_APN.c	\
+	RANAP_AreaIdentity.c	\
+	RANAP_Ass-RAB-Parameters.c	\
+	RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.c	\
+	RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.c	\
+	RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.c	\
+	RANAP_Ass-RAB-Parameter-MaxBitrateList.c	\
+	RANAP_AuthorisedPLMNs.c	\
+	RANAP_AuthorisedSNAs.c	\
+	RANAP_BindingID.c	\
+	RANAP_BroadcastAssistanceDataDecipheringKeys.c	\
+	RANAP_Cause.c	\
+	RANAP_CauseMisc.c	\
+	RANAP_CauseNAS.c	\
+	RANAP_CauseProtocol.c	\
+	RANAP_CauseRadioNetwork.c	\
+	RANAP_CauseRadioNetworkExtension.c	\
+	RANAP_CauseNon-Standard.c	\
+	RANAP_CauseTransmissionNetwork.c	\
+	RANAP_Cell-Access-Mode.c	\
+	RANAP_CellBased.c	\
+	RANAP_CellIdList.c	\
+	RANAP_Cell-Id.c	\
+	RANAP_Cell-Capacity-Class-Value.c	\
+	RANAP_CellLoadInformation.c	\
+	RANAP_CellLoadInformationGroup.c	\
+	RANAP_CellType.c	\
+	RANAP_ClientType.c	\
+	RANAP_CriticalityDiagnostics.c	\
+	RANAP_CriticalityDiagnostics-IE-List.c	\
+	RANAP_MessageStructure.c	\
+	RANAP_CGI.c	\
+	RANAP_ChosenEncryptionAlgorithm.c	\
+	RANAP_ChosenIntegrityProtectionAlgorithm.c	\
+	RANAP_CI.c	\
+	RANAP_ClassmarkInformation2.c	\
+	RANAP_ClassmarkInformation3.c	\
+	RANAP_CN-DomainIndicator.c	\
+	RANAP_CN-ID.c	\
+	RANAP_Correlation-ID.c	\
+	RANAP_CSFB-Information.c	\
+	RANAP_CSG-Id.c	\
+	RANAP_CSG-Id-List.c	\
+	RANAP_CSG-Membership-Status.c	\
+	RANAP_DataPDUType.c	\
+	RANAP_DataVolumeReference.c	\
+	RANAP_DataVolumeReportingIndication.c	\
+	RANAP_DCH-ID.c	\
+	RANAP_DeliveryOfErroneousSDU.c	\
+	RANAP_DeliveryOrder.c	\
+	RANAP_DeltaRAListofIdleModeUEs.c	\
+	RANAP_NewRAListofIdleModeUEs.c	\
+	RANAP_RAListwithNoIdleModeUEsAnyMore.c	\
+	RANAP_ForwardingIndication.c	\
+	RANAP_DL-GTP-PDU-SequenceNumber.c	\
+	RANAP_DL-N-PDU-SequenceNumber.c	\
+	RANAP_D-RNTI.c	\
+	RANAP_DRX-CycleLengthCoefficient.c	\
+	RANAP_DSCH-ID.c	\
+	RANAP_EARFCN-Extended.c	\
+	RANAP_E-DCH-MAC-d-Flow-ID.c	\
+	RANAP_ENB-ID.c	\
+	RANAP_EncryptionAlgorithm.c	\
+	RANAP_EncryptionInformation.c	\
+	RANAP_EncryptionKey.c	\
+	RANAP_End-Of-CSFB.c	\
+	RANAP_EquipmentsToBeTraced.c	\
+	RANAP_E-UTRAN-Service-Handover.c	\
+	RANAP_Event.c	\
+	RANAP_Event1F-Parameters.c	\
+	RANAP_Event1I-Parameters.c	\
+	RANAP_ExtendedGuaranteedBitrate.c	\
+	RANAP_ExtendedMaxBitrate.c	\
+	RANAP_ExtendedRNC-ID.c	\
+	RANAP_FrameSequenceNumber.c	\
+	RANAP_FrequenceLayerConvergenceFlag.c	\
+	RANAP_GANSS-PositioningDataSet.c	\
+	RANAP_GANSS-PositioningMethodAndUsage.c	\
+	RANAP_GeographicalArea.c	\
+	RANAP_GeographicalCoordinates.c	\
+	RANAP_GA-AltitudeAndDirection.c	\
+	RANAP_GA-EllipsoidArc.c	\
+	RANAP_GA-Point.c	\
+	RANAP_GA-PointWithAltitude.c	\
+	RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.c	\
+	RANAP_GA-PointWithUnCertainty.c	\
+	RANAP_GA-PointWithUnCertaintyEllipse.c	\
+	RANAP_GA-Polygon.c	\
+	RANAP_GA-UncertaintyEllipse.c	\
+	RANAP_GERAN-BSC-Container.c	\
+	RANAP_GERAN-Cell-ID.c	\
+	RANAP_GERAN-Classmark.c	\
+	RANAP_GlobalCN-ID.c	\
+	RANAP_GlobalRNC-ID.c	\
+	RANAP_GTP-TEI.c	\
+	RANAP_GuaranteedBitrate.c	\
+	RANAP_HigherBitratesThan16MbpsFlag.c	\
+	RANAP_HS-DSCH-MAC-d-Flow-ID.c	\
+	RANAP_IMEI.c	\
+	RANAP_IMEIGroup.c	\
+	RANAP_IMEIList.c	\
+	RANAP_IMEISV.c	\
+	RANAP_IMEISVGroup.c	\
+	RANAP_IMEISVList.c	\
+	RANAP_ImmediateMDT.c	\
+	RANAP_IMSI.c	\
+	RANAP_IncludeVelocity.c	\
+	RANAP_InformationExchangeID.c	\
+	RANAP_InformationExchangeType.c	\
+	RANAP_InformationRequested.c	\
+	RANAP_InformationRequestType.c	\
+	RANAP_InformationTransferID.c	\
+	RANAP_InformationTransferType.c	\
+	RANAP_IntegrityProtectionAlgorithm.c	\
+	RANAP_IntegrityProtectionInformation.c	\
+	RANAP_IntegrityProtectionKey.c	\
+	RANAP_InterSystemInformationTransferType.c	\
+	RANAP_InterSystemInformation-TransparentContainer.c	\
+	RANAP_IPMulticastAddress.c	\
+	RANAP_IuSignallingConnectionIdentifier.c	\
+	RANAP_IuTransportAssociation.c	\
+	RANAP_KeyStatus.c	\
+	RANAP_LA-LIST.c	\
+	RANAP_LAC.c	\
+	RANAP_LAI.c	\
+	RANAP_LastKnownServiceArea.c	\
+	RANAP_LastVisitedUTRANCell-Item.c	\
+	RANAP_LHN-ID.c	\
+	RANAP_Links-to-log.c	\
+	RANAP_ListOF-SNAs.c	\
+	RANAP_ListOfInterfacesToTrace.c	\
+	RANAP_InterfacesToTraceItem.c	\
+	RANAP_LoadValue.c	\
+	RANAP_LocationRelatedDataRequestType.c	\
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.c	\
+	RANAP_LocationReportingTransferInformation.c	\
+	RANAP_ReportChangeOfSAI.c	\
+	RANAP_PeriodicReportingIndicator.c	\
+	RANAP_DirectReportingIndicator.c	\
+	RANAP_L3-Information.c	\
+	RANAP_M1Report.c	\
+	RANAP_M2Report.c	\
+	RANAP_M4Report.c	\
+	RANAP_M4-Collection-Parameters.c	\
+	RANAP_M4-Period.c	\
+	RANAP_M4-Threshold.c	\
+	RANAP_M5Report.c	\
+	RANAP_M5-Period.c	\
+	RANAP_M6Report.c	\
+	RANAP_M6-Period.c	\
+	RANAP_M7Report.c	\
+	RANAP_M7-Period.c	\
+	RANAP_Management-Based-MDT-Allowed.c	\
+	RANAP_MaxBitrate.c	\
+	RANAP_MaxSDU-Size.c	\
+	RANAP_MBMS-PTP-RAB-ID.c	\
+	RANAP_MBMSBearerServiceType.c	\
+	RANAP_MBMSCNDe-Registration.c	\
+	RANAP_MBMSCountingInformation.c	\
+	RANAP_MBMSHCIndicator.c	\
+	RANAP_MBMSIPMulticastAddressandAPNRequest.c	\
+	RANAP_MBMSLinkingInformation.c	\
+	RANAP_MBMSRegistrationRequestType.c	\
+	RANAP_MBMSServiceArea.c	\
+	RANAP_MBMSSessionDuration.c	\
+	RANAP_MBMSSessionIdentity.c	\
+	RANAP_MBMSSessionRepetitionNumber.c	\
+	RANAP_MDT-Activation.c	\
+	RANAP_MDTAreaScope.c	\
+	RANAP_MDT-Configuration.c	\
+	RANAP_MDTMode.c	\
+	RANAP_MDT-PLMN-List.c	\
+	RANAP_MDT-Report-Parameters.c	\
+	RANAP_MeasurementQuantity.c	\
+	RANAP_MeasurementsToActivate.c	\
+	RANAP_MSISDN.c	\
+	RANAP_NAS-PDU.c	\
+	RANAP_NAS-SequenceNumber.c	\
+	RANAP_NAS-SynchronisationIndicator.c	\
+	RANAP_NewBSS-To-OldBSS-Information.c	\
+	RANAP_NonSearchingIndication.c	\
+	RANAP_NRTLoadInformationValue.c	\
+	RANAP_NumberOfIuInstances.c	\
+	RANAP_NumberOfSteps.c	\
+	RANAP_Offload-RAB-Parameters.c	\
+	RANAP_Offload-RAB-Parameters-APN.c	\
+	RANAP_Offload-RAB-Parameters-ChargingCharacteristics.c	\
+	RANAP_OldBSS-ToNewBSS-Information.c	\
+	RANAP_OMC-ID.c	\
+	RANAP_Out-Of-UTRAN.c	\
+	RANAP_PagingAreaID.c	\
+	RANAP_PagingCause.c	\
+	RANAP_PDP-TypeInformation.c	\
+	RANAP_PDP-Type.c	\
+	RANAP_PDP-TypeInformation-extension.c	\
+	RANAP_PDP-Type-extension.c	\
+	RANAP_PDUType14FrameSequenceNumber.c	\
+	RANAP_PeriodicLocationInfo.c	\
+	RANAP_PermanentNAS-UE-ID.c	\
+	RANAP_PermittedEncryptionAlgorithms.c	\
+	RANAP_PermittedIntegrityProtectionAlgorithms.c	\
+	RANAP_LABased.c	\
+	RANAP_LAI-List.c	\
+	RANAP_LoggedMDT.c	\
+	RANAP_LoggingInterval.c	\
+	RANAP_LoggingDuration.c	\
+	RANAP_PLMNidentity.c	\
+	RANAP_PLMNs-in-shared-network.c	\
+	RANAP_Port-Number.c	\
+	RANAP_PositioningDataDiscriminator.c	\
+	RANAP_PositioningDataSet.c	\
+	RANAP_PositioningMethodAndUsage.c	\
+	RANAP_PositioningPriority.c	\
+	RANAP_PositionData.c	\
+	RANAP_PositionDataSpecificToGERANIuMode.c	\
+	RANAP_Pre-emptionCapability.c	\
+	RANAP_Pre-emptionVulnerability.c	\
+	RANAP_PriorityLevel.c	\
+	RANAP_Priority-Class-Indicator.c	\
+	RANAP_ProvidedData.c	\
+	RANAP_P-TMSI.c	\
+	RANAP_QueuingAllowed.c	\
+	RANAP_RAB-AsymmetryIndicator.c	\
+	RANAP_RABased.c	\
+	RANAP_RAI-List.c	\
+	RANAP_RABDataVolumeReport.c	\
+	RANAP_RAB-ID.c	\
+	RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.c	\
+	RANAP_RAB-Parameter-ExtendedMaxBitrateList.c	\
+	RANAP_RAB-Parameter-GuaranteedBitrateList.c	\
+	RANAP_RAB-Parameter-MaxBitrateList.c	\
+	RANAP_RAB-Parameters.c	\
+	RANAP_RABParametersList.c	\
+	RANAP_RAB-SubflowCombinationBitRate.c	\
+	RANAP_RAB-TrCH-Mapping.c	\
+	RANAP_RAB-TrCH-MappingItem.c	\
+	RANAP_RAC.c	\
+	RANAP_RAI.c	\
+	RANAP_RAListofIdleModeUEs.c	\
+	RANAP_NotEmptyRAListofIdleModeUEs.c	\
+	RANAP_RAofIdleModeUEs.c	\
+	RANAP_LAListofIdleModeUEs.c	\
+	RANAP_RAT-Type.c	\
+	RANAP_RateControlAllowed.c	\
+	RANAP_RedirectAttemptFlag.c	\
+	RANAP_RedirectionCompleted.c	\
+	RANAP_RejectCauseValue.c	\
+	RANAP_RelocationRequirement.c	\
+	RANAP_RelocationType.c	\
+	RANAP_RepetitionNumber0.c	\
+	RANAP_RepetitionNumber1.c	\
+	RANAP_ReportArea.c	\
+	RANAP_ReportInterval.c	\
+	RANAP_ReportAmount.c	\
+	RANAP_RequestedGPSAssistanceData.c	\
+	RANAP_RequestedGANSSAssistanceData.c	\
+	RANAP_RequestedLocationRelatedDataType.c	\
+	RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.c	\
+	RANAP_MBMSIPMulticastAddressandAPNlist.c	\
+	RANAP_RequestedMulticastServiceList.c	\
+	RANAP_Requested-RAB-Parameter-Values.c	\
+	RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.c	\
+	RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.c	\
+	RANAP_Requested-RAB-Parameter-MaxBitrateList.c	\
+	RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.c	\
+	RANAP_RequestType.c	\
+	RANAP_ResidualBitErrorRatio.c	\
+	RANAP_ResponseTime.c	\
+	RANAP_RIMInformation.c	\
+	RANAP_RIM-Transfer.c	\
+	RANAP_RIMRoutingAddress.c	\
+	RANAP_RNC-ID.c	\
+	RANAP_RNCTraceInformation.c	\
+	RANAP_RNSAPRelocationParameters.c	\
+	RANAP_RRC-Container.c	\
+	RANAP_RTLoadValue.c	\
+	RANAP_RSRVCC-HO-Indication.c	\
+	RANAP_RSRVCC-Information.c	\
+	RANAP_RSRVCC-Operation-Possible.c	\
+	RANAP_SAC.c	\
+	RANAP_SAI.c	\
+	RANAP_SAPI.c	\
+	RANAP_SessionUpdateID.c	\
+	RANAP_Shared-Network-Information.c	\
+	RANAP_Session-Re-establishment-Indicator.c	\
+	RANAP_SignallingIndication.c	\
+	RANAP_SDU-ErrorRatio.c	\
+	RANAP_SDU-FormatInformationParameters.c	\
+	RANAP_SDU-Parameters.c	\
+	RANAP_SNA-Access-Information.c	\
+	RANAP_SNAC.c	\
+	RANAP_Service-Handover.c	\
+	RANAP_Source-ToTarget-TransparentContainer.c	\
+	RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.c	\
+	RANAP_SourceCellID.c	\
+	RANAP_SourceBSS-ToTargetBSS-TransparentContainer.c	\
+	RANAP_SourceID.c	\
+	RANAP_SourceRNC-ID.c	\
+	RANAP_SourceRNC-ToTargetRNC-TransparentContainer.c	\
+	RANAP_IRAT-Measurement-Configuration.c	\
+	RANAP_IRATmeasurementParameters.c	\
+	RANAP_RSRQ-Type.c	\
+	RANAP_RSRQ-Extension.c	\
+	RANAP_EUTRANFrequencies.c	\
+	RANAP_MeasBand.c	\
+	RANAP_SubscriberProfileIDforRFP.c	\
+	RANAP_SourceStatisticsDescriptor.c	\
+	RANAP_SupportedRAB-ParameterBitrateList.c	\
+	RANAP_SupportedBitrate.c	\
+	RANAP_SourceUTRANCellID.c	\
+	RANAP_SRB-ID.c	\
+	RANAP_SRB-TrCH-Mapping.c	\
+	RANAP_SRB-TrCH-MappingItem.c	\
+	RANAP_SRVCC-HO-Indication.c	\
+	RANAP_SRVCC-Information.c	\
+	RANAP_SRVCC-Operation-Possible.c	\
+	RANAP_SubflowSDU-Size.c	\
+	RANAP_TAC.c	\
+	RANAP_TAI.c	\
+	RANAP_Target-ToSource-TransparentContainer.c	\
+	RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.c	\
+	RANAP_TargetBSS-ToSourceBSS-TransparentContainer.c	\
+	RANAP_TargetCellId.c	\
+	RANAP_TargetID.c	\
+	RANAP_TargetENB-ID.c	\
+	RANAP_TargetRNC-ID.c	\
+	RANAP_TargetRNC-ToSourceRNC-TransparentContainer.c	\
+	RANAP_TBCD-STRING.c	\
+	RANAP_TemporaryUE-ID.c	\
+	RANAP_Time-UE-StayedInCell.c	\
+	RANAP_Time-UE-StayedInCell-EnhancedGranularity.c	\
+	RANAP_TimeToMBMSDataTransfer.c	\
+	RANAP_TimingDifferenceULDL.c	\
+	RANAP_TMGI.c	\
+	RANAP_TMSI.c	\
+	RANAP_TraceDepth.c	\
+	RANAP_TraceInformation.c	\
+	RANAP_TracePropagationParameters.c	\
+	RANAP_TraceRecordingSessionInformation.c	\
+	RANAP_TraceRecordingSessionReference.c	\
+	RANAP_TraceReference.c	\
+	RANAP_TraceType.c	\
+	RANAP_TrafficClass.c	\
+	RANAP_TrafficHandlingPriority.c	\
+	RANAP_TransferDelay.c	\
+	RANAP_UnsuccessfullyTransmittedDataVolume.c	\
+	RANAP_TransportLayerAddress.c	\
+	RANAP_TrCH-ID.c	\
+	RANAP_TrCH-ID-List.c	\
+	RANAP_TriggerID.c	\
+	RANAP_TunnelInformation.c	\
+	RANAP_TypeOfError.c	\
+	RANAP_UE-AggregateMaximumBitRate.c	\
+	RANAP_UE-AggregateMaximumBitRateDownlink.c	\
+	RANAP_UE-AggregateMaximumBitRateUplink.c	\
+	RANAP_UE-History-Information.c	\
+	RANAP_UE-ID.c	\
+	RANAP_UESBI-Iu.c	\
+	RANAP_UESBI-IuA.c	\
+	RANAP_UESBI-IuB.c	\
+	RANAP_UL-GTP-PDU-SequenceNumber.c	\
+	RANAP_UL-N-PDU-SequenceNumber.c	\
+	RANAP_UPInformation.c	\
+	RANAP_UPInitialisationFrame.c	\
+	RANAP_UP-ModeVersions.c	\
+	RANAP_USCH-ID.c	\
+	RANAP_UserPlaneMode.c	\
+	RANAP_UTRAN-CellID.c	\
+	RANAP_VelocityEstimate.c	\
+	RANAP_HorizontalVelocity.c	\
+	RANAP_HorizontalWithVerticalVelocity.c	\
+	RANAP_HorizontalVelocityWithUncertainty.c	\
+	RANAP_HorizontalWithVerticalVelocityAndUncertainty.c	\
+	RANAP_HorizontalSpeedAndBearing.c	\
+	RANAP_VerticalVelocity.c	\
+	RANAP_VerticalSpeedDirection.c	\
+	RANAP_VerticalAccuracyCode.c	\
+	RANAP_VoiceSupportMatchIndicator.c	\
+	RANAP_RANAP-PDU.c	\
+	RANAP_InitiatingMessage.c	\
+	RANAP_SuccessfulOutcome.c	\
+	RANAP_UnsuccessfulOutcome.c	\
+	RANAP_Outcome.c	\
+	RANAP_Iu-ReleaseCommand.c	\
+	RANAP_Iu-ReleaseComplete.c	\
+	RANAP_RelocationRequired.c	\
+	RANAP_RelocationCommand.c	\
+	RANAP_RelocationPreparationFailure.c	\
+	RANAP_RelocationRequest.c	\
+	RANAP_RelocationRequestAcknowledge.c	\
+	RANAP_RelocationFailure.c	\
+	RANAP_RelocationCancel.c	\
+	RANAP_RelocationCancelAcknowledge.c	\
+	RANAP_SRNS-ContextRequest.c	\
+	RANAP_SRNS-ContextResponse.c	\
+	RANAP_SecurityModeCommand.c	\
+	RANAP_SecurityModeComplete.c	\
+	RANAP_SecurityModeReject.c	\
+	RANAP_DataVolumeReportRequest.c	\
+	RANAP_DataVolumeReport.c	\
+	RANAP_Reset.c	\
+	RANAP_ResetAcknowledge.c	\
+	RANAP_RAB-ReleaseRequest.c	\
+	RANAP_Iu-ReleaseRequest.c	\
+	RANAP_RelocationDetect.c	\
+	RANAP_RelocationComplete.c	\
+	RANAP_Paging.c	\
+	RANAP_CommonID.c	\
+	RANAP_CN-InvokeTrace.c	\
+	RANAP_CN-DeactivateTrace.c	\
+	RANAP_LocationReportingControl.c	\
+	RANAP_LocationReport.c	\
+	RANAP_InitialUE-Message.c	\
+	RANAP_DirectTransfer.c	\
+	RANAP_Overload.c	\
+	RANAP_ErrorIndication.c	\
+	RANAP_SRNS-DataForwardCommand.c	\
+	RANAP_ForwardSRNS-Context.c	\
+	RANAP_RAB-AssignmentRequest.c	\
+	RANAP_RAB-AssignmentResponse.c	\
+	RANAP_PrivateMessage.c	\
+	RANAP_ResetResource.c	\
+	RANAP_ResetResourceAcknowledge.c	\
+	RANAP_RANAP-RelocationInformation.c	\
+	RANAP_RAB-ModifyRequest.c	\
+	RANAP_LocationRelatedDataRequest.c	\
+	RANAP_LocationRelatedDataResponse.c	\
+	RANAP_LocationRelatedDataFailure.c	\
+	RANAP_InformationTransferIndication.c	\
+	RANAP_InformationTransferConfirmation.c	\
+	RANAP_InformationTransferFailure.c	\
+	RANAP_UESpecificInformationIndication.c	\
+	RANAP_DirectInformationTransfer.c	\
+	RANAP_UplinkInformationExchangeRequest.c	\
+	RANAP_UplinkInformationExchangeResponse.c	\
+	RANAP_UplinkInformationExchangeFailure.c	\
+	RANAP_MBMSSessionStart.c	\
+	RANAP_MBMSSessionStartResponse.c	\
+	RANAP_MBMSSessionStartFailure.c	\
+	RANAP_MBMSSessionUpdate.c	\
+	RANAP_MBMSSessionUpdateResponse.c	\
+	RANAP_MBMSSessionUpdateFailure.c	\
+	RANAP_MBMSSessionStop.c	\
+	RANAP_MBMSSessionStopResponse.c	\
+	RANAP_MBMSUELinkingRequest.c	\
+	RANAP_MBMSUELinkingResponse.c	\
+	RANAP_MBMSRegistrationRequest.c	\
+	RANAP_MBMSRegistrationResponse.c	\
+	RANAP_MBMSRegistrationFailure.c	\
+	RANAP_MBMSCNDe-RegistrationRequest.c	\
+	RANAP_MBMSCNDe-RegistrationResponse.c	\
+	RANAP_MBMSRABEstablishmentIndication.c	\
+	RANAP_MBMSRABReleaseRequest.c	\
+	RANAP_MBMSRABRelease.c	\
+	RANAP_MBMSRABReleaseFailure.c	\
+	RANAP_EnhancedRelocationCompleteRequest.c	\
+	RANAP_EnhancedRelocationCompleteResponse.c	\
+	RANAP_EnhancedRelocationCompleteFailure.c	\
+	RANAP_EnhancedRelocationCompleteConfirm.c	\
+	RANAP_RANAP-EnhancedRelocationInformationRequest.c	\
+	RANAP_RANAP-EnhancedRelocationInformationResponse.c	\
+	RANAP_SRVCC-CSKeysRequest.c	\
+	RANAP_SRVCC-CSKeysResponse.c	\
+	RANAP_UeRadioCapabilityMatchRequest.c	\
+	RANAP_UeRadioCapabilityMatchResponse.c	\
+	RANAP_IE.c
+
+ASN_MODULE_HEADERS=	\
+	RANAP_Criticality.h	\
+	RANAP_Presence.h	\
+	RANAP_PrivateIE-ID.h	\
+	RANAP_ProcedureCode.h	\
+	RANAP_ProtocolExtensionID.h	\
+	RANAP_ProtocolIE-ID.h	\
+	RANAP_TriggeringMessage.h	\
+	RANAP_IE-Extensions.h	\
+	RANAP_AccuracyFulfilmentIndicator.h	\
+	RANAP_AllocationOrRetentionPriority.h	\
+	RANAP_Alt-RAB-Parameters.h	\
+	RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.h	\
+	RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.h	\
+	RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.h	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.h	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrates.h	\
+	RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.h	\
+	RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.h	\
+	RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.h	\
+	RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.h	\
+	RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.h	\
+	RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.h	\
+	RANAP_Alt-RAB-Parameter-MaxBitrateInf.h	\
+	RANAP_Alt-RAB-Parameter-MaxBitrateType.h	\
+	RANAP_Alt-RAB-Parameter-MaxBitrates.h	\
+	RANAP_Alt-RAB-Parameter-MaxBitrateList.h	\
+	RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.h	\
+	RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.h	\
+	RANAP_AlternativeRABConfigurationRequest.h	\
+	RANAP_APN.h	\
+	RANAP_AreaIdentity.h	\
+	RANAP_Ass-RAB-Parameters.h	\
+	RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.h	\
+	RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.h	\
+	RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.h	\
+	RANAP_Ass-RAB-Parameter-MaxBitrateList.h	\
+	RANAP_AuthorisedPLMNs.h	\
+	RANAP_AuthorisedSNAs.h	\
+	RANAP_BindingID.h	\
+	RANAP_BroadcastAssistanceDataDecipheringKeys.h	\
+	RANAP_Cause.h	\
+	RANAP_CauseMisc.h	\
+	RANAP_CauseNAS.h	\
+	RANAP_CauseProtocol.h	\
+	RANAP_CauseRadioNetwork.h	\
+	RANAP_CauseRadioNetworkExtension.h	\
+	RANAP_CauseNon-Standard.h	\
+	RANAP_CauseTransmissionNetwork.h	\
+	RANAP_Cell-Access-Mode.h	\
+	RANAP_CellBased.h	\
+	RANAP_CellIdList.h	\
+	RANAP_Cell-Id.h	\
+	RANAP_Cell-Capacity-Class-Value.h	\
+	RANAP_CellLoadInformation.h	\
+	RANAP_CellLoadInformationGroup.h	\
+	RANAP_CellType.h	\
+	RANAP_ClientType.h	\
+	RANAP_CriticalityDiagnostics.h	\
+	RANAP_CriticalityDiagnostics-IE-List.h	\
+	RANAP_MessageStructure.h	\
+	RANAP_CGI.h	\
+	RANAP_ChosenEncryptionAlgorithm.h	\
+	RANAP_ChosenIntegrityProtectionAlgorithm.h	\
+	RANAP_CI.h	\
+	RANAP_ClassmarkInformation2.h	\
+	RANAP_ClassmarkInformation3.h	\
+	RANAP_CN-DomainIndicator.h	\
+	RANAP_CN-ID.h	\
+	RANAP_Correlation-ID.h	\
+	RANAP_CSFB-Information.h	\
+	RANAP_CSG-Id.h	\
+	RANAP_CSG-Id-List.h	\
+	RANAP_CSG-Membership-Status.h	\
+	RANAP_DataPDUType.h	\
+	RANAP_DataVolumeReference.h	\
+	RANAP_DataVolumeReportingIndication.h	\
+	RANAP_DCH-ID.h	\
+	RANAP_DeliveryOfErroneousSDU.h	\
+	RANAP_DeliveryOrder.h	\
+	RANAP_DeltaRAListofIdleModeUEs.h	\
+	RANAP_NewRAListofIdleModeUEs.h	\
+	RANAP_RAListwithNoIdleModeUEsAnyMore.h	\
+	RANAP_ForwardingIndication.h	\
+	RANAP_DL-GTP-PDU-SequenceNumber.h	\
+	RANAP_DL-N-PDU-SequenceNumber.h	\
+	RANAP_D-RNTI.h	\
+	RANAP_DRX-CycleLengthCoefficient.h	\
+	RANAP_DSCH-ID.h	\
+	RANAP_EARFCN-Extended.h	\
+	RANAP_E-DCH-MAC-d-Flow-ID.h	\
+	RANAP_ENB-ID.h	\
+	RANAP_EncryptionAlgorithm.h	\
+	RANAP_EncryptionInformation.h	\
+	RANAP_EncryptionKey.h	\
+	RANAP_End-Of-CSFB.h	\
+	RANAP_EquipmentsToBeTraced.h	\
+	RANAP_E-UTRAN-Service-Handover.h	\
+	RANAP_Event.h	\
+	RANAP_Event1F-Parameters.h	\
+	RANAP_Event1I-Parameters.h	\
+	RANAP_ExtendedGuaranteedBitrate.h	\
+	RANAP_ExtendedMaxBitrate.h	\
+	RANAP_ExtendedRNC-ID.h	\
+	RANAP_FrameSequenceNumber.h	\
+	RANAP_FrequenceLayerConvergenceFlag.h	\
+	RANAP_GANSS-PositioningDataSet.h	\
+	RANAP_GANSS-PositioningMethodAndUsage.h	\
+	RANAP_GeographicalArea.h	\
+	RANAP_GeographicalCoordinates.h	\
+	RANAP_GA-AltitudeAndDirection.h	\
+	RANAP_GA-EllipsoidArc.h	\
+	RANAP_GA-Point.h	\
+	RANAP_GA-PointWithAltitude.h	\
+	RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.h	\
+	RANAP_GA-PointWithUnCertainty.h	\
+	RANAP_GA-PointWithUnCertaintyEllipse.h	\
+	RANAP_GA-Polygon.h	\
+	RANAP_GA-UncertaintyEllipse.h	\
+	RANAP_GERAN-BSC-Container.h	\
+	RANAP_GERAN-Cell-ID.h	\
+	RANAP_GERAN-Classmark.h	\
+	RANAP_GlobalCN-ID.h	\
+	RANAP_GlobalRNC-ID.h	\
+	RANAP_GTP-TEI.h	\
+	RANAP_GuaranteedBitrate.h	\
+	RANAP_HigherBitratesThan16MbpsFlag.h	\
+	RANAP_HS-DSCH-MAC-d-Flow-ID.h	\
+	RANAP_IMEI.h	\
+	RANAP_IMEIGroup.h	\
+	RANAP_IMEIList.h	\
+	RANAP_IMEISV.h	\
+	RANAP_IMEISVGroup.h	\
+	RANAP_IMEISVList.h	\
+	RANAP_ImmediateMDT.h	\
+	RANAP_IMSI.h	\
+	RANAP_IncludeVelocity.h	\
+	RANAP_InformationExchangeID.h	\
+	RANAP_InformationExchangeType.h	\
+	RANAP_InformationRequested.h	\
+	RANAP_InformationRequestType.h	\
+	RANAP_InformationTransferID.h	\
+	RANAP_InformationTransferType.h	\
+	RANAP_IntegrityProtectionAlgorithm.h	\
+	RANAP_IntegrityProtectionInformation.h	\
+	RANAP_IntegrityProtectionKey.h	\
+	RANAP_InterSystemInformationTransferType.h	\
+	RANAP_InterSystemInformation-TransparentContainer.h	\
+	RANAP_IPMulticastAddress.h	\
+	RANAP_IuSignallingConnectionIdentifier.h	\
+	RANAP_IuTransportAssociation.h	\
+	RANAP_KeyStatus.h	\
+	RANAP_LA-LIST.h	\
+	RANAP_LAC.h	\
+	RANAP_LAI.h	\
+	RANAP_LastKnownServiceArea.h	\
+	RANAP_LastVisitedUTRANCell-Item.h	\
+	RANAP_LHN-ID.h	\
+	RANAP_Links-to-log.h	\
+	RANAP_ListOF-SNAs.h	\
+	RANAP_ListOfInterfacesToTrace.h	\
+	RANAP_InterfacesToTraceItem.h	\
+	RANAP_LoadValue.h	\
+	RANAP_LocationRelatedDataRequestType.h	\
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.h	\
+	RANAP_LocationReportingTransferInformation.h	\
+	RANAP_ReportChangeOfSAI.h	\
+	RANAP_PeriodicReportingIndicator.h	\
+	RANAP_DirectReportingIndicator.h	\
+	RANAP_L3-Information.h	\
+	RANAP_M1Report.h	\
+	RANAP_M2Report.h	\
+	RANAP_M4Report.h	\
+	RANAP_M4-Collection-Parameters.h	\
+	RANAP_M4-Period.h	\
+	RANAP_M4-Threshold.h	\
+	RANAP_M5Report.h	\
+	RANAP_M5-Period.h	\
+	RANAP_M6Report.h	\
+	RANAP_M6-Period.h	\
+	RANAP_M7Report.h	\
+	RANAP_M7-Period.h	\
+	RANAP_Management-Based-MDT-Allowed.h	\
+	RANAP_MaxBitrate.h	\
+	RANAP_MaxSDU-Size.h	\
+	RANAP_MBMS-PTP-RAB-ID.h	\
+	RANAP_MBMSBearerServiceType.h	\
+	RANAP_MBMSCNDe-Registration.h	\
+	RANAP_MBMSCountingInformation.h	\
+	RANAP_MBMSHCIndicator.h	\
+	RANAP_MBMSIPMulticastAddressandAPNRequest.h	\
+	RANAP_MBMSLinkingInformation.h	\
+	RANAP_MBMSRegistrationRequestType.h	\
+	RANAP_MBMSServiceArea.h	\
+	RANAP_MBMSSessionDuration.h	\
+	RANAP_MBMSSessionIdentity.h	\
+	RANAP_MBMSSessionRepetitionNumber.h	\
+	RANAP_MDT-Activation.h	\
+	RANAP_MDTAreaScope.h	\
+	RANAP_MDT-Configuration.h	\
+	RANAP_MDTMode.h	\
+	RANAP_MDT-PLMN-List.h	\
+	RANAP_MDT-Report-Parameters.h	\
+	RANAP_MeasurementQuantity.h	\
+	RANAP_MeasurementsToActivate.h	\
+	RANAP_MSISDN.h	\
+	RANAP_NAS-PDU.h	\
+	RANAP_NAS-SequenceNumber.h	\
+	RANAP_NAS-SynchronisationIndicator.h	\
+	RANAP_NewBSS-To-OldBSS-Information.h	\
+	RANAP_NonSearchingIndication.h	\
+	RANAP_NRTLoadInformationValue.h	\
+	RANAP_NumberOfIuInstances.h	\
+	RANAP_NumberOfSteps.h	\
+	RANAP_Offload-RAB-Parameters.h	\
+	RANAP_Offload-RAB-Parameters-APN.h	\
+	RANAP_Offload-RAB-Parameters-ChargingCharacteristics.h	\
+	RANAP_OldBSS-ToNewBSS-Information.h	\
+	RANAP_OMC-ID.h	\
+	RANAP_Out-Of-UTRAN.h	\
+	RANAP_PagingAreaID.h	\
+	RANAP_PagingCause.h	\
+	RANAP_PDP-TypeInformation.h	\
+	RANAP_PDP-Type.h	\
+	RANAP_PDP-TypeInformation-extension.h	\
+	RANAP_PDP-Type-extension.h	\
+	RANAP_PDUType14FrameSequenceNumber.h	\
+	RANAP_PeriodicLocationInfo.h	\
+	RANAP_PermanentNAS-UE-ID.h	\
+	RANAP_PermittedEncryptionAlgorithms.h	\
+	RANAP_PermittedIntegrityProtectionAlgorithms.h	\
+	RANAP_LABased.h	\
+	RANAP_LAI-List.h	\
+	RANAP_LoggedMDT.h	\
+	RANAP_LoggingInterval.h	\
+	RANAP_LoggingDuration.h	\
+	RANAP_PLMNidentity.h	\
+	RANAP_PLMNs-in-shared-network.h	\
+	RANAP_Port-Number.h	\
+	RANAP_PositioningDataDiscriminator.h	\
+	RANAP_PositioningDataSet.h	\
+	RANAP_PositioningMethodAndUsage.h	\
+	RANAP_PositioningPriority.h	\
+	RANAP_PositionData.h	\
+	RANAP_PositionDataSpecificToGERANIuMode.h	\
+	RANAP_Pre-emptionCapability.h	\
+	RANAP_Pre-emptionVulnerability.h	\
+	RANAP_PriorityLevel.h	\
+	RANAP_Priority-Class-Indicator.h	\
+	RANAP_ProvidedData.h	\
+	RANAP_P-TMSI.h	\
+	RANAP_QueuingAllowed.h	\
+	RANAP_RAB-AsymmetryIndicator.h	\
+	RANAP_RABased.h	\
+	RANAP_RAI-List.h	\
+	RANAP_RABDataVolumeReport.h	\
+	RANAP_RAB-ID.h	\
+	RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.h	\
+	RANAP_RAB-Parameter-ExtendedMaxBitrateList.h	\
+	RANAP_RAB-Parameter-GuaranteedBitrateList.h	\
+	RANAP_RAB-Parameter-MaxBitrateList.h	\
+	RANAP_RAB-Parameters.h	\
+	RANAP_RABParametersList.h	\
+	RANAP_RAB-SubflowCombinationBitRate.h	\
+	RANAP_RAB-TrCH-Mapping.h	\
+	RANAP_RAB-TrCH-MappingItem.h	\
+	RANAP_RAC.h	\
+	RANAP_RAI.h	\
+	RANAP_RAListofIdleModeUEs.h	\
+	RANAP_NotEmptyRAListofIdleModeUEs.h	\
+	RANAP_RAofIdleModeUEs.h	\
+	RANAP_LAListofIdleModeUEs.h	\
+	RANAP_RAT-Type.h	\
+	RANAP_RateControlAllowed.h	\
+	RANAP_RedirectAttemptFlag.h	\
+	RANAP_RedirectionCompleted.h	\
+	RANAP_RejectCauseValue.h	\
+	RANAP_RelocationRequirement.h	\
+	RANAP_RelocationType.h	\
+	RANAP_RepetitionNumber0.h	\
+	RANAP_RepetitionNumber1.h	\
+	RANAP_ReportArea.h	\
+	RANAP_ReportInterval.h	\
+	RANAP_ReportAmount.h	\
+	RANAP_RequestedGPSAssistanceData.h	\
+	RANAP_RequestedGANSSAssistanceData.h	\
+	RANAP_RequestedLocationRelatedDataType.h	\
+	RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.h	\
+	RANAP_MBMSIPMulticastAddressandAPNlist.h	\
+	RANAP_RequestedMulticastServiceList.h	\
+	RANAP_Requested-RAB-Parameter-Values.h	\
+	RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.h	\
+	RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.h	\
+	RANAP_Requested-RAB-Parameter-MaxBitrateList.h	\
+	RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.h	\
+	RANAP_RequestType.h	\
+	RANAP_ResidualBitErrorRatio.h	\
+	RANAP_ResponseTime.h	\
+	RANAP_RIMInformation.h	\
+	RANAP_RIM-Transfer.h	\
+	RANAP_RIMRoutingAddress.h	\
+	RANAP_RNC-ID.h	\
+	RANAP_RNCTraceInformation.h	\
+	RANAP_RNSAPRelocationParameters.h	\
+	RANAP_RRC-Container.h	\
+	RANAP_RTLoadValue.h	\
+	RANAP_RSRVCC-HO-Indication.h	\
+	RANAP_RSRVCC-Information.h	\
+	RANAP_RSRVCC-Operation-Possible.h	\
+	RANAP_SAC.h	\
+	RANAP_SAI.h	\
+	RANAP_SAPI.h	\
+	RANAP_SessionUpdateID.h	\
+	RANAP_Shared-Network-Information.h	\
+	RANAP_Session-Re-establishment-Indicator.h	\
+	RANAP_SignallingIndication.h	\
+	RANAP_SDU-ErrorRatio.h	\
+	RANAP_SDU-FormatInformationParameters.h	\
+	RANAP_SDU-Parameters.h	\
+	RANAP_SNA-Access-Information.h	\
+	RANAP_SNAC.h	\
+	RANAP_Service-Handover.h	\
+	RANAP_Source-ToTarget-TransparentContainer.h	\
+	RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.h	\
+	RANAP_SourceCellID.h	\
+	RANAP_SourceBSS-ToTargetBSS-TransparentContainer.h	\
+	RANAP_SourceID.h	\
+	RANAP_SourceRNC-ID.h	\
+	RANAP_SourceRNC-ToTargetRNC-TransparentContainer.h	\
+	RANAP_IRAT-Measurement-Configuration.h	\
+	RANAP_IRATmeasurementParameters.h	\
+	RANAP_RSRQ-Type.h	\
+	RANAP_RSRQ-Extension.h	\
+	RANAP_EUTRANFrequencies.h	\
+	RANAP_MeasBand.h	\
+	RANAP_SubscriberProfileIDforRFP.h	\
+	RANAP_SourceStatisticsDescriptor.h	\
+	RANAP_SupportedRAB-ParameterBitrateList.h	\
+	RANAP_SupportedBitrate.h	\
+	RANAP_SourceUTRANCellID.h	\
+	RANAP_SRB-ID.h	\
+	RANAP_SRB-TrCH-Mapping.h	\
+	RANAP_SRB-TrCH-MappingItem.h	\
+	RANAP_SRVCC-HO-Indication.h	\
+	RANAP_SRVCC-Information.h	\
+	RANAP_SRVCC-Operation-Possible.h	\
+	RANAP_SubflowSDU-Size.h	\
+	RANAP_TAC.h	\
+	RANAP_TAI.h	\
+	RANAP_Target-ToSource-TransparentContainer.h	\
+	RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.h	\
+	RANAP_TargetBSS-ToSourceBSS-TransparentContainer.h	\
+	RANAP_TargetCellId.h	\
+	RANAP_TargetID.h	\
+	RANAP_TargetENB-ID.h	\
+	RANAP_TargetRNC-ID.h	\
+	RANAP_TargetRNC-ToSourceRNC-TransparentContainer.h	\
+	RANAP_TBCD-STRING.h	\
+	RANAP_TemporaryUE-ID.h	\
+	RANAP_Time-UE-StayedInCell.h	\
+	RANAP_Time-UE-StayedInCell-EnhancedGranularity.h	\
+	RANAP_TimeToMBMSDataTransfer.h	\
+	RANAP_TimingDifferenceULDL.h	\
+	RANAP_TMGI.h	\
+	RANAP_TMSI.h	\
+	RANAP_TraceDepth.h	\
+	RANAP_TraceInformation.h	\
+	RANAP_TracePropagationParameters.h	\
+	RANAP_TraceRecordingSessionInformation.h	\
+	RANAP_TraceRecordingSessionReference.h	\
+	RANAP_TraceReference.h	\
+	RANAP_TraceType.h	\
+	RANAP_TrafficClass.h	\
+	RANAP_TrafficHandlingPriority.h	\
+	RANAP_TransferDelay.h	\
+	RANAP_UnsuccessfullyTransmittedDataVolume.h	\
+	RANAP_TransportLayerAddress.h	\
+	RANAP_TrCH-ID.h	\
+	RANAP_TrCH-ID-List.h	\
+	RANAP_TriggerID.h	\
+	RANAP_TunnelInformation.h	\
+	RANAP_TypeOfError.h	\
+	RANAP_UE-AggregateMaximumBitRate.h	\
+	RANAP_UE-AggregateMaximumBitRateDownlink.h	\
+	RANAP_UE-AggregateMaximumBitRateUplink.h	\
+	RANAP_UE-History-Information.h	\
+	RANAP_UE-ID.h	\
+	RANAP_UESBI-Iu.h	\
+	RANAP_UESBI-IuA.h	\
+	RANAP_UESBI-IuB.h	\
+	RANAP_UL-GTP-PDU-SequenceNumber.h	\
+	RANAP_UL-N-PDU-SequenceNumber.h	\
+	RANAP_UPInformation.h	\
+	RANAP_UPInitialisationFrame.h	\
+	RANAP_UP-ModeVersions.h	\
+	RANAP_USCH-ID.h	\
+	RANAP_UserPlaneMode.h	\
+	RANAP_UTRAN-CellID.h	\
+	RANAP_VelocityEstimate.h	\
+	RANAP_HorizontalVelocity.h	\
+	RANAP_HorizontalWithVerticalVelocity.h	\
+	RANAP_HorizontalVelocityWithUncertainty.h	\
+	RANAP_HorizontalWithVerticalVelocityAndUncertainty.h	\
+	RANAP_HorizontalSpeedAndBearing.h	\
+	RANAP_VerticalVelocity.h	\
+	RANAP_VerticalSpeedDirection.h	\
+	RANAP_VerticalAccuracyCode.h	\
+	RANAP_VoiceSupportMatchIndicator.h	\
+	RANAP_RANAP-PDU.h	\
+	RANAP_InitiatingMessage.h	\
+	RANAP_SuccessfulOutcome.h	\
+	RANAP_UnsuccessfulOutcome.h	\
+	RANAP_Outcome.h	\
+	RANAP_Iu-ReleaseCommand.h	\
+	RANAP_Iu-ReleaseComplete.h	\
+	RANAP_RelocationRequired.h	\
+	RANAP_RelocationCommand.h	\
+	RANAP_RelocationPreparationFailure.h	\
+	RANAP_RelocationRequest.h	\
+	RANAP_RelocationRequestAcknowledge.h	\
+	RANAP_RelocationFailure.h	\
+	RANAP_RelocationCancel.h	\
+	RANAP_RelocationCancelAcknowledge.h	\
+	RANAP_SRNS-ContextRequest.h	\
+	RANAP_SRNS-ContextResponse.h	\
+	RANAP_SecurityModeCommand.h	\
+	RANAP_SecurityModeComplete.h	\
+	RANAP_SecurityModeReject.h	\
+	RANAP_DataVolumeReportRequest.h	\
+	RANAP_DataVolumeReport.h	\
+	RANAP_Reset.h	\
+	RANAP_ResetAcknowledge.h	\
+	RANAP_RAB-ReleaseRequest.h	\
+	RANAP_Iu-ReleaseRequest.h	\
+	RANAP_RelocationDetect.h	\
+	RANAP_RelocationComplete.h	\
+	RANAP_Paging.h	\
+	RANAP_CommonID.h	\
+	RANAP_CN-InvokeTrace.h	\
+	RANAP_CN-DeactivateTrace.h	\
+	RANAP_LocationReportingControl.h	\
+	RANAP_LocationReport.h	\
+	RANAP_InitialUE-Message.h	\
+	RANAP_DirectTransfer.h	\
+	RANAP_Overload.h	\
+	RANAP_ErrorIndication.h	\
+	RANAP_SRNS-DataForwardCommand.h	\
+	RANAP_ForwardSRNS-Context.h	\
+	RANAP_RAB-AssignmentRequest.h	\
+	RANAP_RAB-AssignmentResponse.h	\
+	RANAP_PrivateMessage.h	\
+	RANAP_ResetResource.h	\
+	RANAP_ResetResourceAcknowledge.h	\
+	RANAP_RANAP-RelocationInformation.h	\
+	RANAP_RAB-ModifyRequest.h	\
+	RANAP_LocationRelatedDataRequest.h	\
+	RANAP_LocationRelatedDataResponse.h	\
+	RANAP_LocationRelatedDataFailure.h	\
+	RANAP_InformationTransferIndication.h	\
+	RANAP_InformationTransferConfirmation.h	\
+	RANAP_InformationTransferFailure.h	\
+	RANAP_UESpecificInformationIndication.h	\
+	RANAP_DirectInformationTransfer.h	\
+	RANAP_UplinkInformationExchangeRequest.h	\
+	RANAP_UplinkInformationExchangeResponse.h	\
+	RANAP_UplinkInformationExchangeFailure.h	\
+	RANAP_MBMSSessionStart.h	\
+	RANAP_MBMSSessionStartResponse.h	\
+	RANAP_MBMSSessionStartFailure.h	\
+	RANAP_MBMSSessionUpdate.h	\
+	RANAP_MBMSSessionUpdateResponse.h	\
+	RANAP_MBMSSessionUpdateFailure.h	\
+	RANAP_MBMSSessionStop.h	\
+	RANAP_MBMSSessionStopResponse.h	\
+	RANAP_MBMSUELinkingRequest.h	\
+	RANAP_MBMSUELinkingResponse.h	\
+	RANAP_MBMSRegistrationRequest.h	\
+	RANAP_MBMSRegistrationResponse.h	\
+	RANAP_MBMSRegistrationFailure.h	\
+	RANAP_MBMSCNDe-RegistrationRequest.h	\
+	RANAP_MBMSCNDe-RegistrationResponse.h	\
+	RANAP_MBMSRABEstablishmentIndication.h	\
+	RANAP_MBMSRABReleaseRequest.h	\
+	RANAP_MBMSRABRelease.h	\
+	RANAP_MBMSRABReleaseFailure.h	\
+	RANAP_EnhancedRelocationCompleteRequest.h	\
+	RANAP_EnhancedRelocationCompleteResponse.h	\
+	RANAP_EnhancedRelocationCompleteFailure.h	\
+	RANAP_EnhancedRelocationCompleteConfirm.h	\
+	RANAP_RANAP-EnhancedRelocationInformationRequest.h	\
+	RANAP_RANAP-EnhancedRelocationInformationResponse.h	\
+	RANAP_SRVCC-CSKeysRequest.h	\
+	RANAP_SRVCC-CSKeysResponse.h	\
+	RANAP_UeRadioCapabilityMatchRequest.h	\
+	RANAP_UeRadioCapabilityMatchResponse.h	\
+	RANAP_IE.h
+
+
+lib_LTLIBRARIES=libosmo-asn1-ranap.la
+libsomething_la_SOURCES=$(ASN_MODULE_SOURCES)
+
+# Remove the lines below to convert it into a pure .am file
+CFLAGS += -I. `pkg-config --cflags libasn1c`
+OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o}
+
+all: libosmo-asn1-ranap.a
+
+libosmo-asn1-ranap.a: ${OBJS}
+	$(AR) r $@ $^
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+.c.o:
+	$(CC) $(CFLAGS) -o $@ -c $<
+
+clean:
+	rm -f libosmo-asn1-ranap.a
+	rm -f $(OBJS)
+
+clean-srcs:
+	@rm -f *.c *.h Makefile.am.sample
+
+regen: regenerate-from-asn1-source
+
+regenerate-from-asn1-source: clean clean-srcs
+	ASN1C_PREFIX="RANAP_" asn1c -gen-PER ../../asn1/ranap/RANAP-CommonDataTypes.asn ../../asn1/ranap/RANAP-Constants.asn ../../asn1/ranap/RANAP-IEs.asn ../../asn1/ranap/RANAP-PDU.asn
+	# remove the local copy of the runtime code
+	@rm ANY.* BOOLEAN.* INTEGER.* NativeEnumerated.* NativeInteger.* NULL.* OBJECT_IDENTIFIER.* asn_* OCTET_STRING.* converter-sample.c per_* xer_* constr* der_* ber_* BIT_STRING.*
+	# some fixups in erroneous code that asn1c generates
+	sed -i '6i#include <constr_CHOICE.h>' RANAP_ChosenEncryptionAlgorithm.h RANAP_ChosenIntegrityProtectionAlgorithm.h RANAP_IMSI.h RANAP_PLMNidentity.h
+	sed -i 's/Member/MemberA/' RANAP_LA-LIST.[ch] RANAP_SDU-Parameters.[ch] RANAP_RABParametersList.[ch]
diff --git a/src/ranap/RANAP_APN.c b/src/ranap/RANAP_APN.c
new file mode 100644
index 0000000..9058eaf
--- /dev/null
+++ b/src/ranap/RANAP_APN.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_APN.h"
+
+int
+RANAP_APN_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 1l && size <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_APN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_APN_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_APN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_APN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_APN_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_APN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_APN_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_APN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_APN_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_APN_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_APN_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_APN_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_APN_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  255l }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_APN_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_APN = {
+	"RANAP_APN",
+	"RANAP_APN",
+	RANAP_APN_free,
+	RANAP_APN_print,
+	RANAP_APN_constraint,
+	RANAP_APN_decode_ber,
+	RANAP_APN_encode_der,
+	RANAP_APN_decode_xer,
+	RANAP_APN_encode_xer,
+	RANAP_APN_decode_uper,
+	RANAP_APN_encode_uper,
+	RANAP_APN_decode_aper,
+	RANAP_APN_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_APN_tags_1,
+	sizeof(asn_DEF_RANAP_APN_tags_1)
+		/sizeof(asn_DEF_RANAP_APN_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_APN_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_APN_tags_1)
+		/sizeof(asn_DEF_RANAP_APN_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_APN_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_APN.h b/src/ranap/RANAP_APN.h
new file mode 100644
index 0000000..ac158e1
--- /dev/null
+++ b/src/ranap/RANAP_APN.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_APN_H_
+#define	_RANAP_APN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_APN */
+typedef OCTET_STRING_t	 RANAP_APN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_APN;
+asn_struct_free_f RANAP_APN_free;
+asn_struct_print_f RANAP_APN_print;
+asn_constr_check_f RANAP_APN_constraint;
+ber_type_decoder_f RANAP_APN_decode_ber;
+der_type_encoder_f RANAP_APN_encode_der;
+xer_type_decoder_f RANAP_APN_decode_xer;
+xer_type_encoder_f RANAP_APN_encode_xer;
+per_type_decoder_f RANAP_APN_decode_uper;
+per_type_encoder_f RANAP_APN_encode_uper;
+per_type_decoder_f RANAP_APN_decode_aper;
+per_type_encoder_f RANAP_APN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_APN_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_AccuracyFulfilmentIndicator.c b/src/ranap/RANAP_AccuracyFulfilmentIndicator.c
new file mode 100644
index 0000000..9b190b1
--- /dev/null
+++ b/src/ranap/RANAP_AccuracyFulfilmentIndicator.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_AccuracyFulfilmentIndicator.h"
+
+int
+RANAP_AccuracyFulfilmentIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_AccuracyFulfilmentIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_AccuracyFulfilmentIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_AccuracyFulfilmentIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_AccuracyFulfilmentIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_AccuracyFulfilmentIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_AccuracyFulfilmentIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_AccuracyFulfilmentIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_AccuracyFulfilmentIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_AccuracyFulfilmentIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_AccuracyFulfilmentIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_AccuracyFulfilmentIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_AccuracyFulfilmentIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_AccuracyFulfilmentIndicator_value2enum_1[] = {
+	{ 0,	28,	"requested-Accuracy-Fulfilled" },
+	{ 1,	32,	"requested-Accuracy-Not-Fulfilled" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_AccuracyFulfilmentIndicator_enum2value_1[] = {
+	0,	/* requested-Accuracy-Fulfilled(0) */
+	1	/* requested-Accuracy-Not-Fulfilled(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_AccuracyFulfilmentIndicator_specs_1 = {
+	asn_MAP_RANAP_AccuracyFulfilmentIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_AccuracyFulfilmentIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_AccuracyFulfilmentIndicator = {
+	"RANAP_AccuracyFulfilmentIndicator",
+	"RANAP_AccuracyFulfilmentIndicator",
+	RANAP_AccuracyFulfilmentIndicator_free,
+	RANAP_AccuracyFulfilmentIndicator_print,
+	RANAP_AccuracyFulfilmentIndicator_constraint,
+	RANAP_AccuracyFulfilmentIndicator_decode_ber,
+	RANAP_AccuracyFulfilmentIndicator_encode_der,
+	RANAP_AccuracyFulfilmentIndicator_decode_xer,
+	RANAP_AccuracyFulfilmentIndicator_encode_xer,
+	RANAP_AccuracyFulfilmentIndicator_decode_uper,
+	RANAP_AccuracyFulfilmentIndicator_encode_uper,
+	RANAP_AccuracyFulfilmentIndicator_decode_aper,
+	RANAP_AccuracyFulfilmentIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_AccuracyFulfilmentIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_AccuracyFulfilmentIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_AccuracyFulfilmentIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_AccuracyFulfilmentIndicator.h b/src/ranap/RANAP_AccuracyFulfilmentIndicator.h
new file mode 100644
index 0000000..e95d0b9
--- /dev/null
+++ b/src/ranap/RANAP_AccuracyFulfilmentIndicator.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_AccuracyFulfilmentIndicator_H_
+#define	_RANAP_AccuracyFulfilmentIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_AccuracyFulfilmentIndicator {
+	RANAP_AccuracyFulfilmentIndicator_requested_Accuracy_Fulfilled	= 0,
+	RANAP_AccuracyFulfilmentIndicator_requested_Accuracy_Not_Fulfilled	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_AccuracyFulfilmentIndicator;
+
+/* RANAP_AccuracyFulfilmentIndicator */
+typedef long	 RANAP_AccuracyFulfilmentIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_AccuracyFulfilmentIndicator;
+asn_struct_free_f RANAP_AccuracyFulfilmentIndicator_free;
+asn_struct_print_f RANAP_AccuracyFulfilmentIndicator_print;
+asn_constr_check_f RANAP_AccuracyFulfilmentIndicator_constraint;
+ber_type_decoder_f RANAP_AccuracyFulfilmentIndicator_decode_ber;
+der_type_encoder_f RANAP_AccuracyFulfilmentIndicator_encode_der;
+xer_type_decoder_f RANAP_AccuracyFulfilmentIndicator_decode_xer;
+xer_type_encoder_f RANAP_AccuracyFulfilmentIndicator_encode_xer;
+per_type_decoder_f RANAP_AccuracyFulfilmentIndicator_decode_uper;
+per_type_encoder_f RANAP_AccuracyFulfilmentIndicator_encode_uper;
+per_type_decoder_f RANAP_AccuracyFulfilmentIndicator_decode_aper;
+per_type_encoder_f RANAP_AccuracyFulfilmentIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_AccuracyFulfilmentIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_AllocationOrRetentionPriority.c b/src/ranap/RANAP_AllocationOrRetentionPriority.c
new file mode 100644
index 0000000..08c7d69
--- /dev/null
+++ b/src/ranap/RANAP_AllocationOrRetentionPriority.c
@@ -0,0 +1,103 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_AllocationOrRetentionPriority.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_AllocationOrRetentionPriority_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_AllocationOrRetentionPriority, priorityLevel),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PriorityLevel,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"priorityLevel"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_AllocationOrRetentionPriority, pre_emptionCapability),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Pre_emptionCapability,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pre-emptionCapability"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_AllocationOrRetentionPriority, pre_emptionVulnerability),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Pre_emptionVulnerability,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pre-emptionVulnerability"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_AllocationOrRetentionPriority, queuingAllowed),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_QueuingAllowed,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"queuingAllowed"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_AllocationOrRetentionPriority, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_AllocationOrRetentionPriority_oms_1[] = { 4 };
+static const ber_tlv_tag_t asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_AllocationOrRetentionPriority_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* priorityLevel */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* pre-emptionCapability */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* pre-emptionVulnerability */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* queuingAllowed */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_AllocationOrRetentionPriority_specs_1 = {
+	sizeof(struct RANAP_AllocationOrRetentionPriority),
+	offsetof(struct RANAP_AllocationOrRetentionPriority, _asn_ctx),
+	asn_MAP_RANAP_AllocationOrRetentionPriority_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_RANAP_AllocationOrRetentionPriority_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_AllocationOrRetentionPriority = {
+	"RANAP_AllocationOrRetentionPriority",
+	"RANAP_AllocationOrRetentionPriority",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1,
+	sizeof(asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1)
+		/sizeof(asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1)
+		/sizeof(asn_DEF_RANAP_AllocationOrRetentionPriority_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_AllocationOrRetentionPriority_1,
+	5,	/* Elements count */
+	&asn_SPC_RANAP_AllocationOrRetentionPriority_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_AllocationOrRetentionPriority.h b/src/ranap/RANAP_AllocationOrRetentionPriority.h
new file mode 100644
index 0000000..9f19ea6
--- /dev/null
+++ b/src/ranap/RANAP_AllocationOrRetentionPriority.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_AllocationOrRetentionPriority_H_
+#define	_RANAP_AllocationOrRetentionPriority_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PriorityLevel.h"
+#include "RANAP_Pre-emptionCapability.h"
+#include "RANAP_Pre-emptionVulnerability.h"
+#include "RANAP_QueuingAllowed.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_AllocationOrRetentionPriority */
+typedef struct RANAP_AllocationOrRetentionPriority {
+	RANAP_PriorityLevel_t	 priorityLevel;
+	RANAP_Pre_emptionCapability_t	 pre_emptionCapability;
+	RANAP_Pre_emptionVulnerability_t	 pre_emptionVulnerability;
+	RANAP_QueuingAllowed_t	 queuingAllowed;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_AllocationOrRetentionPriority_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_AllocationOrRetentionPriority;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_AllocationOrRetentionPriority_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.c b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.c
new file mode 100644
index 0000000..98f8fd0
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf, altExtendedGuaranteedBitrateType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altExtendedGuaranteedBitrateType"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf, altExtendedGuaranteedBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altExtendedGuaranteedBitrates"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altExtendedGuaranteedBitrateType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* altExtendedGuaranteedBitrates */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf),
+	offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf = {
+	"RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf",
+	"RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.h b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.h
new file mode 100644
index 0000000..9c51390
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_H_
+#define	_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h"
+#include "RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateInf */
+typedef struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_t	 altExtendedGuaranteedBitrateType;
+	RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_t	*altExtendedGuaranteedBitrates	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.c b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.c
new file mode 100644
index 0000000..a0a2400
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedGuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList),
+	offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList = {
+	"RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList",
+	"RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.h b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.h
new file mode 100644
index 0000000..3e7e9c3
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+#define	_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedGuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList */
+typedef struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedGuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.c b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.c
new file mode 100644
index 0000000..cab8a51
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates),
+	offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates = {
+	"RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates",
+	"RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.h b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.h
new file mode 100644
index 0000000..0a6ef5a
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_H_
+#define	_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrateList.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-ExtendedGuaranteedBitrates */
+typedef struct RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates {
+	A_SEQUENCE_OF(RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrateList_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_ExtendedGuaranteedBitrates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.c b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.c
new file mode 100644
index 0000000..370ceaf
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf, altExtendedMaxBitrateType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altExtendedMaxBitrateType"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf, altExtendedMaxBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altExtendedMaxBitrates"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altExtendedMaxBitrateType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* altExtendedMaxBitrates */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf),
+	offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf = {
+	"RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf",
+	"RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.h b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.h
new file mode 100644
index 0000000..21e53eb
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_H_
+#define	_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateType.h"
+#include "RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateInf */
+typedef struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_t	 altExtendedMaxBitrateType;
+	RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_t	*altExtendedMaxBitrates	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.c b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.c
new file mode 100644
index 0000000..4a98375
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedMaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList),
+	offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList = {
+	"RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList",
+	"RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.h b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.h
new file mode 100644
index 0000000..8e51167
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_H_
+#define	_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedMaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList */
+typedef struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedMaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.c b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.c
new file mode 100644
index 0000000..eb4b238
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates),
+	offsetof(struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates = {
+	"RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates",
+	"RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.h b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.h
new file mode 100644
index 0000000..635a449
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_H_
+#define	_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-ExtendedMaxBitrateList.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-ExtendedMaxBitrates */
+typedef struct RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates {
+	A_SEQUENCE_OF(RANAP_Alt_RAB_Parameter_ExtendedMaxBitrateList_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_ExtendedMaxBitrates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.c b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.c
new file mode 100644
index 0000000..9cff07a
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf, altGuaranteedBitrateType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altGuaranteedBitrateType"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf, altGuaranteedBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altGuaranteedBitrates"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altGuaranteedBitrateType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* altGuaranteedBitrates */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf),
+	offsetof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf = {
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf",
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.h b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.h
new file mode 100644
index 0000000..e136bc7
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_H_
+#define	_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h"
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrates.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf */
+typedef struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_t	 altGuaranteedBitrateType;
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrates_t	*altGuaranteedBitrates	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.c b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.c
new file mode 100644
index 0000000..150e081
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_GuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateList),
+	offsetof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList = {
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrateList",
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.h b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.h
new file mode 100644
index 0000000..b654747
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_H_
+#define	_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-GuaranteedBitrateList */
+typedef struct RANAP_Alt_RAB_Parameter_GuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_GuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.c b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.c
new file mode 100644
index 0000000..204664a
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h"
+
+int
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_value2enum_1[] = {
+	{ 0,	11,	"unspecified" },
+	{ 1,	11,	"value-range" },
+	{ 2,	15,	"discrete-values" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_enum2value_1[] = {
+	2,	/* discrete-values(2) */
+	0,	/* unspecified(0) */
+	1	/* value-range(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_specs_1 = {
+	asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType = {
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrateType",
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrateType",
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_free,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_print,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_constraint,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_ber,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_der,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_xer,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_xer,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_uper,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_uper,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_aper,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h
new file mode 100644
index 0000000..57611be
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_H_
+#define	_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Alt_RAB_Parameter_GuaranteedBitrateType {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_unspecified	= 0,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_value_range	= 1,
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_discrete_values	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType;
+
+/* RANAP_Alt-RAB-Parameter-GuaranteedBitrateType */
+typedef long	 RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType;
+asn_struct_free_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_free;
+asn_struct_print_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_print;
+asn_constr_check_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_constraint;
+ber_type_decoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_ber;
+der_type_encoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_der;
+xer_type_decoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_xer;
+xer_type_encoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_xer;
+per_type_decoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_uper;
+per_type_encoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_uper;
+per_type_decoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_decode_aper;
+per_type_encoder_f RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrates.c b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrates.c
new file mode 100644
index 0000000..ebe1a27
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrates.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrates.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrates),
+	offsetof(struct RANAP_Alt_RAB_Parameter_GuaranteedBitrates, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates = {
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrates",
+	"RANAP_Alt-RAB-Parameter-GuaranteedBitrates",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrates.h b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrates.h
new file mode 100644
index 0000000..0c92a8b
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-GuaranteedBitrates.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_H_
+#define	_RANAP_Alt_RAB_Parameter_GuaranteedBitrates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateList.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-GuaranteedBitrates */
+typedef struct RANAP_Alt_RAB_Parameter_GuaranteedBitrates {
+	A_SEQUENCE_OF(RANAP_Alt_RAB_Parameter_GuaranteedBitrateList_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_GuaranteedBitrates_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_GuaranteedBitrates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateInf.c b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateInf.c
new file mode 100644
index 0000000..6bd2fec
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateInf.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateInf.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_MaxBitrateInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Alt_RAB_Parameter_MaxBitrateInf, altMaxBitrateType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altMaxBitrateType"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameter_MaxBitrateInf, altMaxBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altMaxBitrates"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateInf_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altMaxBitrateType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* altMaxBitrates */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrateInf_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_MaxBitrateInf),
+	offsetof(struct RANAP_Alt_RAB_Parameter_MaxBitrateInf, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateInf_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf = {
+	"RANAP_Alt-RAB-Parameter-MaxBitrateInf",
+	"RANAP_Alt-RAB-Parameter-MaxBitrateInf",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameter_MaxBitrateInf_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrateInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateInf.h b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateInf.h
new file mode 100644
index 0000000..5163490
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateInf.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_MaxBitrateInf_H_
+#define	_RANAP_Alt_RAB_Parameter_MaxBitrateInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateType.h"
+#include "RANAP_Alt-RAB-Parameter-MaxBitrates.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-MaxBitrateInf */
+typedef struct RANAP_Alt_RAB_Parameter_MaxBitrateInf {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_t	 altMaxBitrateType;
+	RANAP_Alt_RAB_Parameter_MaxBitrates_t	*altMaxBitrates	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_MaxBitrateInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_MaxBitrateInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateList.c b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateList.c
new file mode 100644
index 0000000..f776c6d
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_MaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_MaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_MaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_MaxBitrateList),
+	offsetof(struct RANAP_Alt_RAB_Parameter_MaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList = {
+	"RANAP_Alt-RAB-Parameter-MaxBitrateList",
+	"RANAP_Alt-RAB-Parameter-MaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_MaxBitrateList_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_MaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateList.h b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateList.h
new file mode 100644
index 0000000..55d5e74
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_MaxBitrateList_H_
+#define	_RANAP_Alt_RAB_Parameter_MaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-MaxBitrateList */
+typedef struct RANAP_Alt_RAB_Parameter_MaxBitrateList {
+	A_SEQUENCE_OF(RANAP_MaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_MaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_MaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateType.c b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateType.c
new file mode 100644
index 0000000..87e856c
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateType.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateType.h"
+
+int
+RANAP_Alt_RAB_Parameter_MaxBitrateType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Alt_RAB_Parameter_MaxBitrateType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Alt_RAB_Parameter_MaxBitrateType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_MaxBitrateType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateType_value2enum_1[] = {
+	{ 0,	11,	"unspecified" },
+	{ 1,	11,	"value-range" },
+	{ 2,	15,	"discrete-values" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateType_enum2value_1[] = {
+	2,	/* discrete-values(2) */
+	0,	/* unspecified(0) */
+	1	/* value-range(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrateType_specs_1 = {
+	asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Alt_RAB_Parameter_MaxBitrateType_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType = {
+	"RANAP_Alt-RAB-Parameter-MaxBitrateType",
+	"RANAP_Alt-RAB-Parameter-MaxBitrateType",
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_free,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_print,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_constraint,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_ber,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_der,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_xer,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_xer,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_uper,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_uper,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_aper,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_MaxBitrateType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrateType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateType.h b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateType.h
new file mode 100644
index 0000000..1370399
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrateType.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_MaxBitrateType_H_
+#define	_RANAP_Alt_RAB_Parameter_MaxBitrateType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Alt_RAB_Parameter_MaxBitrateType {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_unspecified	= 0,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_value_range	= 1,
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_discrete_values	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Alt_RAB_Parameter_MaxBitrateType;
+
+/* RANAP_Alt-RAB-Parameter-MaxBitrateType */
+typedef long	 RANAP_Alt_RAB_Parameter_MaxBitrateType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType;
+asn_struct_free_f RANAP_Alt_RAB_Parameter_MaxBitrateType_free;
+asn_struct_print_f RANAP_Alt_RAB_Parameter_MaxBitrateType_print;
+asn_constr_check_f RANAP_Alt_RAB_Parameter_MaxBitrateType_constraint;
+ber_type_decoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_ber;
+der_type_encoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_der;
+xer_type_decoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_xer;
+xer_type_encoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_xer;
+per_type_decoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_uper;
+per_type_encoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_uper;
+per_type_decoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_decode_aper;
+per_type_encoder_f RANAP_Alt_RAB_Parameter_MaxBitrateType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_MaxBitrateType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrates.c b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrates.c
new file mode 100644
index 0000000..485a613
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrates.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-MaxBitrates.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_MaxBitrates_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_MaxBitrates_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrates_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_MaxBitrates),
+	offsetof(struct RANAP_Alt_RAB_Parameter_MaxBitrates, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates = {
+	"RANAP_Alt-RAB-Parameter-MaxBitrates",
+	"RANAP_Alt-RAB-Parameter-MaxBitrates",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_MaxBitrates_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_MaxBitrates_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_MaxBitrates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrates.h b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrates.h
new file mode 100644
index 0000000..11aba6d
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-MaxBitrates.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_MaxBitrates_H_
+#define	_RANAP_Alt_RAB_Parameter_MaxBitrates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateList.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-MaxBitrates */
+typedef struct RANAP_Alt_RAB_Parameter_MaxBitrates {
+	A_SEQUENCE_OF(RANAP_Alt_RAB_Parameter_MaxBitrateList_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_MaxBitrates_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_MaxBitrates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.c b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.c
new file mode 100644
index 0000000..cb7351c
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf, altSupportedGuaranteedBitrateType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altSupportedGuaranteedBitrateType"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf, altSupportedGuaranteedBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altSupportedGuaranteedBitrates"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altSupportedGuaranteedBitrateType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* altSupportedGuaranteedBitrates */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf),
+	offsetof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf = {
+	"RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf",
+	"RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.h b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.h
new file mode 100644
index 0000000..f352baa
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_H_
+#define	_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateType.h"
+#include "RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrateInf */
+typedef struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf {
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateType_t	 altSupportedGuaranteedBitrateType;
+	RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_t	*altSupportedGuaranteedBitrates	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.c b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.c
new file mode 100644
index 0000000..35df587
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_SupportedRAB_ParameterBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates),
+	offsetof(struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates = {
+	"RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates",
+	"RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.h b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.h
new file mode 100644
index 0000000..fa2a46f
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_H_
+#define	_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SupportedRAB-ParameterBitrateList.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-SupportedGuaranteedBitrates */
+typedef struct RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates {
+	A_SEQUENCE_OF(RANAP_SupportedRAB_ParameterBitrateList_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_SupportedGuaranteedBitrates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.c b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.c
new file mode 100644
index 0000000..6862df3
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf, altSupportedMaxBitrateType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altSupportedMaxBitrateType"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf, altSupportedMaxBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altSupportedMaxBitrates"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altSupportedMaxBitrateType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* altSupportedMaxBitrates */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf),
+	offsetof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf = {
+	"RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf",
+	"RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.h b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.h
new file mode 100644
index 0000000..3b3fb33
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_H_
+#define	_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateType.h"
+#include "RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-SupportedMaxBitrateInf */
+typedef struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf {
+	RANAP_Alt_RAB_Parameter_MaxBitrateType_t	 altSupportedMaxBitrateType;
+	RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_t	*altSupportedMaxBitrates	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_SupportedMaxBitrateInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.c b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.c
new file mode 100644
index 0000000..bcf848c
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_SupportedRAB_ParameterBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrates),
+	offsetof(struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrates, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates = {
+	"RANAP_Alt-RAB-Parameter-SupportedMaxBitrates",
+	"RANAP_Alt-RAB-Parameter-SupportedMaxBitrates",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_constr_1,
+	asn_MBR_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.h b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.h
new file mode 100644
index 0000000..453d578
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameter-SupportedMaxBitrates.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_H_
+#define	_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SupportedRAB-ParameterBitrateList.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameter-SupportedMaxBitrates */
+typedef struct RANAP_Alt_RAB_Parameter_SupportedMaxBitrates {
+	A_SEQUENCE_OF(RANAP_SupportedRAB_ParameterBitrateList_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameter_SupportedMaxBitrates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameter_SupportedMaxBitrates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Alt-RAB-Parameters.c b/src/ranap/RANAP_Alt-RAB-Parameters.c
new file mode 100644
index 0000000..5bee958
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameters.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Alt-RAB-Parameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Alt_RAB_Parameters_1[] = {
+	{ ATF_POINTER, 3, offsetof(struct RANAP_Alt_RAB_Parameters, altMaxBitrateInf),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_MaxBitrateInf,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altMaxBitrateInf"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_Alt_RAB_Parameters, altGuaranteedBitRateInf),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altGuaranteedBitRateInf"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Alt_RAB_Parameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Alt_RAB_Parameters_oms_1[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Alt_RAB_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Alt_RAB_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* altMaxBitrateInf */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* altGuaranteedBitRateInf */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Alt_RAB_Parameters_specs_1 = {
+	sizeof(struct RANAP_Alt_RAB_Parameters),
+	offsetof(struct RANAP_Alt_RAB_Parameters, _asn_ctx),
+	asn_MAP_RANAP_Alt_RAB_Parameters_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_Alt_RAB_Parameters_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameters = {
+	"RANAP_Alt-RAB-Parameters",
+	"RANAP_Alt-RAB-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Alt_RAB_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Alt_RAB_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Alt_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Alt_RAB_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Alt_RAB_Parameters_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Alt_RAB_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Alt-RAB-Parameters.h b/src/ranap/RANAP_Alt-RAB-Parameters.h
new file mode 100644
index 0000000..a92d41c
--- /dev/null
+++ b/src/ranap/RANAP_Alt-RAB-Parameters.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Alt_RAB_Parameters_H_
+#define	_RANAP_Alt_RAB_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Alt-RAB-Parameter-MaxBitrateInf.h"
+#include "RANAP_Alt-RAB-Parameter-GuaranteedBitrateInf.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Alt-RAB-Parameters */
+typedef struct RANAP_Alt_RAB_Parameters {
+	RANAP_Alt_RAB_Parameter_MaxBitrateInf_t	*altMaxBitrateInf	/* OPTIONAL */;
+	RANAP_Alt_RAB_Parameter_GuaranteedBitrateInf_t	*altGuaranteedBitRateInf	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Alt_RAB_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Alt_RAB_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Alt_RAB_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_AlternativeRABConfigurationRequest.c b/src/ranap/RANAP_AlternativeRABConfigurationRequest.c
new file mode 100644
index 0000000..388a74d
--- /dev/null
+++ b/src/ranap/RANAP_AlternativeRABConfigurationRequest.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_AlternativeRABConfigurationRequest.h"
+
+int
+RANAP_AlternativeRABConfigurationRequest_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_AlternativeRABConfigurationRequest_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_AlternativeRABConfigurationRequest_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_AlternativeRABConfigurationRequest_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_AlternativeRABConfigurationRequest_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_AlternativeRABConfigurationRequest_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_AlternativeRABConfigurationRequest_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_AlternativeRABConfigurationRequest_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_AlternativeRABConfigurationRequest_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_AlternativeRABConfigurationRequest_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_AlternativeRABConfigurationRequest_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_AlternativeRABConfigurationRequest_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_AlternativeRABConfigurationRequest_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_AlternativeRABConfigurationRequest_value2enum_1[] = {
+	{ 0,	39,	"alternative-RAB-configuration-Requested" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_AlternativeRABConfigurationRequest_enum2value_1[] = {
+	0	/* alternative-RAB-configuration-Requested(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_AlternativeRABConfigurationRequest_specs_1 = {
+	asn_MAP_RANAP_AlternativeRABConfigurationRequest_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_AlternativeRABConfigurationRequest_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_AlternativeRABConfigurationRequest = {
+	"RANAP_AlternativeRABConfigurationRequest",
+	"RANAP_AlternativeRABConfigurationRequest",
+	RANAP_AlternativeRABConfigurationRequest_free,
+	RANAP_AlternativeRABConfigurationRequest_print,
+	RANAP_AlternativeRABConfigurationRequest_constraint,
+	RANAP_AlternativeRABConfigurationRequest_decode_ber,
+	RANAP_AlternativeRABConfigurationRequest_encode_der,
+	RANAP_AlternativeRABConfigurationRequest_decode_xer,
+	RANAP_AlternativeRABConfigurationRequest_encode_xer,
+	RANAP_AlternativeRABConfigurationRequest_decode_uper,
+	RANAP_AlternativeRABConfigurationRequest_encode_uper,
+	RANAP_AlternativeRABConfigurationRequest_decode_aper,
+	RANAP_AlternativeRABConfigurationRequest_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1,
+	sizeof(asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_AlternativeRABConfigurationRequest_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_AlternativeRABConfigurationRequest_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_AlternativeRABConfigurationRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_AlternativeRABConfigurationRequest.h b/src/ranap/RANAP_AlternativeRABConfigurationRequest.h
new file mode 100644
index 0000000..676d97f
--- /dev/null
+++ b/src/ranap/RANAP_AlternativeRABConfigurationRequest.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_AlternativeRABConfigurationRequest_H_
+#define	_RANAP_AlternativeRABConfigurationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_AlternativeRABConfigurationRequest {
+	RANAP_AlternativeRABConfigurationRequest_alternative_RAB_configuration_Requested	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_AlternativeRABConfigurationRequest;
+
+/* RANAP_AlternativeRABConfigurationRequest */
+typedef long	 RANAP_AlternativeRABConfigurationRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_AlternativeRABConfigurationRequest;
+asn_struct_free_f RANAP_AlternativeRABConfigurationRequest_free;
+asn_struct_print_f RANAP_AlternativeRABConfigurationRequest_print;
+asn_constr_check_f RANAP_AlternativeRABConfigurationRequest_constraint;
+ber_type_decoder_f RANAP_AlternativeRABConfigurationRequest_decode_ber;
+der_type_encoder_f RANAP_AlternativeRABConfigurationRequest_encode_der;
+xer_type_decoder_f RANAP_AlternativeRABConfigurationRequest_decode_xer;
+xer_type_encoder_f RANAP_AlternativeRABConfigurationRequest_encode_xer;
+per_type_decoder_f RANAP_AlternativeRABConfigurationRequest_decode_uper;
+per_type_encoder_f RANAP_AlternativeRABConfigurationRequest_encode_uper;
+per_type_decoder_f RANAP_AlternativeRABConfigurationRequest_decode_aper;
+per_type_encoder_f RANAP_AlternativeRABConfigurationRequest_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_AlternativeRABConfigurationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_AreaIdentity.c b/src/ranap/RANAP_AreaIdentity.c
new file mode 100644
index 0000000..259b8b0
--- /dev/null
+++ b/src/ranap/RANAP_AreaIdentity.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_AreaIdentity.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_AreaIdentity_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_AreaIdentity_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_AreaIdentity, choice.sAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sAI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_AreaIdentity, choice.geographicalArea),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalArea,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalArea"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_AreaIdentity_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* geographicalArea */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_AreaIdentity_specs_1 = {
+	sizeof(struct RANAP_AreaIdentity),
+	offsetof(struct RANAP_AreaIdentity, _asn_ctx),
+	offsetof(struct RANAP_AreaIdentity, present),
+	sizeof(((struct RANAP_AreaIdentity *)0)->present),
+	asn_MAP_RANAP_AreaIdentity_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_AreaIdentity = {
+	"RANAP_AreaIdentity",
+	"RANAP_AreaIdentity",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_AreaIdentity_constr_1,
+	asn_MBR_RANAP_AreaIdentity_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_AreaIdentity_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_AreaIdentity.h b/src/ranap/RANAP_AreaIdentity.h
new file mode 100644
index 0000000..3af01d2
--- /dev/null
+++ b/src/ranap/RANAP_AreaIdentity.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_AreaIdentity_H_
+#define	_RANAP_AreaIdentity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SAI.h"
+#include "RANAP_GeographicalArea.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_AreaIdentity_PR {
+	RANAP_AreaIdentity_PR_NOTHING,	/* No components present */
+	RANAP_AreaIdentity_PR_sAI,
+	RANAP_AreaIdentity_PR_geographicalArea,
+	/* Extensions may appear below */
+	
+} RANAP_AreaIdentity_PR;
+
+/* RANAP_AreaIdentity */
+typedef struct RANAP_AreaIdentity {
+	RANAP_AreaIdentity_PR present;
+	union RANAP_AreaIdentity_u {
+		RANAP_SAI_t	 sAI;
+		RANAP_GeographicalArea_t	 geographicalArea;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_AreaIdentity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_AreaIdentity;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_AreaIdentity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.c b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.c
new file mode 100644
index 0000000..310bf43
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedGuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList),
+	offsetof(struct RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList = {
+	"RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList",
+	"RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.h b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.h
new file mode 100644
index 0000000..a8a5bc6
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+#define	_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedGuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Ass-RAB-Parameter-ExtendedGuaranteedBitrateList */
+typedef struct RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedGuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.c b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.c
new file mode 100644
index 0000000..90f2cda
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedMaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList),
+	offsetof(struct RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList = {
+	"RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList",
+	"RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_constr_1,
+	asn_MBR_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.h b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.h
new file mode 100644
index 0000000..4ecb4e6
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_H_
+#define	_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedMaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Ass-RAB-Parameter-ExtendedMaxBitrateList */
+typedef struct RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedMaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Ass_RAB_Parameter_ExtendedMaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.c b/src/ranap/RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.c
new file mode 100644
index 0000000..59ff57d
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_GuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_Ass_RAB_Parameter_GuaranteedBitrateList),
+	offsetof(struct RANAP_Ass_RAB_Parameter_GuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList = {
+	"RANAP_Ass-RAB-Parameter-GuaranteedBitrateList",
+	"RANAP_Ass-RAB-Parameter-GuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.h b/src/ranap/RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.h
new file mode 100644
index 0000000..63e30ed
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_H_
+#define	_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Ass-RAB-Parameter-GuaranteedBitrateList */
+typedef struct RANAP_Ass_RAB_Parameter_GuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_GuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-MaxBitrateList.c b/src/ranap/RANAP_Ass-RAB-Parameter-MaxBitrateList.c
new file mode 100644
index 0000000..94bafa4
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-MaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Ass-RAB-Parameter-MaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Ass_RAB_Parameter_MaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Ass_RAB_Parameter_MaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_MaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Ass_RAB_Parameter_MaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_Ass_RAB_Parameter_MaxBitrateList),
+	offsetof(struct RANAP_Ass_RAB_Parameter_MaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList = {
+	"RANAP_Ass-RAB-Parameter-MaxBitrateList",
+	"RANAP_Ass-RAB-Parameter-MaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Ass_RAB_Parameter_MaxBitrateList_constr_1,
+	asn_MBR_RANAP_Ass_RAB_Parameter_MaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Ass_RAB_Parameter_MaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Ass-RAB-Parameter-MaxBitrateList.h b/src/ranap/RANAP_Ass-RAB-Parameter-MaxBitrateList.h
new file mode 100644
index 0000000..1171651
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameter-MaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Ass_RAB_Parameter_MaxBitrateList_H_
+#define	_RANAP_Ass_RAB_Parameter_MaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Ass-RAB-Parameter-MaxBitrateList */
+typedef struct RANAP_Ass_RAB_Parameter_MaxBitrateList {
+	A_SEQUENCE_OF(RANAP_MaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Ass_RAB_Parameter_MaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Ass_RAB_Parameter_MaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Ass-RAB-Parameters.c b/src/ranap/RANAP_Ass-RAB-Parameters.c
new file mode 100644
index 0000000..2804418
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameters.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Ass-RAB-Parameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Ass_RAB_Parameters_1[] = {
+	{ ATF_POINTER, 3, offsetof(struct RANAP_Ass_RAB_Parameters, assMaxBitrateInf),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Ass_RAB_Parameter_MaxBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"assMaxBitrateInf"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_Ass_RAB_Parameters, assGuaranteedBitRateInf),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Ass_RAB_Parameter_GuaranteedBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"assGuaranteedBitRateInf"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Ass_RAB_Parameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Ass_RAB_Parameters_oms_1[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Ass_RAB_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Ass_RAB_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* assMaxBitrateInf */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* assGuaranteedBitRateInf */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Ass_RAB_Parameters_specs_1 = {
+	sizeof(struct RANAP_Ass_RAB_Parameters),
+	offsetof(struct RANAP_Ass_RAB_Parameters, _asn_ctx),
+	asn_MAP_RANAP_Ass_RAB_Parameters_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_Ass_RAB_Parameters_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameters = {
+	"RANAP_Ass-RAB-Parameters",
+	"RANAP_Ass-RAB-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Ass_RAB_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Ass_RAB_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Ass_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Ass_RAB_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Ass_RAB_Parameters_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Ass_RAB_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Ass-RAB-Parameters.h b/src/ranap/RANAP_Ass-RAB-Parameters.h
new file mode 100644
index 0000000..4760fdf
--- /dev/null
+++ b/src/ranap/RANAP_Ass-RAB-Parameters.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Ass_RAB_Parameters_H_
+#define	_RANAP_Ass_RAB_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Ass-RAB-Parameter-MaxBitrateList.h"
+#include "RANAP_Ass-RAB-Parameter-GuaranteedBitrateList.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Ass-RAB-Parameters */
+typedef struct RANAP_Ass_RAB_Parameters {
+	RANAP_Ass_RAB_Parameter_MaxBitrateList_t	*assMaxBitrateInf	/* OPTIONAL */;
+	RANAP_Ass_RAB_Parameter_GuaranteedBitrateList_t	*assGuaranteedBitRateInf	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Ass_RAB_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Ass_RAB_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Ass_RAB_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_AuthorisedPLMNs.c b/src/ranap/RANAP_AuthorisedPLMNs.c
new file mode 100644
index 0000000..784177c
--- /dev/null
+++ b/src/ranap/RANAP_AuthorisedPLMNs.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_AuthorisedPLMNs.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_AuthorisedPLMNs_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  1l,  32l }	/* (SIZE(1..32)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, authorisedSNAsList),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_AuthorisedSNAs,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"authorisedSNAsList"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* authorisedSNAsList */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	3,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_AuthorisedPLMNs_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_AuthorisedPLMNs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_AuthorisedPLMNs_specs_1 = {
+	sizeof(struct RANAP_AuthorisedPLMNs),
+	offsetof(struct RANAP_AuthorisedPLMNs, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_AuthorisedPLMNs = {
+	"RANAP_AuthorisedPLMNs",
+	"RANAP_AuthorisedPLMNs",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_AuthorisedPLMNs_tags_1,
+	sizeof(asn_DEF_RANAP_AuthorisedPLMNs_tags_1)
+		/sizeof(asn_DEF_RANAP_AuthorisedPLMNs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_AuthorisedPLMNs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_AuthorisedPLMNs_tags_1)
+		/sizeof(asn_DEF_RANAP_AuthorisedPLMNs_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_AuthorisedPLMNs_constr_1,
+	asn_MBR_RANAP_AuthorisedPLMNs_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_AuthorisedPLMNs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_AuthorisedPLMNs.h b/src/ranap/RANAP_AuthorisedPLMNs.h
new file mode 100644
index 0000000..16fe12c
--- /dev/null
+++ b/src/ranap/RANAP_AuthorisedPLMNs.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_AuthorisedPLMNs_H_
+#define	_RANAP_AuthorisedPLMNs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_AuthorisedSNAs.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_AuthorisedPLMNs */
+typedef struct RANAP_AuthorisedPLMNs {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_PLMNidentity_t	 pLMNidentity;
+		RANAP_AuthorisedSNAs_t	*authorisedSNAsList	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_AuthorisedPLMNs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_AuthorisedPLMNs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_AuthorisedPLMNs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_AuthorisedSNAs.c b/src/ranap/RANAP_AuthorisedSNAs.c
new file mode 100644
index 0000000..f236bec
--- /dev/null
+++ b/src/ranap/RANAP_AuthorisedSNAs.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_AuthorisedSNAs.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_AuthorisedSNAs_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_AuthorisedSNAs_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_SNAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_AuthorisedSNAs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_AuthorisedSNAs_specs_1 = {
+	sizeof(struct RANAP_AuthorisedSNAs),
+	offsetof(struct RANAP_AuthorisedSNAs, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_AuthorisedSNAs = {
+	"RANAP_AuthorisedSNAs",
+	"RANAP_AuthorisedSNAs",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_AuthorisedSNAs_tags_1,
+	sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1)
+		/sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_AuthorisedSNAs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1)
+		/sizeof(asn_DEF_RANAP_AuthorisedSNAs_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_AuthorisedSNAs_constr_1,
+	asn_MBR_RANAP_AuthorisedSNAs_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_AuthorisedSNAs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_AuthorisedSNAs.h b/src/ranap/RANAP_AuthorisedSNAs.h
new file mode 100644
index 0000000..20abd85
--- /dev/null
+++ b/src/ranap/RANAP_AuthorisedSNAs.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_AuthorisedSNAs_H_
+#define	_RANAP_AuthorisedSNAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SNAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_AuthorisedSNAs */
+typedef struct RANAP_AuthorisedSNAs {
+	A_SEQUENCE_OF(RANAP_SNAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_AuthorisedSNAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_AuthorisedSNAs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_AuthorisedSNAs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_BindingID.c b/src/ranap/RANAP_BindingID.c
new file mode 100644
index 0000000..92f72c9
--- /dev/null
+++ b/src/ranap/RANAP_BindingID.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_BindingID.h"
+
+int
+RANAP_BindingID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_BindingID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_BindingID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_BindingID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_BindingID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_BindingID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_BindingID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_BindingID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_BindingID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_BindingID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_BindingID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_BindingID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_BindingID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_BindingID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_BindingID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_BindingID = {
+	"RANAP_BindingID",
+	"RANAP_BindingID",
+	RANAP_BindingID_free,
+	RANAP_BindingID_print,
+	RANAP_BindingID_constraint,
+	RANAP_BindingID_decode_ber,
+	RANAP_BindingID_encode_der,
+	RANAP_BindingID_decode_xer,
+	RANAP_BindingID_encode_xer,
+	RANAP_BindingID_decode_uper,
+	RANAP_BindingID_encode_uper,
+	RANAP_BindingID_decode_aper,
+	RANAP_BindingID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_BindingID_tags_1,
+	sizeof(asn_DEF_RANAP_BindingID_tags_1)
+		/sizeof(asn_DEF_RANAP_BindingID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_BindingID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_BindingID_tags_1)
+		/sizeof(asn_DEF_RANAP_BindingID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_BindingID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_BindingID.h b/src/ranap/RANAP_BindingID.h
new file mode 100644
index 0000000..ff5a303
--- /dev/null
+++ b/src/ranap/RANAP_BindingID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_BindingID_H_
+#define	_RANAP_BindingID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_BindingID */
+typedef OCTET_STRING_t	 RANAP_BindingID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_BindingID;
+asn_struct_free_f RANAP_BindingID_free;
+asn_struct_print_f RANAP_BindingID_print;
+asn_constr_check_f RANAP_BindingID_constraint;
+ber_type_decoder_f RANAP_BindingID_decode_ber;
+der_type_encoder_f RANAP_BindingID_encode_der;
+xer_type_decoder_f RANAP_BindingID_decode_xer;
+xer_type_encoder_f RANAP_BindingID_encode_xer;
+per_type_decoder_f RANAP_BindingID_decode_uper;
+per_type_encoder_f RANAP_BindingID_encode_uper;
+per_type_decoder_f RANAP_BindingID_decode_aper;
+per_type_encoder_f RANAP_BindingID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_BindingID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_BroadcastAssistanceDataDecipheringKeys.c b/src/ranap/RANAP_BroadcastAssistanceDataDecipheringKeys.c
new file mode 100644
index 0000000..cfbe03d
--- /dev/null
+++ b/src/ranap/RANAP_BroadcastAssistanceDataDecipheringKeys.c
@@ -0,0 +1,189 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_BroadcastAssistanceDataDecipheringKeys.h"
+
+static int
+memb_cipheringKeyFlag_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_currentDecipheringKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 56l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_nextDecipheringKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 56l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_cipheringKeyFlag_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_currentDecipheringKey_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  56l,  56l }	/* (SIZE(56..56)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_nextDecipheringKey_constr_4 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  56l,  56l }	/* (SIZE(56..56)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_BroadcastAssistanceDataDecipheringKeys_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_BroadcastAssistanceDataDecipheringKeys, cipheringKeyFlag),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_cipheringKeyFlag_constraint_1,
+		&asn_PER_memb_cipheringKeyFlag_constr_2,
+		0,
+		"cipheringKeyFlag"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_BroadcastAssistanceDataDecipheringKeys, currentDecipheringKey),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_currentDecipheringKey_constraint_1,
+		&asn_PER_memb_currentDecipheringKey_constr_3,
+		0,
+		"currentDecipheringKey"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_BroadcastAssistanceDataDecipheringKeys, nextDecipheringKey),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_nextDecipheringKey_constraint_1,
+		&asn_PER_memb_nextDecipheringKey_constr_4,
+		0,
+		"nextDecipheringKey"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_BroadcastAssistanceDataDecipheringKeys_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cipheringKeyFlag */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* currentDecipheringKey */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* nextDecipheringKey */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_BroadcastAssistanceDataDecipheringKeys_specs_1 = {
+	sizeof(struct RANAP_BroadcastAssistanceDataDecipheringKeys),
+	offsetof(struct RANAP_BroadcastAssistanceDataDecipheringKeys, _asn_ctx),
+	asn_MAP_RANAP_BroadcastAssistanceDataDecipheringKeys_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys = {
+	"RANAP_BroadcastAssistanceDataDecipheringKeys",
+	"RANAP_BroadcastAssistanceDataDecipheringKeys",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1,
+	sizeof(asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1)
+		/sizeof(asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1)
+		/sizeof(asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_BroadcastAssistanceDataDecipheringKeys_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_BroadcastAssistanceDataDecipheringKeys_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_BroadcastAssistanceDataDecipheringKeys.h b/src/ranap/RANAP_BroadcastAssistanceDataDecipheringKeys.h
new file mode 100644
index 0000000..8d0e895
--- /dev/null
+++ b/src/ranap/RANAP_BroadcastAssistanceDataDecipheringKeys.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_BroadcastAssistanceDataDecipheringKeys_H_
+#define	_RANAP_BroadcastAssistanceDataDecipheringKeys_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_BroadcastAssistanceDataDecipheringKeys */
+typedef struct RANAP_BroadcastAssistanceDataDecipheringKeys {
+	BIT_STRING_t	 cipheringKeyFlag;
+	BIT_STRING_t	 currentDecipheringKey;
+	BIT_STRING_t	 nextDecipheringKey;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_BroadcastAssistanceDataDecipheringKeys_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_BroadcastAssistanceDataDecipheringKeys;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_BroadcastAssistanceDataDecipheringKeys_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CGI.c b/src/ranap/RANAP_CGI.c
new file mode 100644
index 0000000..6987266
--- /dev/null
+++ b/src/ranap/RANAP_CGI.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CGI.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_CGI_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CGI, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CGI, lAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAC"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CGI, cI),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cI"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_CGI, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_CGI_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_CGI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CGI_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* lAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cI */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CGI_specs_1 = {
+	sizeof(struct RANAP_CGI),
+	offsetof(struct RANAP_CGI, _asn_ctx),
+	asn_MAP_RANAP_CGI_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_CGI_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CGI = {
+	"RANAP_CGI",
+	"RANAP_CGI",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CGI_tags_1,
+	sizeof(asn_DEF_RANAP_CGI_tags_1)
+		/sizeof(asn_DEF_RANAP_CGI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CGI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CGI_tags_1)
+		/sizeof(asn_DEF_RANAP_CGI_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CGI_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_CGI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CGI.h b/src/ranap/RANAP_CGI.h
new file mode 100644
index 0000000..7f132b8
--- /dev/null
+++ b/src/ranap/RANAP_CGI.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CGI_H_
+#define	_RANAP_CGI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_LAC.h"
+#include "RANAP_CI.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CGI */
+typedef struct RANAP_CGI {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_LAC_t	 lAC;
+	RANAP_CI_t	 cI;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CGI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CGI;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CGI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CI.c b/src/ranap/RANAP_CI.c
new file mode 100644
index 0000000..9033b5f
--- /dev/null
+++ b/src/ranap/RANAP_CI.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CI.h"
+
+int
+RANAP_CI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_CI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CI_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CI = {
+	"RANAP_CI",
+	"RANAP_CI",
+	RANAP_CI_free,
+	RANAP_CI_print,
+	RANAP_CI_constraint,
+	RANAP_CI_decode_ber,
+	RANAP_CI_encode_der,
+	RANAP_CI_decode_xer,
+	RANAP_CI_encode_xer,
+	RANAP_CI_decode_uper,
+	RANAP_CI_encode_uper,
+	RANAP_CI_decode_aper,
+	RANAP_CI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CI_tags_1,
+	sizeof(asn_DEF_RANAP_CI_tags_1)
+		/sizeof(asn_DEF_RANAP_CI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CI_tags_1)
+		/sizeof(asn_DEF_RANAP_CI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CI.h b/src/ranap/RANAP_CI.h
new file mode 100644
index 0000000..fb7c777
--- /dev/null
+++ b/src/ranap/RANAP_CI.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CI_H_
+#define	_RANAP_CI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CI */
+typedef OCTET_STRING_t	 RANAP_CI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CI;
+asn_struct_free_f RANAP_CI_free;
+asn_struct_print_f RANAP_CI_print;
+asn_constr_check_f RANAP_CI_constraint;
+ber_type_decoder_f RANAP_CI_decode_ber;
+der_type_encoder_f RANAP_CI_encode_der;
+xer_type_decoder_f RANAP_CI_decode_xer;
+xer_type_encoder_f RANAP_CI_encode_xer;
+per_type_decoder_f RANAP_CI_decode_uper;
+per_type_encoder_f RANAP_CI_encode_uper;
+per_type_decoder_f RANAP_CI_decode_aper;
+per_type_encoder_f RANAP_CI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CN-DeactivateTrace.c b/src/ranap/RANAP_CN-DeactivateTrace.c
new file mode 100644
index 0000000..d1b013c
--- /dev/null
+++ b/src/ranap/RANAP_CN-DeactivateTrace.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_CN-DeactivateTrace.h"
+
+static int
+memb_cN_DeactivateTrace_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_cN_DeactivateTrace_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_cN_DeactivateTrace_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_cN_DeactivateTrace_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_cN_DeactivateTrace_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_cN_DeactivateTrace_ies_specs_2 = {
+	sizeof(struct cN_DeactivateTrace_ies),
+	offsetof(struct cN_DeactivateTrace_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_cN_DeactivateTrace_ies_2 = {
+	"cN-DeactivateTrace-ies",
+	"cN-DeactivateTrace-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_cN_DeactivateTrace_ies_tags_2,
+	sizeof(asn_DEF_cN_DeactivateTrace_ies_tags_2)
+		/sizeof(asn_DEF_cN_DeactivateTrace_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_cN_DeactivateTrace_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_cN_DeactivateTrace_ies_tags_2)
+		/sizeof(asn_DEF_cN_DeactivateTrace_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_cN_DeactivateTrace_ies_constr_2,
+	asn_MBR_cN_DeactivateTrace_ies_2,
+	1,	/* Single element */
+	&asn_SPC_cN_DeactivateTrace_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_CN_DeactivateTrace_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CN_DeactivateTrace, cN_DeactivateTrace_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_cN_DeactivateTrace_ies_2,
+		memb_cN_DeactivateTrace_ies_constraint_1,
+		&asn_PER_memb_cN_DeactivateTrace_ies_constr_2,
+		0,
+		"cN-DeactivateTrace-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CN_DeactivateTrace_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CN_DeactivateTrace_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* cN-DeactivateTrace-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CN_DeactivateTrace_specs_1 = {
+	sizeof(struct RANAP_CN_DeactivateTrace),
+	offsetof(struct RANAP_CN_DeactivateTrace, _asn_ctx),
+	asn_MAP_RANAP_CN_DeactivateTrace_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CN_DeactivateTrace = {
+	"RANAP_CN-DeactivateTrace",
+	"RANAP_CN-DeactivateTrace",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CN_DeactivateTrace_tags_1,
+	sizeof(asn_DEF_RANAP_CN_DeactivateTrace_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_DeactivateTrace_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CN_DeactivateTrace_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CN_DeactivateTrace_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_DeactivateTrace_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CN_DeactivateTrace_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_CN_DeactivateTrace_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CN-DeactivateTrace.h b/src/ranap/RANAP_CN-DeactivateTrace.h
new file mode 100644
index 0000000..8be0305
--- /dev/null
+++ b/src/ranap/RANAP_CN-DeactivateTrace.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_CN_DeactivateTrace_H_
+#define	_RANAP_CN_DeactivateTrace_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CN-DeactivateTrace */
+typedef struct RANAP_CN_DeactivateTrace {
+	struct cN_DeactivateTrace_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} cN_DeactivateTrace_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CN_DeactivateTrace_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CN_DeactivateTrace;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CN_DeactivateTrace_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CN-DomainIndicator.c b/src/ranap/RANAP_CN-DomainIndicator.c
new file mode 100644
index 0000000..ba1eeef
--- /dev/null
+++ b/src/ranap/RANAP_CN-DomainIndicator.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CN-DomainIndicator.h"
+
+int
+RANAP_CN_DomainIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_CN_DomainIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CN_DomainIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CN_DomainIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CN_DomainIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CN_DomainIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CN_DomainIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CN_DomainIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CN_DomainIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CN_DomainIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CN_DomainIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CN_DomainIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CN_DomainIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_CN_DomainIndicator_value2enum_1[] = {
+	{ 0,	9,	"cs-domain" },
+	{ 1,	9,	"ps-domain" }
+};
+static const unsigned int asn_MAP_RANAP_CN_DomainIndicator_enum2value_1[] = {
+	0,	/* cs-domain(0) */
+	1	/* ps-domain(1) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_CN_DomainIndicator_specs_1 = {
+	asn_MAP_RANAP_CN_DomainIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_CN_DomainIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CN_DomainIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CN_DomainIndicator = {
+	"RANAP_CN-DomainIndicator",
+	"RANAP_CN-DomainIndicator",
+	RANAP_CN_DomainIndicator_free,
+	RANAP_CN_DomainIndicator_print,
+	RANAP_CN_DomainIndicator_constraint,
+	RANAP_CN_DomainIndicator_decode_ber,
+	RANAP_CN_DomainIndicator_encode_der,
+	RANAP_CN_DomainIndicator_decode_xer,
+	RANAP_CN_DomainIndicator_encode_xer,
+	RANAP_CN_DomainIndicator_decode_uper,
+	RANAP_CN_DomainIndicator_encode_uper,
+	RANAP_CN_DomainIndicator_decode_aper,
+	RANAP_CN_DomainIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CN_DomainIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_CN_DomainIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_DomainIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CN_DomainIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CN_DomainIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_DomainIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CN_DomainIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_CN_DomainIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CN-DomainIndicator.h b/src/ranap/RANAP_CN-DomainIndicator.h
new file mode 100644
index 0000000..3a63f87
--- /dev/null
+++ b/src/ranap/RANAP_CN-DomainIndicator.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CN_DomainIndicator_H_
+#define	_RANAP_CN_DomainIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CN_DomainIndicator {
+	RANAP_CN_DomainIndicator_cs_domain	= 0,
+	RANAP_CN_DomainIndicator_ps_domain	= 1
+} e_RANAP_CN_DomainIndicator;
+
+/* RANAP_CN-DomainIndicator */
+typedef long	 RANAP_CN_DomainIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CN_DomainIndicator;
+asn_struct_free_f RANAP_CN_DomainIndicator_free;
+asn_struct_print_f RANAP_CN_DomainIndicator_print;
+asn_constr_check_f RANAP_CN_DomainIndicator_constraint;
+ber_type_decoder_f RANAP_CN_DomainIndicator_decode_ber;
+der_type_encoder_f RANAP_CN_DomainIndicator_encode_der;
+xer_type_decoder_f RANAP_CN_DomainIndicator_decode_xer;
+xer_type_encoder_f RANAP_CN_DomainIndicator_encode_xer;
+per_type_decoder_f RANAP_CN_DomainIndicator_decode_uper;
+per_type_encoder_f RANAP_CN_DomainIndicator_encode_uper;
+per_type_decoder_f RANAP_CN_DomainIndicator_decode_aper;
+per_type_encoder_f RANAP_CN_DomainIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CN_DomainIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CN-ID.c b/src/ranap/RANAP_CN-ID.c
new file mode 100644
index 0000000..53522b4
--- /dev/null
+++ b/src/ranap/RANAP_CN-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CN-ID.h"
+
+int
+RANAP_CN_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 4095l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CN_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CN_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CN_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CN_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CN_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CN_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CN_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CN_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CN_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CN_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CN_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CN_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CN_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  0l,  4095l }	/* (0..4095) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CN_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CN_ID = {
+	"RANAP_CN-ID",
+	"RANAP_CN-ID",
+	RANAP_CN_ID_free,
+	RANAP_CN_ID_print,
+	RANAP_CN_ID_constraint,
+	RANAP_CN_ID_decode_ber,
+	RANAP_CN_ID_encode_der,
+	RANAP_CN_ID_decode_xer,
+	RANAP_CN_ID_encode_xer,
+	RANAP_CN_ID_decode_uper,
+	RANAP_CN_ID_encode_uper,
+	RANAP_CN_ID_decode_aper,
+	RANAP_CN_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CN_ID_tags_1,
+	sizeof(asn_DEF_RANAP_CN_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CN_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CN_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CN_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CN-ID.h b/src/ranap/RANAP_CN-ID.h
new file mode 100644
index 0000000..2032791
--- /dev/null
+++ b/src/ranap/RANAP_CN-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CN_ID_H_
+#define	_RANAP_CN_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CN-ID */
+typedef long	 RANAP_CN_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CN_ID;
+asn_struct_free_f RANAP_CN_ID_free;
+asn_struct_print_f RANAP_CN_ID_print;
+asn_constr_check_f RANAP_CN_ID_constraint;
+ber_type_decoder_f RANAP_CN_ID_decode_ber;
+der_type_encoder_f RANAP_CN_ID_encode_der;
+xer_type_decoder_f RANAP_CN_ID_decode_xer;
+xer_type_encoder_f RANAP_CN_ID_encode_xer;
+per_type_decoder_f RANAP_CN_ID_decode_uper;
+per_type_encoder_f RANAP_CN_ID_encode_uper;
+per_type_decoder_f RANAP_CN_ID_decode_aper;
+per_type_encoder_f RANAP_CN_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CN_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CN-InvokeTrace.c b/src/ranap/RANAP_CN-InvokeTrace.c
new file mode 100644
index 0000000..980cf6c
--- /dev/null
+++ b/src/ranap/RANAP_CN-InvokeTrace.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_CN-InvokeTrace.h"
+
+static int
+memb_cN_InvokeTrace_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_cN_InvokeTrace_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_cN_InvokeTrace_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_cN_InvokeTrace_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_cN_InvokeTrace_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_cN_InvokeTrace_ies_specs_2 = {
+	sizeof(struct cN_InvokeTrace_ies),
+	offsetof(struct cN_InvokeTrace_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_cN_InvokeTrace_ies_2 = {
+	"cN-InvokeTrace-ies",
+	"cN-InvokeTrace-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_cN_InvokeTrace_ies_tags_2,
+	sizeof(asn_DEF_cN_InvokeTrace_ies_tags_2)
+		/sizeof(asn_DEF_cN_InvokeTrace_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_cN_InvokeTrace_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_cN_InvokeTrace_ies_tags_2)
+		/sizeof(asn_DEF_cN_InvokeTrace_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_cN_InvokeTrace_ies_constr_2,
+	asn_MBR_cN_InvokeTrace_ies_2,
+	1,	/* Single element */
+	&asn_SPC_cN_InvokeTrace_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_CN_InvokeTrace_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CN_InvokeTrace, cN_InvokeTrace_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_cN_InvokeTrace_ies_2,
+		memb_cN_InvokeTrace_ies_constraint_1,
+		&asn_PER_memb_cN_InvokeTrace_ies_constr_2,
+		0,
+		"cN-InvokeTrace-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CN_InvokeTrace_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CN_InvokeTrace_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* cN-InvokeTrace-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CN_InvokeTrace_specs_1 = {
+	sizeof(struct RANAP_CN_InvokeTrace),
+	offsetof(struct RANAP_CN_InvokeTrace, _asn_ctx),
+	asn_MAP_RANAP_CN_InvokeTrace_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CN_InvokeTrace = {
+	"RANAP_CN-InvokeTrace",
+	"RANAP_CN-InvokeTrace",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CN_InvokeTrace_tags_1,
+	sizeof(asn_DEF_RANAP_CN_InvokeTrace_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_InvokeTrace_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CN_InvokeTrace_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CN_InvokeTrace_tags_1)
+		/sizeof(asn_DEF_RANAP_CN_InvokeTrace_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CN_InvokeTrace_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_CN_InvokeTrace_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CN-InvokeTrace.h b/src/ranap/RANAP_CN-InvokeTrace.h
new file mode 100644
index 0000000..66b7892
--- /dev/null
+++ b/src/ranap/RANAP_CN-InvokeTrace.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_CN_InvokeTrace_H_
+#define	_RANAP_CN_InvokeTrace_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CN-InvokeTrace */
+typedef struct RANAP_CN_InvokeTrace {
+	struct cN_InvokeTrace_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} cN_InvokeTrace_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CN_InvokeTrace_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CN_InvokeTrace;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CN_InvokeTrace_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CSFB-Information.c b/src/ranap/RANAP_CSFB-Information.c
new file mode 100644
index 0000000..90246ed
--- /dev/null
+++ b/src/ranap/RANAP_CSFB-Information.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CSFB-Information.h"
+
+int
+RANAP_CSFB_Information_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CSFB_Information_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_CSFB_Information_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CSFB_Information_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSFB_Information_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CSFB_Information_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSFB_Information_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CSFB_Information_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSFB_Information_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CSFB_Information_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CSFB_Information_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CSFB_Information_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CSFB_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CSFB_Information_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_CSFB_Information_value2enum_1[] = {
+	{ 0,	4,	"csfb" },
+	{ 1,	18,	"csfb-high-priority" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_CSFB_Information_enum2value_1[] = {
+	0,	/* csfb(0) */
+	1	/* csfb-high-priority(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_CSFB_Information_specs_1 = {
+	asn_MAP_RANAP_CSFB_Information_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_CSFB_Information_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CSFB_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CSFB_Information = {
+	"RANAP_CSFB-Information",
+	"RANAP_CSFB-Information",
+	RANAP_CSFB_Information_free,
+	RANAP_CSFB_Information_print,
+	RANAP_CSFB_Information_constraint,
+	RANAP_CSFB_Information_decode_ber,
+	RANAP_CSFB_Information_encode_der,
+	RANAP_CSFB_Information_decode_xer,
+	RANAP_CSFB_Information_encode_xer,
+	RANAP_CSFB_Information_decode_uper,
+	RANAP_CSFB_Information_encode_uper,
+	RANAP_CSFB_Information_decode_aper,
+	RANAP_CSFB_Information_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CSFB_Information_tags_1,
+	sizeof(asn_DEF_RANAP_CSFB_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_CSFB_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CSFB_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CSFB_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_CSFB_Information_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CSFB_Information_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_CSFB_Information_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CSFB-Information.h b/src/ranap/RANAP_CSFB-Information.h
new file mode 100644
index 0000000..8a64b23
--- /dev/null
+++ b/src/ranap/RANAP_CSFB-Information.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CSFB_Information_H_
+#define	_RANAP_CSFB_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CSFB_Information {
+	RANAP_CSFB_Information_csfb	= 0,
+	RANAP_CSFB_Information_csfb_high_priority	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_CSFB_Information;
+
+/* RANAP_CSFB-Information */
+typedef long	 RANAP_CSFB_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CSFB_Information;
+asn_struct_free_f RANAP_CSFB_Information_free;
+asn_struct_print_f RANAP_CSFB_Information_print;
+asn_constr_check_f RANAP_CSFB_Information_constraint;
+ber_type_decoder_f RANAP_CSFB_Information_decode_ber;
+der_type_encoder_f RANAP_CSFB_Information_encode_der;
+xer_type_decoder_f RANAP_CSFB_Information_decode_xer;
+xer_type_encoder_f RANAP_CSFB_Information_encode_xer;
+per_type_decoder_f RANAP_CSFB_Information_decode_uper;
+per_type_encoder_f RANAP_CSFB_Information_encode_uper;
+per_type_decoder_f RANAP_CSFB_Information_decode_aper;
+per_type_encoder_f RANAP_CSFB_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CSFB_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CSG-Id-List.c b/src/ranap/RANAP_CSG-Id-List.c
new file mode 100644
index 0000000..d3450c9
--- /dev/null
+++ b/src/ranap/RANAP_CSG-Id-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CSG-Id-List.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_CSG_Id_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_CSG_Id_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_CSG_Id,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CSG_Id_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_CSG_Id_List_specs_1 = {
+	sizeof(struct RANAP_CSG_Id_List),
+	offsetof(struct RANAP_CSG_Id_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CSG_Id_List = {
+	"RANAP_CSG-Id-List",
+	"RANAP_CSG-Id-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CSG_Id_List_tags_1,
+	sizeof(asn_DEF_RANAP_CSG_Id_List_tags_1)
+		/sizeof(asn_DEF_RANAP_CSG_Id_List_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CSG_Id_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CSG_Id_List_tags_1)
+		/sizeof(asn_DEF_RANAP_CSG_Id_List_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CSG_Id_List_constr_1,
+	asn_MBR_RANAP_CSG_Id_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_CSG_Id_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CSG-Id-List.h b/src/ranap/RANAP_CSG-Id-List.h
new file mode 100644
index 0000000..0069c33
--- /dev/null
+++ b/src/ranap/RANAP_CSG-Id-List.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CSG_Id_List_H_
+#define	_RANAP_CSG_Id_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_CSG-Id.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CSG-Id-List */
+typedef struct RANAP_CSG_Id_List {
+	A_SEQUENCE_OF(RANAP_CSG_Id_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CSG_Id_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CSG_Id_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CSG_Id_List_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CSG-Id.c b/src/ranap/RANAP_CSG-Id.c
new file mode 100644
index 0000000..6e2303e
--- /dev/null
+++ b/src/ranap/RANAP_CSG-Id.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CSG-Id.h"
+
+int
+RANAP_CSG_Id_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 27l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CSG_Id_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_CSG_Id_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CSG_Id_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Id_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Id_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Id_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Id_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Id_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Id_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Id_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Id_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CSG_Id_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CSG_Id_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  27l,  27l }	/* (SIZE(27..27)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CSG_Id_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CSG_Id = {
+	"RANAP_CSG-Id",
+	"RANAP_CSG-Id",
+	RANAP_CSG_Id_free,
+	RANAP_CSG_Id_print,
+	RANAP_CSG_Id_constraint,
+	RANAP_CSG_Id_decode_ber,
+	RANAP_CSG_Id_encode_der,
+	RANAP_CSG_Id_decode_xer,
+	RANAP_CSG_Id_encode_xer,
+	RANAP_CSG_Id_decode_uper,
+	RANAP_CSG_Id_encode_uper,
+	RANAP_CSG_Id_decode_aper,
+	RANAP_CSG_Id_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CSG_Id_tags_1,
+	sizeof(asn_DEF_RANAP_CSG_Id_tags_1)
+		/sizeof(asn_DEF_RANAP_CSG_Id_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CSG_Id_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CSG_Id_tags_1)
+		/sizeof(asn_DEF_RANAP_CSG_Id_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CSG_Id_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CSG-Id.h b/src/ranap/RANAP_CSG-Id.h
new file mode 100644
index 0000000..57dd868
--- /dev/null
+++ b/src/ranap/RANAP_CSG-Id.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CSG_Id_H_
+#define	_RANAP_CSG_Id_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CSG-Id */
+typedef BIT_STRING_t	 RANAP_CSG_Id_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CSG_Id;
+asn_struct_free_f RANAP_CSG_Id_free;
+asn_struct_print_f RANAP_CSG_Id_print;
+asn_constr_check_f RANAP_CSG_Id_constraint;
+ber_type_decoder_f RANAP_CSG_Id_decode_ber;
+der_type_encoder_f RANAP_CSG_Id_encode_der;
+xer_type_decoder_f RANAP_CSG_Id_decode_xer;
+xer_type_encoder_f RANAP_CSG_Id_encode_xer;
+per_type_decoder_f RANAP_CSG_Id_decode_uper;
+per_type_encoder_f RANAP_CSG_Id_encode_uper;
+per_type_decoder_f RANAP_CSG_Id_decode_aper;
+per_type_encoder_f RANAP_CSG_Id_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CSG_Id_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CSG-Membership-Status.c b/src/ranap/RANAP_CSG-Membership-Status.c
new file mode 100644
index 0000000..76b80f7
--- /dev/null
+++ b/src/ranap/RANAP_CSG-Membership-Status.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CSG-Membership-Status.h"
+
+int
+RANAP_CSG_Membership_Status_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_CSG_Membership_Status_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CSG_Membership_Status_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Membership_Status_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Membership_Status_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Membership_Status_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Membership_Status_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Membership_Status_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Membership_Status_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CSG_Membership_Status_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CSG_Membership_Status_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CSG_Membership_Status_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CSG_Membership_Status_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_CSG_Membership_Status_value2enum_1[] = {
+	{ 0,	6,	"member" },
+	{ 1,	10,	"non-member" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_CSG_Membership_Status_enum2value_1[] = {
+	0,	/* member(0) */
+	1	/* non-member(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_CSG_Membership_Status_specs_1 = {
+	asn_MAP_RANAP_CSG_Membership_Status_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_CSG_Membership_Status_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CSG_Membership_Status_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CSG_Membership_Status = {
+	"RANAP_CSG-Membership-Status",
+	"RANAP_CSG-Membership-Status",
+	RANAP_CSG_Membership_Status_free,
+	RANAP_CSG_Membership_Status_print,
+	RANAP_CSG_Membership_Status_constraint,
+	RANAP_CSG_Membership_Status_decode_ber,
+	RANAP_CSG_Membership_Status_encode_der,
+	RANAP_CSG_Membership_Status_decode_xer,
+	RANAP_CSG_Membership_Status_encode_xer,
+	RANAP_CSG_Membership_Status_decode_uper,
+	RANAP_CSG_Membership_Status_encode_uper,
+	RANAP_CSG_Membership_Status_decode_aper,
+	RANAP_CSG_Membership_Status_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CSG_Membership_Status_tags_1,
+	sizeof(asn_DEF_RANAP_CSG_Membership_Status_tags_1)
+		/sizeof(asn_DEF_RANAP_CSG_Membership_Status_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CSG_Membership_Status_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CSG_Membership_Status_tags_1)
+		/sizeof(asn_DEF_RANAP_CSG_Membership_Status_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CSG_Membership_Status_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_CSG_Membership_Status_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CSG-Membership-Status.h b/src/ranap/RANAP_CSG-Membership-Status.h
new file mode 100644
index 0000000..eeeae70
--- /dev/null
+++ b/src/ranap/RANAP_CSG-Membership-Status.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CSG_Membership_Status_H_
+#define	_RANAP_CSG_Membership_Status_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CSG_Membership_Status {
+	RANAP_CSG_Membership_Status_member	= 0,
+	RANAP_CSG_Membership_Status_non_member	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_CSG_Membership_Status;
+
+/* RANAP_CSG-Membership-Status */
+typedef long	 RANAP_CSG_Membership_Status_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CSG_Membership_Status;
+asn_struct_free_f RANAP_CSG_Membership_Status_free;
+asn_struct_print_f RANAP_CSG_Membership_Status_print;
+asn_constr_check_f RANAP_CSG_Membership_Status_constraint;
+ber_type_decoder_f RANAP_CSG_Membership_Status_decode_ber;
+der_type_encoder_f RANAP_CSG_Membership_Status_encode_der;
+xer_type_decoder_f RANAP_CSG_Membership_Status_decode_xer;
+xer_type_encoder_f RANAP_CSG_Membership_Status_encode_xer;
+per_type_decoder_f RANAP_CSG_Membership_Status_decode_uper;
+per_type_encoder_f RANAP_CSG_Membership_Status_encode_uper;
+per_type_decoder_f RANAP_CSG_Membership_Status_decode_aper;
+per_type_encoder_f RANAP_CSG_Membership_Status_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CSG_Membership_Status_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Cause.c b/src/ranap/RANAP_Cause.c
new file mode 100644
index 0000000..718167b
--- /dev/null
+++ b/src/ranap/RANAP_Cause.c
@@ -0,0 +1,122 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Cause.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Cause_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  5l }	/* (0..5,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Cause_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.radioNetwork),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseRadioNetwork,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"radioNetwork"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.transmissionNetwork),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseTransmissionNetwork,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"transmissionNetwork"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.nAS),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseNAS,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"nAS"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.protocol),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseProtocol,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"protocol"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.misc),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseMisc,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"misc"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.non_Standard),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseNon_Standard,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"non-Standard"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Cause, choice.radioNetworkExtension),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CauseRadioNetworkExtension,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"radioNetworkExtension"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Cause_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* radioNetwork */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* transmissionNetwork */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* nAS */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* protocol */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* misc */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* non-Standard */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* radioNetworkExtension */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_Cause_specs_1 = {
+	sizeof(struct RANAP_Cause),
+	offsetof(struct RANAP_Cause, _asn_ctx),
+	offsetof(struct RANAP_Cause, present),
+	sizeof(((struct RANAP_Cause *)0)->present),
+	asn_MAP_RANAP_Cause_tag2el_1,
+	7,	/* Count of tags in the map */
+	0,
+	6	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Cause = {
+	"RANAP_Cause",
+	"RANAP_Cause",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_Cause_constr_1,
+	asn_MBR_RANAP_Cause_1,
+	7,	/* Elements count */
+	&asn_SPC_RANAP_Cause_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Cause.h b/src/ranap/RANAP_Cause.h
new file mode 100644
index 0000000..156504f
--- /dev/null
+++ b/src/ranap/RANAP_Cause.h
@@ -0,0 +1,69 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Cause_H_
+#define	_RANAP_Cause_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_CauseRadioNetwork.h"
+#include "RANAP_CauseTransmissionNetwork.h"
+#include "RANAP_CauseNAS.h"
+#include "RANAP_CauseProtocol.h"
+#include "RANAP_CauseMisc.h"
+#include "RANAP_CauseNon-Standard.h"
+#include "RANAP_CauseRadioNetworkExtension.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Cause_PR {
+	RANAP_Cause_PR_NOTHING,	/* No components present */
+	RANAP_Cause_PR_radioNetwork,
+	RANAP_Cause_PR_transmissionNetwork,
+	RANAP_Cause_PR_nAS,
+	RANAP_Cause_PR_protocol,
+	RANAP_Cause_PR_misc,
+	RANAP_Cause_PR_non_Standard,
+	/* Extensions may appear below */
+	RANAP_Cause_PR_radioNetworkExtension
+} RANAP_Cause_PR;
+
+/* RANAP_Cause */
+typedef struct RANAP_Cause {
+	RANAP_Cause_PR present;
+	union RANAP_Cause_u {
+		RANAP_CauseRadioNetwork_t	 radioNetwork;
+		RANAP_CauseTransmissionNetwork_t	 transmissionNetwork;
+		RANAP_CauseNAS_t	 nAS;
+		RANAP_CauseProtocol_t	 protocol;
+		RANAP_CauseMisc_t	 misc;
+		RANAP_CauseNon_Standard_t	 non_Standard;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		RANAP_CauseRadioNetworkExtension_t	 radioNetworkExtension;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Cause_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Cause;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Cause_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseMisc.c b/src/ranap/RANAP_CauseMisc.c
new file mode 100644
index 0000000..9a8d7e3
--- /dev/null
+++ b/src/ranap/RANAP_CauseMisc.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseMisc.h"
+
+int
+RANAP_CauseMisc_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 113l && value <= 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseMisc_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseMisc_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseMisc_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseMisc_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseMisc_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseMisc_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseMisc_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseMisc_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseMisc_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseMisc_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseMisc_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseMisc_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseMisc_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  113l,  128l }	/* (113..128) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseMisc_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseMisc = {
+	"RANAP_CauseMisc",
+	"RANAP_CauseMisc",
+	RANAP_CauseMisc_free,
+	RANAP_CauseMisc_print,
+	RANAP_CauseMisc_constraint,
+	RANAP_CauseMisc_decode_ber,
+	RANAP_CauseMisc_encode_der,
+	RANAP_CauseMisc_decode_xer,
+	RANAP_CauseMisc_encode_xer,
+	RANAP_CauseMisc_decode_uper,
+	RANAP_CauseMisc_encode_uper,
+	RANAP_CauseMisc_decode_aper,
+	RANAP_CauseMisc_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseMisc_tags_1,
+	sizeof(asn_DEF_RANAP_CauseMisc_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseMisc_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseMisc_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseMisc_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseMisc_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseMisc_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseMisc.h b/src/ranap/RANAP_CauseMisc.h
new file mode 100644
index 0000000..69ff507
--- /dev/null
+++ b/src/ranap/RANAP_CauseMisc.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseMisc_H_
+#define	_RANAP_CauseMisc_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CauseMisc {
+	RANAP_CauseMisc_om_intervention	= 113,
+	RANAP_CauseMisc_no_resource_available	= 114,
+	RANAP_CauseMisc_unspecified_failure	= 115,
+	RANAP_CauseMisc_network_optimisation	= 116
+} e_RANAP_CauseMisc;
+
+/* RANAP_CauseMisc */
+typedef long	 RANAP_CauseMisc_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseMisc;
+asn_struct_free_f RANAP_CauseMisc_free;
+asn_struct_print_f RANAP_CauseMisc_print;
+asn_constr_check_f RANAP_CauseMisc_constraint;
+ber_type_decoder_f RANAP_CauseMisc_decode_ber;
+der_type_encoder_f RANAP_CauseMisc_encode_der;
+xer_type_decoder_f RANAP_CauseMisc_decode_xer;
+xer_type_encoder_f RANAP_CauseMisc_encode_xer;
+per_type_decoder_f RANAP_CauseMisc_decode_uper;
+per_type_encoder_f RANAP_CauseMisc_encode_uper;
+per_type_decoder_f RANAP_CauseMisc_decode_aper;
+per_type_encoder_f RANAP_CauseMisc_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseMisc_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseNAS.c b/src/ranap/RANAP_CauseNAS.c
new file mode 100644
index 0000000..7683cf1
--- /dev/null
+++ b/src/ranap/RANAP_CauseNAS.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseNAS.h"
+
+int
+RANAP_CauseNAS_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 81l && value <= 96l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseNAS_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseNAS_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseNAS_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseNAS_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseNAS_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseNAS_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseNAS_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseNAS_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseNAS_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseNAS_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseNAS_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseNAS_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseNAS_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  81l,  96l }	/* (81..96) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseNAS_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseNAS = {
+	"RANAP_CauseNAS",
+	"RANAP_CauseNAS",
+	RANAP_CauseNAS_free,
+	RANAP_CauseNAS_print,
+	RANAP_CauseNAS_constraint,
+	RANAP_CauseNAS_decode_ber,
+	RANAP_CauseNAS_encode_der,
+	RANAP_CauseNAS_decode_xer,
+	RANAP_CauseNAS_encode_xer,
+	RANAP_CauseNAS_decode_uper,
+	RANAP_CauseNAS_encode_uper,
+	RANAP_CauseNAS_decode_aper,
+	RANAP_CauseNAS_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseNAS_tags_1,
+	sizeof(asn_DEF_RANAP_CauseNAS_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseNAS_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseNAS_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseNAS_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseNAS_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseNAS_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseNAS.h b/src/ranap/RANAP_CauseNAS.h
new file mode 100644
index 0000000..90f60a4
--- /dev/null
+++ b/src/ranap/RANAP_CauseNAS.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseNAS_H_
+#define	_RANAP_CauseNAS_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CauseNAS {
+	RANAP_CauseNAS_user_restriction_start_indication	= 81,
+	RANAP_CauseNAS_user_restriction_end_indication	= 82,
+	RANAP_CauseNAS_normal_release	= 83,
+	RANAP_CauseNAS_csg_subscription_expiry	= 84
+} e_RANAP_CauseNAS;
+
+/* RANAP_CauseNAS */
+typedef long	 RANAP_CauseNAS_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseNAS;
+asn_struct_free_f RANAP_CauseNAS_free;
+asn_struct_print_f RANAP_CauseNAS_print;
+asn_constr_check_f RANAP_CauseNAS_constraint;
+ber_type_decoder_f RANAP_CauseNAS_decode_ber;
+der_type_encoder_f RANAP_CauseNAS_encode_der;
+xer_type_decoder_f RANAP_CauseNAS_decode_xer;
+xer_type_encoder_f RANAP_CauseNAS_encode_xer;
+per_type_decoder_f RANAP_CauseNAS_decode_uper;
+per_type_encoder_f RANAP_CauseNAS_encode_uper;
+per_type_decoder_f RANAP_CauseNAS_decode_aper;
+per_type_encoder_f RANAP_CauseNAS_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseNAS_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseNon-Standard.c b/src/ranap/RANAP_CauseNon-Standard.c
new file mode 100644
index 0000000..32ca44d
--- /dev/null
+++ b/src/ranap/RANAP_CauseNon-Standard.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseNon-Standard.h"
+
+int
+RANAP_CauseNon_Standard_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 129l && value <= 256l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseNon_Standard_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseNon_Standard_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseNon_Standard_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseNon_Standard_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseNon_Standard_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseNon_Standard_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseNon_Standard_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseNon_Standard_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseNon_Standard_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseNon_Standard_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseNon_Standard_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseNon_Standard_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  129l,  256l }	/* (129..256) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseNon_Standard_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseNon_Standard = {
+	"RANAP_CauseNon-Standard",
+	"RANAP_CauseNon-Standard",
+	RANAP_CauseNon_Standard_free,
+	RANAP_CauseNon_Standard_print,
+	RANAP_CauseNon_Standard_constraint,
+	RANAP_CauseNon_Standard_decode_ber,
+	RANAP_CauseNon_Standard_encode_der,
+	RANAP_CauseNon_Standard_decode_xer,
+	RANAP_CauseNon_Standard_encode_xer,
+	RANAP_CauseNon_Standard_decode_uper,
+	RANAP_CauseNon_Standard_encode_uper,
+	RANAP_CauseNon_Standard_decode_aper,
+	RANAP_CauseNon_Standard_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseNon_Standard_tags_1,
+	sizeof(asn_DEF_RANAP_CauseNon_Standard_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseNon_Standard_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseNon_Standard_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseNon_Standard_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseNon_Standard_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseNon_Standard_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseNon-Standard.h b/src/ranap/RANAP_CauseNon-Standard.h
new file mode 100644
index 0000000..22e85e4
--- /dev/null
+++ b/src/ranap/RANAP_CauseNon-Standard.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseNon_Standard_H_
+#define	_RANAP_CauseNon_Standard_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CauseNon-Standard */
+typedef long	 RANAP_CauseNon_Standard_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseNon_Standard;
+asn_struct_free_f RANAP_CauseNon_Standard_free;
+asn_struct_print_f RANAP_CauseNon_Standard_print;
+asn_constr_check_f RANAP_CauseNon_Standard_constraint;
+ber_type_decoder_f RANAP_CauseNon_Standard_decode_ber;
+der_type_encoder_f RANAP_CauseNon_Standard_encode_der;
+xer_type_decoder_f RANAP_CauseNon_Standard_decode_xer;
+xer_type_encoder_f RANAP_CauseNon_Standard_encode_xer;
+per_type_decoder_f RANAP_CauseNon_Standard_decode_uper;
+per_type_encoder_f RANAP_CauseNon_Standard_encode_uper;
+per_type_decoder_f RANAP_CauseNon_Standard_decode_aper;
+per_type_encoder_f RANAP_CauseNon_Standard_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseNon_Standard_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseProtocol.c b/src/ranap/RANAP_CauseProtocol.c
new file mode 100644
index 0000000..3cf3bcb
--- /dev/null
+++ b/src/ranap/RANAP_CauseProtocol.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseProtocol.h"
+
+int
+RANAP_CauseProtocol_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 97l && value <= 112l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseProtocol_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseProtocol_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseProtocol_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseProtocol_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseProtocol_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseProtocol_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseProtocol_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseProtocol_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseProtocol_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseProtocol_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseProtocol_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseProtocol_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseProtocol_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  97l,  112l }	/* (97..112) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseProtocol_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseProtocol = {
+	"RANAP_CauseProtocol",
+	"RANAP_CauseProtocol",
+	RANAP_CauseProtocol_free,
+	RANAP_CauseProtocol_print,
+	RANAP_CauseProtocol_constraint,
+	RANAP_CauseProtocol_decode_ber,
+	RANAP_CauseProtocol_encode_der,
+	RANAP_CauseProtocol_decode_xer,
+	RANAP_CauseProtocol_encode_xer,
+	RANAP_CauseProtocol_decode_uper,
+	RANAP_CauseProtocol_encode_uper,
+	RANAP_CauseProtocol_decode_aper,
+	RANAP_CauseProtocol_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseProtocol_tags_1,
+	sizeof(asn_DEF_RANAP_CauseProtocol_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseProtocol_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseProtocol_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseProtocol_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseProtocol_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseProtocol_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseProtocol.h b/src/ranap/RANAP_CauseProtocol.h
new file mode 100644
index 0000000..d05f6e4
--- /dev/null
+++ b/src/ranap/RANAP_CauseProtocol.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseProtocol_H_
+#define	_RANAP_CauseProtocol_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CauseProtocol {
+	RANAP_CauseProtocol_transfer_syntax_error	= 97,
+	RANAP_CauseProtocol_semantic_error	= 98,
+	RANAP_CauseProtocol_message_not_compatible_with_receiver_state	= 99,
+	RANAP_CauseProtocol_abstract_syntax_error_reject	= 100,
+	RANAP_CauseProtocol_abstract_syntax_error_ignore_and_notify	= 101,
+	RANAP_CauseProtocol_abstract_syntax_error_falsely_constructed_message	= 102
+} e_RANAP_CauseProtocol;
+
+/* RANAP_CauseProtocol */
+typedef long	 RANAP_CauseProtocol_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseProtocol;
+asn_struct_free_f RANAP_CauseProtocol_free;
+asn_struct_print_f RANAP_CauseProtocol_print;
+asn_constr_check_f RANAP_CauseProtocol_constraint;
+ber_type_decoder_f RANAP_CauseProtocol_decode_ber;
+der_type_encoder_f RANAP_CauseProtocol_encode_der;
+xer_type_decoder_f RANAP_CauseProtocol_decode_xer;
+xer_type_encoder_f RANAP_CauseProtocol_encode_xer;
+per_type_decoder_f RANAP_CauseProtocol_decode_uper;
+per_type_encoder_f RANAP_CauseProtocol_encode_uper;
+per_type_decoder_f RANAP_CauseProtocol_decode_aper;
+per_type_encoder_f RANAP_CauseProtocol_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseProtocol_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseRadioNetwork.c b/src/ranap/RANAP_CauseRadioNetwork.c
new file mode 100644
index 0000000..4f94812
--- /dev/null
+++ b/src/ranap/RANAP_CauseRadioNetwork.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseRadioNetwork.h"
+
+int
+RANAP_CauseRadioNetwork_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 64l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseRadioNetwork_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseRadioNetwork_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetwork_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetwork_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetwork_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetwork_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetwork_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetwork_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetwork_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetwork_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseRadioNetwork_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseRadioNetwork_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 6,  6,  1l,  64l }	/* (1..64) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseRadioNetwork_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseRadioNetwork = {
+	"RANAP_CauseRadioNetwork",
+	"RANAP_CauseRadioNetwork",
+	RANAP_CauseRadioNetwork_free,
+	RANAP_CauseRadioNetwork_print,
+	RANAP_CauseRadioNetwork_constraint,
+	RANAP_CauseRadioNetwork_decode_ber,
+	RANAP_CauseRadioNetwork_encode_der,
+	RANAP_CauseRadioNetwork_decode_xer,
+	RANAP_CauseRadioNetwork_encode_xer,
+	RANAP_CauseRadioNetwork_decode_uper,
+	RANAP_CauseRadioNetwork_encode_uper,
+	RANAP_CauseRadioNetwork_decode_aper,
+	RANAP_CauseRadioNetwork_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseRadioNetwork_tags_1,
+	sizeof(asn_DEF_RANAP_CauseRadioNetwork_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseRadioNetwork_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseRadioNetwork_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseRadioNetwork_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseRadioNetwork_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseRadioNetwork_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseRadioNetwork.h b/src/ranap/RANAP_CauseRadioNetwork.h
new file mode 100644
index 0000000..5abcbc9
--- /dev/null
+++ b/src/ranap/RANAP_CauseRadioNetwork.h
@@ -0,0 +1,110 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseRadioNetwork_H_
+#define	_RANAP_CauseRadioNetwork_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CauseRadioNetwork {
+	RANAP_CauseRadioNetwork_rab_pre_empted	= 1,
+	RANAP_CauseRadioNetwork_trelocoverall_expiry	= 2,
+	RANAP_CauseRadioNetwork_trelocprep_expiry	= 3,
+	RANAP_CauseRadioNetwork_treloccomplete_expiry	= 4,
+	RANAP_CauseRadioNetwork_tqueing_expiry	= 5,
+	RANAP_CauseRadioNetwork_relocation_triggered	= 6,
+	RANAP_CauseRadioNetwork_trellocalloc_expiry	= 7,
+	RANAP_CauseRadioNetwork_unable_to_establish_during_relocation	= 8,
+	RANAP_CauseRadioNetwork_unknown_target_rnc	= 9,
+	RANAP_CauseRadioNetwork_relocation_cancelled	= 10,
+	RANAP_CauseRadioNetwork_successful_relocation	= 11,
+	RANAP_CauseRadioNetwork_requested_ciphering_and_or_integrity_protection_algorithms_not_supported	= 12,
+	RANAP_CauseRadioNetwork_conflict_with_already_existing_integrity_protection_and_or_ciphering_information	= 13,
+	RANAP_CauseRadioNetwork_failure_in_the_radio_interface_procedure	= 14,
+	RANAP_CauseRadioNetwork_release_due_to_utran_generated_reason	= 15,
+	RANAP_CauseRadioNetwork_user_inactivity	= 16,
+	RANAP_CauseRadioNetwork_time_critical_relocation	= 17,
+	RANAP_CauseRadioNetwork_requested_traffic_class_not_available	= 18,
+	RANAP_CauseRadioNetwork_invalid_rab_parameters_value	= 19,
+	RANAP_CauseRadioNetwork_requested_maximum_bit_rate_not_available	= 20,
+	RANAP_CauseRadioNetwork_requested_guaranteed_bit_rate_not_available	= 21,
+	RANAP_CauseRadioNetwork_requested_transfer_delay_not_achievable	= 22,
+	RANAP_CauseRadioNetwork_invalid_rab_parameters_combination	= 23,
+	RANAP_CauseRadioNetwork_condition_violation_for_sdu_parameters	= 24,
+	RANAP_CauseRadioNetwork_condition_violation_for_traffic_handling_priority	= 25,
+	RANAP_CauseRadioNetwork_condition_violation_for_guaranteed_bit_rate	= 26,
+	RANAP_CauseRadioNetwork_user_plane_versions_not_supported	= 27,
+	RANAP_CauseRadioNetwork_iu_up_failure	= 28,
+	RANAP_CauseRadioNetwork_relocation_failure_in_target_CN_RNC_or_target_system	= 29,
+	RANAP_CauseRadioNetwork_invalid_RAB_ID	= 30,
+	RANAP_CauseRadioNetwork_no_remaining_rab	= 31,
+	RANAP_CauseRadioNetwork_interaction_with_other_procedure	= 32,
+	RANAP_CauseRadioNetwork_requested_maximum_bit_rate_for_dl_not_available	= 33,
+	RANAP_CauseRadioNetwork_requested_maximum_bit_rate_for_ul_not_available	= 34,
+	RANAP_CauseRadioNetwork_requested_guaranteed_bit_rate_for_dl_not_available	= 35,
+	RANAP_CauseRadioNetwork_requested_guaranteed_bit_rate_for_ul_not_available	= 36,
+	RANAP_CauseRadioNetwork_repeated_integrity_checking_failure	= 37,
+	RANAP_CauseRadioNetwork_requested_request_type_not_supported	= 38,
+	RANAP_CauseRadioNetwork_request_superseded	= 39,
+	RANAP_CauseRadioNetwork_release_due_to_UE_generated_signalling_connection_release	= 40,
+	RANAP_CauseRadioNetwork_resource_optimisation_relocation	= 41,
+	RANAP_CauseRadioNetwork_requested_information_not_available	= 42,
+	RANAP_CauseRadioNetwork_relocation_desirable_for_radio_reasons	= 43,
+	RANAP_CauseRadioNetwork_relocation_not_supported_in_target_RNC_or_target_system	= 44,
+	RANAP_CauseRadioNetwork_directed_retry	= 45,
+	RANAP_CauseRadioNetwork_radio_connection_with_UE_Lost	= 46,
+	RANAP_CauseRadioNetwork_rNC_unable_to_establish_all_RFCs	= 47,
+	RANAP_CauseRadioNetwork_deciphering_keys_not_available	= 48,
+	RANAP_CauseRadioNetwork_dedicated_assistance_data_not_available	= 49,
+	RANAP_CauseRadioNetwork_relocation_target_not_allowed	= 50,
+	RANAP_CauseRadioNetwork_location_reporting_congestion	= 51,
+	RANAP_CauseRadioNetwork_reduce_load_in_serving_cell	= 52,
+	RANAP_CauseRadioNetwork_no_radio_resources_available_in_target_cell	= 53,
+	RANAP_CauseRadioNetwork_gERAN_Iumode_failure	= 54,
+	RANAP_CauseRadioNetwork_access_restricted_due_to_shared_networks	= 55,
+	RANAP_CauseRadioNetwork_incoming_relocation_not_supported_due_to_PUESBINE_feature	= 56,
+	RANAP_CauseRadioNetwork_traffic_load_in_the_target_cell_higher_than_in_the_source_cell	= 57,
+	RANAP_CauseRadioNetwork_mBMS_no_multicast_service_for_this_UE	= 58,
+	RANAP_CauseRadioNetwork_mBMS_unknown_UE_ID	= 59,
+	RANAP_CauseRadioNetwork_successful_MBMS_session_start_no_data_bearer_necessary	= 60,
+	RANAP_CauseRadioNetwork_mBMS_superseded_due_to_NNSF	= 61,
+	RANAP_CauseRadioNetwork_mBMS_UE_linking_already_done	= 62,
+	RANAP_CauseRadioNetwork_mBMS_UE_de_linking_failure_no_existing_UE_linking	= 63,
+	RANAP_CauseRadioNetwork_tMGI_unknown	= 64
+} e_RANAP_CauseRadioNetwork;
+
+/* RANAP_CauseRadioNetwork */
+typedef long	 RANAP_CauseRadioNetwork_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseRadioNetwork;
+asn_struct_free_f RANAP_CauseRadioNetwork_free;
+asn_struct_print_f RANAP_CauseRadioNetwork_print;
+asn_constr_check_f RANAP_CauseRadioNetwork_constraint;
+ber_type_decoder_f RANAP_CauseRadioNetwork_decode_ber;
+der_type_encoder_f RANAP_CauseRadioNetwork_encode_der;
+xer_type_decoder_f RANAP_CauseRadioNetwork_decode_xer;
+xer_type_encoder_f RANAP_CauseRadioNetwork_encode_xer;
+per_type_decoder_f RANAP_CauseRadioNetwork_decode_uper;
+per_type_encoder_f RANAP_CauseRadioNetwork_encode_uper;
+per_type_decoder_f RANAP_CauseRadioNetwork_decode_aper;
+per_type_encoder_f RANAP_CauseRadioNetwork_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseRadioNetwork_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseRadioNetworkExtension.c b/src/ranap/RANAP_CauseRadioNetworkExtension.c
new file mode 100644
index 0000000..646ff23
--- /dev/null
+++ b/src/ranap/RANAP_CauseRadioNetworkExtension.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseRadioNetworkExtension.h"
+
+int
+RANAP_CauseRadioNetworkExtension_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 257l && value <= 512l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseRadioNetworkExtension_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseRadioNetworkExtension_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetworkExtension_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetworkExtension_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetworkExtension_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetworkExtension_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetworkExtension_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetworkExtension_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseRadioNetworkExtension_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseRadioNetworkExtension_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseRadioNetworkExtension_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseRadioNetworkExtension_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  257l,  512l }	/* (257..512) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseRadioNetworkExtension = {
+	"RANAP_CauseRadioNetworkExtension",
+	"RANAP_CauseRadioNetworkExtension",
+	RANAP_CauseRadioNetworkExtension_free,
+	RANAP_CauseRadioNetworkExtension_print,
+	RANAP_CauseRadioNetworkExtension_constraint,
+	RANAP_CauseRadioNetworkExtension_decode_ber,
+	RANAP_CauseRadioNetworkExtension_encode_der,
+	RANAP_CauseRadioNetworkExtension_decode_xer,
+	RANAP_CauseRadioNetworkExtension_encode_xer,
+	RANAP_CauseRadioNetworkExtension_decode_uper,
+	RANAP_CauseRadioNetworkExtension_encode_uper,
+	RANAP_CauseRadioNetworkExtension_decode_aper,
+	RANAP_CauseRadioNetworkExtension_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1,
+	sizeof(asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseRadioNetworkExtension_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseRadioNetworkExtension_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseRadioNetworkExtension.h b/src/ranap/RANAP_CauseRadioNetworkExtension.h
new file mode 100644
index 0000000..b055f58
--- /dev/null
+++ b/src/ranap/RANAP_CauseRadioNetworkExtension.h
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseRadioNetworkExtension_H_
+#define	_RANAP_CauseRadioNetworkExtension_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CauseRadioNetworkExtension {
+	RANAP_CauseRadioNetworkExtension_iP_multicast_address_and_APN_not_valid	= 257,
+	RANAP_CauseRadioNetworkExtension_mBMS_de_registration_rejected_due_to_implicit_registration	= 258,
+	RANAP_CauseRadioNetworkExtension_mBMS_request_superseded	= 259,
+	RANAP_CauseRadioNetworkExtension_mBMS_de_registration_during_session_not_allowed	= 260,
+	RANAP_CauseRadioNetworkExtension_mBMS_no_data_bearer_necessary	= 261,
+	RANAP_CauseRadioNetworkExtension_periodicLocationInformationNotAvailable	= 262,
+	RANAP_CauseRadioNetworkExtension_gTP_Resources_Unavailable	= 263,
+	RANAP_CauseRadioNetworkExtension_tMGI_inUse_overlapping_MBMS_service_area	= 264,
+	RANAP_CauseRadioNetworkExtension_mBMS_no_cell_in_MBMS_service_area	= 265,
+	RANAP_CauseRadioNetworkExtension_no_Iu_CS_UP_relocation	= 266,
+	RANAP_CauseRadioNetworkExtension_successful_MBMS_Session_Start_IP_Multicast_Bearer_established	= 267,
+	RANAP_CauseRadioNetworkExtension_cS_fallback_triggered	= 268,
+	RANAP_CauseRadioNetworkExtension_invalid_CSG_Id	= 269
+} e_RANAP_CauseRadioNetworkExtension;
+
+/* RANAP_CauseRadioNetworkExtension */
+typedef long	 RANAP_CauseRadioNetworkExtension_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseRadioNetworkExtension;
+asn_struct_free_f RANAP_CauseRadioNetworkExtension_free;
+asn_struct_print_f RANAP_CauseRadioNetworkExtension_print;
+asn_constr_check_f RANAP_CauseRadioNetworkExtension_constraint;
+ber_type_decoder_f RANAP_CauseRadioNetworkExtension_decode_ber;
+der_type_encoder_f RANAP_CauseRadioNetworkExtension_encode_der;
+xer_type_decoder_f RANAP_CauseRadioNetworkExtension_decode_xer;
+xer_type_encoder_f RANAP_CauseRadioNetworkExtension_encode_xer;
+per_type_decoder_f RANAP_CauseRadioNetworkExtension_decode_uper;
+per_type_encoder_f RANAP_CauseRadioNetworkExtension_encode_uper;
+per_type_decoder_f RANAP_CauseRadioNetworkExtension_decode_aper;
+per_type_encoder_f RANAP_CauseRadioNetworkExtension_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseRadioNetworkExtension_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CauseTransmissionNetwork.c b/src/ranap/RANAP_CauseTransmissionNetwork.c
new file mode 100644
index 0000000..a5230e0
--- /dev/null
+++ b/src/ranap/RANAP_CauseTransmissionNetwork.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CauseTransmissionNetwork.h"
+
+int
+RANAP_CauseTransmissionNetwork_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 65l && value <= 80l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_CauseTransmissionNetwork_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CauseTransmissionNetwork_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseTransmissionNetwork_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CauseTransmissionNetwork_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseTransmissionNetwork_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CauseTransmissionNetwork_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CauseTransmissionNetwork_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CauseTransmissionNetwork_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CauseTransmissionNetwork_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CauseTransmissionNetwork_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CauseTransmissionNetwork_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CauseTransmissionNetwork_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  65l,  80l }	/* (65..80) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CauseTransmissionNetwork_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CauseTransmissionNetwork = {
+	"RANAP_CauseTransmissionNetwork",
+	"RANAP_CauseTransmissionNetwork",
+	RANAP_CauseTransmissionNetwork_free,
+	RANAP_CauseTransmissionNetwork_print,
+	RANAP_CauseTransmissionNetwork_constraint,
+	RANAP_CauseTransmissionNetwork_decode_ber,
+	RANAP_CauseTransmissionNetwork_encode_der,
+	RANAP_CauseTransmissionNetwork_decode_xer,
+	RANAP_CauseTransmissionNetwork_encode_xer,
+	RANAP_CauseTransmissionNetwork_decode_uper,
+	RANAP_CauseTransmissionNetwork_encode_uper,
+	RANAP_CauseTransmissionNetwork_decode_aper,
+	RANAP_CauseTransmissionNetwork_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CauseTransmissionNetwork_tags_1,
+	sizeof(asn_DEF_RANAP_CauseTransmissionNetwork_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseTransmissionNetwork_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CauseTransmissionNetwork_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CauseTransmissionNetwork_tags_1)
+		/sizeof(asn_DEF_RANAP_CauseTransmissionNetwork_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CauseTransmissionNetwork_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_CauseTransmissionNetwork.h b/src/ranap/RANAP_CauseTransmissionNetwork.h
new file mode 100644
index 0000000..9026c2c
--- /dev/null
+++ b/src/ranap/RANAP_CauseTransmissionNetwork.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CauseTransmissionNetwork_H_
+#define	_RANAP_CauseTransmissionNetwork_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CauseTransmissionNetwork {
+	RANAP_CauseTransmissionNetwork_signalling_transport_resource_failure	= 65,
+	RANAP_CauseTransmissionNetwork_iu_transport_connection_failed_to_establish	= 66
+} e_RANAP_CauseTransmissionNetwork;
+
+/* RANAP_CauseTransmissionNetwork */
+typedef long	 RANAP_CauseTransmissionNetwork_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CauseTransmissionNetwork;
+asn_struct_free_f RANAP_CauseTransmissionNetwork_free;
+asn_struct_print_f RANAP_CauseTransmissionNetwork_print;
+asn_constr_check_f RANAP_CauseTransmissionNetwork_constraint;
+ber_type_decoder_f RANAP_CauseTransmissionNetwork_decode_ber;
+der_type_encoder_f RANAP_CauseTransmissionNetwork_encode_der;
+xer_type_decoder_f RANAP_CauseTransmissionNetwork_decode_xer;
+xer_type_encoder_f RANAP_CauseTransmissionNetwork_encode_xer;
+per_type_decoder_f RANAP_CauseTransmissionNetwork_decode_uper;
+per_type_encoder_f RANAP_CauseTransmissionNetwork_encode_uper;
+per_type_decoder_f RANAP_CauseTransmissionNetwork_decode_aper;
+per_type_encoder_f RANAP_CauseTransmissionNetwork_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CauseTransmissionNetwork_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Cell-Access-Mode.c b/src/ranap/RANAP_Cell-Access-Mode.c
new file mode 100644
index 0000000..9b9f880
--- /dev/null
+++ b/src/ranap/RANAP_Cell-Access-Mode.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Cell-Access-Mode.h"
+
+int
+RANAP_Cell_Access_Mode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Cell_Access_Mode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Cell_Access_Mode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Access_Mode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Access_Mode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Access_Mode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Access_Mode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Access_Mode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Access_Mode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Access_Mode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Access_Mode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Cell_Access_Mode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Cell_Access_Mode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Cell_Access_Mode_value2enum_1[] = {
+	{ 0,	6,	"hybrid" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Cell_Access_Mode_enum2value_1[] = {
+	0	/* hybrid(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Cell_Access_Mode_specs_1 = {
+	asn_MAP_RANAP_Cell_Access_Mode_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Cell_Access_Mode_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Cell_Access_Mode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Cell_Access_Mode = {
+	"RANAP_Cell-Access-Mode",
+	"RANAP_Cell-Access-Mode",
+	RANAP_Cell_Access_Mode_free,
+	RANAP_Cell_Access_Mode_print,
+	RANAP_Cell_Access_Mode_constraint,
+	RANAP_Cell_Access_Mode_decode_ber,
+	RANAP_Cell_Access_Mode_encode_der,
+	RANAP_Cell_Access_Mode_decode_xer,
+	RANAP_Cell_Access_Mode_encode_xer,
+	RANAP_Cell_Access_Mode_decode_uper,
+	RANAP_Cell_Access_Mode_encode_uper,
+	RANAP_Cell_Access_Mode_decode_aper,
+	RANAP_Cell_Access_Mode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Cell_Access_Mode_tags_1,
+	sizeof(asn_DEF_RANAP_Cell_Access_Mode_tags_1)
+		/sizeof(asn_DEF_RANAP_Cell_Access_Mode_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Cell_Access_Mode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Cell_Access_Mode_tags_1)
+		/sizeof(asn_DEF_RANAP_Cell_Access_Mode_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Cell_Access_Mode_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Cell_Access_Mode_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Cell-Access-Mode.h b/src/ranap/RANAP_Cell-Access-Mode.h
new file mode 100644
index 0000000..e0389a9
--- /dev/null
+++ b/src/ranap/RANAP_Cell-Access-Mode.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Cell_Access_Mode_H_
+#define	_RANAP_Cell_Access_Mode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Cell_Access_Mode {
+	RANAP_Cell_Access_Mode_hybrid	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Cell_Access_Mode;
+
+/* RANAP_Cell-Access-Mode */
+typedef long	 RANAP_Cell_Access_Mode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Cell_Access_Mode;
+asn_struct_free_f RANAP_Cell_Access_Mode_free;
+asn_struct_print_f RANAP_Cell_Access_Mode_print;
+asn_constr_check_f RANAP_Cell_Access_Mode_constraint;
+ber_type_decoder_f RANAP_Cell_Access_Mode_decode_ber;
+der_type_encoder_f RANAP_Cell_Access_Mode_encode_der;
+xer_type_decoder_f RANAP_Cell_Access_Mode_decode_xer;
+xer_type_encoder_f RANAP_Cell_Access_Mode_encode_xer;
+per_type_decoder_f RANAP_Cell_Access_Mode_decode_uper;
+per_type_encoder_f RANAP_Cell_Access_Mode_encode_uper;
+per_type_decoder_f RANAP_Cell_Access_Mode_decode_aper;
+per_type_encoder_f RANAP_Cell_Access_Mode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Cell_Access_Mode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Cell-Capacity-Class-Value.c b/src/ranap/RANAP_Cell-Capacity-Class-Value.c
new file mode 100644
index 0000000..ee33b4a
--- /dev/null
+++ b/src/ranap/RANAP_Cell-Capacity-Class-Value.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Cell-Capacity-Class-Value.h"
+
+int
+RANAP_Cell_Capacity_Class_Value_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 100l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_Cell_Capacity_Class_Value_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Cell_Capacity_Class_Value_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Capacity_Class_Value_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Capacity_Class_Value_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Capacity_Class_Value_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Capacity_Class_Value_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Capacity_Class_Value_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Capacity_Class_Value_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Capacity_Class_Value_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Capacity_Class_Value_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Cell_Capacity_Class_Value_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Cell_Capacity_Class_Value_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7,  1l,  100l }	/* (1..100,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Cell_Capacity_Class_Value = {
+	"RANAP_Cell-Capacity-Class-Value",
+	"RANAP_Cell-Capacity-Class-Value",
+	RANAP_Cell_Capacity_Class_Value_free,
+	RANAP_Cell_Capacity_Class_Value_print,
+	RANAP_Cell_Capacity_Class_Value_constraint,
+	RANAP_Cell_Capacity_Class_Value_decode_ber,
+	RANAP_Cell_Capacity_Class_Value_encode_der,
+	RANAP_Cell_Capacity_Class_Value_decode_xer,
+	RANAP_Cell_Capacity_Class_Value_encode_xer,
+	RANAP_Cell_Capacity_Class_Value_decode_uper,
+	RANAP_Cell_Capacity_Class_Value_encode_uper,
+	RANAP_Cell_Capacity_Class_Value_decode_aper,
+	RANAP_Cell_Capacity_Class_Value_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1,
+	sizeof(asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1)
+		/sizeof(asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1)
+		/sizeof(asn_DEF_RANAP_Cell_Capacity_Class_Value_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Cell_Capacity_Class_Value_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Cell-Capacity-Class-Value.h b/src/ranap/RANAP_Cell-Capacity-Class-Value.h
new file mode 100644
index 0000000..b414ad3
--- /dev/null
+++ b/src/ranap/RANAP_Cell-Capacity-Class-Value.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Cell_Capacity_Class_Value_H_
+#define	_RANAP_Cell_Capacity_Class_Value_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Cell-Capacity-Class-Value */
+typedef long	 RANAP_Cell_Capacity_Class_Value_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Cell_Capacity_Class_Value;
+asn_struct_free_f RANAP_Cell_Capacity_Class_Value_free;
+asn_struct_print_f RANAP_Cell_Capacity_Class_Value_print;
+asn_constr_check_f RANAP_Cell_Capacity_Class_Value_constraint;
+ber_type_decoder_f RANAP_Cell_Capacity_Class_Value_decode_ber;
+der_type_encoder_f RANAP_Cell_Capacity_Class_Value_encode_der;
+xer_type_decoder_f RANAP_Cell_Capacity_Class_Value_decode_xer;
+xer_type_encoder_f RANAP_Cell_Capacity_Class_Value_encode_xer;
+per_type_decoder_f RANAP_Cell_Capacity_Class_Value_decode_uper;
+per_type_encoder_f RANAP_Cell_Capacity_Class_Value_encode_uper;
+per_type_decoder_f RANAP_Cell_Capacity_Class_Value_decode_aper;
+per_type_encoder_f RANAP_Cell_Capacity_Class_Value_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Cell_Capacity_Class_Value_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Cell-Id.c b/src/ranap/RANAP_Cell-Id.c
new file mode 100644
index 0000000..9ffda0a
--- /dev/null
+++ b/src/ranap/RANAP_Cell-Id.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Cell-Id.h"
+
+int
+RANAP_Cell_Id_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 268435455l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Cell_Id_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_Cell_Id_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Cell_Id_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Id_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Id_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Id_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Id_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Id_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Id_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Cell_Id_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Cell_Id_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Cell_Id_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Cell_Id_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 28, -1,  0l,  268435455l }	/* (0..268435455) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Cell_Id_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Cell_Id = {
+	"RANAP_Cell-Id",
+	"RANAP_Cell-Id",
+	RANAP_Cell_Id_free,
+	RANAP_Cell_Id_print,
+	RANAP_Cell_Id_constraint,
+	RANAP_Cell_Id_decode_ber,
+	RANAP_Cell_Id_encode_der,
+	RANAP_Cell_Id_decode_xer,
+	RANAP_Cell_Id_encode_xer,
+	RANAP_Cell_Id_decode_uper,
+	RANAP_Cell_Id_encode_uper,
+	RANAP_Cell_Id_decode_aper,
+	RANAP_Cell_Id_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Cell_Id_tags_1,
+	sizeof(asn_DEF_RANAP_Cell_Id_tags_1)
+		/sizeof(asn_DEF_RANAP_Cell_Id_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Cell_Id_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Cell_Id_tags_1)
+		/sizeof(asn_DEF_RANAP_Cell_Id_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Cell_Id_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Cell-Id.h b/src/ranap/RANAP_Cell-Id.h
new file mode 100644
index 0000000..36aed83
--- /dev/null
+++ b/src/ranap/RANAP_Cell-Id.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Cell_Id_H_
+#define	_RANAP_Cell_Id_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Cell-Id */
+typedef long	 RANAP_Cell_Id_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Cell_Id;
+asn_struct_free_f RANAP_Cell_Id_free;
+asn_struct_print_f RANAP_Cell_Id_print;
+asn_constr_check_f RANAP_Cell_Id_constraint;
+ber_type_decoder_f RANAP_Cell_Id_decode_ber;
+der_type_encoder_f RANAP_Cell_Id_encode_der;
+xer_type_decoder_f RANAP_Cell_Id_decode_xer;
+xer_type_encoder_f RANAP_Cell_Id_encode_xer;
+per_type_decoder_f RANAP_Cell_Id_decode_uper;
+per_type_encoder_f RANAP_Cell_Id_encode_uper;
+per_type_decoder_f RANAP_Cell_Id_decode_aper;
+per_type_encoder_f RANAP_Cell_Id_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Cell_Id_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CellBased.c b/src/ranap/RANAP_CellBased.c
new file mode 100644
index 0000000..57d26b3
--- /dev/null
+++ b/src/ranap/RANAP_CellBased.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CellBased.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_CellBased_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CellBased, cellIdList),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellIdList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cellIdList"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_CellBased, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_CellBased_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_CellBased_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CellBased_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellIdList */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CellBased_specs_1 = {
+	sizeof(struct RANAP_CellBased),
+	offsetof(struct RANAP_CellBased, _asn_ctx),
+	asn_MAP_RANAP_CellBased_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_CellBased_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CellBased = {
+	"RANAP_CellBased",
+	"RANAP_CellBased",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CellBased_tags_1,
+	sizeof(asn_DEF_RANAP_CellBased_tags_1)
+		/sizeof(asn_DEF_RANAP_CellBased_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CellBased_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CellBased_tags_1)
+		/sizeof(asn_DEF_RANAP_CellBased_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CellBased_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_CellBased_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CellBased.h b/src/ranap/RANAP_CellBased.h
new file mode 100644
index 0000000..4a42057
--- /dev/null
+++ b/src/ranap/RANAP_CellBased.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CellBased_H_
+#define	_RANAP_CellBased_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_CellIdList.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CellBased */
+typedef struct RANAP_CellBased {
+	RANAP_CellIdList_t	 cellIdList;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CellBased_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CellBased;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CellBased_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CellIdList.c b/src/ranap/RANAP_CellIdList.c
new file mode 100644
index 0000000..f5a9c74
--- /dev/null
+++ b/src/ranap/RANAP_CellIdList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CellIdList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_CellIdList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  1l,  32l }	/* (SIZE(1..32)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_CellIdList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_Cell_Id,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CellIdList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_CellIdList_specs_1 = {
+	sizeof(struct RANAP_CellIdList),
+	offsetof(struct RANAP_CellIdList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CellIdList = {
+	"RANAP_CellIdList",
+	"RANAP_CellIdList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CellIdList_tags_1,
+	sizeof(asn_DEF_RANAP_CellIdList_tags_1)
+		/sizeof(asn_DEF_RANAP_CellIdList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CellIdList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CellIdList_tags_1)
+		/sizeof(asn_DEF_RANAP_CellIdList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CellIdList_constr_1,
+	asn_MBR_RANAP_CellIdList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_CellIdList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CellIdList.h b/src/ranap/RANAP_CellIdList.h
new file mode 100644
index 0000000..edde11e
--- /dev/null
+++ b/src/ranap/RANAP_CellIdList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CellIdList_H_
+#define	_RANAP_CellIdList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Cell-Id.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CellIdList */
+typedef struct RANAP_CellIdList {
+	A_SEQUENCE_OF(RANAP_Cell_Id_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CellIdList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CellIdList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CellIdList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CellLoadInformation.c b/src/ranap/RANAP_CellLoadInformation.c
new file mode 100644
index 0000000..e4aa67e
--- /dev/null
+++ b/src/ranap/RANAP_CellLoadInformation.c
@@ -0,0 +1,103 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CellLoadInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_CellLoadInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CellLoadInformation, cell_Capacity_Class_Value),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Cell_Capacity_Class_Value,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cell-Capacity-Class-Value"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CellLoadInformation, loadValue),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LoadValue,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"loadValue"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_CellLoadInformation, rTLoadValue),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RTLoadValue,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rTLoadValue"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_CellLoadInformation, nRTLoadInformationValue),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_NRTLoadInformationValue,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"nRTLoadInformationValue"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_CellLoadInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_CellLoadInformation_oms_1[] = { 2, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_RANAP_CellLoadInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CellLoadInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cell-Capacity-Class-Value */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* loadValue */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* rTLoadValue */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* nRTLoadInformationValue */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CellLoadInformation_specs_1 = {
+	sizeof(struct RANAP_CellLoadInformation),
+	offsetof(struct RANAP_CellLoadInformation, _asn_ctx),
+	asn_MAP_RANAP_CellLoadInformation_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_RANAP_CellLoadInformation_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CellLoadInformation = {
+	"RANAP_CellLoadInformation",
+	"RANAP_CellLoadInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CellLoadInformation_tags_1,
+	sizeof(asn_DEF_RANAP_CellLoadInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_CellLoadInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CellLoadInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CellLoadInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_CellLoadInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CellLoadInformation_1,
+	5,	/* Elements count */
+	&asn_SPC_RANAP_CellLoadInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CellLoadInformation.h b/src/ranap/RANAP_CellLoadInformation.h
new file mode 100644
index 0000000..085f791
--- /dev/null
+++ b/src/ranap/RANAP_CellLoadInformation.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CellLoadInformation_H_
+#define	_RANAP_CellLoadInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Cell-Capacity-Class-Value.h"
+#include "RANAP_LoadValue.h"
+#include "RANAP_RTLoadValue.h"
+#include "RANAP_NRTLoadInformationValue.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CellLoadInformation */
+typedef struct RANAP_CellLoadInformation {
+	RANAP_Cell_Capacity_Class_Value_t	 cell_Capacity_Class_Value;
+	RANAP_LoadValue_t	 loadValue;
+	RANAP_RTLoadValue_t	*rTLoadValue	/* OPTIONAL */;
+	RANAP_NRTLoadInformationValue_t	*nRTLoadInformationValue	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CellLoadInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CellLoadInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CellLoadInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CellLoadInformationGroup.c b/src/ranap/RANAP_CellLoadInformationGroup.c
new file mode 100644
index 0000000..1091b22
--- /dev/null
+++ b/src/ranap/RANAP_CellLoadInformationGroup.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CellLoadInformationGroup.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_CellLoadInformationGroup_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CellLoadInformationGroup, sourceCellID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_SourceCellID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sourceCellID"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_CellLoadInformationGroup, uplinkCellLoadInformation),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellLoadInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uplinkCellLoadInformation"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_CellLoadInformationGroup, downlinkCellLoadInformation),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellLoadInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"downlinkCellLoadInformation"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_CellLoadInformationGroup, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_CellLoadInformationGroup_oms_1[] = { 1, 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_CellLoadInformationGroup_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CellLoadInformationGroup_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sourceCellID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uplinkCellLoadInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* downlinkCellLoadInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CellLoadInformationGroup_specs_1 = {
+	sizeof(struct RANAP_CellLoadInformationGroup),
+	offsetof(struct RANAP_CellLoadInformationGroup, _asn_ctx),
+	asn_MAP_RANAP_CellLoadInformationGroup_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_CellLoadInformationGroup_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CellLoadInformationGroup = {
+	"RANAP_CellLoadInformationGroup",
+	"RANAP_CellLoadInformationGroup",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CellLoadInformationGroup_tags_1,
+	sizeof(asn_DEF_RANAP_CellLoadInformationGroup_tags_1)
+		/sizeof(asn_DEF_RANAP_CellLoadInformationGroup_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CellLoadInformationGroup_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CellLoadInformationGroup_tags_1)
+		/sizeof(asn_DEF_RANAP_CellLoadInformationGroup_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CellLoadInformationGroup_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_CellLoadInformationGroup_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CellLoadInformationGroup.h b/src/ranap/RANAP_CellLoadInformationGroup.h
new file mode 100644
index 0000000..eb7c234
--- /dev/null
+++ b/src/ranap/RANAP_CellLoadInformationGroup.h
@@ -0,0 +1,46 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CellLoadInformationGroup_H_
+#define	_RANAP_CellLoadInformationGroup_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SourceCellID.h"
+#include "RANAP_CellLoadInformation.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CellLoadInformationGroup */
+typedef struct RANAP_CellLoadInformationGroup {
+	RANAP_SourceCellID_t	 sourceCellID;
+	RANAP_CellLoadInformation_t	*uplinkCellLoadInformation	/* OPTIONAL */;
+	RANAP_CellLoadInformation_t	*downlinkCellLoadInformation	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CellLoadInformationGroup_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CellLoadInformationGroup;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CellLoadInformationGroup_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CellType.c b/src/ranap/RANAP_CellType.c
new file mode 100644
index 0000000..c12bedb
--- /dev/null
+++ b/src/ranap/RANAP_CellType.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CellType.h"
+
+int
+RANAP_CellType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_CellType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_CellType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_CellType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CellType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_CellType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CellType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_CellType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_CellType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_CellType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_CellType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_CellType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_CellType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_CellType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_CellType_value2enum_1[] = {
+	{ 0,	5,	"macro" },
+	{ 1,	5,	"micro" },
+	{ 2,	4,	"pico" },
+	{ 3,	5,	"femto" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_CellType_enum2value_1[] = {
+	3,	/* femto(3) */
+	0,	/* macro(0) */
+	1,	/* micro(1) */
+	2	/* pico(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_CellType_specs_1 = {
+	asn_MAP_RANAP_CellType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_CellType_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	5,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CellType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CellType = {
+	"RANAP_CellType",
+	"RANAP_CellType",
+	RANAP_CellType_free,
+	RANAP_CellType_print,
+	RANAP_CellType_constraint,
+	RANAP_CellType_decode_ber,
+	RANAP_CellType_encode_der,
+	RANAP_CellType_decode_xer,
+	RANAP_CellType_encode_xer,
+	RANAP_CellType_decode_uper,
+	RANAP_CellType_encode_uper,
+	RANAP_CellType_decode_aper,
+	RANAP_CellType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CellType_tags_1,
+	sizeof(asn_DEF_RANAP_CellType_tags_1)
+		/sizeof(asn_DEF_RANAP_CellType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CellType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CellType_tags_1)
+		/sizeof(asn_DEF_RANAP_CellType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CellType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_CellType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CellType.h b/src/ranap/RANAP_CellType.h
new file mode 100644
index 0000000..6e47d31
--- /dev/null
+++ b/src/ranap/RANAP_CellType.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CellType_H_
+#define	_RANAP_CellType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_CellType {
+	RANAP_CellType_macro	= 0,
+	RANAP_CellType_micro	= 1,
+	RANAP_CellType_pico	= 2,
+	RANAP_CellType_femto	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_CellType;
+
+/* RANAP_CellType */
+typedef long	 RANAP_CellType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CellType;
+asn_struct_free_f RANAP_CellType_free;
+asn_struct_print_f RANAP_CellType_print;
+asn_constr_check_f RANAP_CellType_constraint;
+ber_type_decoder_f RANAP_CellType_decode_ber;
+der_type_encoder_f RANAP_CellType_encode_der;
+xer_type_decoder_f RANAP_CellType_decode_xer;
+xer_type_encoder_f RANAP_CellType_encode_xer;
+per_type_decoder_f RANAP_CellType_decode_uper;
+per_type_encoder_f RANAP_CellType_encode_uper;
+per_type_decoder_f RANAP_CellType_decode_aper;
+per_type_encoder_f RANAP_CellType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CellType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ChosenEncryptionAlgorithm.c b/src/ranap/RANAP_ChosenEncryptionAlgorithm.c
new file mode 100644
index 0000000..2b1581f
--- /dev/null
+++ b/src/ranap/RANAP_ChosenEncryptionAlgorithm.c
@@ -0,0 +1,157 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ChosenEncryptionAlgorithm.h"
+
+int
+RANAP_ChosenEncryptionAlgorithm_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_RANAP_EncryptionAlgorithm.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using RANAP_EncryptionAlgorithm,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_RANAP_EncryptionAlgorithm.free_struct;
+	td->print_struct   = asn_DEF_RANAP_EncryptionAlgorithm.print_struct;
+	td->check_constraints = asn_DEF_RANAP_EncryptionAlgorithm.check_constraints;
+	td->ber_decoder    = asn_DEF_RANAP_EncryptionAlgorithm.ber_decoder;
+	td->der_encoder    = asn_DEF_RANAP_EncryptionAlgorithm.der_encoder;
+	td->xer_decoder    = asn_DEF_RANAP_EncryptionAlgorithm.xer_decoder;
+	td->xer_encoder    = asn_DEF_RANAP_EncryptionAlgorithm.xer_encoder;
+	td->uper_decoder   = asn_DEF_RANAP_EncryptionAlgorithm.uper_decoder;
+	td->uper_encoder   = asn_DEF_RANAP_EncryptionAlgorithm.uper_encoder;
+	td->aper_decoder   = asn_DEF_RANAP_EncryptionAlgorithm.aper_decoder;
+	td->aper_encoder   = asn_DEF_RANAP_EncryptionAlgorithm.aper_encoder;
+	/* The next four lines are here because of -fknown-extern-type */
+	td->tags           = asn_DEF_RANAP_EncryptionAlgorithm.tags;
+	td->tags_count     = asn_DEF_RANAP_EncryptionAlgorithm.tags_count;
+	td->all_tags       = asn_DEF_RANAP_EncryptionAlgorithm.all_tags;
+	td->all_tags_count = asn_DEF_RANAP_EncryptionAlgorithm.all_tags_count;
+	/* End of these lines */
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_RANAP_EncryptionAlgorithm.per_constraints;
+	td->elements       = asn_DEF_RANAP_EncryptionAlgorithm.elements;
+	td->elements_count = asn_DEF_RANAP_EncryptionAlgorithm.elements_count;
+	td->specifics      = asn_DEF_RANAP_EncryptionAlgorithm.specifics;
+}
+
+void
+RANAP_ChosenEncryptionAlgorithm_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ChosenEncryptionAlgorithm_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ChosenEncryptionAlgorithm_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ChosenEncryptionAlgorithm_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ChosenEncryptionAlgorithm_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ChosenEncryptionAlgorithm_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ChosenEncryptionAlgorithm_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ChosenEncryptionAlgorithm_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ChosenEncryptionAlgorithm_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ChosenEncryptionAlgorithm_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ChosenEncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_TYPE_descriptor_t asn_DEF_RANAP_ChosenEncryptionAlgorithm = {
+	"RANAP_ChosenEncryptionAlgorithm",
+	"RANAP_ChosenEncryptionAlgorithm",
+	RANAP_ChosenEncryptionAlgorithm_free,
+	RANAP_ChosenEncryptionAlgorithm_print,
+	RANAP_ChosenEncryptionAlgorithm_constraint,
+	RANAP_ChosenEncryptionAlgorithm_decode_ber,
+	RANAP_ChosenEncryptionAlgorithm_encode_der,
+	RANAP_ChosenEncryptionAlgorithm_decode_xer,
+	RANAP_ChosenEncryptionAlgorithm_encode_xer,
+	RANAP_ChosenEncryptionAlgorithm_decode_uper,
+	RANAP_ChosenEncryptionAlgorithm_encode_uper,
+	RANAP_ChosenEncryptionAlgorithm_decode_aper,
+	RANAP_ChosenEncryptionAlgorithm_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ChosenEncryptionAlgorithm.h b/src/ranap/RANAP_ChosenEncryptionAlgorithm.h
new file mode 100644
index 0000000..190acf7
--- /dev/null
+++ b/src/ranap/RANAP_ChosenEncryptionAlgorithm.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+#include <constr_CHOICE.h>
+
+#ifndef	_RANAP_ChosenEncryptionAlgorithm_H_
+#define	_RANAP_ChosenEncryptionAlgorithm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_EncryptionAlgorithm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ChosenEncryptionAlgorithm */
+typedef RANAP_EncryptionAlgorithm_t	 RANAP_ChosenEncryptionAlgorithm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ChosenEncryptionAlgorithm;
+asn_struct_free_f RANAP_ChosenEncryptionAlgorithm_free;
+asn_struct_print_f RANAP_ChosenEncryptionAlgorithm_print;
+asn_constr_check_f RANAP_ChosenEncryptionAlgorithm_constraint;
+ber_type_decoder_f RANAP_ChosenEncryptionAlgorithm_decode_ber;
+der_type_encoder_f RANAP_ChosenEncryptionAlgorithm_encode_der;
+xer_type_decoder_f RANAP_ChosenEncryptionAlgorithm_decode_xer;
+xer_type_encoder_f RANAP_ChosenEncryptionAlgorithm_encode_xer;
+per_type_decoder_f RANAP_ChosenEncryptionAlgorithm_decode_uper;
+per_type_encoder_f RANAP_ChosenEncryptionAlgorithm_encode_uper;
+per_type_decoder_f RANAP_ChosenEncryptionAlgorithm_decode_aper;
+per_type_encoder_f RANAP_ChosenEncryptionAlgorithm_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ChosenEncryptionAlgorithm_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ChosenIntegrityProtectionAlgorithm.c b/src/ranap/RANAP_ChosenIntegrityProtectionAlgorithm.c
new file mode 100644
index 0000000..e38a640
--- /dev/null
+++ b/src/ranap/RANAP_ChosenIntegrityProtectionAlgorithm.c
@@ -0,0 +1,157 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ChosenIntegrityProtectionAlgorithm.h"
+
+int
+RANAP_ChosenIntegrityProtectionAlgorithm_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_RANAP_IntegrityProtectionAlgorithm.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using RANAP_IntegrityProtectionAlgorithm,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_RANAP_IntegrityProtectionAlgorithm.free_struct;
+	td->print_struct   = asn_DEF_RANAP_IntegrityProtectionAlgorithm.print_struct;
+	td->check_constraints = asn_DEF_RANAP_IntegrityProtectionAlgorithm.check_constraints;
+	td->ber_decoder    = asn_DEF_RANAP_IntegrityProtectionAlgorithm.ber_decoder;
+	td->der_encoder    = asn_DEF_RANAP_IntegrityProtectionAlgorithm.der_encoder;
+	td->xer_decoder    = asn_DEF_RANAP_IntegrityProtectionAlgorithm.xer_decoder;
+	td->xer_encoder    = asn_DEF_RANAP_IntegrityProtectionAlgorithm.xer_encoder;
+	td->uper_decoder   = asn_DEF_RANAP_IntegrityProtectionAlgorithm.uper_decoder;
+	td->uper_encoder   = asn_DEF_RANAP_IntegrityProtectionAlgorithm.uper_encoder;
+	td->aper_decoder   = asn_DEF_RANAP_IntegrityProtectionAlgorithm.aper_decoder;
+	td->aper_encoder   = asn_DEF_RANAP_IntegrityProtectionAlgorithm.aper_encoder;
+	/* The next four lines are here because of -fknown-extern-type */
+	td->tags           = asn_DEF_RANAP_IntegrityProtectionAlgorithm.tags;
+	td->tags_count     = asn_DEF_RANAP_IntegrityProtectionAlgorithm.tags_count;
+	td->all_tags       = asn_DEF_RANAP_IntegrityProtectionAlgorithm.all_tags;
+	td->all_tags_count = asn_DEF_RANAP_IntegrityProtectionAlgorithm.all_tags_count;
+	/* End of these lines */
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_RANAP_IntegrityProtectionAlgorithm.per_constraints;
+	td->elements       = asn_DEF_RANAP_IntegrityProtectionAlgorithm.elements;
+	td->elements_count = asn_DEF_RANAP_IntegrityProtectionAlgorithm.elements_count;
+	td->specifics      = asn_DEF_RANAP_IntegrityProtectionAlgorithm.specifics;
+}
+
+void
+RANAP_ChosenIntegrityProtectionAlgorithm_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ChosenIntegrityProtectionAlgorithm_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ChosenIntegrityProtectionAlgorithm_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ChosenIntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_TYPE_descriptor_t asn_DEF_RANAP_ChosenIntegrityProtectionAlgorithm = {
+	"RANAP_ChosenIntegrityProtectionAlgorithm",
+	"RANAP_ChosenIntegrityProtectionAlgorithm",
+	RANAP_ChosenIntegrityProtectionAlgorithm_free,
+	RANAP_ChosenIntegrityProtectionAlgorithm_print,
+	RANAP_ChosenIntegrityProtectionAlgorithm_constraint,
+	RANAP_ChosenIntegrityProtectionAlgorithm_decode_ber,
+	RANAP_ChosenIntegrityProtectionAlgorithm_encode_der,
+	RANAP_ChosenIntegrityProtectionAlgorithm_decode_xer,
+	RANAP_ChosenIntegrityProtectionAlgorithm_encode_xer,
+	RANAP_ChosenIntegrityProtectionAlgorithm_decode_uper,
+	RANAP_ChosenIntegrityProtectionAlgorithm_encode_uper,
+	RANAP_ChosenIntegrityProtectionAlgorithm_decode_aper,
+	RANAP_ChosenIntegrityProtectionAlgorithm_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ChosenIntegrityProtectionAlgorithm.h b/src/ranap/RANAP_ChosenIntegrityProtectionAlgorithm.h
new file mode 100644
index 0000000..09c9493
--- /dev/null
+++ b/src/ranap/RANAP_ChosenIntegrityProtectionAlgorithm.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+#include <constr_CHOICE.h>
+
+#ifndef	_RANAP_ChosenIntegrityProtectionAlgorithm_H_
+#define	_RANAP_ChosenIntegrityProtectionAlgorithm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IntegrityProtectionAlgorithm.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ChosenIntegrityProtectionAlgorithm */
+typedef RANAP_IntegrityProtectionAlgorithm_t	 RANAP_ChosenIntegrityProtectionAlgorithm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ChosenIntegrityProtectionAlgorithm;
+asn_struct_free_f RANAP_ChosenIntegrityProtectionAlgorithm_free;
+asn_struct_print_f RANAP_ChosenIntegrityProtectionAlgorithm_print;
+asn_constr_check_f RANAP_ChosenIntegrityProtectionAlgorithm_constraint;
+ber_type_decoder_f RANAP_ChosenIntegrityProtectionAlgorithm_decode_ber;
+der_type_encoder_f RANAP_ChosenIntegrityProtectionAlgorithm_encode_der;
+xer_type_decoder_f RANAP_ChosenIntegrityProtectionAlgorithm_decode_xer;
+xer_type_encoder_f RANAP_ChosenIntegrityProtectionAlgorithm_encode_xer;
+per_type_decoder_f RANAP_ChosenIntegrityProtectionAlgorithm_decode_uper;
+per_type_encoder_f RANAP_ChosenIntegrityProtectionAlgorithm_encode_uper;
+per_type_decoder_f RANAP_ChosenIntegrityProtectionAlgorithm_decode_aper;
+per_type_encoder_f RANAP_ChosenIntegrityProtectionAlgorithm_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ChosenIntegrityProtectionAlgorithm_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ClassmarkInformation2.c b/src/ranap/RANAP_ClassmarkInformation2.c
new file mode 100644
index 0000000..fd6e41e
--- /dev/null
+++ b/src/ranap/RANAP_ClassmarkInformation2.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ClassmarkInformation2.h"
+
+int
+RANAP_ClassmarkInformation2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_ClassmarkInformation2_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ClassmarkInformation2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation2_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation2_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation2_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation2_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ClassmarkInformation2_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_ClassmarkInformation2_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ClassmarkInformation2 = {
+	"RANAP_ClassmarkInformation2",
+	"RANAP_ClassmarkInformation2",
+	RANAP_ClassmarkInformation2_free,
+	RANAP_ClassmarkInformation2_print,
+	RANAP_ClassmarkInformation2_constraint,
+	RANAP_ClassmarkInformation2_decode_ber,
+	RANAP_ClassmarkInformation2_encode_der,
+	RANAP_ClassmarkInformation2_decode_xer,
+	RANAP_ClassmarkInformation2_encode_xer,
+	RANAP_ClassmarkInformation2_decode_uper,
+	RANAP_ClassmarkInformation2_encode_uper,
+	RANAP_ClassmarkInformation2_decode_aper,
+	RANAP_ClassmarkInformation2_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ClassmarkInformation2_tags_1,
+	sizeof(asn_DEF_RANAP_ClassmarkInformation2_tags_1)
+		/sizeof(asn_DEF_RANAP_ClassmarkInformation2_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ClassmarkInformation2_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ClassmarkInformation2_tags_1)
+		/sizeof(asn_DEF_RANAP_ClassmarkInformation2_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ClassmarkInformation2.h b/src/ranap/RANAP_ClassmarkInformation2.h
new file mode 100644
index 0000000..efab851
--- /dev/null
+++ b/src/ranap/RANAP_ClassmarkInformation2.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ClassmarkInformation2_H_
+#define	_RANAP_ClassmarkInformation2_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ClassmarkInformation2 */
+typedef OCTET_STRING_t	 RANAP_ClassmarkInformation2_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ClassmarkInformation2;
+asn_struct_free_f RANAP_ClassmarkInformation2_free;
+asn_struct_print_f RANAP_ClassmarkInformation2_print;
+asn_constr_check_f RANAP_ClassmarkInformation2_constraint;
+ber_type_decoder_f RANAP_ClassmarkInformation2_decode_ber;
+der_type_encoder_f RANAP_ClassmarkInformation2_encode_der;
+xer_type_decoder_f RANAP_ClassmarkInformation2_decode_xer;
+xer_type_encoder_f RANAP_ClassmarkInformation2_encode_xer;
+per_type_decoder_f RANAP_ClassmarkInformation2_decode_uper;
+per_type_encoder_f RANAP_ClassmarkInformation2_encode_uper;
+per_type_decoder_f RANAP_ClassmarkInformation2_decode_aper;
+per_type_encoder_f RANAP_ClassmarkInformation2_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ClassmarkInformation2_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ClassmarkInformation3.c b/src/ranap/RANAP_ClassmarkInformation3.c
new file mode 100644
index 0000000..5523cee
--- /dev/null
+++ b/src/ranap/RANAP_ClassmarkInformation3.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ClassmarkInformation3.h"
+
+int
+RANAP_ClassmarkInformation3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_ClassmarkInformation3_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ClassmarkInformation3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation3_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation3_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ClassmarkInformation3_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ClassmarkInformation3_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ClassmarkInformation3_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_ClassmarkInformation3_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ClassmarkInformation3 = {
+	"RANAP_ClassmarkInformation3",
+	"RANAP_ClassmarkInformation3",
+	RANAP_ClassmarkInformation3_free,
+	RANAP_ClassmarkInformation3_print,
+	RANAP_ClassmarkInformation3_constraint,
+	RANAP_ClassmarkInformation3_decode_ber,
+	RANAP_ClassmarkInformation3_encode_der,
+	RANAP_ClassmarkInformation3_decode_xer,
+	RANAP_ClassmarkInformation3_encode_xer,
+	RANAP_ClassmarkInformation3_decode_uper,
+	RANAP_ClassmarkInformation3_encode_uper,
+	RANAP_ClassmarkInformation3_decode_aper,
+	RANAP_ClassmarkInformation3_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ClassmarkInformation3_tags_1,
+	sizeof(asn_DEF_RANAP_ClassmarkInformation3_tags_1)
+		/sizeof(asn_DEF_RANAP_ClassmarkInformation3_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ClassmarkInformation3_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ClassmarkInformation3_tags_1)
+		/sizeof(asn_DEF_RANAP_ClassmarkInformation3_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ClassmarkInformation3.h b/src/ranap/RANAP_ClassmarkInformation3.h
new file mode 100644
index 0000000..db377ff
--- /dev/null
+++ b/src/ranap/RANAP_ClassmarkInformation3.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ClassmarkInformation3_H_
+#define	_RANAP_ClassmarkInformation3_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ClassmarkInformation3 */
+typedef OCTET_STRING_t	 RANAP_ClassmarkInformation3_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ClassmarkInformation3;
+asn_struct_free_f RANAP_ClassmarkInformation3_free;
+asn_struct_print_f RANAP_ClassmarkInformation3_print;
+asn_constr_check_f RANAP_ClassmarkInformation3_constraint;
+ber_type_decoder_f RANAP_ClassmarkInformation3_decode_ber;
+der_type_encoder_f RANAP_ClassmarkInformation3_encode_der;
+xer_type_decoder_f RANAP_ClassmarkInformation3_decode_xer;
+xer_type_encoder_f RANAP_ClassmarkInformation3_encode_xer;
+per_type_decoder_f RANAP_ClassmarkInformation3_decode_uper;
+per_type_encoder_f RANAP_ClassmarkInformation3_encode_uper;
+per_type_decoder_f RANAP_ClassmarkInformation3_decode_aper;
+per_type_encoder_f RANAP_ClassmarkInformation3_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ClassmarkInformation3_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ClientType.c b/src/ranap/RANAP_ClientType.c
new file mode 100644
index 0000000..0229654
--- /dev/null
+++ b/src/ranap/RANAP_ClientType.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ClientType.h"
+
+int
+RANAP_ClientType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ClientType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ClientType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ClientType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClientType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ClientType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClientType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ClientType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ClientType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ClientType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ClientType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ClientType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ClientType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ClientType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  7l }	/* (0..7,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ClientType_value2enum_1[] = {
+	{ 0,	18,	"emergency-Services" },
+	{ 1,	20,	"value-Added-Services" },
+	{ 2,	22,	"pLMN-Operator-Services" },
+	{ 3,	25,	"lawful-Intercept-Services" },
+	{ 4,	32,	"pLMN-Operator-Broadcast-Services" },
+	{ 5,	20,	"pLMN-Operator-O-et-M" },
+	{ 6,	34,	"pLMN-Operator-Anonymous-Statistics" },
+	{ 7,	39,	"pLMN-Operator-Target-MS-Service-Support" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ClientType_enum2value_1[] = {
+	0,	/* emergency-Services(0) */
+	3,	/* lawful-Intercept-Services(3) */
+	6,	/* pLMN-Operator-Anonymous-Statistics(6) */
+	4,	/* pLMN-Operator-Broadcast-Services(4) */
+	5,	/* pLMN-Operator-O-et-M(5) */
+	2,	/* pLMN-Operator-Services(2) */
+	7,	/* pLMN-Operator-Target-MS-Service-Support(7) */
+	1	/* value-Added-Services(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ClientType_specs_1 = {
+	asn_MAP_RANAP_ClientType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ClientType_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	9,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ClientType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ClientType = {
+	"RANAP_ClientType",
+	"RANAP_ClientType",
+	RANAP_ClientType_free,
+	RANAP_ClientType_print,
+	RANAP_ClientType_constraint,
+	RANAP_ClientType_decode_ber,
+	RANAP_ClientType_encode_der,
+	RANAP_ClientType_decode_xer,
+	RANAP_ClientType_encode_xer,
+	RANAP_ClientType_decode_uper,
+	RANAP_ClientType_encode_uper,
+	RANAP_ClientType_decode_aper,
+	RANAP_ClientType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ClientType_tags_1,
+	sizeof(asn_DEF_RANAP_ClientType_tags_1)
+		/sizeof(asn_DEF_RANAP_ClientType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ClientType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ClientType_tags_1)
+		/sizeof(asn_DEF_RANAP_ClientType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ClientType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ClientType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ClientType.h b/src/ranap/RANAP_ClientType.h
new file mode 100644
index 0000000..834cc0f
--- /dev/null
+++ b/src/ranap/RANAP_ClientType.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ClientType_H_
+#define	_RANAP_ClientType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ClientType {
+	RANAP_ClientType_emergency_Services	= 0,
+	RANAP_ClientType_value_Added_Services	= 1,
+	RANAP_ClientType_pLMN_Operator_Services	= 2,
+	RANAP_ClientType_lawful_Intercept_Services	= 3,
+	RANAP_ClientType_pLMN_Operator_Broadcast_Services	= 4,
+	RANAP_ClientType_pLMN_Operator_O_et_M	= 5,
+	RANAP_ClientType_pLMN_Operator_Anonymous_Statistics	= 6,
+	RANAP_ClientType_pLMN_Operator_Target_MS_Service_Support	= 7
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_ClientType;
+
+/* RANAP_ClientType */
+typedef long	 RANAP_ClientType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ClientType;
+asn_struct_free_f RANAP_ClientType_free;
+asn_struct_print_f RANAP_ClientType_print;
+asn_constr_check_f RANAP_ClientType_constraint;
+ber_type_decoder_f RANAP_ClientType_decode_ber;
+der_type_encoder_f RANAP_ClientType_encode_der;
+xer_type_decoder_f RANAP_ClientType_decode_xer;
+xer_type_encoder_f RANAP_ClientType_encode_xer;
+per_type_decoder_f RANAP_ClientType_decode_uper;
+per_type_encoder_f RANAP_ClientType_encode_uper;
+per_type_decoder_f RANAP_ClientType_decode_aper;
+per_type_encoder_f RANAP_ClientType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ClientType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CommonID.c b/src/ranap/RANAP_CommonID.c
new file mode 100644
index 0000000..5507b9a
--- /dev/null
+++ b/src/ranap/RANAP_CommonID.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_CommonID.h"
+
+static int
+memb_commonID_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_commonID_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_commonID_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_commonID_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_commonID_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_commonID_ies_specs_2 = {
+	sizeof(struct commonID_ies),
+	offsetof(struct commonID_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_commonID_ies_2 = {
+	"commonID-ies",
+	"commonID-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_commonID_ies_tags_2,
+	sizeof(asn_DEF_commonID_ies_tags_2)
+		/sizeof(asn_DEF_commonID_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_commonID_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_commonID_ies_tags_2)
+		/sizeof(asn_DEF_commonID_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_commonID_ies_constr_2,
+	asn_MBR_commonID_ies_2,
+	1,	/* Single element */
+	&asn_SPC_commonID_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_CommonID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_CommonID, commonID_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_commonID_ies_2,
+		memb_commonID_ies_constraint_1,
+		&asn_PER_memb_commonID_ies_constr_2,
+		0,
+		"commonID-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CommonID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CommonID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* commonID-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CommonID_specs_1 = {
+	sizeof(struct RANAP_CommonID),
+	offsetof(struct RANAP_CommonID, _asn_ctx),
+	asn_MAP_RANAP_CommonID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CommonID = {
+	"RANAP_CommonID",
+	"RANAP_CommonID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CommonID_tags_1,
+	sizeof(asn_DEF_RANAP_CommonID_tags_1)
+		/sizeof(asn_DEF_RANAP_CommonID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CommonID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CommonID_tags_1)
+		/sizeof(asn_DEF_RANAP_CommonID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CommonID_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_CommonID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CommonID.h b/src/ranap/RANAP_CommonID.h
new file mode 100644
index 0000000..01c0116
--- /dev/null
+++ b/src/ranap/RANAP_CommonID.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_CommonID_H_
+#define	_RANAP_CommonID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CommonID */
+typedef struct RANAP_CommonID {
+	struct commonID_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} commonID_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CommonID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CommonID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CommonID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Correlation-ID.c b/src/ranap/RANAP_Correlation-ID.c
new file mode 100644
index 0000000..67fa503
--- /dev/null
+++ b/src/ranap/RANAP_Correlation-ID.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Correlation-ID.h"
+
+int
+RANAP_Correlation_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Correlation_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_Correlation_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Correlation_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Correlation_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Correlation_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Correlation_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Correlation_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Correlation_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Correlation_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Correlation_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Correlation_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Correlation_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Correlation_ID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Correlation_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Correlation_ID = {
+	"RANAP_Correlation-ID",
+	"RANAP_Correlation-ID",
+	RANAP_Correlation_ID_free,
+	RANAP_Correlation_ID_print,
+	RANAP_Correlation_ID_constraint,
+	RANAP_Correlation_ID_decode_ber,
+	RANAP_Correlation_ID_encode_der,
+	RANAP_Correlation_ID_decode_xer,
+	RANAP_Correlation_ID_encode_xer,
+	RANAP_Correlation_ID_decode_uper,
+	RANAP_Correlation_ID_encode_uper,
+	RANAP_Correlation_ID_decode_aper,
+	RANAP_Correlation_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Correlation_ID_tags_1,
+	sizeof(asn_DEF_RANAP_Correlation_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_Correlation_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Correlation_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Correlation_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_Correlation_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Correlation_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Correlation-ID.h b/src/ranap/RANAP_Correlation-ID.h
new file mode 100644
index 0000000..a47174a
--- /dev/null
+++ b/src/ranap/RANAP_Correlation-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Correlation_ID_H_
+#define	_RANAP_Correlation_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Correlation-ID */
+typedef OCTET_STRING_t	 RANAP_Correlation_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Correlation_ID;
+asn_struct_free_f RANAP_Correlation_ID_free;
+asn_struct_print_f RANAP_Correlation_ID_print;
+asn_constr_check_f RANAP_Correlation_ID_constraint;
+ber_type_decoder_f RANAP_Correlation_ID_decode_ber;
+der_type_encoder_f RANAP_Correlation_ID_encode_der;
+xer_type_decoder_f RANAP_Correlation_ID_decode_xer;
+xer_type_encoder_f RANAP_Correlation_ID_encode_xer;
+per_type_decoder_f RANAP_Correlation_ID_decode_uper;
+per_type_encoder_f RANAP_Correlation_ID_encode_uper;
+per_type_decoder_f RANAP_Correlation_ID_decode_aper;
+per_type_encoder_f RANAP_Correlation_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Correlation_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Criticality.c b/src/ranap/RANAP_Criticality.c
new file mode 100644
index 0000000..fec28f4
--- /dev/null
+++ b/src/ranap/RANAP_Criticality.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_Criticality.h"
+
+int
+RANAP_Criticality_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Criticality_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Criticality_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Criticality_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Criticality_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Criticality_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Criticality_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Criticality_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Criticality_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Criticality_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Criticality_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Criticality_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Criticality_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  2l }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Criticality_value2enum_1[] = {
+	{ 0,	6,	"reject" },
+	{ 1,	6,	"ignore" },
+	{ 2,	6,	"notify" }
+};
+static const unsigned int asn_MAP_RANAP_Criticality_enum2value_1[] = {
+	1,	/* ignore(1) */
+	2,	/* notify(2) */
+	0	/* reject(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Criticality_specs_1 = {
+	asn_MAP_RANAP_Criticality_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Criticality_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Criticality_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Criticality = {
+	"RANAP_Criticality",
+	"RANAP_Criticality",
+	RANAP_Criticality_free,
+	RANAP_Criticality_print,
+	RANAP_Criticality_constraint,
+	RANAP_Criticality_decode_ber,
+	RANAP_Criticality_encode_der,
+	RANAP_Criticality_decode_xer,
+	RANAP_Criticality_encode_xer,
+	RANAP_Criticality_decode_uper,
+	RANAP_Criticality_encode_uper,
+	RANAP_Criticality_decode_aper,
+	RANAP_Criticality_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Criticality_tags_1,
+	sizeof(asn_DEF_RANAP_Criticality_tags_1)
+		/sizeof(asn_DEF_RANAP_Criticality_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Criticality_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Criticality_tags_1)
+		/sizeof(asn_DEF_RANAP_Criticality_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Criticality_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Criticality_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Criticality.h b/src/ranap/RANAP_Criticality.h
new file mode 100644
index 0000000..192cd8a
--- /dev/null
+++ b/src/ranap/RANAP_Criticality.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_Criticality_H_
+#define	_RANAP_Criticality_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Criticality {
+	RANAP_Criticality_reject	= 0,
+	RANAP_Criticality_ignore	= 1,
+	RANAP_Criticality_notify	= 2
+} e_RANAP_Criticality;
+
+/* RANAP_Criticality */
+typedef long	 RANAP_Criticality_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Criticality;
+asn_struct_free_f RANAP_Criticality_free;
+asn_struct_print_f RANAP_Criticality_print;
+asn_constr_check_f RANAP_Criticality_constraint;
+ber_type_decoder_f RANAP_Criticality_decode_ber;
+der_type_encoder_f RANAP_Criticality_encode_der;
+xer_type_decoder_f RANAP_Criticality_decode_xer;
+xer_type_encoder_f RANAP_Criticality_encode_xer;
+per_type_decoder_f RANAP_Criticality_decode_uper;
+per_type_encoder_f RANAP_Criticality_encode_uper;
+per_type_decoder_f RANAP_Criticality_decode_aper;
+per_type_encoder_f RANAP_Criticality_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Criticality_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CriticalityDiagnostics-IE-List.c b/src/ranap/RANAP_CriticalityDiagnostics-IE-List.c
new file mode 100644
index 0000000..4574a99
--- /dev/null
+++ b/src/ranap/RANAP_CriticalityDiagnostics-IE-List.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CriticalityDiagnostics-IE-List.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_CriticalityDiagnostics_IE_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, iECriticality),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iECriticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, iE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProtocolIE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-ID"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, repetitionNumber),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RepetitionNumber0,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"repetitionNumber"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iECriticality */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* repetitionNumber */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	4,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	4,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_CriticalityDiagnostics_IE_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_CriticalityDiagnostics_IE_List_specs_1 = {
+	sizeof(struct RANAP_CriticalityDiagnostics_IE_List),
+	offsetof(struct RANAP_CriticalityDiagnostics_IE_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CriticalityDiagnostics_IE_List = {
+	"RANAP_CriticalityDiagnostics-IE-List",
+	"RANAP_CriticalityDiagnostics-IE-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1,
+	sizeof(asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1)
+		/sizeof(asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1)
+		/sizeof(asn_DEF_RANAP_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_CriticalityDiagnostics_IE_List_constr_1,
+	asn_MBR_RANAP_CriticalityDiagnostics_IE_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_CriticalityDiagnostics_IE_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CriticalityDiagnostics-IE-List.h b/src/ranap/RANAP_CriticalityDiagnostics-IE-List.h
new file mode 100644
index 0000000..cba5bbd
--- /dev/null
+++ b/src/ranap/RANAP_CriticalityDiagnostics-IE-List.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CriticalityDiagnostics_IE_List_H_
+#define	_RANAP_CriticalityDiagnostics_IE_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_Criticality.h"
+#include "RANAP_ProtocolIE-ID.h"
+#include "RANAP_RepetitionNumber0.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CriticalityDiagnostics-IE-List */
+typedef struct RANAP_CriticalityDiagnostics_IE_List {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_Criticality_t	 iECriticality;
+		RANAP_ProtocolIE_ID_t	 iE_ID;
+		RANAP_RepetitionNumber0_t	*repetitionNumber	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CriticalityDiagnostics_IE_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CriticalityDiagnostics_IE_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CriticalityDiagnostics_IE_List_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_CriticalityDiagnostics.c b/src/ranap/RANAP_CriticalityDiagnostics.c
new file mode 100644
index 0000000..5004af6
--- /dev/null
+++ b/src/ranap/RANAP_CriticalityDiagnostics.c
@@ -0,0 +1,103 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_CriticalityDiagnostics.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_CriticalityDiagnostics_1[] = {
+	{ ATF_POINTER, 5, offsetof(struct RANAP_CriticalityDiagnostics, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_POINTER, 4, offsetof(struct RANAP_CriticalityDiagnostics, triggeringMessage),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TriggeringMessage,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"triggeringMessage"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_CriticalityDiagnostics, procedureCriticality),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCriticality"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_CriticalityDiagnostics, iEsCriticalityDiagnostics),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CriticalityDiagnostics_IE_List,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iEsCriticalityDiagnostics"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_CriticalityDiagnostics, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_CriticalityDiagnostics_oms_1[] = { 0, 1, 2, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_RANAP_CriticalityDiagnostics_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_CriticalityDiagnostics_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* triggeringMessage */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* procedureCriticality */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* iEsCriticalityDiagnostics */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_CriticalityDiagnostics_specs_1 = {
+	sizeof(struct RANAP_CriticalityDiagnostics),
+	offsetof(struct RANAP_CriticalityDiagnostics, _asn_ctx),
+	asn_MAP_RANAP_CriticalityDiagnostics_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_RANAP_CriticalityDiagnostics_oms_1,	/* Optional members */
+	5, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_CriticalityDiagnostics = {
+	"RANAP_CriticalityDiagnostics",
+	"RANAP_CriticalityDiagnostics",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_CriticalityDiagnostics_tags_1,
+	sizeof(asn_DEF_RANAP_CriticalityDiagnostics_tags_1)
+		/sizeof(asn_DEF_RANAP_CriticalityDiagnostics_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_CriticalityDiagnostics_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_CriticalityDiagnostics_tags_1)
+		/sizeof(asn_DEF_RANAP_CriticalityDiagnostics_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_CriticalityDiagnostics_1,
+	5,	/* Elements count */
+	&asn_SPC_RANAP_CriticalityDiagnostics_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_CriticalityDiagnostics.h b/src/ranap/RANAP_CriticalityDiagnostics.h
new file mode 100644
index 0000000..0577204
--- /dev/null
+++ b/src/ranap/RANAP_CriticalityDiagnostics.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_CriticalityDiagnostics_H_
+#define	_RANAP_CriticalityDiagnostics_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ProcedureCode.h"
+#include "RANAP_TriggeringMessage.h"
+#include "RANAP_Criticality.h"
+#include "RANAP_CriticalityDiagnostics-IE-List.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_CriticalityDiagnostics */
+typedef struct RANAP_CriticalityDiagnostics {
+	RANAP_ProcedureCode_t	*procedureCode	/* OPTIONAL */;
+	RANAP_TriggeringMessage_t	*triggeringMessage	/* OPTIONAL */;
+	RANAP_Criticality_t	*procedureCriticality	/* OPTIONAL */;
+	RANAP_CriticalityDiagnostics_IE_List_t	*iEsCriticalityDiagnostics	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_CriticalityDiagnostics_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_CriticalityDiagnostics;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_CriticalityDiagnostics_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_D-RNTI.c b/src/ranap/RANAP_D-RNTI.c
new file mode 100644
index 0000000..2fa4ab2
--- /dev/null
+++ b/src/ranap/RANAP_D-RNTI.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_D-RNTI.h"
+
+int
+RANAP_D_RNTI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 1048575l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_D_RNTI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_D_RNTI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_D_RNTI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_D_RNTI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_D_RNTI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_D_RNTI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_D_RNTI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_D_RNTI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_D_RNTI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_D_RNTI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_D_RNTI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_D_RNTI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_D_RNTI_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 20, -1,  0l,  1048575l }	/* (0..1048575) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_D_RNTI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_D_RNTI = {
+	"RANAP_D-RNTI",
+	"RANAP_D-RNTI",
+	RANAP_D_RNTI_free,
+	RANAP_D_RNTI_print,
+	RANAP_D_RNTI_constraint,
+	RANAP_D_RNTI_decode_ber,
+	RANAP_D_RNTI_encode_der,
+	RANAP_D_RNTI_decode_xer,
+	RANAP_D_RNTI_encode_xer,
+	RANAP_D_RNTI_decode_uper,
+	RANAP_D_RNTI_encode_uper,
+	RANAP_D_RNTI_decode_aper,
+	RANAP_D_RNTI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_D_RNTI_tags_1,
+	sizeof(asn_DEF_RANAP_D_RNTI_tags_1)
+		/sizeof(asn_DEF_RANAP_D_RNTI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_D_RNTI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_D_RNTI_tags_1)
+		/sizeof(asn_DEF_RANAP_D_RNTI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_D_RNTI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_D-RNTI.h b/src/ranap/RANAP_D-RNTI.h
new file mode 100644
index 0000000..4ede3e4
--- /dev/null
+++ b/src/ranap/RANAP_D-RNTI.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_D_RNTI_H_
+#define	_RANAP_D_RNTI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_D-RNTI */
+typedef long	 RANAP_D_RNTI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_D_RNTI;
+asn_struct_free_f RANAP_D_RNTI_free;
+asn_struct_print_f RANAP_D_RNTI_print;
+asn_constr_check_f RANAP_D_RNTI_constraint;
+ber_type_decoder_f RANAP_D_RNTI_decode_ber;
+der_type_encoder_f RANAP_D_RNTI_encode_der;
+xer_type_decoder_f RANAP_D_RNTI_decode_xer;
+xer_type_encoder_f RANAP_D_RNTI_encode_xer;
+per_type_decoder_f RANAP_D_RNTI_decode_uper;
+per_type_encoder_f RANAP_D_RNTI_encode_uper;
+per_type_decoder_f RANAP_D_RNTI_decode_aper;
+per_type_encoder_f RANAP_D_RNTI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_D_RNTI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DCH-ID.c b/src/ranap/RANAP_DCH-ID.c
new file mode 100644
index 0000000..a4aa1d8
--- /dev/null
+++ b/src/ranap/RANAP_DCH-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DCH-ID.h"
+
+int
+RANAP_DCH_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DCH_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_DCH_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DCH_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DCH_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DCH_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DCH_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DCH_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DCH_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DCH_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DCH_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DCH_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DCH_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DCH_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DCH_ID = {
+	"RANAP_DCH-ID",
+	"RANAP_DCH-ID",
+	RANAP_DCH_ID_free,
+	RANAP_DCH_ID_print,
+	RANAP_DCH_ID_constraint,
+	RANAP_DCH_ID_decode_ber,
+	RANAP_DCH_ID_encode_der,
+	RANAP_DCH_ID_decode_xer,
+	RANAP_DCH_ID_encode_xer,
+	RANAP_DCH_ID_decode_uper,
+	RANAP_DCH_ID_encode_uper,
+	RANAP_DCH_ID_decode_aper,
+	RANAP_DCH_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DCH_ID_tags_1,
+	sizeof(asn_DEF_RANAP_DCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_DCH_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DCH_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_DCH_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DCH_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_DCH-ID.h b/src/ranap/RANAP_DCH-ID.h
new file mode 100644
index 0000000..756fd5d
--- /dev/null
+++ b/src/ranap/RANAP_DCH-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DCH_ID_H_
+#define	_RANAP_DCH_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DCH-ID */
+typedef long	 RANAP_DCH_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DCH_ID;
+asn_struct_free_f RANAP_DCH_ID_free;
+asn_struct_print_f RANAP_DCH_ID_print;
+asn_constr_check_f RANAP_DCH_ID_constraint;
+ber_type_decoder_f RANAP_DCH_ID_decode_ber;
+der_type_encoder_f RANAP_DCH_ID_encode_der;
+xer_type_decoder_f RANAP_DCH_ID_decode_xer;
+xer_type_encoder_f RANAP_DCH_ID_encode_xer;
+per_type_decoder_f RANAP_DCH_ID_decode_uper;
+per_type_encoder_f RANAP_DCH_ID_encode_uper;
+per_type_decoder_f RANAP_DCH_ID_decode_aper;
+per_type_encoder_f RANAP_DCH_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DCH_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DL-GTP-PDU-SequenceNumber.c b/src/ranap/RANAP_DL-GTP-PDU-SequenceNumber.c
new file mode 100644
index 0000000..7321c32
--- /dev/null
+++ b/src/ranap/RANAP_DL-GTP-PDU-SequenceNumber.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DL-GTP-PDU-SequenceNumber.h"
+
+int
+RANAP_DL_GTP_PDU_SequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_DL_GTP_PDU_SequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DL_GTP_PDU_SequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DL_GTP_PDU_SequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DL_GTP_PDU_SequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber = {
+	"RANAP_DL-GTP-PDU-SequenceNumber",
+	"RANAP_DL-GTP-PDU-SequenceNumber",
+	RANAP_DL_GTP_PDU_SequenceNumber_free,
+	RANAP_DL_GTP_PDU_SequenceNumber_print,
+	RANAP_DL_GTP_PDU_SequenceNumber_constraint,
+	RANAP_DL_GTP_PDU_SequenceNumber_decode_ber,
+	RANAP_DL_GTP_PDU_SequenceNumber_encode_der,
+	RANAP_DL_GTP_PDU_SequenceNumber_decode_xer,
+	RANAP_DL_GTP_PDU_SequenceNumber_encode_xer,
+	RANAP_DL_GTP_PDU_SequenceNumber_decode_uper,
+	RANAP_DL_GTP_PDU_SequenceNumber_encode_uper,
+	RANAP_DL_GTP_PDU_SequenceNumber_decode_aper,
+	RANAP_DL_GTP_PDU_SequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DL_GTP_PDU_SequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_DL-GTP-PDU-SequenceNumber.h b/src/ranap/RANAP_DL-GTP-PDU-SequenceNumber.h
new file mode 100644
index 0000000..94b1ad1
--- /dev/null
+++ b/src/ranap/RANAP_DL-GTP-PDU-SequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DL_GTP_PDU_SequenceNumber_H_
+#define	_RANAP_DL_GTP_PDU_SequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DL-GTP-PDU-SequenceNumber */
+typedef long	 RANAP_DL_GTP_PDU_SequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber;
+asn_struct_free_f RANAP_DL_GTP_PDU_SequenceNumber_free;
+asn_struct_print_f RANAP_DL_GTP_PDU_SequenceNumber_print;
+asn_constr_check_f RANAP_DL_GTP_PDU_SequenceNumber_constraint;
+ber_type_decoder_f RANAP_DL_GTP_PDU_SequenceNumber_decode_ber;
+der_type_encoder_f RANAP_DL_GTP_PDU_SequenceNumber_encode_der;
+xer_type_decoder_f RANAP_DL_GTP_PDU_SequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_DL_GTP_PDU_SequenceNumber_encode_xer;
+per_type_decoder_f RANAP_DL_GTP_PDU_SequenceNumber_decode_uper;
+per_type_encoder_f RANAP_DL_GTP_PDU_SequenceNumber_encode_uper;
+per_type_decoder_f RANAP_DL_GTP_PDU_SequenceNumber_decode_aper;
+per_type_encoder_f RANAP_DL_GTP_PDU_SequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DL_GTP_PDU_SequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DL-N-PDU-SequenceNumber.c b/src/ranap/RANAP_DL-N-PDU-SequenceNumber.c
new file mode 100644
index 0000000..68bf7c5
--- /dev/null
+++ b/src/ranap/RANAP_DL-N-PDU-SequenceNumber.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DL-N-PDU-SequenceNumber.h"
+
+int
+RANAP_DL_N_PDU_SequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_DL_N_PDU_SequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DL_N_PDU_SequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DL_N_PDU_SequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DL_N_PDU_SequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DL_N_PDU_SequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DL_N_PDU_SequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DL_N_PDU_SequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DL_N_PDU_SequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DL_N_PDU_SequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DL_N_PDU_SequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DL_N_PDU_SequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DL_N_PDU_SequenceNumber = {
+	"RANAP_DL-N-PDU-SequenceNumber",
+	"RANAP_DL-N-PDU-SequenceNumber",
+	RANAP_DL_N_PDU_SequenceNumber_free,
+	RANAP_DL_N_PDU_SequenceNumber_print,
+	RANAP_DL_N_PDU_SequenceNumber_constraint,
+	RANAP_DL_N_PDU_SequenceNumber_decode_ber,
+	RANAP_DL_N_PDU_SequenceNumber_encode_der,
+	RANAP_DL_N_PDU_SequenceNumber_decode_xer,
+	RANAP_DL_N_PDU_SequenceNumber_encode_xer,
+	RANAP_DL_N_PDU_SequenceNumber_decode_uper,
+	RANAP_DL_N_PDU_SequenceNumber_encode_uper,
+	RANAP_DL_N_PDU_SequenceNumber_decode_aper,
+	RANAP_DL_N_PDU_SequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_DL_N_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DL_N_PDU_SequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_DL-N-PDU-SequenceNumber.h b/src/ranap/RANAP_DL-N-PDU-SequenceNumber.h
new file mode 100644
index 0000000..1b4d062
--- /dev/null
+++ b/src/ranap/RANAP_DL-N-PDU-SequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DL_N_PDU_SequenceNumber_H_
+#define	_RANAP_DL_N_PDU_SequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DL-N-PDU-SequenceNumber */
+typedef long	 RANAP_DL_N_PDU_SequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DL_N_PDU_SequenceNumber;
+asn_struct_free_f RANAP_DL_N_PDU_SequenceNumber_free;
+asn_struct_print_f RANAP_DL_N_PDU_SequenceNumber_print;
+asn_constr_check_f RANAP_DL_N_PDU_SequenceNumber_constraint;
+ber_type_decoder_f RANAP_DL_N_PDU_SequenceNumber_decode_ber;
+der_type_encoder_f RANAP_DL_N_PDU_SequenceNumber_encode_der;
+xer_type_decoder_f RANAP_DL_N_PDU_SequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_DL_N_PDU_SequenceNumber_encode_xer;
+per_type_decoder_f RANAP_DL_N_PDU_SequenceNumber_decode_uper;
+per_type_encoder_f RANAP_DL_N_PDU_SequenceNumber_encode_uper;
+per_type_decoder_f RANAP_DL_N_PDU_SequenceNumber_decode_aper;
+per_type_encoder_f RANAP_DL_N_PDU_SequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DL_N_PDU_SequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DRX-CycleLengthCoefficient.c b/src/ranap/RANAP_DRX-CycleLengthCoefficient.c
new file mode 100644
index 0000000..031e163
--- /dev/null
+++ b/src/ranap/RANAP_DRX-CycleLengthCoefficient.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DRX-CycleLengthCoefficient.h"
+
+int
+RANAP_DRX_CycleLengthCoefficient_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 6l && value <= 9l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_DRX_CycleLengthCoefficient_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DRX_CycleLengthCoefficient_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DRX_CycleLengthCoefficient_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DRX_CycleLengthCoefficient_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DRX_CycleLengthCoefficient_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DRX_CycleLengthCoefficient_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DRX_CycleLengthCoefficient_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DRX_CycleLengthCoefficient_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DRX_CycleLengthCoefficient_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DRX_CycleLengthCoefficient_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DRX_CycleLengthCoefficient_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DRX_CycleLengthCoefficient_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  6l,  9l }	/* (6..9) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DRX_CycleLengthCoefficient = {
+	"RANAP_DRX-CycleLengthCoefficient",
+	"RANAP_DRX-CycleLengthCoefficient",
+	RANAP_DRX_CycleLengthCoefficient_free,
+	RANAP_DRX_CycleLengthCoefficient_print,
+	RANAP_DRX_CycleLengthCoefficient_constraint,
+	RANAP_DRX_CycleLengthCoefficient_decode_ber,
+	RANAP_DRX_CycleLengthCoefficient_encode_der,
+	RANAP_DRX_CycleLengthCoefficient_decode_xer,
+	RANAP_DRX_CycleLengthCoefficient_encode_xer,
+	RANAP_DRX_CycleLengthCoefficient_decode_uper,
+	RANAP_DRX_CycleLengthCoefficient_encode_uper,
+	RANAP_DRX_CycleLengthCoefficient_decode_aper,
+	RANAP_DRX_CycleLengthCoefficient_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1,
+	sizeof(asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1)
+		/sizeof(asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1)
+		/sizeof(asn_DEF_RANAP_DRX_CycleLengthCoefficient_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DRX_CycleLengthCoefficient_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_DRX-CycleLengthCoefficient.h b/src/ranap/RANAP_DRX-CycleLengthCoefficient.h
new file mode 100644
index 0000000..f1af3ed
--- /dev/null
+++ b/src/ranap/RANAP_DRX-CycleLengthCoefficient.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DRX_CycleLengthCoefficient_H_
+#define	_RANAP_DRX_CycleLengthCoefficient_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DRX-CycleLengthCoefficient */
+typedef long	 RANAP_DRX_CycleLengthCoefficient_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DRX_CycleLengthCoefficient;
+asn_struct_free_f RANAP_DRX_CycleLengthCoefficient_free;
+asn_struct_print_f RANAP_DRX_CycleLengthCoefficient_print;
+asn_constr_check_f RANAP_DRX_CycleLengthCoefficient_constraint;
+ber_type_decoder_f RANAP_DRX_CycleLengthCoefficient_decode_ber;
+der_type_encoder_f RANAP_DRX_CycleLengthCoefficient_encode_der;
+xer_type_decoder_f RANAP_DRX_CycleLengthCoefficient_decode_xer;
+xer_type_encoder_f RANAP_DRX_CycleLengthCoefficient_encode_xer;
+per_type_decoder_f RANAP_DRX_CycleLengthCoefficient_decode_uper;
+per_type_encoder_f RANAP_DRX_CycleLengthCoefficient_encode_uper;
+per_type_decoder_f RANAP_DRX_CycleLengthCoefficient_decode_aper;
+per_type_encoder_f RANAP_DRX_CycleLengthCoefficient_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DRX_CycleLengthCoefficient_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DSCH-ID.c b/src/ranap/RANAP_DSCH-ID.c
new file mode 100644
index 0000000..23996d5
--- /dev/null
+++ b/src/ranap/RANAP_DSCH-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DSCH-ID.h"
+
+int
+RANAP_DSCH_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DSCH_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_DSCH_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DSCH_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DSCH_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DSCH_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DSCH_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DSCH_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DSCH_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DSCH_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DSCH_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DSCH_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DSCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DSCH_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DSCH_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DSCH_ID = {
+	"RANAP_DSCH-ID",
+	"RANAP_DSCH-ID",
+	RANAP_DSCH_ID_free,
+	RANAP_DSCH_ID_print,
+	RANAP_DSCH_ID_constraint,
+	RANAP_DSCH_ID_decode_ber,
+	RANAP_DSCH_ID_encode_der,
+	RANAP_DSCH_ID_decode_xer,
+	RANAP_DSCH_ID_encode_xer,
+	RANAP_DSCH_ID_decode_uper,
+	RANAP_DSCH_ID_encode_uper,
+	RANAP_DSCH_ID_decode_aper,
+	RANAP_DSCH_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DSCH_ID_tags_1,
+	sizeof(asn_DEF_RANAP_DSCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_DSCH_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DSCH_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DSCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_DSCH_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DSCH_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_DSCH-ID.h b/src/ranap/RANAP_DSCH-ID.h
new file mode 100644
index 0000000..54e678b
--- /dev/null
+++ b/src/ranap/RANAP_DSCH-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DSCH_ID_H_
+#define	_RANAP_DSCH_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DSCH-ID */
+typedef long	 RANAP_DSCH_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DSCH_ID;
+asn_struct_free_f RANAP_DSCH_ID_free;
+asn_struct_print_f RANAP_DSCH_ID_print;
+asn_constr_check_f RANAP_DSCH_ID_constraint;
+ber_type_decoder_f RANAP_DSCH_ID_decode_ber;
+der_type_encoder_f RANAP_DSCH_ID_encode_der;
+xer_type_decoder_f RANAP_DSCH_ID_decode_xer;
+xer_type_encoder_f RANAP_DSCH_ID_encode_xer;
+per_type_decoder_f RANAP_DSCH_ID_decode_uper;
+per_type_encoder_f RANAP_DSCH_ID_encode_uper;
+per_type_decoder_f RANAP_DSCH_ID_decode_aper;
+per_type_encoder_f RANAP_DSCH_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DSCH_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DataPDUType.c b/src/ranap/RANAP_DataPDUType.c
new file mode 100644
index 0000000..d960a4d
--- /dev/null
+++ b/src/ranap/RANAP_DataPDUType.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DataPDUType.h"
+
+int
+RANAP_DataPDUType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DataPDUType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_DataPDUType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DataPDUType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataPDUType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DataPDUType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataPDUType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DataPDUType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataPDUType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DataPDUType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DataPDUType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DataPDUType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DataPDUType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DataPDUType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_DataPDUType_value2enum_1[] = {
+	{ 0,	8,	"pDUtype0" },
+	{ 1,	8,	"pDUtype1" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_DataPDUType_enum2value_1[] = {
+	0,	/* pDUtype0(0) */
+	1	/* pDUtype1(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_DataPDUType_specs_1 = {
+	asn_MAP_RANAP_DataPDUType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_DataPDUType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DataPDUType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DataPDUType = {
+	"RANAP_DataPDUType",
+	"RANAP_DataPDUType",
+	RANAP_DataPDUType_free,
+	RANAP_DataPDUType_print,
+	RANAP_DataPDUType_constraint,
+	RANAP_DataPDUType_decode_ber,
+	RANAP_DataPDUType_encode_der,
+	RANAP_DataPDUType_decode_xer,
+	RANAP_DataPDUType_encode_xer,
+	RANAP_DataPDUType_decode_uper,
+	RANAP_DataPDUType_encode_uper,
+	RANAP_DataPDUType_decode_aper,
+	RANAP_DataPDUType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DataPDUType_tags_1,
+	sizeof(asn_DEF_RANAP_DataPDUType_tags_1)
+		/sizeof(asn_DEF_RANAP_DataPDUType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DataPDUType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DataPDUType_tags_1)
+		/sizeof(asn_DEF_RANAP_DataPDUType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DataPDUType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_DataPDUType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DataPDUType.h b/src/ranap/RANAP_DataPDUType.h
new file mode 100644
index 0000000..f732d62
--- /dev/null
+++ b/src/ranap/RANAP_DataPDUType.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DataPDUType_H_
+#define	_RANAP_DataPDUType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_DataPDUType {
+	RANAP_DataPDUType_pDUtype0	= 0,
+	RANAP_DataPDUType_pDUtype1	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_DataPDUType;
+
+/* RANAP_DataPDUType */
+typedef long	 RANAP_DataPDUType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DataPDUType;
+asn_struct_free_f RANAP_DataPDUType_free;
+asn_struct_print_f RANAP_DataPDUType_print;
+asn_constr_check_f RANAP_DataPDUType_constraint;
+ber_type_decoder_f RANAP_DataPDUType_decode_ber;
+der_type_encoder_f RANAP_DataPDUType_encode_der;
+xer_type_decoder_f RANAP_DataPDUType_decode_xer;
+xer_type_encoder_f RANAP_DataPDUType_encode_xer;
+per_type_decoder_f RANAP_DataPDUType_decode_uper;
+per_type_encoder_f RANAP_DataPDUType_encode_uper;
+per_type_decoder_f RANAP_DataPDUType_decode_aper;
+per_type_encoder_f RANAP_DataPDUType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DataPDUType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DataVolumeReference.c b/src/ranap/RANAP_DataVolumeReference.c
new file mode 100644
index 0000000..dc8daa9
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReference.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DataVolumeReference.h"
+
+int
+RANAP_DataVolumeReference_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_DataVolumeReference_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DataVolumeReference_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReference_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReference_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReference_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReference_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReference_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReference_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReference_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReference_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DataVolumeReference_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DataVolumeReference_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DataVolumeReference_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReference = {
+	"RANAP_DataVolumeReference",
+	"RANAP_DataVolumeReference",
+	RANAP_DataVolumeReference_free,
+	RANAP_DataVolumeReference_print,
+	RANAP_DataVolumeReference_constraint,
+	RANAP_DataVolumeReference_decode_ber,
+	RANAP_DataVolumeReference_encode_der,
+	RANAP_DataVolumeReference_decode_xer,
+	RANAP_DataVolumeReference_encode_xer,
+	RANAP_DataVolumeReference_decode_uper,
+	RANAP_DataVolumeReference_encode_uper,
+	RANAP_DataVolumeReference_decode_aper,
+	RANAP_DataVolumeReference_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DataVolumeReference_tags_1,
+	sizeof(asn_DEF_RANAP_DataVolumeReference_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReference_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DataVolumeReference_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DataVolumeReference_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReference_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DataVolumeReference_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_DataVolumeReference.h b/src/ranap/RANAP_DataVolumeReference.h
new file mode 100644
index 0000000..693de2b
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReference.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DataVolumeReference_H_
+#define	_RANAP_DataVolumeReference_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DataVolumeReference */
+typedef long	 RANAP_DataVolumeReference_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReference;
+asn_struct_free_f RANAP_DataVolumeReference_free;
+asn_struct_print_f RANAP_DataVolumeReference_print;
+asn_constr_check_f RANAP_DataVolumeReference_constraint;
+ber_type_decoder_f RANAP_DataVolumeReference_decode_ber;
+der_type_encoder_f RANAP_DataVolumeReference_encode_der;
+xer_type_decoder_f RANAP_DataVolumeReference_decode_xer;
+xer_type_encoder_f RANAP_DataVolumeReference_encode_xer;
+per_type_decoder_f RANAP_DataVolumeReference_decode_uper;
+per_type_encoder_f RANAP_DataVolumeReference_encode_uper;
+per_type_decoder_f RANAP_DataVolumeReference_decode_aper;
+per_type_encoder_f RANAP_DataVolumeReference_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DataVolumeReference_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DataVolumeReport.c b/src/ranap/RANAP_DataVolumeReport.c
new file mode 100644
index 0000000..e89948f
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReport.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_DataVolumeReport.h"
+
+static int
+memb_dataVolumeReport_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_dataVolumeReport_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_dataVolumeReport_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_dataVolumeReport_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_dataVolumeReport_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_dataVolumeReport_ies_specs_2 = {
+	sizeof(struct dataVolumeReport_ies),
+	offsetof(struct dataVolumeReport_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_dataVolumeReport_ies_2 = {
+	"dataVolumeReport-ies",
+	"dataVolumeReport-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_dataVolumeReport_ies_tags_2,
+	sizeof(asn_DEF_dataVolumeReport_ies_tags_2)
+		/sizeof(asn_DEF_dataVolumeReport_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_dataVolumeReport_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_dataVolumeReport_ies_tags_2)
+		/sizeof(asn_DEF_dataVolumeReport_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_dataVolumeReport_ies_constr_2,
+	asn_MBR_dataVolumeReport_ies_2,
+	1,	/* Single element */
+	&asn_SPC_dataVolumeReport_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_DataVolumeReport_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_DataVolumeReport, dataVolumeReport_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_dataVolumeReport_ies_2,
+		memb_dataVolumeReport_ies_constraint_1,
+		&asn_PER_memb_dataVolumeReport_ies_constr_2,
+		0,
+		"dataVolumeReport-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DataVolumeReport_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_DataVolumeReport_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* dataVolumeReport-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_DataVolumeReport_specs_1 = {
+	sizeof(struct RANAP_DataVolumeReport),
+	offsetof(struct RANAP_DataVolumeReport, _asn_ctx),
+	asn_MAP_RANAP_DataVolumeReport_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReport = {
+	"RANAP_DataVolumeReport",
+	"RANAP_DataVolumeReport",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DataVolumeReport_tags_1,
+	sizeof(asn_DEF_RANAP_DataVolumeReport_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReport_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DataVolumeReport_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DataVolumeReport_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReport_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_DataVolumeReport_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_DataVolumeReport_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DataVolumeReport.h b/src/ranap/RANAP_DataVolumeReport.h
new file mode 100644
index 0000000..c0e2a9d
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReport.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_DataVolumeReport_H_
+#define	_RANAP_DataVolumeReport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DataVolumeReport */
+typedef struct RANAP_DataVolumeReport {
+	struct dataVolumeReport_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} dataVolumeReport_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_DataVolumeReport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DataVolumeReport_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DataVolumeReportRequest.c b/src/ranap/RANAP_DataVolumeReportRequest.c
new file mode 100644
index 0000000..b69246e
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReportRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_DataVolumeReportRequest.h"
+
+static int
+memb_dataVolumeReportRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_dataVolumeReportRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_dataVolumeReportRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_dataVolumeReportRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_dataVolumeReportRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_dataVolumeReportRequest_ies_specs_2 = {
+	sizeof(struct dataVolumeReportRequest_ies),
+	offsetof(struct dataVolumeReportRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_dataVolumeReportRequest_ies_2 = {
+	"dataVolumeReportRequest-ies",
+	"dataVolumeReportRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_dataVolumeReportRequest_ies_tags_2,
+	sizeof(asn_DEF_dataVolumeReportRequest_ies_tags_2)
+		/sizeof(asn_DEF_dataVolumeReportRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_dataVolumeReportRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_dataVolumeReportRequest_ies_tags_2)
+		/sizeof(asn_DEF_dataVolumeReportRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_dataVolumeReportRequest_ies_constr_2,
+	asn_MBR_dataVolumeReportRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_dataVolumeReportRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_DataVolumeReportRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_DataVolumeReportRequest, dataVolumeReportRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_dataVolumeReportRequest_ies_2,
+		memb_dataVolumeReportRequest_ies_constraint_1,
+		&asn_PER_memb_dataVolumeReportRequest_ies_constr_2,
+		0,
+		"dataVolumeReportRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DataVolumeReportRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_DataVolumeReportRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* dataVolumeReportRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_DataVolumeReportRequest_specs_1 = {
+	sizeof(struct RANAP_DataVolumeReportRequest),
+	offsetof(struct RANAP_DataVolumeReportRequest, _asn_ctx),
+	asn_MAP_RANAP_DataVolumeReportRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReportRequest = {
+	"RANAP_DataVolumeReportRequest",
+	"RANAP_DataVolumeReportRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DataVolumeReportRequest_tags_1,
+	sizeof(asn_DEF_RANAP_DataVolumeReportRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReportRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DataVolumeReportRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DataVolumeReportRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReportRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_DataVolumeReportRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_DataVolumeReportRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DataVolumeReportRequest.h b/src/ranap/RANAP_DataVolumeReportRequest.h
new file mode 100644
index 0000000..bec017f
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReportRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_DataVolumeReportRequest_H_
+#define	_RANAP_DataVolumeReportRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DataVolumeReportRequest */
+typedef struct RANAP_DataVolumeReportRequest {
+	struct dataVolumeReportRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} dataVolumeReportRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_DataVolumeReportRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReportRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DataVolumeReportRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DataVolumeReportingIndication.c b/src/ranap/RANAP_DataVolumeReportingIndication.c
new file mode 100644
index 0000000..9f9e684
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReportingIndication.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DataVolumeReportingIndication.h"
+
+int
+RANAP_DataVolumeReportingIndication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_DataVolumeReportingIndication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DataVolumeReportingIndication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReportingIndication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReportingIndication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReportingIndication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReportingIndication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReportingIndication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReportingIndication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DataVolumeReportingIndication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DataVolumeReportingIndication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DataVolumeReportingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DataVolumeReportingIndication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_DataVolumeReportingIndication_value2enum_1[] = {
+	{ 0,	9,	"do-report" },
+	{ 1,	13,	"do-not-report" }
+};
+static const unsigned int asn_MAP_RANAP_DataVolumeReportingIndication_enum2value_1[] = {
+	1,	/* do-not-report(1) */
+	0	/* do-report(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_DataVolumeReportingIndication_specs_1 = {
+	asn_MAP_RANAP_DataVolumeReportingIndication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_DataVolumeReportingIndication_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DataVolumeReportingIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReportingIndication = {
+	"RANAP_DataVolumeReportingIndication",
+	"RANAP_DataVolumeReportingIndication",
+	RANAP_DataVolumeReportingIndication_free,
+	RANAP_DataVolumeReportingIndication_print,
+	RANAP_DataVolumeReportingIndication_constraint,
+	RANAP_DataVolumeReportingIndication_decode_ber,
+	RANAP_DataVolumeReportingIndication_encode_der,
+	RANAP_DataVolumeReportingIndication_decode_xer,
+	RANAP_DataVolumeReportingIndication_encode_xer,
+	RANAP_DataVolumeReportingIndication_decode_uper,
+	RANAP_DataVolumeReportingIndication_encode_uper,
+	RANAP_DataVolumeReportingIndication_decode_aper,
+	RANAP_DataVolumeReportingIndication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DataVolumeReportingIndication_tags_1,
+	sizeof(asn_DEF_RANAP_DataVolumeReportingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReportingIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DataVolumeReportingIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DataVolumeReportingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReportingIndication_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DataVolumeReportingIndication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_DataVolumeReportingIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DataVolumeReportingIndication.h b/src/ranap/RANAP_DataVolumeReportingIndication.h
new file mode 100644
index 0000000..feaa072
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReportingIndication.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DataVolumeReportingIndication_H_
+#define	_RANAP_DataVolumeReportingIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_DataVolumeReportingIndication {
+	RANAP_DataVolumeReportingIndication_do_report	= 0,
+	RANAP_DataVolumeReportingIndication_do_not_report	= 1
+} e_RANAP_DataVolumeReportingIndication;
+
+/* RANAP_DataVolumeReportingIndication */
+typedef long	 RANAP_DataVolumeReportingIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReportingIndication;
+asn_struct_free_f RANAP_DataVolumeReportingIndication_free;
+asn_struct_print_f RANAP_DataVolumeReportingIndication_print;
+asn_constr_check_f RANAP_DataVolumeReportingIndication_constraint;
+ber_type_decoder_f RANAP_DataVolumeReportingIndication_decode_ber;
+der_type_encoder_f RANAP_DataVolumeReportingIndication_encode_der;
+xer_type_decoder_f RANAP_DataVolumeReportingIndication_decode_xer;
+xer_type_encoder_f RANAP_DataVolumeReportingIndication_encode_xer;
+per_type_decoder_f RANAP_DataVolumeReportingIndication_decode_uper;
+per_type_encoder_f RANAP_DataVolumeReportingIndication_encode_uper;
+per_type_decoder_f RANAP_DataVolumeReportingIndication_decode_aper;
+per_type_encoder_f RANAP_DataVolumeReportingIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DataVolumeReportingIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DeliveryOfErroneousSDU.c b/src/ranap/RANAP_DeliveryOfErroneousSDU.c
new file mode 100644
index 0000000..6319390
--- /dev/null
+++ b/src/ranap/RANAP_DeliveryOfErroneousSDU.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DeliveryOfErroneousSDU.h"
+
+int
+RANAP_DeliveryOfErroneousSDU_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_DeliveryOfErroneousSDU_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DeliveryOfErroneousSDU_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOfErroneousSDU_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOfErroneousSDU_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOfErroneousSDU_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOfErroneousSDU_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOfErroneousSDU_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOfErroneousSDU_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOfErroneousSDU_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOfErroneousSDU_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DeliveryOfErroneousSDU_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DeliveryOfErroneousSDU_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  2l }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_DeliveryOfErroneousSDU_value2enum_1[] = {
+	{ 0,	3,	"yes" },
+	{ 1,	2,	"no" },
+	{ 2,	32,	"no-error-detection-consideration" }
+};
+static const unsigned int asn_MAP_RANAP_DeliveryOfErroneousSDU_enum2value_1[] = {
+	1,	/* no(1) */
+	2,	/* no-error-detection-consideration(2) */
+	0	/* yes(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_DeliveryOfErroneousSDU_specs_1 = {
+	asn_MAP_RANAP_DeliveryOfErroneousSDU_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_DeliveryOfErroneousSDU_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DeliveryOfErroneousSDU = {
+	"RANAP_DeliveryOfErroneousSDU",
+	"RANAP_DeliveryOfErroneousSDU",
+	RANAP_DeliveryOfErroneousSDU_free,
+	RANAP_DeliveryOfErroneousSDU_print,
+	RANAP_DeliveryOfErroneousSDU_constraint,
+	RANAP_DeliveryOfErroneousSDU_decode_ber,
+	RANAP_DeliveryOfErroneousSDU_encode_der,
+	RANAP_DeliveryOfErroneousSDU_decode_xer,
+	RANAP_DeliveryOfErroneousSDU_encode_xer,
+	RANAP_DeliveryOfErroneousSDU_decode_uper,
+	RANAP_DeliveryOfErroneousSDU_encode_uper,
+	RANAP_DeliveryOfErroneousSDU_decode_aper,
+	RANAP_DeliveryOfErroneousSDU_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1,
+	sizeof(asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1)
+		/sizeof(asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1)
+		/sizeof(asn_DEF_RANAP_DeliveryOfErroneousSDU_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DeliveryOfErroneousSDU_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_DeliveryOfErroneousSDU_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DeliveryOfErroneousSDU.h b/src/ranap/RANAP_DeliveryOfErroneousSDU.h
new file mode 100644
index 0000000..6e95465
--- /dev/null
+++ b/src/ranap/RANAP_DeliveryOfErroneousSDU.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DeliveryOfErroneousSDU_H_
+#define	_RANAP_DeliveryOfErroneousSDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_DeliveryOfErroneousSDU {
+	RANAP_DeliveryOfErroneousSDU_yes	= 0,
+	RANAP_DeliveryOfErroneousSDU_no	= 1,
+	RANAP_DeliveryOfErroneousSDU_no_error_detection_consideration	= 2
+} e_RANAP_DeliveryOfErroneousSDU;
+
+/* RANAP_DeliveryOfErroneousSDU */
+typedef long	 RANAP_DeliveryOfErroneousSDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DeliveryOfErroneousSDU;
+asn_struct_free_f RANAP_DeliveryOfErroneousSDU_free;
+asn_struct_print_f RANAP_DeliveryOfErroneousSDU_print;
+asn_constr_check_f RANAP_DeliveryOfErroneousSDU_constraint;
+ber_type_decoder_f RANAP_DeliveryOfErroneousSDU_decode_ber;
+der_type_encoder_f RANAP_DeliveryOfErroneousSDU_encode_der;
+xer_type_decoder_f RANAP_DeliveryOfErroneousSDU_decode_xer;
+xer_type_encoder_f RANAP_DeliveryOfErroneousSDU_encode_xer;
+per_type_decoder_f RANAP_DeliveryOfErroneousSDU_decode_uper;
+per_type_encoder_f RANAP_DeliveryOfErroneousSDU_encode_uper;
+per_type_decoder_f RANAP_DeliveryOfErroneousSDU_decode_aper;
+per_type_encoder_f RANAP_DeliveryOfErroneousSDU_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DeliveryOfErroneousSDU_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DeliveryOrder.c b/src/ranap/RANAP_DeliveryOrder.c
new file mode 100644
index 0000000..3f089d2
--- /dev/null
+++ b/src/ranap/RANAP_DeliveryOrder.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DeliveryOrder.h"
+
+int
+RANAP_DeliveryOrder_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_DeliveryOrder_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DeliveryOrder_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOrder_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOrder_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOrder_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOrder_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOrder_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOrder_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DeliveryOrder_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DeliveryOrder_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DeliveryOrder_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DeliveryOrder_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_DeliveryOrder_value2enum_1[] = {
+	{ 0,	24,	"delivery-order-requested" },
+	{ 1,	28,	"delivery-order-not-requested" }
+};
+static const unsigned int asn_MAP_RANAP_DeliveryOrder_enum2value_1[] = {
+	1,	/* delivery-order-not-requested(1) */
+	0	/* delivery-order-requested(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_DeliveryOrder_specs_1 = {
+	asn_MAP_RANAP_DeliveryOrder_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_DeliveryOrder_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DeliveryOrder_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DeliveryOrder = {
+	"RANAP_DeliveryOrder",
+	"RANAP_DeliveryOrder",
+	RANAP_DeliveryOrder_free,
+	RANAP_DeliveryOrder_print,
+	RANAP_DeliveryOrder_constraint,
+	RANAP_DeliveryOrder_decode_ber,
+	RANAP_DeliveryOrder_encode_der,
+	RANAP_DeliveryOrder_decode_xer,
+	RANAP_DeliveryOrder_encode_xer,
+	RANAP_DeliveryOrder_decode_uper,
+	RANAP_DeliveryOrder_encode_uper,
+	RANAP_DeliveryOrder_decode_aper,
+	RANAP_DeliveryOrder_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DeliveryOrder_tags_1,
+	sizeof(asn_DEF_RANAP_DeliveryOrder_tags_1)
+		/sizeof(asn_DEF_RANAP_DeliveryOrder_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DeliveryOrder_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DeliveryOrder_tags_1)
+		/sizeof(asn_DEF_RANAP_DeliveryOrder_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DeliveryOrder_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_DeliveryOrder_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DeliveryOrder.h b/src/ranap/RANAP_DeliveryOrder.h
new file mode 100644
index 0000000..8968908
--- /dev/null
+++ b/src/ranap/RANAP_DeliveryOrder.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DeliveryOrder_H_
+#define	_RANAP_DeliveryOrder_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_DeliveryOrder {
+	RANAP_DeliveryOrder_delivery_order_requested	= 0,
+	RANAP_DeliveryOrder_delivery_order_not_requested	= 1
+} e_RANAP_DeliveryOrder;
+
+/* RANAP_DeliveryOrder */
+typedef long	 RANAP_DeliveryOrder_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DeliveryOrder;
+asn_struct_free_f RANAP_DeliveryOrder_free;
+asn_struct_print_f RANAP_DeliveryOrder_print;
+asn_constr_check_f RANAP_DeliveryOrder_constraint;
+ber_type_decoder_f RANAP_DeliveryOrder_decode_ber;
+der_type_encoder_f RANAP_DeliveryOrder_encode_der;
+xer_type_decoder_f RANAP_DeliveryOrder_decode_xer;
+xer_type_encoder_f RANAP_DeliveryOrder_encode_xer;
+per_type_decoder_f RANAP_DeliveryOrder_decode_uper;
+per_type_encoder_f RANAP_DeliveryOrder_encode_uper;
+per_type_decoder_f RANAP_DeliveryOrder_decode_aper;
+per_type_encoder_f RANAP_DeliveryOrder_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DeliveryOrder_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DeltaRAListofIdleModeUEs.c b/src/ranap/RANAP_DeltaRAListofIdleModeUEs.c
new file mode 100644
index 0000000..0e89cbb
--- /dev/null
+++ b/src/ranap/RANAP_DeltaRAListofIdleModeUEs.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DeltaRAListofIdleModeUEs.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_DeltaRAListofIdleModeUEs_1[] = {
+	{ ATF_POINTER, 3, offsetof(struct RANAP_DeltaRAListofIdleModeUEs, newRAListofIdleModeUEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_NewRAListofIdleModeUEs,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"newRAListofIdleModeUEs"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_DeltaRAListofIdleModeUEs, rAListwithNoIdleModeUEsAnyMore),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAListwithNoIdleModeUEsAnyMore"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_DeltaRAListofIdleModeUEs, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_DeltaRAListofIdleModeUEs_oms_1[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_DeltaRAListofIdleModeUEs_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* newRAListofIdleModeUEs */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rAListwithNoIdleModeUEsAnyMore */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_DeltaRAListofIdleModeUEs_specs_1 = {
+	sizeof(struct RANAP_DeltaRAListofIdleModeUEs),
+	offsetof(struct RANAP_DeltaRAListofIdleModeUEs, _asn_ctx),
+	asn_MAP_RANAP_DeltaRAListofIdleModeUEs_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_DeltaRAListofIdleModeUEs_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DeltaRAListofIdleModeUEs = {
+	"RANAP_DeltaRAListofIdleModeUEs",
+	"RANAP_DeltaRAListofIdleModeUEs",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1,
+	sizeof(asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_DeltaRAListofIdleModeUEs_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_DeltaRAListofIdleModeUEs_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_DeltaRAListofIdleModeUEs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DeltaRAListofIdleModeUEs.h b/src/ranap/RANAP_DeltaRAListofIdleModeUEs.h
new file mode 100644
index 0000000..209c2c5
--- /dev/null
+++ b/src/ranap/RANAP_DeltaRAListofIdleModeUEs.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DeltaRAListofIdleModeUEs_H_
+#define	_RANAP_DeltaRAListofIdleModeUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_NewRAListofIdleModeUEs.h"
+#include "RANAP_RAListwithNoIdleModeUEsAnyMore.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DeltaRAListofIdleModeUEs */
+typedef struct RANAP_DeltaRAListofIdleModeUEs {
+	RANAP_NewRAListofIdleModeUEs_t	*newRAListofIdleModeUEs	/* OPTIONAL */;
+	RANAP_RAListwithNoIdleModeUEsAnyMore_t	*rAListwithNoIdleModeUEsAnyMore	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_DeltaRAListofIdleModeUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DeltaRAListofIdleModeUEs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DeltaRAListofIdleModeUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DirectInformationTransfer.c b/src/ranap/RANAP_DirectInformationTransfer.c
new file mode 100644
index 0000000..06444c3
--- /dev/null
+++ b/src/ranap/RANAP_DirectInformationTransfer.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_DirectInformationTransfer.h"
+
+static int
+memb_directInformationTransfer_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_directInformationTransfer_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_directInformationTransfer_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_directInformationTransfer_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_directInformationTransfer_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_directInformationTransfer_ies_specs_2 = {
+	sizeof(struct directInformationTransfer_ies),
+	offsetof(struct directInformationTransfer_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_directInformationTransfer_ies_2 = {
+	"directInformationTransfer-ies",
+	"directInformationTransfer-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_directInformationTransfer_ies_tags_2,
+	sizeof(asn_DEF_directInformationTransfer_ies_tags_2)
+		/sizeof(asn_DEF_directInformationTransfer_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_directInformationTransfer_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_directInformationTransfer_ies_tags_2)
+		/sizeof(asn_DEF_directInformationTransfer_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_directInformationTransfer_ies_constr_2,
+	asn_MBR_directInformationTransfer_ies_2,
+	1,	/* Single element */
+	&asn_SPC_directInformationTransfer_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_DirectInformationTransfer_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_DirectInformationTransfer, directInformationTransfer_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_directInformationTransfer_ies_2,
+		memb_directInformationTransfer_ies_constraint_1,
+		&asn_PER_memb_directInformationTransfer_ies_constr_2,
+		0,
+		"directInformationTransfer-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DirectInformationTransfer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_DirectInformationTransfer_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* directInformationTransfer-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_DirectInformationTransfer_specs_1 = {
+	sizeof(struct RANAP_DirectInformationTransfer),
+	offsetof(struct RANAP_DirectInformationTransfer, _asn_ctx),
+	asn_MAP_RANAP_DirectInformationTransfer_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DirectInformationTransfer = {
+	"RANAP_DirectInformationTransfer",
+	"RANAP_DirectInformationTransfer",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DirectInformationTransfer_tags_1,
+	sizeof(asn_DEF_RANAP_DirectInformationTransfer_tags_1)
+		/sizeof(asn_DEF_RANAP_DirectInformationTransfer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DirectInformationTransfer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DirectInformationTransfer_tags_1)
+		/sizeof(asn_DEF_RANAP_DirectInformationTransfer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_DirectInformationTransfer_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_DirectInformationTransfer_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DirectInformationTransfer.h b/src/ranap/RANAP_DirectInformationTransfer.h
new file mode 100644
index 0000000..bc2b851
--- /dev/null
+++ b/src/ranap/RANAP_DirectInformationTransfer.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_DirectInformationTransfer_H_
+#define	_RANAP_DirectInformationTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DirectInformationTransfer */
+typedef struct RANAP_DirectInformationTransfer {
+	struct directInformationTransfer_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} directInformationTransfer_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_DirectInformationTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DirectInformationTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DirectInformationTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DirectReportingIndicator.c b/src/ranap/RANAP_DirectReportingIndicator.c
new file mode 100644
index 0000000..27a798f
--- /dev/null
+++ b/src/ranap/RANAP_DirectReportingIndicator.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_DirectReportingIndicator.h"
+
+int
+RANAP_DirectReportingIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_DirectReportingIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_DirectReportingIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DirectReportingIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_DirectReportingIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DirectReportingIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_DirectReportingIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_DirectReportingIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_DirectReportingIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_DirectReportingIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_DirectReportingIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_DirectReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_DirectReportingIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_DirectReportingIndicator_value2enum_1[] = {
+	{ 0,	9,	"directSAI" },
+	{ 1,	9,	"directGeo" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_DirectReportingIndicator_enum2value_1[] = {
+	1,	/* directGeo(1) */
+	0	/* directSAI(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_DirectReportingIndicator_specs_1 = {
+	asn_MAP_RANAP_DirectReportingIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_DirectReportingIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DirectReportingIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DirectReportingIndicator = {
+	"RANAP_DirectReportingIndicator",
+	"RANAP_DirectReportingIndicator",
+	RANAP_DirectReportingIndicator_free,
+	RANAP_DirectReportingIndicator_print,
+	RANAP_DirectReportingIndicator_constraint,
+	RANAP_DirectReportingIndicator_decode_ber,
+	RANAP_DirectReportingIndicator_encode_der,
+	RANAP_DirectReportingIndicator_decode_xer,
+	RANAP_DirectReportingIndicator_encode_xer,
+	RANAP_DirectReportingIndicator_decode_uper,
+	RANAP_DirectReportingIndicator_encode_uper,
+	RANAP_DirectReportingIndicator_decode_aper,
+	RANAP_DirectReportingIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DirectReportingIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_DirectReportingIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_DirectReportingIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DirectReportingIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DirectReportingIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_DirectReportingIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_DirectReportingIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_DirectReportingIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DirectReportingIndicator.h b/src/ranap/RANAP_DirectReportingIndicator.h
new file mode 100644
index 0000000..8636557
--- /dev/null
+++ b/src/ranap/RANAP_DirectReportingIndicator.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_DirectReportingIndicator_H_
+#define	_RANAP_DirectReportingIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_DirectReportingIndicator {
+	RANAP_DirectReportingIndicator_directSAI	= 0,
+	RANAP_DirectReportingIndicator_directGeo	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_DirectReportingIndicator;
+
+/* RANAP_DirectReportingIndicator */
+typedef long	 RANAP_DirectReportingIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DirectReportingIndicator;
+asn_struct_free_f RANAP_DirectReportingIndicator_free;
+asn_struct_print_f RANAP_DirectReportingIndicator_print;
+asn_constr_check_f RANAP_DirectReportingIndicator_constraint;
+ber_type_decoder_f RANAP_DirectReportingIndicator_decode_ber;
+der_type_encoder_f RANAP_DirectReportingIndicator_encode_der;
+xer_type_decoder_f RANAP_DirectReportingIndicator_decode_xer;
+xer_type_encoder_f RANAP_DirectReportingIndicator_encode_xer;
+per_type_decoder_f RANAP_DirectReportingIndicator_decode_uper;
+per_type_encoder_f RANAP_DirectReportingIndicator_encode_uper;
+per_type_decoder_f RANAP_DirectReportingIndicator_decode_aper;
+per_type_encoder_f RANAP_DirectReportingIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DirectReportingIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_DirectTransfer.c b/src/ranap/RANAP_DirectTransfer.c
new file mode 100644
index 0000000..44ce20d
--- /dev/null
+++ b/src/ranap/RANAP_DirectTransfer.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_DirectTransfer.h"
+
+static int
+memb_directTransfer_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_directTransfer_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_directTransfer_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_directTransfer_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_directTransfer_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_directTransfer_ies_specs_2 = {
+	sizeof(struct directTransfer_ies),
+	offsetof(struct directTransfer_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_directTransfer_ies_2 = {
+	"directTransfer-ies",
+	"directTransfer-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_directTransfer_ies_tags_2,
+	sizeof(asn_DEF_directTransfer_ies_tags_2)
+		/sizeof(asn_DEF_directTransfer_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_directTransfer_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_directTransfer_ies_tags_2)
+		/sizeof(asn_DEF_directTransfer_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_directTransfer_ies_constr_2,
+	asn_MBR_directTransfer_ies_2,
+	1,	/* Single element */
+	&asn_SPC_directTransfer_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_DirectTransfer_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_DirectTransfer, directTransfer_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_directTransfer_ies_2,
+		memb_directTransfer_ies_constraint_1,
+		&asn_PER_memb_directTransfer_ies_constr_2,
+		0,
+		"directTransfer-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DirectTransfer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_DirectTransfer_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* directTransfer-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_DirectTransfer_specs_1 = {
+	sizeof(struct RANAP_DirectTransfer),
+	offsetof(struct RANAP_DirectTransfer, _asn_ctx),
+	asn_MAP_RANAP_DirectTransfer_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_DirectTransfer = {
+	"RANAP_DirectTransfer",
+	"RANAP_DirectTransfer",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_DirectTransfer_tags_1,
+	sizeof(asn_DEF_RANAP_DirectTransfer_tags_1)
+		/sizeof(asn_DEF_RANAP_DirectTransfer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DirectTransfer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DirectTransfer_tags_1)
+		/sizeof(asn_DEF_RANAP_DirectTransfer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_DirectTransfer_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_DirectTransfer_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DirectTransfer.h b/src/ranap/RANAP_DirectTransfer.h
new file mode 100644
index 0000000..7258755
--- /dev/null
+++ b/src/ranap/RANAP_DirectTransfer.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_DirectTransfer_H_
+#define	_RANAP_DirectTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DirectTransfer */
+typedef struct RANAP_DirectTransfer {
+	struct directTransfer_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} directTransfer_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_DirectTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DirectTransfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DirectTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_E-DCH-MAC-d-Flow-ID.c b/src/ranap/RANAP_E-DCH-MAC-d-Flow-ID.c
new file mode 100644
index 0000000..cbd9fee
--- /dev/null
+++ b/src/ranap/RANAP_E-DCH-MAC-d-Flow-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_E-DCH-MAC-d-Flow-ID.h"
+
+int
+RANAP_E_DCH_MAC_d_Flow_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 7l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_E_DCH_MAC_d_Flow_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_E_DCH_MAC_d_Flow_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_E_DCH_MAC_d_Flow_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_E_DCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_E_DCH_MAC_d_Flow_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 3,  3,  0l,  7l }	/* (0..7) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID = {
+	"RANAP_E-DCH-MAC-d-Flow-ID",
+	"RANAP_E-DCH-MAC-d-Flow-ID",
+	RANAP_E_DCH_MAC_d_Flow_ID_free,
+	RANAP_E_DCH_MAC_d_Flow_ID_print,
+	RANAP_E_DCH_MAC_d_Flow_ID_constraint,
+	RANAP_E_DCH_MAC_d_Flow_ID_decode_ber,
+	RANAP_E_DCH_MAC_d_Flow_ID_encode_der,
+	RANAP_E_DCH_MAC_d_Flow_ID_decode_xer,
+	RANAP_E_DCH_MAC_d_Flow_ID_encode_xer,
+	RANAP_E_DCH_MAC_d_Flow_ID_decode_uper,
+	RANAP_E_DCH_MAC_d_Flow_ID_encode_uper,
+	RANAP_E_DCH_MAC_d_Flow_ID_decode_aper,
+	RANAP_E_DCH_MAC_d_Flow_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1,
+	sizeof(asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_E_DCH_MAC_d_Flow_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_E-DCH-MAC-d-Flow-ID.h b/src/ranap/RANAP_E-DCH-MAC-d-Flow-ID.h
new file mode 100644
index 0000000..6fc0fda
--- /dev/null
+++ b/src/ranap/RANAP_E-DCH-MAC-d-Flow-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_E_DCH_MAC_d_Flow_ID_H_
+#define	_RANAP_E_DCH_MAC_d_Flow_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_E-DCH-MAC-d-Flow-ID */
+typedef long	 RANAP_E_DCH_MAC_d_Flow_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_E_DCH_MAC_d_Flow_ID;
+asn_struct_free_f RANAP_E_DCH_MAC_d_Flow_ID_free;
+asn_struct_print_f RANAP_E_DCH_MAC_d_Flow_ID_print;
+asn_constr_check_f RANAP_E_DCH_MAC_d_Flow_ID_constraint;
+ber_type_decoder_f RANAP_E_DCH_MAC_d_Flow_ID_decode_ber;
+der_type_encoder_f RANAP_E_DCH_MAC_d_Flow_ID_encode_der;
+xer_type_decoder_f RANAP_E_DCH_MAC_d_Flow_ID_decode_xer;
+xer_type_encoder_f RANAP_E_DCH_MAC_d_Flow_ID_encode_xer;
+per_type_decoder_f RANAP_E_DCH_MAC_d_Flow_ID_decode_uper;
+per_type_encoder_f RANAP_E_DCH_MAC_d_Flow_ID_encode_uper;
+per_type_decoder_f RANAP_E_DCH_MAC_d_Flow_ID_decode_aper;
+per_type_encoder_f RANAP_E_DCH_MAC_d_Flow_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_E_DCH_MAC_d_Flow_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_E-UTRAN-Service-Handover.c b/src/ranap/RANAP_E-UTRAN-Service-Handover.c
new file mode 100644
index 0000000..0eb7a82
--- /dev/null
+++ b/src/ranap/RANAP_E-UTRAN-Service-Handover.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_E-UTRAN-Service-Handover.h"
+
+int
+RANAP_E_UTRAN_Service_Handover_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_E_UTRAN_Service_Handover_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_E_UTRAN_Service_Handover_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_E_UTRAN_Service_Handover_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_E_UTRAN_Service_Handover_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_E_UTRAN_Service_Handover_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_E_UTRAN_Service_Handover_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_E_UTRAN_Service_Handover_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_E_UTRAN_Service_Handover_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_E_UTRAN_Service_Handover_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_E_UTRAN_Service_Handover_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_E_UTRAN_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_E_UTRAN_Service_Handover_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_E_UTRAN_Service_Handover_value2enum_1[] = {
+	{ 0,	42,	"handover-to-E-UTRAN-shall-not-be-performed" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_E_UTRAN_Service_Handover_enum2value_1[] = {
+	0	/* handover-to-E-UTRAN-shall-not-be-performed(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_E_UTRAN_Service_Handover_specs_1 = {
+	asn_MAP_RANAP_E_UTRAN_Service_Handover_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_E_UTRAN_Service_Handover_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_E_UTRAN_Service_Handover = {
+	"RANAP_E-UTRAN-Service-Handover",
+	"RANAP_E-UTRAN-Service-Handover",
+	RANAP_E_UTRAN_Service_Handover_free,
+	RANAP_E_UTRAN_Service_Handover_print,
+	RANAP_E_UTRAN_Service_Handover_constraint,
+	RANAP_E_UTRAN_Service_Handover_decode_ber,
+	RANAP_E_UTRAN_Service_Handover_encode_der,
+	RANAP_E_UTRAN_Service_Handover_decode_xer,
+	RANAP_E_UTRAN_Service_Handover_encode_xer,
+	RANAP_E_UTRAN_Service_Handover_decode_uper,
+	RANAP_E_UTRAN_Service_Handover_encode_uper,
+	RANAP_E_UTRAN_Service_Handover_decode_aper,
+	RANAP_E_UTRAN_Service_Handover_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1,
+	sizeof(asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1)
+		/sizeof(asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1)
+		/sizeof(asn_DEF_RANAP_E_UTRAN_Service_Handover_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_E_UTRAN_Service_Handover_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_E_UTRAN_Service_Handover_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_E-UTRAN-Service-Handover.h b/src/ranap/RANAP_E-UTRAN-Service-Handover.h
new file mode 100644
index 0000000..689c743
--- /dev/null
+++ b/src/ranap/RANAP_E-UTRAN-Service-Handover.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_E_UTRAN_Service_Handover_H_
+#define	_RANAP_E_UTRAN_Service_Handover_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_E_UTRAN_Service_Handover {
+	RANAP_E_UTRAN_Service_Handover_handover_to_E_UTRAN_shall_not_be_performed	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_E_UTRAN_Service_Handover;
+
+/* RANAP_E-UTRAN-Service-Handover */
+typedef long	 RANAP_E_UTRAN_Service_Handover_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_E_UTRAN_Service_Handover;
+asn_struct_free_f RANAP_E_UTRAN_Service_Handover_free;
+asn_struct_print_f RANAP_E_UTRAN_Service_Handover_print;
+asn_constr_check_f RANAP_E_UTRAN_Service_Handover_constraint;
+ber_type_decoder_f RANAP_E_UTRAN_Service_Handover_decode_ber;
+der_type_encoder_f RANAP_E_UTRAN_Service_Handover_encode_der;
+xer_type_decoder_f RANAP_E_UTRAN_Service_Handover_decode_xer;
+xer_type_encoder_f RANAP_E_UTRAN_Service_Handover_encode_xer;
+per_type_decoder_f RANAP_E_UTRAN_Service_Handover_decode_uper;
+per_type_encoder_f RANAP_E_UTRAN_Service_Handover_encode_uper;
+per_type_decoder_f RANAP_E_UTRAN_Service_Handover_decode_aper;
+per_type_encoder_f RANAP_E_UTRAN_Service_Handover_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_E_UTRAN_Service_Handover_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EARFCN-Extended.c b/src/ranap/RANAP_EARFCN-Extended.c
new file mode 100644
index 0000000..c1888b5
--- /dev/null
+++ b/src/ranap/RANAP_EARFCN-Extended.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_EARFCN-Extended.h"
+
+int
+RANAP_EARFCN_Extended_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 65536l && value <= 262143l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_EARFCN_Extended_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_EARFCN_Extended_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EARFCN_Extended_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_EARFCN_Extended_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EARFCN_Extended_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_EARFCN_Extended_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EARFCN_Extended_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_EARFCN_Extended_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_EARFCN_Extended_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_EARFCN_Extended_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_EARFCN_Extended_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_EARFCN_Extended_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  18, -1,  65536l,  262143l }	/* (65536..262143,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EARFCN_Extended_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EARFCN_Extended = {
+	"RANAP_EARFCN-Extended",
+	"RANAP_EARFCN-Extended",
+	RANAP_EARFCN_Extended_free,
+	RANAP_EARFCN_Extended_print,
+	RANAP_EARFCN_Extended_constraint,
+	RANAP_EARFCN_Extended_decode_ber,
+	RANAP_EARFCN_Extended_encode_der,
+	RANAP_EARFCN_Extended_decode_xer,
+	RANAP_EARFCN_Extended_encode_xer,
+	RANAP_EARFCN_Extended_decode_uper,
+	RANAP_EARFCN_Extended_encode_uper,
+	RANAP_EARFCN_Extended_decode_aper,
+	RANAP_EARFCN_Extended_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EARFCN_Extended_tags_1,
+	sizeof(asn_DEF_RANAP_EARFCN_Extended_tags_1)
+		/sizeof(asn_DEF_RANAP_EARFCN_Extended_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EARFCN_Extended_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EARFCN_Extended_tags_1)
+		/sizeof(asn_DEF_RANAP_EARFCN_Extended_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_EARFCN_Extended_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_EARFCN-Extended.h b/src/ranap/RANAP_EARFCN-Extended.h
new file mode 100644
index 0000000..9b84df4
--- /dev/null
+++ b/src/ranap/RANAP_EARFCN-Extended.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_EARFCN_Extended_H_
+#define	_RANAP_EARFCN_Extended_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EARFCN-Extended */
+typedef long	 RANAP_EARFCN_Extended_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EARFCN_Extended;
+asn_struct_free_f RANAP_EARFCN_Extended_free;
+asn_struct_print_f RANAP_EARFCN_Extended_print;
+asn_constr_check_f RANAP_EARFCN_Extended_constraint;
+ber_type_decoder_f RANAP_EARFCN_Extended_decode_ber;
+der_type_encoder_f RANAP_EARFCN_Extended_encode_der;
+xer_type_decoder_f RANAP_EARFCN_Extended_decode_xer;
+xer_type_encoder_f RANAP_EARFCN_Extended_encode_xer;
+per_type_decoder_f RANAP_EARFCN_Extended_decode_uper;
+per_type_encoder_f RANAP_EARFCN_Extended_encode_uper;
+per_type_decoder_f RANAP_EARFCN_Extended_decode_aper;
+per_type_encoder_f RANAP_EARFCN_Extended_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EARFCN_Extended_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ENB-ID.c b/src/ranap/RANAP_ENB-ID.c
new file mode 100644
index 0000000..67859b3
--- /dev/null
+++ b/src/ranap/RANAP_ENB-ID.c
@@ -0,0 +1,144 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ENB-ID.h"
+
+static int
+memb_macroENB_ID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 20l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_homeENB_ID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 28l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_macroENB_ID_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  20l,  20l }	/* (SIZE(20..20)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_homeENB_ID_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  28l,  28l }	/* (SIZE(28..28)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_type_RANAP_ENB_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_ENB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ENB_ID, choice.macroENB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_macroENB_ID_constraint_1,
+		&asn_PER_memb_macroENB_ID_constr_2,
+		0,
+		"macroENB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ENB_ID, choice.homeENB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_homeENB_ID_constraint_1,
+		&asn_PER_memb_homeENB_ID_constr_3,
+		0,
+		"homeENB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ENB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* macroENB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* homeENB-ID */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_ENB_ID_specs_1 = {
+	sizeof(struct RANAP_ENB_ID),
+	offsetof(struct RANAP_ENB_ID, _asn_ctx),
+	offsetof(struct RANAP_ENB_ID, present),
+	sizeof(((struct RANAP_ENB_ID *)0)->present),
+	asn_MAP_RANAP_ENB_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ENB_ID = {
+	"RANAP_ENB-ID",
+	"RANAP_ENB-ID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_ENB_ID_constr_1,
+	asn_MBR_RANAP_ENB_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_ENB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ENB-ID.h b/src/ranap/RANAP_ENB-ID.h
new file mode 100644
index 0000000..4a0a3c6
--- /dev/null
+++ b/src/ranap/RANAP_ENB-ID.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ENB_ID_H_
+#define	_RANAP_ENB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ENB_ID_PR {
+	RANAP_ENB_ID_PR_NOTHING,	/* No components present */
+	RANAP_ENB_ID_PR_macroENB_ID,
+	RANAP_ENB_ID_PR_homeENB_ID,
+	/* Extensions may appear below */
+	
+} RANAP_ENB_ID_PR;
+
+/* RANAP_ENB-ID */
+typedef struct RANAP_ENB_ID {
+	RANAP_ENB_ID_PR present;
+	union RANAP_ENB_ID_u {
+		BIT_STRING_t	 macroENB_ID;
+		BIT_STRING_t	 homeENB_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ENB_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ENB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EUTRANFrequencies.c b/src/ranap/RANAP_EUTRANFrequencies.c
new file mode 100644
index 0000000..2420cd7
--- /dev/null
+++ b/src/ranap/RANAP_EUTRANFrequencies.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_EUTRANFrequencies.h"
+
+static int
+memb_earfcn_constraint_2(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_earfcn_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_type_RANAP_EUTRANFrequencies_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 3,  3,  1l,  8l }	/* (SIZE(1..8)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, earfcn),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_earfcn_constraint_2,
+		&asn_PER_memb_earfcn_constr_3,
+		0,
+		"earfcn"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, measBand),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MeasBand,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"measBand"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* earfcn */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* measBand */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	3,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_EUTRANFrequencies_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EUTRANFrequencies_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_EUTRANFrequencies_specs_1 = {
+	sizeof(struct RANAP_EUTRANFrequencies),
+	offsetof(struct RANAP_EUTRANFrequencies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EUTRANFrequencies = {
+	"RANAP_EUTRANFrequencies",
+	"RANAP_EUTRANFrequencies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EUTRANFrequencies_tags_1,
+	sizeof(asn_DEF_RANAP_EUTRANFrequencies_tags_1)
+		/sizeof(asn_DEF_RANAP_EUTRANFrequencies_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EUTRANFrequencies_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EUTRANFrequencies_tags_1)
+		/sizeof(asn_DEF_RANAP_EUTRANFrequencies_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_EUTRANFrequencies_constr_1,
+	asn_MBR_RANAP_EUTRANFrequencies_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_EUTRANFrequencies_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EUTRANFrequencies.h b/src/ranap/RANAP_EUTRANFrequencies.h
new file mode 100644
index 0000000..cc7588c
--- /dev/null
+++ b/src/ranap/RANAP_EUTRANFrequencies.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_EUTRANFrequencies_H_
+#define	_RANAP_EUTRANFrequencies_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include <NativeInteger.h>
+#include "RANAP_MeasBand.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EUTRANFrequencies */
+typedef struct RANAP_EUTRANFrequencies {
+	A_SEQUENCE_OF(struct Member {
+		long	 earfcn;
+		RANAP_MeasBand_t	*measBand	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EUTRANFrequencies_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EUTRANFrequencies;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EUTRANFrequencies_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EncryptionAlgorithm.c b/src/ranap/RANAP_EncryptionAlgorithm.c
new file mode 100644
index 0000000..aa24b16
--- /dev/null
+++ b/src/ranap/RANAP_EncryptionAlgorithm.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_EncryptionAlgorithm.h"
+
+int
+RANAP_EncryptionAlgorithm_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 15l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_EncryptionAlgorithm_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_EncryptionAlgorithm_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionAlgorithm_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionAlgorithm_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionAlgorithm_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionAlgorithm_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionAlgorithm_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionAlgorithm_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionAlgorithm_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionAlgorithm_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_EncryptionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_EncryptionAlgorithm_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  0l,  15l }	/* (0..15) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EncryptionAlgorithm_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EncryptionAlgorithm = {
+	"RANAP_EncryptionAlgorithm",
+	"RANAP_EncryptionAlgorithm",
+	RANAP_EncryptionAlgorithm_free,
+	RANAP_EncryptionAlgorithm_print,
+	RANAP_EncryptionAlgorithm_constraint,
+	RANAP_EncryptionAlgorithm_decode_ber,
+	RANAP_EncryptionAlgorithm_encode_der,
+	RANAP_EncryptionAlgorithm_decode_xer,
+	RANAP_EncryptionAlgorithm_encode_xer,
+	RANAP_EncryptionAlgorithm_decode_uper,
+	RANAP_EncryptionAlgorithm_encode_uper,
+	RANAP_EncryptionAlgorithm_decode_aper,
+	RANAP_EncryptionAlgorithm_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EncryptionAlgorithm_tags_1,
+	sizeof(asn_DEF_RANAP_EncryptionAlgorithm_tags_1)
+		/sizeof(asn_DEF_RANAP_EncryptionAlgorithm_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EncryptionAlgorithm_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EncryptionAlgorithm_tags_1)
+		/sizeof(asn_DEF_RANAP_EncryptionAlgorithm_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_EncryptionAlgorithm_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_EncryptionAlgorithm.h b/src/ranap/RANAP_EncryptionAlgorithm.h
new file mode 100644
index 0000000..99f5b62
--- /dev/null
+++ b/src/ranap/RANAP_EncryptionAlgorithm.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_EncryptionAlgorithm_H_
+#define	_RANAP_EncryptionAlgorithm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_EncryptionAlgorithm {
+	RANAP_EncryptionAlgorithm_no_encryption	= 0,
+	RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorith_UEA1	= 1,
+	RANAP_EncryptionAlgorithm_standard_UMTS_encryption_algorithm_UEA2	= 2
+} e_RANAP_EncryptionAlgorithm;
+
+/* RANAP_EncryptionAlgorithm */
+typedef long	 RANAP_EncryptionAlgorithm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EncryptionAlgorithm;
+asn_struct_free_f RANAP_EncryptionAlgorithm_free;
+asn_struct_print_f RANAP_EncryptionAlgorithm_print;
+asn_constr_check_f RANAP_EncryptionAlgorithm_constraint;
+ber_type_decoder_f RANAP_EncryptionAlgorithm_decode_ber;
+der_type_encoder_f RANAP_EncryptionAlgorithm_encode_der;
+xer_type_decoder_f RANAP_EncryptionAlgorithm_decode_xer;
+xer_type_encoder_f RANAP_EncryptionAlgorithm_encode_xer;
+per_type_decoder_f RANAP_EncryptionAlgorithm_decode_uper;
+per_type_encoder_f RANAP_EncryptionAlgorithm_encode_uper;
+per_type_decoder_f RANAP_EncryptionAlgorithm_decode_aper;
+per_type_encoder_f RANAP_EncryptionAlgorithm_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EncryptionAlgorithm_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EncryptionInformation.c b/src/ranap/RANAP_EncryptionInformation.c
new file mode 100644
index 0000000..6d586bb
--- /dev/null
+++ b/src/ranap/RANAP_EncryptionInformation.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_EncryptionInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_EncryptionInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EncryptionInformation, permittedAlgorithms),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PermittedEncryptionAlgorithms,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"permittedAlgorithms"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EncryptionInformation, key),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_EncryptionKey,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"key"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_EncryptionInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_EncryptionInformation_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_EncryptionInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_EncryptionInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* permittedAlgorithms */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* key */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_EncryptionInformation_specs_1 = {
+	sizeof(struct RANAP_EncryptionInformation),
+	offsetof(struct RANAP_EncryptionInformation, _asn_ctx),
+	asn_MAP_RANAP_EncryptionInformation_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_EncryptionInformation_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EncryptionInformation = {
+	"RANAP_EncryptionInformation",
+	"RANAP_EncryptionInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EncryptionInformation_tags_1,
+	sizeof(asn_DEF_RANAP_EncryptionInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_EncryptionInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EncryptionInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EncryptionInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_EncryptionInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_EncryptionInformation_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_EncryptionInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EncryptionInformation.h b/src/ranap/RANAP_EncryptionInformation.h
new file mode 100644
index 0000000..942108d
--- /dev/null
+++ b/src/ranap/RANAP_EncryptionInformation.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_EncryptionInformation_H_
+#define	_RANAP_EncryptionInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PermittedEncryptionAlgorithms.h"
+#include "RANAP_EncryptionKey.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EncryptionInformation */
+typedef struct RANAP_EncryptionInformation {
+	RANAP_PermittedEncryptionAlgorithms_t	 permittedAlgorithms;
+	RANAP_EncryptionKey_t	 key;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EncryptionInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EncryptionInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EncryptionInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EncryptionKey.c b/src/ranap/RANAP_EncryptionKey.c
new file mode 100644
index 0000000..fc8dc45
--- /dev/null
+++ b/src/ranap/RANAP_EncryptionKey.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_EncryptionKey.h"
+
+int
+RANAP_EncryptionKey_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_EncryptionKey_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_EncryptionKey_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_EncryptionKey_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionKey_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionKey_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionKey_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionKey_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionKey_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionKey_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_EncryptionKey_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_EncryptionKey_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_EncryptionKey_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_EncryptionKey_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  128l,  128l }	/* (SIZE(128..128)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EncryptionKey_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EncryptionKey = {
+	"RANAP_EncryptionKey",
+	"RANAP_EncryptionKey",
+	RANAP_EncryptionKey_free,
+	RANAP_EncryptionKey_print,
+	RANAP_EncryptionKey_constraint,
+	RANAP_EncryptionKey_decode_ber,
+	RANAP_EncryptionKey_encode_der,
+	RANAP_EncryptionKey_decode_xer,
+	RANAP_EncryptionKey_encode_xer,
+	RANAP_EncryptionKey_decode_uper,
+	RANAP_EncryptionKey_encode_uper,
+	RANAP_EncryptionKey_decode_aper,
+	RANAP_EncryptionKey_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EncryptionKey_tags_1,
+	sizeof(asn_DEF_RANAP_EncryptionKey_tags_1)
+		/sizeof(asn_DEF_RANAP_EncryptionKey_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EncryptionKey_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EncryptionKey_tags_1)
+		/sizeof(asn_DEF_RANAP_EncryptionKey_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_EncryptionKey_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_EncryptionKey.h b/src/ranap/RANAP_EncryptionKey.h
new file mode 100644
index 0000000..7173803
--- /dev/null
+++ b/src/ranap/RANAP_EncryptionKey.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_EncryptionKey_H_
+#define	_RANAP_EncryptionKey_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EncryptionKey */
+typedef BIT_STRING_t	 RANAP_EncryptionKey_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EncryptionKey;
+asn_struct_free_f RANAP_EncryptionKey_free;
+asn_struct_print_f RANAP_EncryptionKey_print;
+asn_constr_check_f RANAP_EncryptionKey_constraint;
+ber_type_decoder_f RANAP_EncryptionKey_decode_ber;
+der_type_encoder_f RANAP_EncryptionKey_encode_der;
+xer_type_decoder_f RANAP_EncryptionKey_decode_xer;
+xer_type_encoder_f RANAP_EncryptionKey_encode_xer;
+per_type_decoder_f RANAP_EncryptionKey_decode_uper;
+per_type_encoder_f RANAP_EncryptionKey_encode_uper;
+per_type_decoder_f RANAP_EncryptionKey_decode_aper;
+per_type_encoder_f RANAP_EncryptionKey_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EncryptionKey_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_End-Of-CSFB.c b/src/ranap/RANAP_End-Of-CSFB.c
new file mode 100644
index 0000000..534fb5a
--- /dev/null
+++ b/src/ranap/RANAP_End-Of-CSFB.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_End-Of-CSFB.h"
+
+int
+RANAP_End_Of_CSFB_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_End_Of_CSFB_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_End_Of_CSFB_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_End_Of_CSFB_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_End_Of_CSFB_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_End_Of_CSFB_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_End_Of_CSFB_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_End_Of_CSFB_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_End_Of_CSFB_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_End_Of_CSFB_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_End_Of_CSFB_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_End_Of_CSFB_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_End_Of_CSFB_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_End_Of_CSFB_value2enum_1[] = {
+	{ 0,	11,	"end-of-CSFB" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_End_Of_CSFB_enum2value_1[] = {
+	0	/* end-of-CSFB(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_End_Of_CSFB_specs_1 = {
+	asn_MAP_RANAP_End_Of_CSFB_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_End_Of_CSFB_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_End_Of_CSFB_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_End_Of_CSFB = {
+	"RANAP_End-Of-CSFB",
+	"RANAP_End-Of-CSFB",
+	RANAP_End_Of_CSFB_free,
+	RANAP_End_Of_CSFB_print,
+	RANAP_End_Of_CSFB_constraint,
+	RANAP_End_Of_CSFB_decode_ber,
+	RANAP_End_Of_CSFB_encode_der,
+	RANAP_End_Of_CSFB_decode_xer,
+	RANAP_End_Of_CSFB_encode_xer,
+	RANAP_End_Of_CSFB_decode_uper,
+	RANAP_End_Of_CSFB_encode_uper,
+	RANAP_End_Of_CSFB_decode_aper,
+	RANAP_End_Of_CSFB_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_End_Of_CSFB_tags_1,
+	sizeof(asn_DEF_RANAP_End_Of_CSFB_tags_1)
+		/sizeof(asn_DEF_RANAP_End_Of_CSFB_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_End_Of_CSFB_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_End_Of_CSFB_tags_1)
+		/sizeof(asn_DEF_RANAP_End_Of_CSFB_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_End_Of_CSFB_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_End_Of_CSFB_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_End-Of-CSFB.h b/src/ranap/RANAP_End-Of-CSFB.h
new file mode 100644
index 0000000..b992889
--- /dev/null
+++ b/src/ranap/RANAP_End-Of-CSFB.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_End_Of_CSFB_H_
+#define	_RANAP_End_Of_CSFB_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_End_Of_CSFB {
+	RANAP_End_Of_CSFB_end_of_CSFB	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_End_Of_CSFB;
+
+/* RANAP_End-Of-CSFB */
+typedef long	 RANAP_End_Of_CSFB_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_End_Of_CSFB;
+asn_struct_free_f RANAP_End_Of_CSFB_free;
+asn_struct_print_f RANAP_End_Of_CSFB_print;
+asn_constr_check_f RANAP_End_Of_CSFB_constraint;
+ber_type_decoder_f RANAP_End_Of_CSFB_decode_ber;
+der_type_encoder_f RANAP_End_Of_CSFB_encode_der;
+xer_type_decoder_f RANAP_End_Of_CSFB_decode_xer;
+xer_type_encoder_f RANAP_End_Of_CSFB_encode_xer;
+per_type_decoder_f RANAP_End_Of_CSFB_decode_uper;
+per_type_encoder_f RANAP_End_Of_CSFB_encode_uper;
+per_type_decoder_f RANAP_End_Of_CSFB_decode_aper;
+per_type_encoder_f RANAP_End_Of_CSFB_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_End_Of_CSFB_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteConfirm.c b/src/ranap/RANAP_EnhancedRelocationCompleteConfirm.c
new file mode 100644
index 0000000..fcdd3d3
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteConfirm.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_EnhancedRelocationCompleteConfirm.h"
+
+static int
+memb_enhancedRelocationCompleteConfirm_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_enhancedRelocationCompleteConfirm_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_enhancedRelocationCompleteConfirm_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_enhancedRelocationCompleteConfirm_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_enhancedRelocationCompleteConfirm_ies_specs_2 = {
+	sizeof(struct enhancedRelocationCompleteConfirm_ies),
+	offsetof(struct enhancedRelocationCompleteConfirm_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_enhancedRelocationCompleteConfirm_ies_2 = {
+	"enhancedRelocationCompleteConfirm-ies",
+	"enhancedRelocationCompleteConfirm-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2,
+	sizeof(asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteConfirm_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_enhancedRelocationCompleteConfirm_ies_constr_2,
+	asn_MBR_enhancedRelocationCompleteConfirm_ies_2,
+	1,	/* Single element */
+	&asn_SPC_enhancedRelocationCompleteConfirm_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_EnhancedRelocationCompleteConfirm_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EnhancedRelocationCompleteConfirm, enhancedRelocationCompleteConfirm_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_enhancedRelocationCompleteConfirm_ies_2,
+		memb_enhancedRelocationCompleteConfirm_ies_constraint_1,
+		&asn_PER_memb_enhancedRelocationCompleteConfirm_ies_constr_2,
+		0,
+		"enhancedRelocationCompleteConfirm-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_EnhancedRelocationCompleteConfirm_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* enhancedRelocationCompleteConfirm-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_EnhancedRelocationCompleteConfirm_specs_1 = {
+	sizeof(struct RANAP_EnhancedRelocationCompleteConfirm),
+	offsetof(struct RANAP_EnhancedRelocationCompleteConfirm, _asn_ctx),
+	asn_MAP_RANAP_EnhancedRelocationCompleteConfirm_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteConfirm = {
+	"RANAP_EnhancedRelocationCompleteConfirm",
+	"RANAP_EnhancedRelocationCompleteConfirm",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1,
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteConfirm_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_EnhancedRelocationCompleteConfirm_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_EnhancedRelocationCompleteConfirm_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteConfirm.h b/src/ranap/RANAP_EnhancedRelocationCompleteConfirm.h
new file mode 100644
index 0000000..5891f03
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteConfirm.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_EnhancedRelocationCompleteConfirm_H_
+#define	_RANAP_EnhancedRelocationCompleteConfirm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EnhancedRelocationCompleteConfirm */
+typedef struct RANAP_EnhancedRelocationCompleteConfirm {
+	struct enhancedRelocationCompleteConfirm_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} enhancedRelocationCompleteConfirm_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EnhancedRelocationCompleteConfirm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteConfirm;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EnhancedRelocationCompleteConfirm_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteFailure.c b/src/ranap/RANAP_EnhancedRelocationCompleteFailure.c
new file mode 100644
index 0000000..b50b0bf
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_EnhancedRelocationCompleteFailure.h"
+
+static int
+memb_enhancedRelocationCompleteFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_enhancedRelocationCompleteFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_enhancedRelocationCompleteFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_enhancedRelocationCompleteFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_enhancedRelocationCompleteFailure_ies_specs_2 = {
+	sizeof(struct enhancedRelocationCompleteFailure_ies),
+	offsetof(struct enhancedRelocationCompleteFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_enhancedRelocationCompleteFailure_ies_2 = {
+	"enhancedRelocationCompleteFailure-ies",
+	"enhancedRelocationCompleteFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2,
+	sizeof(asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_enhancedRelocationCompleteFailure_ies_constr_2,
+	asn_MBR_enhancedRelocationCompleteFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_enhancedRelocationCompleteFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_EnhancedRelocationCompleteFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EnhancedRelocationCompleteFailure, enhancedRelocationCompleteFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_enhancedRelocationCompleteFailure_ies_2,
+		memb_enhancedRelocationCompleteFailure_ies_constraint_1,
+		&asn_PER_memb_enhancedRelocationCompleteFailure_ies_constr_2,
+		0,
+		"enhancedRelocationCompleteFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_EnhancedRelocationCompleteFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* enhancedRelocationCompleteFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_EnhancedRelocationCompleteFailure_specs_1 = {
+	sizeof(struct RANAP_EnhancedRelocationCompleteFailure),
+	offsetof(struct RANAP_EnhancedRelocationCompleteFailure, _asn_ctx),
+	asn_MAP_RANAP_EnhancedRelocationCompleteFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteFailure = {
+	"RANAP_EnhancedRelocationCompleteFailure",
+	"RANAP_EnhancedRelocationCompleteFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1,
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_EnhancedRelocationCompleteFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_EnhancedRelocationCompleteFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteFailure.h b/src/ranap/RANAP_EnhancedRelocationCompleteFailure.h
new file mode 100644
index 0000000..0d055e2
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_EnhancedRelocationCompleteFailure_H_
+#define	_RANAP_EnhancedRelocationCompleteFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EnhancedRelocationCompleteFailure */
+typedef struct RANAP_EnhancedRelocationCompleteFailure {
+	struct enhancedRelocationCompleteFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} enhancedRelocationCompleteFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EnhancedRelocationCompleteFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EnhancedRelocationCompleteFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteRequest.c b/src/ranap/RANAP_EnhancedRelocationCompleteRequest.c
new file mode 100644
index 0000000..a7addd4
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_EnhancedRelocationCompleteRequest.h"
+
+static int
+memb_enhancedRelocationCompleteRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_enhancedRelocationCompleteRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_enhancedRelocationCompleteRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_enhancedRelocationCompleteRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_enhancedRelocationCompleteRequest_ies_specs_2 = {
+	sizeof(struct enhancedRelocationCompleteRequest_ies),
+	offsetof(struct enhancedRelocationCompleteRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_enhancedRelocationCompleteRequest_ies_2 = {
+	"enhancedRelocationCompleteRequest-ies",
+	"enhancedRelocationCompleteRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2,
+	sizeof(asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_enhancedRelocationCompleteRequest_ies_constr_2,
+	asn_MBR_enhancedRelocationCompleteRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_enhancedRelocationCompleteRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_EnhancedRelocationCompleteRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EnhancedRelocationCompleteRequest, enhancedRelocationCompleteRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_enhancedRelocationCompleteRequest_ies_2,
+		memb_enhancedRelocationCompleteRequest_ies_constraint_1,
+		&asn_PER_memb_enhancedRelocationCompleteRequest_ies_constr_2,
+		0,
+		"enhancedRelocationCompleteRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_EnhancedRelocationCompleteRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* enhancedRelocationCompleteRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_EnhancedRelocationCompleteRequest_specs_1 = {
+	sizeof(struct RANAP_EnhancedRelocationCompleteRequest),
+	offsetof(struct RANAP_EnhancedRelocationCompleteRequest, _asn_ctx),
+	asn_MAP_RANAP_EnhancedRelocationCompleteRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteRequest = {
+	"RANAP_EnhancedRelocationCompleteRequest",
+	"RANAP_EnhancedRelocationCompleteRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1,
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_EnhancedRelocationCompleteRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_EnhancedRelocationCompleteRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteRequest.h b/src/ranap/RANAP_EnhancedRelocationCompleteRequest.h
new file mode 100644
index 0000000..ba398bf
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_EnhancedRelocationCompleteRequest_H_
+#define	_RANAP_EnhancedRelocationCompleteRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EnhancedRelocationCompleteRequest */
+typedef struct RANAP_EnhancedRelocationCompleteRequest {
+	struct enhancedRelocationCompleteRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} enhancedRelocationCompleteRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EnhancedRelocationCompleteRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EnhancedRelocationCompleteRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteResponse.c b/src/ranap/RANAP_EnhancedRelocationCompleteResponse.c
new file mode 100644
index 0000000..6d5e63b
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_EnhancedRelocationCompleteResponse.h"
+
+static int
+memb_enhancedRelocationCompleteResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_enhancedRelocationCompleteResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_enhancedRelocationCompleteResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_enhancedRelocationCompleteResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_enhancedRelocationCompleteResponse_ies_specs_2 = {
+	sizeof(struct enhancedRelocationCompleteResponse_ies),
+	offsetof(struct enhancedRelocationCompleteResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_enhancedRelocationCompleteResponse_ies_2 = {
+	"enhancedRelocationCompleteResponse-ies",
+	"enhancedRelocationCompleteResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2,
+	sizeof(asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2)
+		/sizeof(asn_DEF_enhancedRelocationCompleteResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_enhancedRelocationCompleteResponse_ies_constr_2,
+	asn_MBR_enhancedRelocationCompleteResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_enhancedRelocationCompleteResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_EnhancedRelocationCompleteResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EnhancedRelocationCompleteResponse, enhancedRelocationCompleteResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_enhancedRelocationCompleteResponse_ies_2,
+		memb_enhancedRelocationCompleteResponse_ies_constraint_1,
+		&asn_PER_memb_enhancedRelocationCompleteResponse_ies_constr_2,
+		0,
+		"enhancedRelocationCompleteResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_EnhancedRelocationCompleteResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* enhancedRelocationCompleteResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_EnhancedRelocationCompleteResponse_specs_1 = {
+	sizeof(struct RANAP_EnhancedRelocationCompleteResponse),
+	offsetof(struct RANAP_EnhancedRelocationCompleteResponse, _asn_ctx),
+	asn_MAP_RANAP_EnhancedRelocationCompleteResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteResponse = {
+	"RANAP_EnhancedRelocationCompleteResponse",
+	"RANAP_EnhancedRelocationCompleteResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1,
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_EnhancedRelocationCompleteResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_EnhancedRelocationCompleteResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_EnhancedRelocationCompleteResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EnhancedRelocationCompleteResponse.h b/src/ranap/RANAP_EnhancedRelocationCompleteResponse.h
new file mode 100644
index 0000000..7691d79
--- /dev/null
+++ b/src/ranap/RANAP_EnhancedRelocationCompleteResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_EnhancedRelocationCompleteResponse_H_
+#define	_RANAP_EnhancedRelocationCompleteResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_EnhancedRelocationCompleteResponse */
+typedef struct RANAP_EnhancedRelocationCompleteResponse {
+	struct enhancedRelocationCompleteResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} enhancedRelocationCompleteResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EnhancedRelocationCompleteResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EnhancedRelocationCompleteResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EnhancedRelocationCompleteResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_EquipmentsToBeTraced.c b/src/ranap/RANAP_EquipmentsToBeTraced.c
new file mode 100644
index 0000000..c22da5d
--- /dev/null
+++ b/src/ranap/RANAP_EquipmentsToBeTraced.c
@@ -0,0 +1,92 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_EquipmentsToBeTraced.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_EquipmentsToBeTraced_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_EquipmentsToBeTraced_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EquipmentsToBeTraced, choice.iMEIlist),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEIList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMEIlist"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EquipmentsToBeTraced, choice.iMEISVlist),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEISVList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMEISVlist"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EquipmentsToBeTraced, choice.iMEIgroup),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEIGroup,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMEIgroup"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_EquipmentsToBeTraced, choice.iMEISVgroup),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEISVGroup,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMEISVgroup"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_EquipmentsToBeTraced_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iMEIlist */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iMEISVlist */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* iMEIgroup */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iMEISVgroup */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_EquipmentsToBeTraced_specs_1 = {
+	sizeof(struct RANAP_EquipmentsToBeTraced),
+	offsetof(struct RANAP_EquipmentsToBeTraced, _asn_ctx),
+	offsetof(struct RANAP_EquipmentsToBeTraced, present),
+	sizeof(((struct RANAP_EquipmentsToBeTraced *)0)->present),
+	asn_MAP_RANAP_EquipmentsToBeTraced_tag2el_1,
+	4,	/* Count of tags in the map */
+	0,
+	4	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_EquipmentsToBeTraced = {
+	"RANAP_EquipmentsToBeTraced",
+	"RANAP_EquipmentsToBeTraced",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_EquipmentsToBeTraced_constr_1,
+	asn_MBR_RANAP_EquipmentsToBeTraced_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_EquipmentsToBeTraced_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_EquipmentsToBeTraced.h b/src/ranap/RANAP_EquipmentsToBeTraced.h
new file mode 100644
index 0000000..01478db
--- /dev/null
+++ b/src/ranap/RANAP_EquipmentsToBeTraced.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_EquipmentsToBeTraced_H_
+#define	_RANAP_EquipmentsToBeTraced_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMEIList.h"
+#include "RANAP_IMEISVList.h"
+#include "RANAP_IMEIGroup.h"
+#include "RANAP_IMEISVGroup.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_EquipmentsToBeTraced_PR {
+	RANAP_EquipmentsToBeTraced_PR_NOTHING,	/* No components present */
+	RANAP_EquipmentsToBeTraced_PR_iMEIlist,
+	RANAP_EquipmentsToBeTraced_PR_iMEISVlist,
+	RANAP_EquipmentsToBeTraced_PR_iMEIgroup,
+	RANAP_EquipmentsToBeTraced_PR_iMEISVgroup,
+	/* Extensions may appear below */
+	
+} RANAP_EquipmentsToBeTraced_PR;
+
+/* RANAP_EquipmentsToBeTraced */
+typedef struct RANAP_EquipmentsToBeTraced {
+	RANAP_EquipmentsToBeTraced_PR present;
+	union RANAP_EquipmentsToBeTraced_u {
+		RANAP_IMEIList_t	 iMEIlist;
+		RANAP_IMEISVList_t	 iMEISVlist;
+		RANAP_IMEIGroup_t	 iMEIgroup;
+		RANAP_IMEISVGroup_t	 iMEISVgroup;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_EquipmentsToBeTraced_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_EquipmentsToBeTraced;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_EquipmentsToBeTraced_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ErrorIndication.c b/src/ranap/RANAP_ErrorIndication.c
new file mode 100644
index 0000000..6cc3fbe
--- /dev/null
+++ b/src/ranap/RANAP_ErrorIndication.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_ErrorIndication.h"
+
+static int
+memb_errorIndication_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_errorIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_errorIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_errorIndication_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_errorIndication_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_errorIndication_ies_specs_2 = {
+	sizeof(struct errorIndication_ies),
+	offsetof(struct errorIndication_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_errorIndication_ies_2 = {
+	"errorIndication-ies",
+	"errorIndication-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_errorIndication_ies_tags_2,
+	sizeof(asn_DEF_errorIndication_ies_tags_2)
+		/sizeof(asn_DEF_errorIndication_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_errorIndication_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_errorIndication_ies_tags_2)
+		/sizeof(asn_DEF_errorIndication_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_errorIndication_ies_constr_2,
+	asn_MBR_errorIndication_ies_2,
+	1,	/* Single element */
+	&asn_SPC_errorIndication_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_ErrorIndication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ErrorIndication, errorIndication_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_errorIndication_ies_2,
+		memb_errorIndication_ies_constraint_1,
+		&asn_PER_memb_errorIndication_ies_constr_2,
+		0,
+		"errorIndication-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ErrorIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ErrorIndication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* errorIndication-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ErrorIndication_specs_1 = {
+	sizeof(struct RANAP_ErrorIndication),
+	offsetof(struct RANAP_ErrorIndication, _asn_ctx),
+	asn_MAP_RANAP_ErrorIndication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ErrorIndication = {
+	"RANAP_ErrorIndication",
+	"RANAP_ErrorIndication",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ErrorIndication_tags_1,
+	sizeof(asn_DEF_RANAP_ErrorIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_ErrorIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ErrorIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ErrorIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_ErrorIndication_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ErrorIndication_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_ErrorIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ErrorIndication.h b/src/ranap/RANAP_ErrorIndication.h
new file mode 100644
index 0000000..ea84d58
--- /dev/null
+++ b/src/ranap/RANAP_ErrorIndication.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_ErrorIndication_H_
+#define	_RANAP_ErrorIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ErrorIndication */
+typedef struct RANAP_ErrorIndication {
+	struct errorIndication_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} errorIndication_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ErrorIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ErrorIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ErrorIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Event.c b/src/ranap/RANAP_Event.c
new file mode 100644
index 0000000..17b6fcf
--- /dev/null
+++ b/src/ranap/RANAP_Event.c
@@ -0,0 +1,175 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Event.h"
+
+int
+RANAP_Event_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Event_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Event_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Event_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Event_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Event_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Event_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Event_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Event_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Event_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Event_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Event_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Event_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Event_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Event_value2enum_1[] = {
+	{ 0,	27,	"stop-change-of-service-area" },
+	{ 1,	6,	"direct" },
+	{ 2,	21,	"change-of-servicearea" },
+	{ 3,	11,	"stop-direct" },
+	{ 4,	8,	"periodic" },
+	{ 5,	13,	"stop-periodic" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Event_enum2value_1[] = {
+	2,	/* change-of-servicearea(2) */
+	1,	/* direct(1) */
+	4,	/* periodic(4) */
+	0,	/* stop-change-of-service-area(0) */
+	3,	/* stop-direct(3) */
+	5	/* stop-periodic(5) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Event_specs_1 = {
+	asn_MAP_RANAP_Event_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Event_enum2value_1,	/* N => "tag"; sorted by N */
+	6,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Event_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Event = {
+	"RANAP_Event",
+	"RANAP_Event",
+	RANAP_Event_free,
+	RANAP_Event_print,
+	RANAP_Event_constraint,
+	RANAP_Event_decode_ber,
+	RANAP_Event_encode_der,
+	RANAP_Event_decode_xer,
+	RANAP_Event_encode_xer,
+	RANAP_Event_decode_uper,
+	RANAP_Event_encode_uper,
+	RANAP_Event_decode_aper,
+	RANAP_Event_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Event_tags_1,
+	sizeof(asn_DEF_RANAP_Event_tags_1)
+		/sizeof(asn_DEF_RANAP_Event_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Event_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Event_tags_1)
+		/sizeof(asn_DEF_RANAP_Event_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Event_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Event_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Event.h b/src/ranap/RANAP_Event.h
new file mode 100644
index 0000000..a3a0e67
--- /dev/null
+++ b/src/ranap/RANAP_Event.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Event_H_
+#define	_RANAP_Event_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Event {
+	RANAP_Event_stop_change_of_service_area	= 0,
+	RANAP_Event_direct	= 1,
+	RANAP_Event_change_of_servicearea	= 2,
+	/*
+	 * Enumeration is extensible
+	 */
+	RANAP_Event_stop_direct	= 3,
+	RANAP_Event_periodic	= 4,
+	RANAP_Event_stop_periodic	= 5
+} e_RANAP_Event;
+
+/* RANAP_Event */
+typedef long	 RANAP_Event_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Event;
+asn_struct_free_f RANAP_Event_free;
+asn_struct_print_f RANAP_Event_print;
+asn_constr_check_f RANAP_Event_constraint;
+ber_type_decoder_f RANAP_Event_decode_ber;
+der_type_encoder_f RANAP_Event_encode_der;
+xer_type_decoder_f RANAP_Event_decode_xer;
+xer_type_encoder_f RANAP_Event_encode_xer;
+per_type_decoder_f RANAP_Event_decode_uper;
+per_type_encoder_f RANAP_Event_encode_uper;
+per_type_decoder_f RANAP_Event_decode_aper;
+per_type_encoder_f RANAP_Event_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Event_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Event1F-Parameters.c b/src/ranap/RANAP_Event1F-Parameters.c
new file mode 100644
index 0000000..4340aa8
--- /dev/null
+++ b/src/ranap/RANAP_Event1F-Parameters.c
@@ -0,0 +1,101 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Event1F-Parameters.h"
+
+static int
+memb_threshold_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= -120ull && value <= 165l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_threshold_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 9,  9, -120ull,  165l }	/* (-120..165) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Event1F_Parameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Event1F_Parameters, measurementQuantity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MeasurementQuantity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"measurementQuantity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Event1F_Parameters, threshold),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_threshold_constraint_1,
+		&asn_PER_memb_threshold_constr_3,
+		0,
+		"threshold"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Event1F_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Event1F_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* measurementQuantity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* threshold */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Event1F_Parameters_specs_1 = {
+	sizeof(struct RANAP_Event1F_Parameters),
+	offsetof(struct RANAP_Event1F_Parameters, _asn_ctx),
+	asn_MAP_RANAP_Event1F_Parameters_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Event1F_Parameters = {
+	"RANAP_Event1F-Parameters",
+	"RANAP_Event1F-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Event1F_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_Event1F_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Event1F_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Event1F_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Event1F_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Event1F_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Event1F_Parameters_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_Event1F_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Event1F-Parameters.h b/src/ranap/RANAP_Event1F-Parameters.h
new file mode 100644
index 0000000..6fc7309
--- /dev/null
+++ b/src/ranap/RANAP_Event1F-Parameters.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Event1F_Parameters_H_
+#define	_RANAP_Event1F_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MeasurementQuantity.h"
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Event1F-Parameters */
+typedef struct RANAP_Event1F_Parameters {
+	RANAP_MeasurementQuantity_t	 measurementQuantity;
+	long	 threshold;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Event1F_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Event1F_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Event1F_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Event1I-Parameters.c b/src/ranap/RANAP_Event1I-Parameters.c
new file mode 100644
index 0000000..16230dd
--- /dev/null
+++ b/src/ranap/RANAP_Event1I-Parameters.c
@@ -0,0 +1,91 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Event1I-Parameters.h"
+
+static int
+memb_threshold_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= -120ull && value <= -25ull)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_threshold_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7, -120ull, -25ull }	/* (-120..-25) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Event1I_Parameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Event1I_Parameters, threshold),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_threshold_constraint_1,
+		&asn_PER_memb_threshold_constr_2,
+		0,
+		"threshold"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Event1I_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Event1I_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* threshold */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Event1I_Parameters_specs_1 = {
+	sizeof(struct RANAP_Event1I_Parameters),
+	offsetof(struct RANAP_Event1I_Parameters, _asn_ctx),
+	asn_MAP_RANAP_Event1I_Parameters_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Event1I_Parameters = {
+	"RANAP_Event1I-Parameters",
+	"RANAP_Event1I-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Event1I_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_Event1I_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Event1I_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Event1I_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Event1I_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Event1I_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Event1I_Parameters_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Event1I_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Event1I-Parameters.h b/src/ranap/RANAP_Event1I-Parameters.h
new file mode 100644
index 0000000..ded464f
--- /dev/null
+++ b/src/ranap/RANAP_Event1I-Parameters.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Event1I_Parameters_H_
+#define	_RANAP_Event1I_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Event1I-Parameters */
+typedef struct RANAP_Event1I_Parameters {
+	long	 threshold;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Event1I_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Event1I_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Event1I_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ExtendedGuaranteedBitrate.c b/src/ranap/RANAP_ExtendedGuaranteedBitrate.c
new file mode 100644
index 0000000..0630086
--- /dev/null
+++ b/src/ranap/RANAP_ExtendedGuaranteedBitrate.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ExtendedGuaranteedBitrate.h"
+
+int
+RANAP_ExtendedGuaranteedBitrate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 16000001l && value <= 256000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_ExtendedGuaranteedBitrate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ExtendedGuaranteedBitrate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedGuaranteedBitrate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedGuaranteedBitrate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedGuaranteedBitrate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedGuaranteedBitrate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedGuaranteedBitrate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedGuaranteedBitrate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedGuaranteedBitrate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedGuaranteedBitrate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ExtendedGuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ExtendedGuaranteedBitrate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 28, -1,  16000001l,  256000000l }	/* (16000001..256000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ExtendedGuaranteedBitrate = {
+	"RANAP_ExtendedGuaranteedBitrate",
+	"RANAP_ExtendedGuaranteedBitrate",
+	RANAP_ExtendedGuaranteedBitrate_free,
+	RANAP_ExtendedGuaranteedBitrate_print,
+	RANAP_ExtendedGuaranteedBitrate_constraint,
+	RANAP_ExtendedGuaranteedBitrate_decode_ber,
+	RANAP_ExtendedGuaranteedBitrate_encode_der,
+	RANAP_ExtendedGuaranteedBitrate_decode_xer,
+	RANAP_ExtendedGuaranteedBitrate_encode_xer,
+	RANAP_ExtendedGuaranteedBitrate_decode_uper,
+	RANAP_ExtendedGuaranteedBitrate_encode_uper,
+	RANAP_ExtendedGuaranteedBitrate_decode_aper,
+	RANAP_ExtendedGuaranteedBitrate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1,
+	sizeof(asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_ExtendedGuaranteedBitrate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ExtendedGuaranteedBitrate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ExtendedGuaranteedBitrate.h b/src/ranap/RANAP_ExtendedGuaranteedBitrate.h
new file mode 100644
index 0000000..404cecb
--- /dev/null
+++ b/src/ranap/RANAP_ExtendedGuaranteedBitrate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ExtendedGuaranteedBitrate_H_
+#define	_RANAP_ExtendedGuaranteedBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ExtendedGuaranteedBitrate */
+typedef long	 RANAP_ExtendedGuaranteedBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ExtendedGuaranteedBitrate;
+asn_struct_free_f RANAP_ExtendedGuaranteedBitrate_free;
+asn_struct_print_f RANAP_ExtendedGuaranteedBitrate_print;
+asn_constr_check_f RANAP_ExtendedGuaranteedBitrate_constraint;
+ber_type_decoder_f RANAP_ExtendedGuaranteedBitrate_decode_ber;
+der_type_encoder_f RANAP_ExtendedGuaranteedBitrate_encode_der;
+xer_type_decoder_f RANAP_ExtendedGuaranteedBitrate_decode_xer;
+xer_type_encoder_f RANAP_ExtendedGuaranteedBitrate_encode_xer;
+per_type_decoder_f RANAP_ExtendedGuaranteedBitrate_decode_uper;
+per_type_encoder_f RANAP_ExtendedGuaranteedBitrate_encode_uper;
+per_type_decoder_f RANAP_ExtendedGuaranteedBitrate_decode_aper;
+per_type_encoder_f RANAP_ExtendedGuaranteedBitrate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ExtendedGuaranteedBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ExtendedMaxBitrate.c b/src/ranap/RANAP_ExtendedMaxBitrate.c
new file mode 100644
index 0000000..3c2532d
--- /dev/null
+++ b/src/ranap/RANAP_ExtendedMaxBitrate.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ExtendedMaxBitrate.h"
+
+int
+RANAP_ExtendedMaxBitrate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 16000001l && value <= 256000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_ExtendedMaxBitrate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ExtendedMaxBitrate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedMaxBitrate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedMaxBitrate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedMaxBitrate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedMaxBitrate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedMaxBitrate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedMaxBitrate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedMaxBitrate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedMaxBitrate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ExtendedMaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ExtendedMaxBitrate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 28, -1,  16000001l,  256000000l }	/* (16000001..256000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ExtendedMaxBitrate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ExtendedMaxBitrate = {
+	"RANAP_ExtendedMaxBitrate",
+	"RANAP_ExtendedMaxBitrate",
+	RANAP_ExtendedMaxBitrate_free,
+	RANAP_ExtendedMaxBitrate_print,
+	RANAP_ExtendedMaxBitrate_constraint,
+	RANAP_ExtendedMaxBitrate_decode_ber,
+	RANAP_ExtendedMaxBitrate_encode_der,
+	RANAP_ExtendedMaxBitrate_decode_xer,
+	RANAP_ExtendedMaxBitrate_encode_xer,
+	RANAP_ExtendedMaxBitrate_decode_uper,
+	RANAP_ExtendedMaxBitrate_encode_uper,
+	RANAP_ExtendedMaxBitrate_decode_aper,
+	RANAP_ExtendedMaxBitrate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ExtendedMaxBitrate_tags_1,
+	sizeof(asn_DEF_RANAP_ExtendedMaxBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_ExtendedMaxBitrate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ExtendedMaxBitrate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ExtendedMaxBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_ExtendedMaxBitrate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ExtendedMaxBitrate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ExtendedMaxBitrate.h b/src/ranap/RANAP_ExtendedMaxBitrate.h
new file mode 100644
index 0000000..07af50d
--- /dev/null
+++ b/src/ranap/RANAP_ExtendedMaxBitrate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ExtendedMaxBitrate_H_
+#define	_RANAP_ExtendedMaxBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ExtendedMaxBitrate */
+typedef long	 RANAP_ExtendedMaxBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ExtendedMaxBitrate;
+asn_struct_free_f RANAP_ExtendedMaxBitrate_free;
+asn_struct_print_f RANAP_ExtendedMaxBitrate_print;
+asn_constr_check_f RANAP_ExtendedMaxBitrate_constraint;
+ber_type_decoder_f RANAP_ExtendedMaxBitrate_decode_ber;
+der_type_encoder_f RANAP_ExtendedMaxBitrate_encode_der;
+xer_type_decoder_f RANAP_ExtendedMaxBitrate_decode_xer;
+xer_type_encoder_f RANAP_ExtendedMaxBitrate_encode_xer;
+per_type_decoder_f RANAP_ExtendedMaxBitrate_decode_uper;
+per_type_encoder_f RANAP_ExtendedMaxBitrate_encode_uper;
+per_type_decoder_f RANAP_ExtendedMaxBitrate_decode_aper;
+per_type_encoder_f RANAP_ExtendedMaxBitrate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ExtendedMaxBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ExtendedRNC-ID.c b/src/ranap/RANAP_ExtendedRNC-ID.c
new file mode 100644
index 0000000..4e56247
--- /dev/null
+++ b/src/ranap/RANAP_ExtendedRNC-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ExtendedRNC-ID.h"
+
+int
+RANAP_ExtendedRNC_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 4096l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_ExtendedRNC_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ExtendedRNC_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedRNC_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedRNC_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedRNC_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedRNC_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedRNC_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedRNC_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ExtendedRNC_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ExtendedRNC_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ExtendedRNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ExtendedRNC_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  4096l,  65535l }	/* (4096..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ExtendedRNC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ExtendedRNC_ID = {
+	"RANAP_ExtendedRNC-ID",
+	"RANAP_ExtendedRNC-ID",
+	RANAP_ExtendedRNC_ID_free,
+	RANAP_ExtendedRNC_ID_print,
+	RANAP_ExtendedRNC_ID_constraint,
+	RANAP_ExtendedRNC_ID_decode_ber,
+	RANAP_ExtendedRNC_ID_encode_der,
+	RANAP_ExtendedRNC_ID_decode_xer,
+	RANAP_ExtendedRNC_ID_encode_xer,
+	RANAP_ExtendedRNC_ID_decode_uper,
+	RANAP_ExtendedRNC_ID_encode_uper,
+	RANAP_ExtendedRNC_ID_decode_aper,
+	RANAP_ExtendedRNC_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ExtendedRNC_ID_tags_1,
+	sizeof(asn_DEF_RANAP_ExtendedRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_ExtendedRNC_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ExtendedRNC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ExtendedRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_ExtendedRNC_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ExtendedRNC_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ExtendedRNC-ID.h b/src/ranap/RANAP_ExtendedRNC-ID.h
new file mode 100644
index 0000000..c76a124
--- /dev/null
+++ b/src/ranap/RANAP_ExtendedRNC-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ExtendedRNC_ID_H_
+#define	_RANAP_ExtendedRNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ExtendedRNC-ID */
+typedef long	 RANAP_ExtendedRNC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ExtendedRNC_ID;
+asn_struct_free_f RANAP_ExtendedRNC_ID_free;
+asn_struct_print_f RANAP_ExtendedRNC_ID_print;
+asn_constr_check_f RANAP_ExtendedRNC_ID_constraint;
+ber_type_decoder_f RANAP_ExtendedRNC_ID_decode_ber;
+der_type_encoder_f RANAP_ExtendedRNC_ID_encode_der;
+xer_type_decoder_f RANAP_ExtendedRNC_ID_decode_xer;
+xer_type_encoder_f RANAP_ExtendedRNC_ID_encode_xer;
+per_type_decoder_f RANAP_ExtendedRNC_ID_decode_uper;
+per_type_encoder_f RANAP_ExtendedRNC_ID_encode_uper;
+per_type_decoder_f RANAP_ExtendedRNC_ID_decode_aper;
+per_type_encoder_f RANAP_ExtendedRNC_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ExtendedRNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ForwardSRNS-Context.c b/src/ranap/RANAP_ForwardSRNS-Context.c
new file mode 100644
index 0000000..3948c53
--- /dev/null
+++ b/src/ranap/RANAP_ForwardSRNS-Context.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_ForwardSRNS-Context.h"
+
+static int
+memb_forwardSRNS_Context_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_forwardSRNS_Context_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_forwardSRNS_Context_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_forwardSRNS_Context_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_forwardSRNS_Context_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_forwardSRNS_Context_ies_specs_2 = {
+	sizeof(struct forwardSRNS_Context_ies),
+	offsetof(struct forwardSRNS_Context_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_forwardSRNS_Context_ies_2 = {
+	"forwardSRNS-Context-ies",
+	"forwardSRNS-Context-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_forwardSRNS_Context_ies_tags_2,
+	sizeof(asn_DEF_forwardSRNS_Context_ies_tags_2)
+		/sizeof(asn_DEF_forwardSRNS_Context_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_forwardSRNS_Context_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_forwardSRNS_Context_ies_tags_2)
+		/sizeof(asn_DEF_forwardSRNS_Context_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_forwardSRNS_Context_ies_constr_2,
+	asn_MBR_forwardSRNS_Context_ies_2,
+	1,	/* Single element */
+	&asn_SPC_forwardSRNS_Context_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_ForwardSRNS_Context_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ForwardSRNS_Context, forwardSRNS_Context_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_forwardSRNS_Context_ies_2,
+		memb_forwardSRNS_Context_ies_constraint_1,
+		&asn_PER_memb_forwardSRNS_Context_ies_constr_2,
+		0,
+		"forwardSRNS-Context-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ForwardSRNS_Context_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ForwardSRNS_Context_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* forwardSRNS-Context-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ForwardSRNS_Context_specs_1 = {
+	sizeof(struct RANAP_ForwardSRNS_Context),
+	offsetof(struct RANAP_ForwardSRNS_Context, _asn_ctx),
+	asn_MAP_RANAP_ForwardSRNS_Context_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ForwardSRNS_Context = {
+	"RANAP_ForwardSRNS-Context",
+	"RANAP_ForwardSRNS-Context",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ForwardSRNS_Context_tags_1,
+	sizeof(asn_DEF_RANAP_ForwardSRNS_Context_tags_1)
+		/sizeof(asn_DEF_RANAP_ForwardSRNS_Context_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ForwardSRNS_Context_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ForwardSRNS_Context_tags_1)
+		/sizeof(asn_DEF_RANAP_ForwardSRNS_Context_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ForwardSRNS_Context_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_ForwardSRNS_Context_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ForwardSRNS-Context.h b/src/ranap/RANAP_ForwardSRNS-Context.h
new file mode 100644
index 0000000..1d78583
--- /dev/null
+++ b/src/ranap/RANAP_ForwardSRNS-Context.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_ForwardSRNS_Context_H_
+#define	_RANAP_ForwardSRNS_Context_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ForwardSRNS-Context */
+typedef struct RANAP_ForwardSRNS_Context {
+	struct forwardSRNS_Context_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} forwardSRNS_Context_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ForwardSRNS_Context_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ForwardSRNS_Context;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ForwardSRNS_Context_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ForwardingIndication.c b/src/ranap/RANAP_ForwardingIndication.c
new file mode 100644
index 0000000..69a3c47
--- /dev/null
+++ b/src/ranap/RANAP_ForwardingIndication.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ForwardingIndication.h"
+
+int
+RANAP_ForwardingIndication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ForwardingIndication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ForwardingIndication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ForwardingIndication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ForwardingIndication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ForwardingIndication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ForwardingIndication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ForwardingIndication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ForwardingIndication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ForwardingIndication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ForwardingIndication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ForwardingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ForwardingIndication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ForwardingIndication_value2enum_1[] = {
+	{ 0,	19,	"forwarding-admitted" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ForwardingIndication_enum2value_1[] = {
+	0	/* forwarding-admitted(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ForwardingIndication_specs_1 = {
+	asn_MAP_RANAP_ForwardingIndication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ForwardingIndication_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ForwardingIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ForwardingIndication = {
+	"RANAP_ForwardingIndication",
+	"RANAP_ForwardingIndication",
+	RANAP_ForwardingIndication_free,
+	RANAP_ForwardingIndication_print,
+	RANAP_ForwardingIndication_constraint,
+	RANAP_ForwardingIndication_decode_ber,
+	RANAP_ForwardingIndication_encode_der,
+	RANAP_ForwardingIndication_decode_xer,
+	RANAP_ForwardingIndication_encode_xer,
+	RANAP_ForwardingIndication_decode_uper,
+	RANAP_ForwardingIndication_encode_uper,
+	RANAP_ForwardingIndication_decode_aper,
+	RANAP_ForwardingIndication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ForwardingIndication_tags_1,
+	sizeof(asn_DEF_RANAP_ForwardingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_ForwardingIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ForwardingIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ForwardingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_ForwardingIndication_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ForwardingIndication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ForwardingIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ForwardingIndication.h b/src/ranap/RANAP_ForwardingIndication.h
new file mode 100644
index 0000000..ee4481c
--- /dev/null
+++ b/src/ranap/RANAP_ForwardingIndication.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ForwardingIndication_H_
+#define	_RANAP_ForwardingIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ForwardingIndication {
+	RANAP_ForwardingIndication_forwarding_admitted	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_ForwardingIndication;
+
+/* RANAP_ForwardingIndication */
+typedef long	 RANAP_ForwardingIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ForwardingIndication;
+asn_struct_free_f RANAP_ForwardingIndication_free;
+asn_struct_print_f RANAP_ForwardingIndication_print;
+asn_constr_check_f RANAP_ForwardingIndication_constraint;
+ber_type_decoder_f RANAP_ForwardingIndication_decode_ber;
+der_type_encoder_f RANAP_ForwardingIndication_encode_der;
+xer_type_decoder_f RANAP_ForwardingIndication_decode_xer;
+xer_type_encoder_f RANAP_ForwardingIndication_encode_xer;
+per_type_decoder_f RANAP_ForwardingIndication_decode_uper;
+per_type_encoder_f RANAP_ForwardingIndication_encode_uper;
+per_type_decoder_f RANAP_ForwardingIndication_decode_aper;
+per_type_encoder_f RANAP_ForwardingIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ForwardingIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_FrameSequenceNumber.c b/src/ranap/RANAP_FrameSequenceNumber.c
new file mode 100644
index 0000000..b4a4858
--- /dev/null
+++ b/src/ranap/RANAP_FrameSequenceNumber.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_FrameSequenceNumber.h"
+
+int
+RANAP_FrameSequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 15l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_FrameSequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_FrameSequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_FrameSequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_FrameSequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_FrameSequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_FrameSequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_FrameSequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_FrameSequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_FrameSequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_FrameSequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_FrameSequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  0l,  15l }	/* (0..15) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_FrameSequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_FrameSequenceNumber = {
+	"RANAP_FrameSequenceNumber",
+	"RANAP_FrameSequenceNumber",
+	RANAP_FrameSequenceNumber_free,
+	RANAP_FrameSequenceNumber_print,
+	RANAP_FrameSequenceNumber_constraint,
+	RANAP_FrameSequenceNumber_decode_ber,
+	RANAP_FrameSequenceNumber_encode_der,
+	RANAP_FrameSequenceNumber_decode_xer,
+	RANAP_FrameSequenceNumber_encode_xer,
+	RANAP_FrameSequenceNumber_decode_uper,
+	RANAP_FrameSequenceNumber_encode_uper,
+	RANAP_FrameSequenceNumber_decode_aper,
+	RANAP_FrameSequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_FrameSequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_FrameSequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_FrameSequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_FrameSequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_FrameSequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_FrameSequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_FrameSequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_FrameSequenceNumber.h b/src/ranap/RANAP_FrameSequenceNumber.h
new file mode 100644
index 0000000..0c2d9e2
--- /dev/null
+++ b/src/ranap/RANAP_FrameSequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_FrameSequenceNumber_H_
+#define	_RANAP_FrameSequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_FrameSequenceNumber */
+typedef long	 RANAP_FrameSequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_FrameSequenceNumber;
+asn_struct_free_f RANAP_FrameSequenceNumber_free;
+asn_struct_print_f RANAP_FrameSequenceNumber_print;
+asn_constr_check_f RANAP_FrameSequenceNumber_constraint;
+ber_type_decoder_f RANAP_FrameSequenceNumber_decode_ber;
+der_type_encoder_f RANAP_FrameSequenceNumber_encode_der;
+xer_type_decoder_f RANAP_FrameSequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_FrameSequenceNumber_encode_xer;
+per_type_decoder_f RANAP_FrameSequenceNumber_decode_uper;
+per_type_encoder_f RANAP_FrameSequenceNumber_encode_uper;
+per_type_decoder_f RANAP_FrameSequenceNumber_decode_aper;
+per_type_encoder_f RANAP_FrameSequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_FrameSequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_FrequenceLayerConvergenceFlag.c b/src/ranap/RANAP_FrequenceLayerConvergenceFlag.c
new file mode 100644
index 0000000..539554c
--- /dev/null
+++ b/src/ranap/RANAP_FrequenceLayerConvergenceFlag.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_FrequenceLayerConvergenceFlag.h"
+
+int
+RANAP_FrequenceLayerConvergenceFlag_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_FrequenceLayerConvergenceFlag_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_FrequenceLayerConvergenceFlag_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_FrequenceLayerConvergenceFlag_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_FrequenceLayerConvergenceFlag_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_FrequenceLayerConvergenceFlag_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_FrequenceLayerConvergenceFlag_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_FrequenceLayerConvergenceFlag_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_FrequenceLayerConvergenceFlag_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_FrequenceLayerConvergenceFlag_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_FrequenceLayerConvergenceFlag_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_FrequenceLayerConvergenceFlag_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_FrequenceLayerConvergenceFlag_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_FrequenceLayerConvergenceFlag_value2enum_1[] = {
+	{ 0,	11,	"no-FLC-flag" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_FrequenceLayerConvergenceFlag_enum2value_1[] = {
+	0	/* no-FLC-flag(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_FrequenceLayerConvergenceFlag_specs_1 = {
+	asn_MAP_RANAP_FrequenceLayerConvergenceFlag_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_FrequenceLayerConvergenceFlag_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_FrequenceLayerConvergenceFlag = {
+	"RANAP_FrequenceLayerConvergenceFlag",
+	"RANAP_FrequenceLayerConvergenceFlag",
+	RANAP_FrequenceLayerConvergenceFlag_free,
+	RANAP_FrequenceLayerConvergenceFlag_print,
+	RANAP_FrequenceLayerConvergenceFlag_constraint,
+	RANAP_FrequenceLayerConvergenceFlag_decode_ber,
+	RANAP_FrequenceLayerConvergenceFlag_encode_der,
+	RANAP_FrequenceLayerConvergenceFlag_decode_xer,
+	RANAP_FrequenceLayerConvergenceFlag_encode_xer,
+	RANAP_FrequenceLayerConvergenceFlag_decode_uper,
+	RANAP_FrequenceLayerConvergenceFlag_encode_uper,
+	RANAP_FrequenceLayerConvergenceFlag_decode_aper,
+	RANAP_FrequenceLayerConvergenceFlag_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1,
+	sizeof(asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1)
+		/sizeof(asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1)
+		/sizeof(asn_DEF_RANAP_FrequenceLayerConvergenceFlag_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_FrequenceLayerConvergenceFlag_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_FrequenceLayerConvergenceFlag_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_FrequenceLayerConvergenceFlag.h b/src/ranap/RANAP_FrequenceLayerConvergenceFlag.h
new file mode 100644
index 0000000..df2eaf5
--- /dev/null
+++ b/src/ranap/RANAP_FrequenceLayerConvergenceFlag.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_FrequenceLayerConvergenceFlag_H_
+#define	_RANAP_FrequenceLayerConvergenceFlag_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_FrequenceLayerConvergenceFlag {
+	RANAP_FrequenceLayerConvergenceFlag_no_FLC_flag	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_FrequenceLayerConvergenceFlag;
+
+/* RANAP_FrequenceLayerConvergenceFlag */
+typedef long	 RANAP_FrequenceLayerConvergenceFlag_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_FrequenceLayerConvergenceFlag;
+asn_struct_free_f RANAP_FrequenceLayerConvergenceFlag_free;
+asn_struct_print_f RANAP_FrequenceLayerConvergenceFlag_print;
+asn_constr_check_f RANAP_FrequenceLayerConvergenceFlag_constraint;
+ber_type_decoder_f RANAP_FrequenceLayerConvergenceFlag_decode_ber;
+der_type_encoder_f RANAP_FrequenceLayerConvergenceFlag_encode_der;
+xer_type_decoder_f RANAP_FrequenceLayerConvergenceFlag_decode_xer;
+xer_type_encoder_f RANAP_FrequenceLayerConvergenceFlag_encode_xer;
+per_type_decoder_f RANAP_FrequenceLayerConvergenceFlag_decode_uper;
+per_type_encoder_f RANAP_FrequenceLayerConvergenceFlag_encode_uper;
+per_type_decoder_f RANAP_FrequenceLayerConvergenceFlag_decode_aper;
+per_type_encoder_f RANAP_FrequenceLayerConvergenceFlag_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_FrequenceLayerConvergenceFlag_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-AltitudeAndDirection.c b/src/ranap/RANAP_GA-AltitudeAndDirection.c
new file mode 100644
index 0000000..a656e03
--- /dev/null
+++ b/src/ranap/RANAP_GA-AltitudeAndDirection.c
@@ -0,0 +1,260 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-AltitudeAndDirection.h"
+
+static int
+directionOfAltitude_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+directionOfAltitude_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+static void
+directionOfAltitude_2_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+static int
+directionOfAltitude_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+static asn_dec_rval_t
+directionOfAltitude_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+static asn_enc_rval_t
+directionOfAltitude_2_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+static asn_dec_rval_t
+directionOfAltitude_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+static asn_enc_rval_t
+directionOfAltitude_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+static asn_dec_rval_t
+directionOfAltitude_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_enc_rval_t
+directionOfAltitude_2_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_enc_rval_t
+directionOfAltitude_2_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_dec_rval_t
+directionOfAltitude_2_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	directionOfAltitude_2_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static int
+memb_altitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 32767l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_directionOfAltitude_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_altitude_constr_5 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 15,  15,  0l,  32767l }	/* (0..32767) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_directionOfAltitude_value2enum_2[] = {
+	{ 0,	6,	"height" },
+	{ 1,	5,	"depth" }
+};
+static const unsigned int asn_MAP_directionOfAltitude_enum2value_2[] = {
+	1,	/* depth(1) */
+	0	/* height(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_directionOfAltitude_specs_2 = {
+	asn_MAP_directionOfAltitude_value2enum_2,	/* "tag" => N; sorted by tag */
+	asn_MAP_directionOfAltitude_enum2value_2,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_directionOfAltitude_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_directionOfAltitude_2 = {
+	"directionOfAltitude",
+	"directionOfAltitude",
+	directionOfAltitude_2_free,
+	directionOfAltitude_2_print,
+	directionOfAltitude_2_constraint,
+	directionOfAltitude_2_decode_ber,
+	directionOfAltitude_2_encode_der,
+	directionOfAltitude_2_decode_xer,
+	directionOfAltitude_2_encode_xer,
+	directionOfAltitude_2_decode_uper,
+	directionOfAltitude_2_encode_uper,
+	directionOfAltitude_2_decode_aper,
+	directionOfAltitude_2_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_directionOfAltitude_tags_2,
+	sizeof(asn_DEF_directionOfAltitude_tags_2)
+		/sizeof(asn_DEF_directionOfAltitude_tags_2[0]) - 1, /* 1 */
+	asn_DEF_directionOfAltitude_tags_2,	/* Same as above */
+	sizeof(asn_DEF_directionOfAltitude_tags_2)
+		/sizeof(asn_DEF_directionOfAltitude_tags_2[0]), /* 2 */
+	&asn_PER_type_directionOfAltitude_constr_2,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_directionOfAltitude_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_GA_AltitudeAndDirection_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_AltitudeAndDirection, directionOfAltitude),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_directionOfAltitude_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"directionOfAltitude"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_AltitudeAndDirection, altitude),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_altitude_constraint_1,
+		&asn_PER_memb_altitude_constr_5,
+		0,
+		"altitude"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_AltitudeAndDirection_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* directionOfAltitude */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* altitude */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_AltitudeAndDirection_specs_1 = {
+	sizeof(struct RANAP_GA_AltitudeAndDirection),
+	offsetof(struct RANAP_GA_AltitudeAndDirection, _asn_ctx),
+	asn_MAP_RANAP_GA_AltitudeAndDirection_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_AltitudeAndDirection = {
+	"RANAP_GA-AltitudeAndDirection",
+	"RANAP_GA-AltitudeAndDirection",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1,
+	sizeof(asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_AltitudeAndDirection_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_AltitudeAndDirection_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_GA_AltitudeAndDirection_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-AltitudeAndDirection.h b/src/ranap/RANAP_GA-AltitudeAndDirection.h
new file mode 100644
index 0000000..e270a75
--- /dev/null
+++ b/src/ranap/RANAP_GA-AltitudeAndDirection.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_AltitudeAndDirection_H_
+#define	_RANAP_GA_AltitudeAndDirection_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum directionOfAltitude {
+	directionOfAltitude_height	= 0,
+	directionOfAltitude_depth	= 1
+} e_directionOfAltitude;
+
+/* RANAP_GA-AltitudeAndDirection */
+typedef struct RANAP_GA_AltitudeAndDirection {
+	long	 directionOfAltitude;
+	long	 altitude;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_AltitudeAndDirection_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_directionOfAltitude_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_AltitudeAndDirection;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_AltitudeAndDirection_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-EllipsoidArc.c b/src/ranap/RANAP_GA-EllipsoidArc.c
new file mode 100644
index 0000000..24c5fbf
--- /dev/null
+++ b/src/ranap/RANAP_GA-EllipsoidArc.c
@@ -0,0 +1,273 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-EllipsoidArc.h"
+
+static int
+memb_innerRadius_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_uncertaintyRadius_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_offsetAngle_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 179l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_includedAngle_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 179l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_confidence_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_innerRadius_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_uncertaintyRadius_constr_4 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_offsetAngle_constr_5 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  179l }	/* (0..179) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_includedAngle_constr_6 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  179l }	/* (0..179) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_confidence_constr_7 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GA_EllipsoidArc_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_EllipsoidArc, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_EllipsoidArc, innerRadius),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_innerRadius_constraint_1,
+		&asn_PER_memb_innerRadius_constr_3,
+		0,
+		"innerRadius"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_EllipsoidArc, uncertaintyRadius),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_uncertaintyRadius_constraint_1,
+		&asn_PER_memb_uncertaintyRadius_constr_4,
+		0,
+		"uncertaintyRadius"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_EllipsoidArc, offsetAngle),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_offsetAngle_constraint_1,
+		&asn_PER_memb_offsetAngle_constr_5,
+		0,
+		"offsetAngle"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_EllipsoidArc, includedAngle),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_includedAngle_constraint_1,
+		&asn_PER_memb_includedAngle_constr_6,
+		0,
+		"includedAngle"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_EllipsoidArc, confidence),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_confidence_constraint_1,
+		&asn_PER_memb_confidence_constr_7,
+		0,
+		"confidence"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GA_EllipsoidArc, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GA_EllipsoidArc_oms_1[] = { 6 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_EllipsoidArc_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_EllipsoidArc_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* innerRadius */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* uncertaintyRadius */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* offsetAngle */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* includedAngle */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* confidence */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_EllipsoidArc_specs_1 = {
+	sizeof(struct RANAP_GA_EllipsoidArc),
+	offsetof(struct RANAP_GA_EllipsoidArc, _asn_ctx),
+	asn_MAP_RANAP_GA_EllipsoidArc_tag2el_1,
+	7,	/* Count of tags in the map */
+	asn_MAP_RANAP_GA_EllipsoidArc_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	6,	/* Start extensions */
+	8	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_EllipsoidArc = {
+	"RANAP_GA-EllipsoidArc",
+	"RANAP_GA-EllipsoidArc",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_EllipsoidArc_tags_1,
+	sizeof(asn_DEF_RANAP_GA_EllipsoidArc_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_EllipsoidArc_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_EllipsoidArc_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_EllipsoidArc_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_EllipsoidArc_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_EllipsoidArc_1,
+	7,	/* Elements count */
+	&asn_SPC_RANAP_GA_EllipsoidArc_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-EllipsoidArc.h b/src/ranap/RANAP_GA-EllipsoidArc.h
new file mode 100644
index 0000000..476bdc4
--- /dev/null
+++ b/src/ranap/RANAP_GA-EllipsoidArc.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_EllipsoidArc_H_
+#define	_RANAP_GA_EllipsoidArc_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GeographicalCoordinates.h"
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-EllipsoidArc */
+typedef struct RANAP_GA_EllipsoidArc {
+	RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+	long	 innerRadius;
+	long	 uncertaintyRadius;
+	long	 offsetAngle;
+	long	 includedAngle;
+	long	 confidence;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_EllipsoidArc_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_EllipsoidArc;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_EllipsoidArc_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-Point.c b/src/ranap/RANAP_GA-Point.c
new file mode 100644
index 0000000..7f79bd7
--- /dev/null
+++ b/src/ranap/RANAP_GA-Point.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-Point.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_GA_Point_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_Point, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GA_Point, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GA_Point_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_Point_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_Point_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_Point_specs_1 = {
+	sizeof(struct RANAP_GA_Point),
+	offsetof(struct RANAP_GA_Point, _asn_ctx),
+	asn_MAP_RANAP_GA_Point_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_GA_Point_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_Point = {
+	"RANAP_GA-Point",
+	"RANAP_GA-Point",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_Point_tags_1,
+	sizeof(asn_DEF_RANAP_GA_Point_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_Point_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_Point_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_Point_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_Point_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_Point_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_GA_Point_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-Point.h b/src/ranap/RANAP_GA-Point.h
new file mode 100644
index 0000000..7d3764e
--- /dev/null
+++ b/src/ranap/RANAP_GA-Point.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_Point_H_
+#define	_RANAP_GA_Point_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GeographicalCoordinates.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-Point */
+typedef struct RANAP_GA_Point {
+	RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_Point_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_Point;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_Point_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-PointWithAltitude.c b/src/ranap/RANAP_GA-PointWithAltitude.c
new file mode 100644
index 0000000..92686d9
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithAltitude.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-PointWithAltitude.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_GA_PointWithAltitude_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitude, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitude, altitudeAndDirection),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_AltitudeAndDirection,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altitudeAndDirection"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GA_PointWithAltitude, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GA_PointWithAltitude_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_PointWithAltitude_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_PointWithAltitude_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* altitudeAndDirection */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_PointWithAltitude_specs_1 = {
+	sizeof(struct RANAP_GA_PointWithAltitude),
+	offsetof(struct RANAP_GA_PointWithAltitude, _asn_ctx),
+	asn_MAP_RANAP_GA_PointWithAltitude_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_GA_PointWithAltitude_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithAltitude = {
+	"RANAP_GA-PointWithAltitude",
+	"RANAP_GA-PointWithAltitude",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_PointWithAltitude_tags_1,
+	sizeof(asn_DEF_RANAP_GA_PointWithAltitude_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithAltitude_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_PointWithAltitude_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_PointWithAltitude_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithAltitude_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_PointWithAltitude_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_GA_PointWithAltitude_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-PointWithAltitude.h b/src/ranap/RANAP_GA-PointWithAltitude.h
new file mode 100644
index 0000000..edcad26
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithAltitude.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_PointWithAltitude_H_
+#define	_RANAP_GA_PointWithAltitude_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GeographicalCoordinates.h"
+#include "RANAP_GA-AltitudeAndDirection.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-PointWithAltitude */
+typedef struct RANAP_GA_PointWithAltitude {
+	RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+	RANAP_GA_AltitudeAndDirection_t	 altitudeAndDirection;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_PointWithAltitude_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithAltitude;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_PointWithAltitude_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.c b/src/ranap/RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.c
new file mode 100644
index 0000000..ede9b4f
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.c
@@ -0,0 +1,173 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.h"
+
+static int
+memb_uncertaintyAltitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_confidence_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_uncertaintyAltitude_constr_5 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_confidence_constr_6 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, altitudeAndDirection),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_AltitudeAndDirection,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"altitudeAndDirection"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, uncertaintyEllipse),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_UncertaintyEllipse,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uncertaintyEllipse"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, uncertaintyAltitude),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_uncertaintyAltitude_constraint_1,
+		&asn_PER_memb_uncertaintyAltitude_constr_5,
+		0,
+		"uncertaintyAltitude"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, confidence),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_confidence_constraint_1,
+		&asn_PER_memb_confidence_constr_6,
+		0,
+		"confidence"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_oms_1[] = { 5 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* altitudeAndDirection */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* uncertaintyEllipse */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* uncertaintyAltitude */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* confidence */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_specs_1 = {
+	sizeof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid),
+	offsetof(struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid, _asn_ctx),
+	asn_MAP_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tag2el_1,
+	6,	/* Count of tags in the map */
+	asn_MAP_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	5,	/* Start extensions */
+	7	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid = {
+	"RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid",
+	"RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1,
+	sizeof(asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_1,
+	6,	/* Elements count */
+	&asn_SPC_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.h b/src/ranap/RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.h
new file mode 100644
index 0000000..62aa5b6
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_H_
+#define	_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GeographicalCoordinates.h"
+#include "RANAP_GA-AltitudeAndDirection.h"
+#include "RANAP_GA-UncertaintyEllipse.h"
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid */
+typedef struct RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid {
+	RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+	RANAP_GA_AltitudeAndDirection_t	 altitudeAndDirection;
+	RANAP_GA_UncertaintyEllipse_t	 uncertaintyEllipse;
+	long	 uncertaintyAltitude;
+	long	 confidence;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-PointWithUnCertainty.c b/src/ranap/RANAP_GA-PointWithUnCertainty.c
new file mode 100644
index 0000000..e3d88d0
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithUnCertainty.c
@@ -0,0 +1,113 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-PointWithUnCertainty.h"
+
+static int
+memb_uncertaintyCode_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_uncertaintyCode_constr_4 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GA_PointWithUnCertainty_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithUnCertainty, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GA_PointWithUnCertainty, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithUnCertainty, uncertaintyCode),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_uncertaintyCode_constraint_1,
+		&asn_PER_memb_uncertaintyCode_constr_4,
+		0,
+		"uncertaintyCode"
+		},
+};
+static const int asn_MAP_RANAP_GA_PointWithUnCertainty_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_PointWithUnCertainty_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-Extensions */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* uncertaintyCode */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_PointWithUnCertainty_specs_1 = {
+	sizeof(struct RANAP_GA_PointWithUnCertainty),
+	offsetof(struct RANAP_GA_PointWithUnCertainty, _asn_ctx),
+	asn_MAP_RANAP_GA_PointWithUnCertainty_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_GA_PointWithUnCertainty_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithUnCertainty = {
+	"RANAP_GA-PointWithUnCertainty",
+	"RANAP_GA-PointWithUnCertainty",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1,
+	sizeof(asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithUnCertainty_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_PointWithUnCertainty_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_GA_PointWithUnCertainty_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-PointWithUnCertainty.h b/src/ranap/RANAP_GA-PointWithUnCertainty.h
new file mode 100644
index 0000000..86a6a82
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithUnCertainty.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_PointWithUnCertainty_H_
+#define	_RANAP_GA_PointWithUnCertainty_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GeographicalCoordinates.h"
+#include "RANAP_IE-Extensions.h"
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-PointWithUnCertainty */
+typedef struct RANAP_GA_PointWithUnCertainty {
+	RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	long	 uncertaintyCode;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_PointWithUnCertainty_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithUnCertainty;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_PointWithUnCertainty_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-PointWithUnCertaintyEllipse.c b/src/ranap/RANAP_GA-PointWithUnCertaintyEllipse.c
new file mode 100644
index 0000000..1dbf7d2
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithUnCertaintyEllipse.c
@@ -0,0 +1,123 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-PointWithUnCertaintyEllipse.h"
+
+static int
+memb_confidence_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_confidence_constr_4 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GA_PointWithUnCertaintyEllipse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithUnCertaintyEllipse, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithUnCertaintyEllipse, uncertaintyEllipse),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_UncertaintyEllipse,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uncertaintyEllipse"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_PointWithUnCertaintyEllipse, confidence),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_confidence_constraint_1,
+		&asn_PER_memb_confidence_constr_4,
+		0,
+		"confidence"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GA_PointWithUnCertaintyEllipse, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GA_PointWithUnCertaintyEllipse_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_PointWithUnCertaintyEllipse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uncertaintyEllipse */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* confidence */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_PointWithUnCertaintyEllipse_specs_1 = {
+	sizeof(struct RANAP_GA_PointWithUnCertaintyEllipse),
+	offsetof(struct RANAP_GA_PointWithUnCertaintyEllipse, _asn_ctx),
+	asn_MAP_RANAP_GA_PointWithUnCertaintyEllipse_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_GA_PointWithUnCertaintyEllipse_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse = {
+	"RANAP_GA-PointWithUnCertaintyEllipse",
+	"RANAP_GA-PointWithUnCertaintyEllipse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1,
+	sizeof(asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_PointWithUnCertaintyEllipse_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_GA_PointWithUnCertaintyEllipse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-PointWithUnCertaintyEllipse.h b/src/ranap/RANAP_GA-PointWithUnCertaintyEllipse.h
new file mode 100644
index 0000000..725ef0d
--- /dev/null
+++ b/src/ranap/RANAP_GA-PointWithUnCertaintyEllipse.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_PointWithUnCertaintyEllipse_H_
+#define	_RANAP_GA_PointWithUnCertaintyEllipse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GeographicalCoordinates.h"
+#include "RANAP_GA-UncertaintyEllipse.h"
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-PointWithUnCertaintyEllipse */
+typedef struct RANAP_GA_PointWithUnCertaintyEllipse {
+	RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+	RANAP_GA_UncertaintyEllipse_t	 uncertaintyEllipse;
+	long	 confidence;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_PointWithUnCertaintyEllipse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_PointWithUnCertaintyEllipse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-Polygon.c b/src/ranap/RANAP_GA-Polygon.c
new file mode 100644
index 0000000..018c9e3
--- /dev/null
+++ b/src/ranap/RANAP_GA-Polygon.c
@@ -0,0 +1,125 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-Polygon.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_GA_Polygon_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  15l }	/* (SIZE(1..15)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, geographicalCoordinates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GeographicalCoordinates,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"geographicalCoordinates"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* geographicalCoordinates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	2,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	2,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_GA_Polygon_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_Polygon_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_GA_Polygon_specs_1 = {
+	sizeof(struct RANAP_GA_Polygon),
+	offsetof(struct RANAP_GA_Polygon, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_Polygon = {
+	"RANAP_GA-Polygon",
+	"RANAP_GA-Polygon",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_Polygon_tags_1,
+	sizeof(asn_DEF_RANAP_GA_Polygon_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_Polygon_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_Polygon_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_Polygon_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_Polygon_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_GA_Polygon_constr_1,
+	asn_MBR_RANAP_GA_Polygon_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_GA_Polygon_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-Polygon.h b/src/ranap/RANAP_GA-Polygon.h
new file mode 100644
index 0000000..ed27da7
--- /dev/null
+++ b/src/ranap/RANAP_GA-Polygon.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_Polygon_H_
+#define	_RANAP_GA_Polygon_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_GeographicalCoordinates.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-Polygon */
+typedef struct RANAP_GA_Polygon {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_GeographicalCoordinates_t	 geographicalCoordinates;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_Polygon_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_Polygon;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_Polygon_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GA-UncertaintyEllipse.c b/src/ranap/RANAP_GA-UncertaintyEllipse.c
new file mode 100644
index 0000000..b82b7e4
--- /dev/null
+++ b/src/ranap/RANAP_GA-UncertaintyEllipse.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GA-UncertaintyEllipse.h"
+
+static int
+memb_uncertaintySemi_major_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_uncertaintySemi_minor_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_orientationOfMajorAxis_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 179l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_uncertaintySemi_major_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_uncertaintySemi_minor_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_orientationOfMajorAxis_constr_4 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  179l }	/* (0..179) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GA_UncertaintyEllipse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_UncertaintyEllipse, uncertaintySemi_major),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_uncertaintySemi_major_constraint_1,
+		&asn_PER_memb_uncertaintySemi_major_constr_2,
+		0,
+		"uncertaintySemi-major"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_UncertaintyEllipse, uncertaintySemi_minor),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_uncertaintySemi_minor_constraint_1,
+		&asn_PER_memb_uncertaintySemi_minor_constr_3,
+		0,
+		"uncertaintySemi-minor"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GA_UncertaintyEllipse, orientationOfMajorAxis),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_orientationOfMajorAxis_constraint_1,
+		&asn_PER_memb_orientationOfMajorAxis_constr_4,
+		0,
+		"orientationOfMajorAxis"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GA_UncertaintyEllipse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uncertaintySemi-major */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uncertaintySemi-minor */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* orientationOfMajorAxis */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GA_UncertaintyEllipse_specs_1 = {
+	sizeof(struct RANAP_GA_UncertaintyEllipse),
+	offsetof(struct RANAP_GA_UncertaintyEllipse, _asn_ctx),
+	asn_MAP_RANAP_GA_UncertaintyEllipse_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GA_UncertaintyEllipse = {
+	"RANAP_GA-UncertaintyEllipse",
+	"RANAP_GA-UncertaintyEllipse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1,
+	sizeof(asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1)
+		/sizeof(asn_DEF_RANAP_GA_UncertaintyEllipse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GA_UncertaintyEllipse_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_GA_UncertaintyEllipse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GA-UncertaintyEllipse.h b/src/ranap/RANAP_GA-UncertaintyEllipse.h
new file mode 100644
index 0000000..0524a29
--- /dev/null
+++ b/src/ranap/RANAP_GA-UncertaintyEllipse.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GA_UncertaintyEllipse_H_
+#define	_RANAP_GA_UncertaintyEllipse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GA-UncertaintyEllipse */
+typedef struct RANAP_GA_UncertaintyEllipse {
+	long	 uncertaintySemi_major;
+	long	 uncertaintySemi_minor;
+	long	 orientationOfMajorAxis;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GA_UncertaintyEllipse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GA_UncertaintyEllipse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GA_UncertaintyEllipse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GANSS-PositioningDataSet.c b/src/ranap/RANAP_GANSS-PositioningDataSet.c
new file mode 100644
index 0000000..3f3f137
--- /dev/null
+++ b/src/ranap/RANAP_GANSS-PositioningDataSet.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GANSS-PositioningDataSet.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_GANSS_PositioningDataSet_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  9l }	/* (SIZE(1..9)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GANSS_PositioningDataSet_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_GANSS_PositioningMethodAndUsage,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_GANSS_PositioningDataSet_specs_1 = {
+	sizeof(struct RANAP_GANSS_PositioningDataSet),
+	offsetof(struct RANAP_GANSS_PositioningDataSet, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GANSS_PositioningDataSet = {
+	"RANAP_GANSS-PositioningDataSet",
+	"RANAP_GANSS-PositioningDataSet",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1,
+	sizeof(asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1)
+		/sizeof(asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1)
+		/sizeof(asn_DEF_RANAP_GANSS_PositioningDataSet_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_GANSS_PositioningDataSet_constr_1,
+	asn_MBR_RANAP_GANSS_PositioningDataSet_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_GANSS_PositioningDataSet_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GANSS-PositioningDataSet.h b/src/ranap/RANAP_GANSS-PositioningDataSet.h
new file mode 100644
index 0000000..d2502d0
--- /dev/null
+++ b/src/ranap/RANAP_GANSS-PositioningDataSet.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GANSS_PositioningDataSet_H_
+#define	_RANAP_GANSS_PositioningDataSet_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GANSS-PositioningMethodAndUsage.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GANSS-PositioningDataSet */
+typedef struct RANAP_GANSS_PositioningDataSet {
+	A_SEQUENCE_OF(RANAP_GANSS_PositioningMethodAndUsage_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GANSS_PositioningDataSet_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GANSS_PositioningDataSet;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GANSS_PositioningDataSet_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GANSS-PositioningMethodAndUsage.c b/src/ranap/RANAP_GANSS-PositioningMethodAndUsage.c
new file mode 100644
index 0000000..4c8aba8
--- /dev/null
+++ b/src/ranap/RANAP_GANSS-PositioningMethodAndUsage.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GANSS-PositioningMethodAndUsage.h"
+
+int
+RANAP_GANSS_PositioningMethodAndUsage_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_GANSS_PositioningMethodAndUsage_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_GANSS_PositioningMethodAndUsage_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_GANSS_PositioningMethodAndUsage_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GANSS_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_GANSS_PositioningMethodAndUsage_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GANSS_PositioningMethodAndUsage = {
+	"RANAP_GANSS-PositioningMethodAndUsage",
+	"RANAP_GANSS-PositioningMethodAndUsage",
+	RANAP_GANSS_PositioningMethodAndUsage_free,
+	RANAP_GANSS_PositioningMethodAndUsage_print,
+	RANAP_GANSS_PositioningMethodAndUsage_constraint,
+	RANAP_GANSS_PositioningMethodAndUsage_decode_ber,
+	RANAP_GANSS_PositioningMethodAndUsage_encode_der,
+	RANAP_GANSS_PositioningMethodAndUsage_decode_xer,
+	RANAP_GANSS_PositioningMethodAndUsage_encode_xer,
+	RANAP_GANSS_PositioningMethodAndUsage_decode_uper,
+	RANAP_GANSS_PositioningMethodAndUsage_encode_uper,
+	RANAP_GANSS_PositioningMethodAndUsage_decode_aper,
+	RANAP_GANSS_PositioningMethodAndUsage_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1,
+	sizeof(asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1)
+		/sizeof(asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1)
+		/sizeof(asn_DEF_RANAP_GANSS_PositioningMethodAndUsage_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_GANSS_PositioningMethodAndUsage_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_GANSS-PositioningMethodAndUsage.h b/src/ranap/RANAP_GANSS-PositioningMethodAndUsage.h
new file mode 100644
index 0000000..793ca23
--- /dev/null
+++ b/src/ranap/RANAP_GANSS-PositioningMethodAndUsage.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GANSS_PositioningMethodAndUsage_H_
+#define	_RANAP_GANSS_PositioningMethodAndUsage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GANSS-PositioningMethodAndUsage */
+typedef OCTET_STRING_t	 RANAP_GANSS_PositioningMethodAndUsage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GANSS_PositioningMethodAndUsage;
+asn_struct_free_f RANAP_GANSS_PositioningMethodAndUsage_free;
+asn_struct_print_f RANAP_GANSS_PositioningMethodAndUsage_print;
+asn_constr_check_f RANAP_GANSS_PositioningMethodAndUsage_constraint;
+ber_type_decoder_f RANAP_GANSS_PositioningMethodAndUsage_decode_ber;
+der_type_encoder_f RANAP_GANSS_PositioningMethodAndUsage_encode_der;
+xer_type_decoder_f RANAP_GANSS_PositioningMethodAndUsage_decode_xer;
+xer_type_encoder_f RANAP_GANSS_PositioningMethodAndUsage_encode_xer;
+per_type_decoder_f RANAP_GANSS_PositioningMethodAndUsage_decode_uper;
+per_type_encoder_f RANAP_GANSS_PositioningMethodAndUsage_encode_uper;
+per_type_decoder_f RANAP_GANSS_PositioningMethodAndUsage_decode_aper;
+per_type_encoder_f RANAP_GANSS_PositioningMethodAndUsage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GANSS_PositioningMethodAndUsage_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GERAN-BSC-Container.c b/src/ranap/RANAP_GERAN-BSC-Container.c
new file mode 100644
index 0000000..99f91a5
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-BSC-Container.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GERAN-BSC-Container.h"
+
+int
+RANAP_GERAN_BSC_Container_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_GERAN_BSC_Container_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_GERAN_BSC_Container_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_BSC_Container_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_BSC_Container_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_BSC_Container_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_BSC_Container_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_BSC_Container_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_BSC_Container_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_BSC_Container_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_BSC_Container_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GERAN_BSC_Container_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_GERAN_BSC_Container_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_BSC_Container = {
+	"RANAP_GERAN-BSC-Container",
+	"RANAP_GERAN-BSC-Container",
+	RANAP_GERAN_BSC_Container_free,
+	RANAP_GERAN_BSC_Container_print,
+	RANAP_GERAN_BSC_Container_constraint,
+	RANAP_GERAN_BSC_Container_decode_ber,
+	RANAP_GERAN_BSC_Container_encode_der,
+	RANAP_GERAN_BSC_Container_decode_xer,
+	RANAP_GERAN_BSC_Container_encode_xer,
+	RANAP_GERAN_BSC_Container_decode_uper,
+	RANAP_GERAN_BSC_Container_encode_uper,
+	RANAP_GERAN_BSC_Container_decode_aper,
+	RANAP_GERAN_BSC_Container_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GERAN_BSC_Container_tags_1,
+	sizeof(asn_DEF_RANAP_GERAN_BSC_Container_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_BSC_Container_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GERAN_BSC_Container_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GERAN_BSC_Container_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_BSC_Container_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_GERAN-BSC-Container.h b/src/ranap/RANAP_GERAN-BSC-Container.h
new file mode 100644
index 0000000..920b279
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-BSC-Container.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GERAN_BSC_Container_H_
+#define	_RANAP_GERAN_BSC_Container_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GERAN-BSC-Container */
+typedef OCTET_STRING_t	 RANAP_GERAN_BSC_Container_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_BSC_Container;
+asn_struct_free_f RANAP_GERAN_BSC_Container_free;
+asn_struct_print_f RANAP_GERAN_BSC_Container_print;
+asn_constr_check_f RANAP_GERAN_BSC_Container_constraint;
+ber_type_decoder_f RANAP_GERAN_BSC_Container_decode_ber;
+der_type_encoder_f RANAP_GERAN_BSC_Container_encode_der;
+xer_type_decoder_f RANAP_GERAN_BSC_Container_decode_xer;
+xer_type_encoder_f RANAP_GERAN_BSC_Container_encode_xer;
+per_type_decoder_f RANAP_GERAN_BSC_Container_decode_uper;
+per_type_encoder_f RANAP_GERAN_BSC_Container_encode_uper;
+per_type_decoder_f RANAP_GERAN_BSC_Container_decode_aper;
+per_type_encoder_f RANAP_GERAN_BSC_Container_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GERAN_BSC_Container_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GERAN-Cell-ID.c b/src/ranap/RANAP_GERAN-Cell-ID.c
new file mode 100644
index 0000000..e69cd12
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-Cell-ID.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GERAN-Cell-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_GERAN_Cell_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GERAN_Cell_ID, lAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GERAN_Cell_ID, rAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAC"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GERAN_Cell_ID, cI),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cI"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GERAN_Cell_ID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GERAN_Cell_ID_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GERAN_Cell_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GERAN_Cell_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* lAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* cI */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GERAN_Cell_ID_specs_1 = {
+	sizeof(struct RANAP_GERAN_Cell_ID),
+	offsetof(struct RANAP_GERAN_Cell_ID, _asn_ctx),
+	asn_MAP_RANAP_GERAN_Cell_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_GERAN_Cell_ID_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_Cell_ID = {
+	"RANAP_GERAN-Cell-ID",
+	"RANAP_GERAN-Cell-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GERAN_Cell_ID_tags_1,
+	sizeof(asn_DEF_RANAP_GERAN_Cell_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_Cell_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GERAN_Cell_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GERAN_Cell_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_Cell_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GERAN_Cell_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_GERAN_Cell_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GERAN-Cell-ID.h b/src/ranap/RANAP_GERAN-Cell-ID.h
new file mode 100644
index 0000000..026dde0
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-Cell-ID.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GERAN_Cell_ID_H_
+#define	_RANAP_GERAN_Cell_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI.h"
+#include "RANAP_RAC.h"
+#include "RANAP_CI.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GERAN-Cell-ID */
+typedef struct RANAP_GERAN_Cell_ID {
+	RANAP_LAI_t	 lAI;
+	RANAP_RAC_t	 rAC;
+	RANAP_CI_t	 cI;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GERAN_Cell_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_Cell_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GERAN_Cell_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GERAN-Classmark.c b/src/ranap/RANAP_GERAN-Classmark.c
new file mode 100644
index 0000000..8eb85e2
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-Classmark.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GERAN-Classmark.h"
+
+int
+RANAP_GERAN_Classmark_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_GERAN_Classmark_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_GERAN_Classmark_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_Classmark_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_Classmark_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_Classmark_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_Classmark_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_Classmark_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_Classmark_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_GERAN_Classmark_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_GERAN_Classmark_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GERAN_Classmark_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_GERAN_Classmark_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_Classmark = {
+	"RANAP_GERAN-Classmark",
+	"RANAP_GERAN-Classmark",
+	RANAP_GERAN_Classmark_free,
+	RANAP_GERAN_Classmark_print,
+	RANAP_GERAN_Classmark_constraint,
+	RANAP_GERAN_Classmark_decode_ber,
+	RANAP_GERAN_Classmark_encode_der,
+	RANAP_GERAN_Classmark_decode_xer,
+	RANAP_GERAN_Classmark_encode_xer,
+	RANAP_GERAN_Classmark_decode_uper,
+	RANAP_GERAN_Classmark_encode_uper,
+	RANAP_GERAN_Classmark_decode_aper,
+	RANAP_GERAN_Classmark_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GERAN_Classmark_tags_1,
+	sizeof(asn_DEF_RANAP_GERAN_Classmark_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_Classmark_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GERAN_Classmark_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GERAN_Classmark_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_Classmark_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_GERAN-Classmark.h b/src/ranap/RANAP_GERAN-Classmark.h
new file mode 100644
index 0000000..8de744b
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-Classmark.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GERAN_Classmark_H_
+#define	_RANAP_GERAN_Classmark_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GERAN-Classmark */
+typedef OCTET_STRING_t	 RANAP_GERAN_Classmark_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_Classmark;
+asn_struct_free_f RANAP_GERAN_Classmark_free;
+asn_struct_print_f RANAP_GERAN_Classmark_print;
+asn_constr_check_f RANAP_GERAN_Classmark_constraint;
+ber_type_decoder_f RANAP_GERAN_Classmark_decode_ber;
+der_type_encoder_f RANAP_GERAN_Classmark_encode_der;
+xer_type_decoder_f RANAP_GERAN_Classmark_decode_xer;
+xer_type_encoder_f RANAP_GERAN_Classmark_encode_xer;
+per_type_decoder_f RANAP_GERAN_Classmark_decode_uper;
+per_type_encoder_f RANAP_GERAN_Classmark_encode_uper;
+per_type_decoder_f RANAP_GERAN_Classmark_decode_aper;
+per_type_encoder_f RANAP_GERAN_Classmark_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GERAN_Classmark_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GTP-TEI.c b/src/ranap/RANAP_GTP-TEI.c
new file mode 100644
index 0000000..7901aff
--- /dev/null
+++ b/src/ranap/RANAP_GTP-TEI.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GTP-TEI.h"
+
+int
+RANAP_GTP_TEI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_GTP_TEI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_GTP_TEI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_GTP_TEI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GTP_TEI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_GTP_TEI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GTP_TEI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_GTP_TEI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GTP_TEI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_GTP_TEI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_GTP_TEI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_GTP_TEI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GTP_TEI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_GTP_TEI_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GTP_TEI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GTP_TEI = {
+	"RANAP_GTP-TEI",
+	"RANAP_GTP-TEI",
+	RANAP_GTP_TEI_free,
+	RANAP_GTP_TEI_print,
+	RANAP_GTP_TEI_constraint,
+	RANAP_GTP_TEI_decode_ber,
+	RANAP_GTP_TEI_encode_der,
+	RANAP_GTP_TEI_decode_xer,
+	RANAP_GTP_TEI_encode_xer,
+	RANAP_GTP_TEI_decode_uper,
+	RANAP_GTP_TEI_encode_uper,
+	RANAP_GTP_TEI_decode_aper,
+	RANAP_GTP_TEI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GTP_TEI_tags_1,
+	sizeof(asn_DEF_RANAP_GTP_TEI_tags_1)
+		/sizeof(asn_DEF_RANAP_GTP_TEI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GTP_TEI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GTP_TEI_tags_1)
+		/sizeof(asn_DEF_RANAP_GTP_TEI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_GTP_TEI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_GTP-TEI.h b/src/ranap/RANAP_GTP-TEI.h
new file mode 100644
index 0000000..01382e0
--- /dev/null
+++ b/src/ranap/RANAP_GTP-TEI.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GTP_TEI_H_
+#define	_RANAP_GTP_TEI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GTP-TEI */
+typedef OCTET_STRING_t	 RANAP_GTP_TEI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GTP_TEI;
+asn_struct_free_f RANAP_GTP_TEI_free;
+asn_struct_print_f RANAP_GTP_TEI_print;
+asn_constr_check_f RANAP_GTP_TEI_constraint;
+ber_type_decoder_f RANAP_GTP_TEI_decode_ber;
+der_type_encoder_f RANAP_GTP_TEI_encode_der;
+xer_type_decoder_f RANAP_GTP_TEI_decode_xer;
+xer_type_encoder_f RANAP_GTP_TEI_encode_xer;
+per_type_decoder_f RANAP_GTP_TEI_decode_uper;
+per_type_encoder_f RANAP_GTP_TEI_encode_uper;
+per_type_decoder_f RANAP_GTP_TEI_decode_aper;
+per_type_encoder_f RANAP_GTP_TEI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GTP_TEI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GeographicalArea.c b/src/ranap/RANAP_GeographicalArea.c
new file mode 100644
index 0000000..eba4572
--- /dev/null
+++ b/src/ranap/RANAP_GeographicalArea.c
@@ -0,0 +1,122 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GeographicalArea.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_GeographicalArea_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_GeographicalArea_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.point),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_Point,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"point"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.pointWithUnCertainty),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_PointWithUnCertainty,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pointWithUnCertainty"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.polygon),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_Polygon,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"polygon"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.pointWithUncertaintyEllipse),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_PointWithUnCertaintyEllipse,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pointWithUncertaintyEllipse"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.pointWithAltitude),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_PointWithAltitude,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pointWithAltitude"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.pointWithAltitudeAndUncertaintyEllipsoid),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pointWithAltitudeAndUncertaintyEllipsoid"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalArea, choice.ellipsoidArc),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GA_EllipsoidArc,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"ellipsoidArc"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GeographicalArea_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* point */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* pointWithUnCertainty */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* polygon */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* pointWithUncertaintyEllipse */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* pointWithAltitude */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* pointWithAltitudeAndUncertaintyEllipsoid */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* ellipsoidArc */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_GeographicalArea_specs_1 = {
+	sizeof(struct RANAP_GeographicalArea),
+	offsetof(struct RANAP_GeographicalArea, _asn_ctx),
+	offsetof(struct RANAP_GeographicalArea, present),
+	sizeof(((struct RANAP_GeographicalArea *)0)->present),
+	asn_MAP_RANAP_GeographicalArea_tag2el_1,
+	7,	/* Count of tags in the map */
+	0,
+	3	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GeographicalArea = {
+	"RANAP_GeographicalArea",
+	"RANAP_GeographicalArea",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_GeographicalArea_constr_1,
+	asn_MBR_RANAP_GeographicalArea_1,
+	7,	/* Elements count */
+	&asn_SPC_RANAP_GeographicalArea_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GeographicalArea.h b/src/ranap/RANAP_GeographicalArea.h
new file mode 100644
index 0000000..930c9f6
--- /dev/null
+++ b/src/ranap/RANAP_GeographicalArea.h
@@ -0,0 +1,69 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GeographicalArea_H_
+#define	_RANAP_GeographicalArea_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GA-Point.h"
+#include "RANAP_GA-PointWithUnCertainty.h"
+#include "RANAP_GA-Polygon.h"
+#include "RANAP_GA-PointWithUnCertaintyEllipse.h"
+#include "RANAP_GA-PointWithAltitude.h"
+#include "RANAP_GA-PointWithAltitudeAndUncertaintyEllipsoid.h"
+#include "RANAP_GA-EllipsoidArc.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_GeographicalArea_PR {
+	RANAP_GeographicalArea_PR_NOTHING,	/* No components present */
+	RANAP_GeographicalArea_PR_point,
+	RANAP_GeographicalArea_PR_pointWithUnCertainty,
+	RANAP_GeographicalArea_PR_polygon,
+	/* Extensions may appear below */
+	RANAP_GeographicalArea_PR_pointWithUncertaintyEllipse,
+	RANAP_GeographicalArea_PR_pointWithAltitude,
+	RANAP_GeographicalArea_PR_pointWithAltitudeAndUncertaintyEllipsoid,
+	RANAP_GeographicalArea_PR_ellipsoidArc
+} RANAP_GeographicalArea_PR;
+
+/* RANAP_GeographicalArea */
+typedef struct RANAP_GeographicalArea {
+	RANAP_GeographicalArea_PR present;
+	union RANAP_GeographicalArea_u {
+		RANAP_GA_Point_t	 point;
+		RANAP_GA_PointWithUnCertainty_t	 pointWithUnCertainty;
+		RANAP_GA_Polygon_t	 polygon;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		RANAP_GA_PointWithUnCertaintyEllipse_t	 pointWithUncertaintyEllipse;
+		RANAP_GA_PointWithAltitude_t	 pointWithAltitude;
+		RANAP_GA_PointWithAltitudeAndUncertaintyEllipsoid_t	 pointWithAltitudeAndUncertaintyEllipsoid;
+		RANAP_GA_EllipsoidArc_t	 ellipsoidArc;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GeographicalArea_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GeographicalArea;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GeographicalArea_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GeographicalCoordinates.c b/src/ranap/RANAP_GeographicalCoordinates.c
new file mode 100644
index 0000000..57f391e
--- /dev/null
+++ b/src/ranap/RANAP_GeographicalCoordinates.c
@@ -0,0 +1,312 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GeographicalCoordinates.h"
+
+static int
+latitudeSign_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+latitudeSign_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+static void
+latitudeSign_2_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+static int
+latitudeSign_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+static asn_dec_rval_t
+latitudeSign_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+static asn_enc_rval_t
+latitudeSign_2_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+static asn_dec_rval_t
+latitudeSign_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+static asn_enc_rval_t
+latitudeSign_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+static asn_dec_rval_t
+latitudeSign_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_enc_rval_t
+latitudeSign_2_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_enc_rval_t
+latitudeSign_2_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_dec_rval_t
+latitudeSign_2_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	latitudeSign_2_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static int
+memb_latitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 8388607l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_longitude_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= -8388608ull && value <= 8388607l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_latitudeSign_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_latitude_constr_5 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 23, -1,  0l,  8388607l }	/* (0..8388607) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_longitude_constr_6 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 24, -1, -8388608ull,  8388607l }	/* (-8388608..8388607) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_latitudeSign_value2enum_2[] = {
+	{ 0,	5,	"north" },
+	{ 1,	5,	"south" }
+};
+static const unsigned int asn_MAP_latitudeSign_enum2value_2[] = {
+	0,	/* north(0) */
+	1	/* south(1) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_latitudeSign_specs_2 = {
+	asn_MAP_latitudeSign_value2enum_2,	/* "tag" => N; sorted by tag */
+	asn_MAP_latitudeSign_enum2value_2,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_latitudeSign_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_latitudeSign_2 = {
+	"latitudeSign",
+	"latitudeSign",
+	latitudeSign_2_free,
+	latitudeSign_2_print,
+	latitudeSign_2_constraint,
+	latitudeSign_2_decode_ber,
+	latitudeSign_2_encode_der,
+	latitudeSign_2_decode_xer,
+	latitudeSign_2_encode_xer,
+	latitudeSign_2_decode_uper,
+	latitudeSign_2_encode_uper,
+	latitudeSign_2_decode_aper,
+	latitudeSign_2_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_latitudeSign_tags_2,
+	sizeof(asn_DEF_latitudeSign_tags_2)
+		/sizeof(asn_DEF_latitudeSign_tags_2[0]) - 1, /* 1 */
+	asn_DEF_latitudeSign_tags_2,	/* Same as above */
+	sizeof(asn_DEF_latitudeSign_tags_2)
+		/sizeof(asn_DEF_latitudeSign_tags_2[0]), /* 2 */
+	&asn_PER_type_latitudeSign_constr_2,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_latitudeSign_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_GeographicalCoordinates_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalCoordinates, latitudeSign),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_latitudeSign_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"latitudeSign"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalCoordinates, latitude),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_latitude_constraint_1,
+		&asn_PER_memb_latitude_constr_5,
+		0,
+		"latitude"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GeographicalCoordinates, longitude),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_longitude_constraint_1,
+		&asn_PER_memb_longitude_constr_6,
+		0,
+		"longitude"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_GeographicalCoordinates, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_GeographicalCoordinates_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_GeographicalCoordinates_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GeographicalCoordinates_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* latitudeSign */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* latitude */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* longitude */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GeographicalCoordinates_specs_1 = {
+	sizeof(struct RANAP_GeographicalCoordinates),
+	offsetof(struct RANAP_GeographicalCoordinates, _asn_ctx),
+	asn_MAP_RANAP_GeographicalCoordinates_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_GeographicalCoordinates_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GeographicalCoordinates = {
+	"RANAP_GeographicalCoordinates",
+	"RANAP_GeographicalCoordinates",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GeographicalCoordinates_tags_1,
+	sizeof(asn_DEF_RANAP_GeographicalCoordinates_tags_1)
+		/sizeof(asn_DEF_RANAP_GeographicalCoordinates_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GeographicalCoordinates_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GeographicalCoordinates_tags_1)
+		/sizeof(asn_DEF_RANAP_GeographicalCoordinates_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GeographicalCoordinates_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_GeographicalCoordinates_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GeographicalCoordinates.h b/src/ranap/RANAP_GeographicalCoordinates.h
new file mode 100644
index 0000000..8f3d911
--- /dev/null
+++ b/src/ranap/RANAP_GeographicalCoordinates.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GeographicalCoordinates_H_
+#define	_RANAP_GeographicalCoordinates_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum latitudeSign {
+	latitudeSign_north	= 0,
+	latitudeSign_south	= 1
+} e_latitudeSign;
+
+/* RANAP_GeographicalCoordinates */
+typedef struct RANAP_GeographicalCoordinates {
+	long	 latitudeSign;
+	long	 latitude;
+	long	 longitude;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GeographicalCoordinates_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_latitudeSign_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GeographicalCoordinates;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GeographicalCoordinates_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GlobalCN-ID.c b/src/ranap/RANAP_GlobalCN-ID.c
new file mode 100644
index 0000000..e83f7eb
--- /dev/null
+++ b/src/ranap/RANAP_GlobalCN-ID.c
@@ -0,0 +1,71 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GlobalCN-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_GlobalCN_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GlobalCN_ID, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GlobalCN_ID, cN_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CN_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cN-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GlobalCN_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GlobalCN_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cN-ID */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GlobalCN_ID_specs_1 = {
+	sizeof(struct RANAP_GlobalCN_ID),
+	offsetof(struct RANAP_GlobalCN_ID, _asn_ctx),
+	asn_MAP_RANAP_GlobalCN_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GlobalCN_ID = {
+	"RANAP_GlobalCN-ID",
+	"RANAP_GlobalCN-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GlobalCN_ID_tags_1,
+	sizeof(asn_DEF_RANAP_GlobalCN_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_GlobalCN_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GlobalCN_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GlobalCN_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_GlobalCN_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GlobalCN_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_GlobalCN_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GlobalCN-ID.h b/src/ranap/RANAP_GlobalCN-ID.h
new file mode 100644
index 0000000..4428af6
--- /dev/null
+++ b/src/ranap/RANAP_GlobalCN-ID.h
@@ -0,0 +1,39 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GlobalCN_ID_H_
+#define	_RANAP_GlobalCN_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_CN-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GlobalCN-ID */
+typedef struct RANAP_GlobalCN_ID {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_CN_ID_t	 cN_ID;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GlobalCN_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GlobalCN_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GlobalCN_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GlobalRNC-ID.c b/src/ranap/RANAP_GlobalRNC-ID.c
new file mode 100644
index 0000000..eff248e
--- /dev/null
+++ b/src/ranap/RANAP_GlobalRNC-ID.c
@@ -0,0 +1,71 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GlobalRNC-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_GlobalRNC_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GlobalRNC_ID, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GlobalRNC_ID, rNC_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RNC_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rNC-ID"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GlobalRNC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GlobalRNC_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* rNC-ID */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GlobalRNC_ID_specs_1 = {
+	sizeof(struct RANAP_GlobalRNC_ID),
+	offsetof(struct RANAP_GlobalRNC_ID, _asn_ctx),
+	asn_MAP_RANAP_GlobalRNC_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GlobalRNC_ID = {
+	"RANAP_GlobalRNC-ID",
+	"RANAP_GlobalRNC-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GlobalRNC_ID_tags_1,
+	sizeof(asn_DEF_RANAP_GlobalRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_GlobalRNC_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GlobalRNC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GlobalRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_GlobalRNC_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GlobalRNC_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_GlobalRNC_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GlobalRNC-ID.h b/src/ranap/RANAP_GlobalRNC-ID.h
new file mode 100644
index 0000000..60bc53e
--- /dev/null
+++ b/src/ranap/RANAP_GlobalRNC-ID.h
@@ -0,0 +1,39 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GlobalRNC_ID_H_
+#define	_RANAP_GlobalRNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_RNC-ID.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GlobalRNC-ID */
+typedef struct RANAP_GlobalRNC_ID {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_RNC_ID_t	 rNC_ID;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GlobalRNC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GlobalRNC_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GlobalRNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GuaranteedBitrate.c b/src/ranap/RANAP_GuaranteedBitrate.c
new file mode 100644
index 0000000..4524f48
--- /dev/null
+++ b/src/ranap/RANAP_GuaranteedBitrate.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_GuaranteedBitrate.h"
+
+int
+RANAP_GuaranteedBitrate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 16000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_GuaranteedBitrate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_GuaranteedBitrate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GuaranteedBitrate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_GuaranteedBitrate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GuaranteedBitrate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_GuaranteedBitrate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_GuaranteedBitrate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_GuaranteedBitrate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_GuaranteedBitrate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_GuaranteedBitrate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_GuaranteedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_GuaranteedBitrate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 24, -1,  0l,  16000000l }	/* (0..16000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GuaranteedBitrate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_GuaranteedBitrate = {
+	"RANAP_GuaranteedBitrate",
+	"RANAP_GuaranteedBitrate",
+	RANAP_GuaranteedBitrate_free,
+	RANAP_GuaranteedBitrate_print,
+	RANAP_GuaranteedBitrate_constraint,
+	RANAP_GuaranteedBitrate_decode_ber,
+	RANAP_GuaranteedBitrate_encode_der,
+	RANAP_GuaranteedBitrate_decode_xer,
+	RANAP_GuaranteedBitrate_encode_xer,
+	RANAP_GuaranteedBitrate_decode_uper,
+	RANAP_GuaranteedBitrate_encode_uper,
+	RANAP_GuaranteedBitrate_decode_aper,
+	RANAP_GuaranteedBitrate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_GuaranteedBitrate_tags_1,
+	sizeof(asn_DEF_RANAP_GuaranteedBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_GuaranteedBitrate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GuaranteedBitrate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GuaranteedBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_GuaranteedBitrate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_GuaranteedBitrate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_GuaranteedBitrate.h b/src/ranap/RANAP_GuaranteedBitrate.h
new file mode 100644
index 0000000..bc3bf0a
--- /dev/null
+++ b/src/ranap/RANAP_GuaranteedBitrate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_GuaranteedBitrate_H_
+#define	_RANAP_GuaranteedBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GuaranteedBitrate */
+typedef long	 RANAP_GuaranteedBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GuaranteedBitrate;
+asn_struct_free_f RANAP_GuaranteedBitrate_free;
+asn_struct_print_f RANAP_GuaranteedBitrate_print;
+asn_constr_check_f RANAP_GuaranteedBitrate_constraint;
+ber_type_decoder_f RANAP_GuaranteedBitrate_decode_ber;
+der_type_encoder_f RANAP_GuaranteedBitrate_encode_der;
+xer_type_decoder_f RANAP_GuaranteedBitrate_decode_xer;
+xer_type_encoder_f RANAP_GuaranteedBitrate_encode_xer;
+per_type_decoder_f RANAP_GuaranteedBitrate_decode_uper;
+per_type_encoder_f RANAP_GuaranteedBitrate_encode_uper;
+per_type_decoder_f RANAP_GuaranteedBitrate_decode_aper;
+per_type_encoder_f RANAP_GuaranteedBitrate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GuaranteedBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HS-DSCH-MAC-d-Flow-ID.c b/src/ranap/RANAP_HS-DSCH-MAC-d-Flow-ID.c
new file mode 100644
index 0000000..00112ba
--- /dev/null
+++ b/src/ranap/RANAP_HS-DSCH-MAC-d-Flow-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HS-DSCH-MAC-d-Flow-ID.h"
+
+int
+RANAP_HS_DSCH_MAC_d_Flow_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 7l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_HS_DSCH_MAC_d_Flow_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_HS_DSCH_MAC_d_Flow_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_HS_DSCH_MAC_d_Flow_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_HS_DSCH_MAC_d_Flow_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_HS_DSCH_MAC_d_Flow_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 3,  3,  0l,  7l }	/* (0..7) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID = {
+	"RANAP_HS-DSCH-MAC-d-Flow-ID",
+	"RANAP_HS-DSCH-MAC-d-Flow-ID",
+	RANAP_HS_DSCH_MAC_d_Flow_ID_free,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_print,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_constraint,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_decode_ber,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_encode_der,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_decode_xer,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_encode_xer,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_decode_uper,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_encode_uper,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_decode_aper,
+	RANAP_HS_DSCH_MAC_d_Flow_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1,
+	sizeof(asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_HS_DSCH_MAC_d_Flow_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_HS-DSCH-MAC-d-Flow-ID.h b/src/ranap/RANAP_HS-DSCH-MAC-d-Flow-ID.h
new file mode 100644
index 0000000..1364acd
--- /dev/null
+++ b/src/ranap/RANAP_HS-DSCH-MAC-d-Flow-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HS_DSCH_MAC_d_Flow_ID_H_
+#define	_RANAP_HS_DSCH_MAC_d_Flow_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_HS-DSCH-MAC-d-Flow-ID */
+typedef long	 RANAP_HS_DSCH_MAC_d_Flow_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HS_DSCH_MAC_d_Flow_ID;
+asn_struct_free_f RANAP_HS_DSCH_MAC_d_Flow_ID_free;
+asn_struct_print_f RANAP_HS_DSCH_MAC_d_Flow_ID_print;
+asn_constr_check_f RANAP_HS_DSCH_MAC_d_Flow_ID_constraint;
+ber_type_decoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_decode_ber;
+der_type_encoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_encode_der;
+xer_type_decoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_decode_xer;
+xer_type_encoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_encode_xer;
+per_type_decoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_decode_uper;
+per_type_encoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_encode_uper;
+per_type_decoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_decode_aper;
+per_type_encoder_f RANAP_HS_DSCH_MAC_d_Flow_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HS_DSCH_MAC_d_Flow_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HigherBitratesThan16MbpsFlag.c b/src/ranap/RANAP_HigherBitratesThan16MbpsFlag.c
new file mode 100644
index 0000000..a3fc106
--- /dev/null
+++ b/src/ranap/RANAP_HigherBitratesThan16MbpsFlag.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HigherBitratesThan16MbpsFlag.h"
+
+int
+RANAP_HigherBitratesThan16MbpsFlag_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_HigherBitratesThan16MbpsFlag_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_HigherBitratesThan16MbpsFlag_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_HigherBitratesThan16MbpsFlag_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_HigherBitratesThan16MbpsFlag_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_HigherBitratesThan16MbpsFlag_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_HigherBitratesThan16MbpsFlag_value2enum_1[] = {
+	{ 0,	7,	"allowed" },
+	{ 1,	11,	"not-allowed" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_HigherBitratesThan16MbpsFlag_enum2value_1[] = {
+	0,	/* allowed(0) */
+	1	/* not-allowed(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_HigherBitratesThan16MbpsFlag_specs_1 = {
+	asn_MAP_RANAP_HigherBitratesThan16MbpsFlag_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_HigherBitratesThan16MbpsFlag_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HigherBitratesThan16MbpsFlag = {
+	"RANAP_HigherBitratesThan16MbpsFlag",
+	"RANAP_HigherBitratesThan16MbpsFlag",
+	RANAP_HigherBitratesThan16MbpsFlag_free,
+	RANAP_HigherBitratesThan16MbpsFlag_print,
+	RANAP_HigherBitratesThan16MbpsFlag_constraint,
+	RANAP_HigherBitratesThan16MbpsFlag_decode_ber,
+	RANAP_HigherBitratesThan16MbpsFlag_encode_der,
+	RANAP_HigherBitratesThan16MbpsFlag_decode_xer,
+	RANAP_HigherBitratesThan16MbpsFlag_encode_xer,
+	RANAP_HigherBitratesThan16MbpsFlag_decode_uper,
+	RANAP_HigherBitratesThan16MbpsFlag_encode_uper,
+	RANAP_HigherBitratesThan16MbpsFlag_decode_aper,
+	RANAP_HigherBitratesThan16MbpsFlag_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1,
+	sizeof(asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1)
+		/sizeof(asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1)
+		/sizeof(asn_DEF_RANAP_HigherBitratesThan16MbpsFlag_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_HigherBitratesThan16MbpsFlag_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_HigherBitratesThan16MbpsFlag_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_HigherBitratesThan16MbpsFlag.h b/src/ranap/RANAP_HigherBitratesThan16MbpsFlag.h
new file mode 100644
index 0000000..19dc7b4
--- /dev/null
+++ b/src/ranap/RANAP_HigherBitratesThan16MbpsFlag.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HigherBitratesThan16MbpsFlag_H_
+#define	_RANAP_HigherBitratesThan16MbpsFlag_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_HigherBitratesThan16MbpsFlag {
+	RANAP_HigherBitratesThan16MbpsFlag_allowed	= 0,
+	RANAP_HigherBitratesThan16MbpsFlag_not_allowed	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_HigherBitratesThan16MbpsFlag;
+
+/* RANAP_HigherBitratesThan16MbpsFlag */
+typedef long	 RANAP_HigherBitratesThan16MbpsFlag_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HigherBitratesThan16MbpsFlag;
+asn_struct_free_f RANAP_HigherBitratesThan16MbpsFlag_free;
+asn_struct_print_f RANAP_HigherBitratesThan16MbpsFlag_print;
+asn_constr_check_f RANAP_HigherBitratesThan16MbpsFlag_constraint;
+ber_type_decoder_f RANAP_HigherBitratesThan16MbpsFlag_decode_ber;
+der_type_encoder_f RANAP_HigherBitratesThan16MbpsFlag_encode_der;
+xer_type_decoder_f RANAP_HigherBitratesThan16MbpsFlag_decode_xer;
+xer_type_encoder_f RANAP_HigherBitratesThan16MbpsFlag_encode_xer;
+per_type_decoder_f RANAP_HigherBitratesThan16MbpsFlag_decode_uper;
+per_type_encoder_f RANAP_HigherBitratesThan16MbpsFlag_encode_uper;
+per_type_decoder_f RANAP_HigherBitratesThan16MbpsFlag_decode_aper;
+per_type_encoder_f RANAP_HigherBitratesThan16MbpsFlag_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HigherBitratesThan16MbpsFlag_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HorizontalSpeedAndBearing.c b/src/ranap/RANAP_HorizontalSpeedAndBearing.c
new file mode 100644
index 0000000..f952f54
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalSpeedAndBearing.c
@@ -0,0 +1,131 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HorizontalSpeedAndBearing.h"
+
+static int
+memb_bearing_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 359l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_horizontalSpeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 2047l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_bearing_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 9,  9,  0l,  359l }	/* (0..359) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_horizontalSpeed_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 11,  11,  0l,  2047l }	/* (0..2047) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_HorizontalSpeedAndBearing_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalSpeedAndBearing, bearing),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_bearing_constraint_1,
+		&asn_PER_memb_bearing_constr_2,
+		0,
+		"bearing"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalSpeedAndBearing, horizontalSpeed),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_horizontalSpeed_constraint_1,
+		&asn_PER_memb_horizontalSpeed_constr_3,
+		0,
+		"horizontalSpeed"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_HorizontalSpeedAndBearing_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* bearing */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* horizontalSpeed */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_HorizontalSpeedAndBearing_specs_1 = {
+	sizeof(struct RANAP_HorizontalSpeedAndBearing),
+	offsetof(struct RANAP_HorizontalSpeedAndBearing, _asn_ctx),
+	asn_MAP_RANAP_HorizontalSpeedAndBearing_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalSpeedAndBearing = {
+	"RANAP_HorizontalSpeedAndBearing",
+	"RANAP_HorizontalSpeedAndBearing",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1,
+	sizeof(asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalSpeedAndBearing_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_HorizontalSpeedAndBearing_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_HorizontalSpeedAndBearing_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_HorizontalSpeedAndBearing.h b/src/ranap/RANAP_HorizontalSpeedAndBearing.h
new file mode 100644
index 0000000..9800231
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalSpeedAndBearing.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HorizontalSpeedAndBearing_H_
+#define	_RANAP_HorizontalSpeedAndBearing_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_HorizontalSpeedAndBearing */
+typedef struct RANAP_HorizontalSpeedAndBearing {
+	long	 bearing;
+	long	 horizontalSpeed;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_HorizontalSpeedAndBearing_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalSpeedAndBearing;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HorizontalSpeedAndBearing_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HorizontalVelocity.c b/src/ranap/RANAP_HorizontalVelocity.c
new file mode 100644
index 0000000..fd51800
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalVelocity.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HorizontalVelocity.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_HorizontalVelocity_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalVelocity, horizontalSpeedAndBearing),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalSpeedAndBearing,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalSpeedAndBearing"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_HorizontalVelocity, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_HorizontalVelocity_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_HorizontalVelocity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_HorizontalVelocity_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horizontalSpeedAndBearing */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_HorizontalVelocity_specs_1 = {
+	sizeof(struct RANAP_HorizontalVelocity),
+	offsetof(struct RANAP_HorizontalVelocity, _asn_ctx),
+	asn_MAP_RANAP_HorizontalVelocity_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_HorizontalVelocity_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalVelocity = {
+	"RANAP_HorizontalVelocity",
+	"RANAP_HorizontalVelocity",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HorizontalVelocity_tags_1,
+	sizeof(asn_DEF_RANAP_HorizontalVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalVelocity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HorizontalVelocity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HorizontalVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalVelocity_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_HorizontalVelocity_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_HorizontalVelocity_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_HorizontalVelocity.h b/src/ranap/RANAP_HorizontalVelocity.h
new file mode 100644
index 0000000..eb7b2e6
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalVelocity.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HorizontalVelocity_H_
+#define	_RANAP_HorizontalVelocity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_HorizontalSpeedAndBearing.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_HorizontalVelocity */
+typedef struct RANAP_HorizontalVelocity {
+	RANAP_HorizontalSpeedAndBearing_t	 horizontalSpeedAndBearing;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_HorizontalVelocity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalVelocity;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HorizontalVelocity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HorizontalVelocityWithUncertainty.c b/src/ranap/RANAP_HorizontalVelocityWithUncertainty.c
new file mode 100644
index 0000000..12a53b2
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalVelocityWithUncertainty.c
@@ -0,0 +1,113 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HorizontalVelocityWithUncertainty.h"
+
+static int
+memb_uncertaintySpeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_uncertaintySpeed_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_HorizontalVelocityWithUncertainty_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalVelocityWithUncertainty, horizontalSpeedAndBearing),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalSpeedAndBearing,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalSpeedAndBearing"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalVelocityWithUncertainty, uncertaintySpeed),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_uncertaintySpeed_constraint_1,
+		&asn_PER_memb_uncertaintySpeed_constr_3,
+		0,
+		"uncertaintySpeed"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_HorizontalVelocityWithUncertainty, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_HorizontalVelocityWithUncertainty_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_HorizontalVelocityWithUncertainty_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horizontalSpeedAndBearing */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uncertaintySpeed */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_HorizontalVelocityWithUncertainty_specs_1 = {
+	sizeof(struct RANAP_HorizontalVelocityWithUncertainty),
+	offsetof(struct RANAP_HorizontalVelocityWithUncertainty, _asn_ctx),
+	asn_MAP_RANAP_HorizontalVelocityWithUncertainty_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_HorizontalVelocityWithUncertainty_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalVelocityWithUncertainty = {
+	"RANAP_HorizontalVelocityWithUncertainty",
+	"RANAP_HorizontalVelocityWithUncertainty",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1,
+	sizeof(asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalVelocityWithUncertainty_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_HorizontalVelocityWithUncertainty_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_HorizontalVelocityWithUncertainty_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_HorizontalVelocityWithUncertainty.h b/src/ranap/RANAP_HorizontalVelocityWithUncertainty.h
new file mode 100644
index 0000000..af8d312
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalVelocityWithUncertainty.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HorizontalVelocityWithUncertainty_H_
+#define	_RANAP_HorizontalVelocityWithUncertainty_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_HorizontalSpeedAndBearing.h"
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_HorizontalVelocityWithUncertainty */
+typedef struct RANAP_HorizontalVelocityWithUncertainty {
+	RANAP_HorizontalSpeedAndBearing_t	 horizontalSpeedAndBearing;
+	long	 uncertaintySpeed;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_HorizontalVelocityWithUncertainty_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalVelocityWithUncertainty;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HorizontalVelocityWithUncertainty_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HorizontalWithVerticalVelocity.c b/src/ranap/RANAP_HorizontalWithVerticalVelocity.c
new file mode 100644
index 0000000..bf3e129
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalWithVerticalVelocity.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HorizontalWithVerticalVelocity.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_HorizontalWithVerticalVelocity_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalWithVerticalVelocity, horizontalSpeedAndBearing),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalSpeedAndBearing,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalSpeedAndBearing"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalWithVerticalVelocity, veritcalVelocity),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_VerticalVelocity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"veritcalVelocity"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_HorizontalWithVerticalVelocity, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_HorizontalWithVerticalVelocity_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_HorizontalWithVerticalVelocity_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horizontalSpeedAndBearing */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* veritcalVelocity */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_HorizontalWithVerticalVelocity_specs_1 = {
+	sizeof(struct RANAP_HorizontalWithVerticalVelocity),
+	offsetof(struct RANAP_HorizontalWithVerticalVelocity, _asn_ctx),
+	asn_MAP_RANAP_HorizontalWithVerticalVelocity_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_HorizontalWithVerticalVelocity_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalWithVerticalVelocity = {
+	"RANAP_HorizontalWithVerticalVelocity",
+	"RANAP_HorizontalWithVerticalVelocity",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1,
+	sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocity_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_HorizontalWithVerticalVelocity_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_HorizontalWithVerticalVelocity_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_HorizontalWithVerticalVelocity.h b/src/ranap/RANAP_HorizontalWithVerticalVelocity.h
new file mode 100644
index 0000000..129877c
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalWithVerticalVelocity.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HorizontalWithVerticalVelocity_H_
+#define	_RANAP_HorizontalWithVerticalVelocity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_HorizontalSpeedAndBearing.h"
+#include "RANAP_VerticalVelocity.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_HorizontalWithVerticalVelocity */
+typedef struct RANAP_HorizontalWithVerticalVelocity {
+	RANAP_HorizontalSpeedAndBearing_t	 horizontalSpeedAndBearing;
+	RANAP_VerticalVelocity_t	 veritcalVelocity;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_HorizontalWithVerticalVelocity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalWithVerticalVelocity;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HorizontalWithVerticalVelocity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_HorizontalWithVerticalVelocityAndUncertainty.c b/src/ranap/RANAP_HorizontalWithVerticalVelocityAndUncertainty.c
new file mode 100644
index 0000000..ad8ef4c
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalWithVerticalVelocityAndUncertainty.c
@@ -0,0 +1,163 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_HorizontalWithVerticalVelocityAndUncertainty.h"
+
+static int
+memb_horizontalUncertaintySpeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_verticalUncertaintySpeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_horizontalUncertaintySpeed_constr_4 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_verticalUncertaintySpeed_constr_5 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_HorizontalWithVerticalVelocityAndUncertainty_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty, horizontalSpeedAndBearing),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalSpeedAndBearing,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalSpeedAndBearing"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty, veritcalVelocity),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_VerticalVelocity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"veritcalVelocity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty, horizontalUncertaintySpeed),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_horizontalUncertaintySpeed_constraint_1,
+		&asn_PER_memb_horizontalUncertaintySpeed_constr_4,
+		0,
+		"horizontalUncertaintySpeed"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty, verticalUncertaintySpeed),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_verticalUncertaintySpeed_constraint_1,
+		&asn_PER_memb_verticalUncertaintySpeed_constr_5,
+		0,
+		"verticalUncertaintySpeed"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_HorizontalWithVerticalVelocityAndUncertainty_oms_1[] = { 4 };
+static const ber_tlv_tag_t asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horizontalSpeedAndBearing */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* veritcalVelocity */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* horizontalUncertaintySpeed */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* verticalUncertaintySpeed */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_HorizontalWithVerticalVelocityAndUncertainty_specs_1 = {
+	sizeof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty),
+	offsetof(struct RANAP_HorizontalWithVerticalVelocityAndUncertainty, _asn_ctx),
+	asn_MAP_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_RANAP_HorizontalWithVerticalVelocityAndUncertainty_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty = {
+	"RANAP_HorizontalWithVerticalVelocityAndUncertainty",
+	"RANAP_HorizontalWithVerticalVelocityAndUncertainty",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1,
+	sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1)
+		/sizeof(asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_HorizontalWithVerticalVelocityAndUncertainty_1,
+	5,	/* Elements count */
+	&asn_SPC_RANAP_HorizontalWithVerticalVelocityAndUncertainty_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_HorizontalWithVerticalVelocityAndUncertainty.h b/src/ranap/RANAP_HorizontalWithVerticalVelocityAndUncertainty.h
new file mode 100644
index 0000000..d75d63f
--- /dev/null
+++ b/src/ranap/RANAP_HorizontalWithVerticalVelocityAndUncertainty.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_HorizontalWithVerticalVelocityAndUncertainty_H_
+#define	_RANAP_HorizontalWithVerticalVelocityAndUncertainty_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_HorizontalSpeedAndBearing.h"
+#include "RANAP_VerticalVelocity.h"
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_HorizontalWithVerticalVelocityAndUncertainty */
+typedef struct RANAP_HorizontalWithVerticalVelocityAndUncertainty {
+	RANAP_HorizontalSpeedAndBearing_t	 horizontalSpeedAndBearing;
+	RANAP_VerticalVelocity_t	 veritcalVelocity;
+	long	 horizontalUncertaintySpeed;
+	long	 verticalUncertaintySpeed;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_HorizontalWithVerticalVelocityAndUncertainty_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_HorizontalWithVerticalVelocityAndUncertainty_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IE-Extensions.c b/src/ranap/RANAP_IE-Extensions.c
new file mode 100644
index 0000000..27de521
--- /dev/null
+++ b/src/ranap/RANAP_IE-Extensions.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IE-Extensions.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_IE_Extensions_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IE_Extensions_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IE_Extensions_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_IE_Extensions_specs_1 = {
+	sizeof(struct RANAP_IE_Extensions),
+	offsetof(struct RANAP_IE_Extensions, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IE_Extensions = {
+	"RANAP_IE-Extensions",
+	"RANAP_IE-Extensions",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IE_Extensions_tags_1,
+	sizeof(asn_DEF_RANAP_IE_Extensions_tags_1)
+		/sizeof(asn_DEF_RANAP_IE_Extensions_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IE_Extensions_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IE_Extensions_tags_1)
+		/sizeof(asn_DEF_RANAP_IE_Extensions_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IE_Extensions_constr_1,
+	asn_MBR_RANAP_IE_Extensions_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_IE_Extensions_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IE-Extensions.h b/src/ranap/RANAP_IE-Extensions.h
new file mode 100644
index 0000000..3866186
--- /dev/null
+++ b/src/ranap/RANAP_IE-Extensions.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IE_Extensions_H_
+#define	_RANAP_IE_Extensions_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IE-Extensions */
+typedef struct RANAP_IE_Extensions {
+	A_SEQUENCE_OF(RANAP_IE_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IE_Extensions_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IE_Extensions;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IE_Extensions_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IE.c b/src/ranap/RANAP_IE.c
new file mode 100644
index 0000000..050bd94
--- /dev/null
+++ b/src/ranap/RANAP_IE.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_IE.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_IE_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IE, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProtocolIE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IE, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IE, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IE_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IE_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_IE_specs_1 = {
+	sizeof(struct RANAP_IE),
+	offsetof(struct RANAP_IE, _asn_ctx),
+	asn_MAP_RANAP_IE_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IE = {
+	"RANAP_IE",
+	"RANAP_IE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IE_tags_1,
+	sizeof(asn_DEF_RANAP_IE_tags_1)
+		/sizeof(asn_DEF_RANAP_IE_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IE_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IE_tags_1)
+		/sizeof(asn_DEF_RANAP_IE_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_IE_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_IE_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IE.h b/src/ranap/RANAP_IE.h
new file mode 100644
index 0000000..e5e23d4
--- /dev/null
+++ b/src/ranap/RANAP_IE.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_IE_H_
+#define	_RANAP_IE_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ProtocolIE-ID.h"
+#include "RANAP_Criticality.h"
+#include <ANY.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IE */
+typedef struct RANAP_IE {
+	RANAP_ProtocolIE_ID_t	 id;
+	RANAP_Criticality_t	 criticality;
+	ANY_t	 value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IE_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IE;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IE_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMEI.c b/src/ranap/RANAP_IMEI.c
new file mode 100644
index 0000000..92956be
--- /dev/null
+++ b/src/ranap/RANAP_IMEI.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMEI.h"
+
+int
+RANAP_IMEI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IMEI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_IMEI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IMEI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMEI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IMEI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMEI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IMEI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMEI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IMEI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IMEI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IMEI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IMEI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IMEI_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IMEI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMEI = {
+	"RANAP_IMEI",
+	"RANAP_IMEI",
+	RANAP_IMEI_free,
+	RANAP_IMEI_print,
+	RANAP_IMEI_constraint,
+	RANAP_IMEI_decode_ber,
+	RANAP_IMEI_encode_der,
+	RANAP_IMEI_decode_xer,
+	RANAP_IMEI_encode_xer,
+	RANAP_IMEI_decode_uper,
+	RANAP_IMEI_encode_uper,
+	RANAP_IMEI_decode_aper,
+	RANAP_IMEI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IMEI_tags_1,
+	sizeof(asn_DEF_RANAP_IMEI_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IMEI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IMEI_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IMEI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IMEI.h b/src/ranap/RANAP_IMEI.h
new file mode 100644
index 0000000..0416050
--- /dev/null
+++ b/src/ranap/RANAP_IMEI.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IMEI_H_
+#define	_RANAP_IMEI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMEI */
+typedef OCTET_STRING_t	 RANAP_IMEI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMEI;
+asn_struct_free_f RANAP_IMEI_free;
+asn_struct_print_f RANAP_IMEI_print;
+asn_constr_check_f RANAP_IMEI_constraint;
+ber_type_decoder_f RANAP_IMEI_decode_ber;
+der_type_encoder_f RANAP_IMEI_encode_der;
+xer_type_decoder_f RANAP_IMEI_decode_xer;
+xer_type_encoder_f RANAP_IMEI_encode_xer;
+per_type_decoder_f RANAP_IMEI_decode_uper;
+per_type_encoder_f RANAP_IMEI_encode_uper;
+per_type_decoder_f RANAP_IMEI_decode_aper;
+per_type_encoder_f RANAP_IMEI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMEI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMEIGroup.c b/src/ranap/RANAP_IMEIGroup.c
new file mode 100644
index 0000000..7f21f94
--- /dev/null
+++ b/src/ranap/RANAP_IMEIGroup.c
@@ -0,0 +1,119 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMEIGroup.h"
+
+static int
+memb_iMEIMask_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 7l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_iMEIMask_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  7l,  7l }	/* (SIZE(7..7)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IMEIGroup_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IMEIGroup, iMEI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMEI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IMEIGroup, iMEIMask),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_iMEIMask_constraint_1,
+		&asn_PER_memb_iMEIMask_constr_3,
+		0,
+		"iMEIMask"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_IMEIGroup, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_IMEIGroup_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_IMEIGroup_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IMEIGroup_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iMEI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iMEIMask */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_IMEIGroup_specs_1 = {
+	sizeof(struct RANAP_IMEIGroup),
+	offsetof(struct RANAP_IMEIGroup, _asn_ctx),
+	asn_MAP_RANAP_IMEIGroup_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_IMEIGroup_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMEIGroup = {
+	"RANAP_IMEIGroup",
+	"RANAP_IMEIGroup",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IMEIGroup_tags_1,
+	sizeof(asn_DEF_RANAP_IMEIGroup_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEIGroup_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IMEIGroup_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IMEIGroup_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEIGroup_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_IMEIGroup_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_IMEIGroup_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IMEIGroup.h b/src/ranap/RANAP_IMEIGroup.h
new file mode 100644
index 0000000..416d7c7
--- /dev/null
+++ b/src/ranap/RANAP_IMEIGroup.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IMEIGroup_H_
+#define	_RANAP_IMEIGroup_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMEI.h"
+#include <BIT_STRING.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMEIGroup */
+typedef struct RANAP_IMEIGroup {
+	RANAP_IMEI_t	 iMEI;
+	BIT_STRING_t	 iMEIMask;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IMEIGroup_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMEIGroup;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMEIGroup_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMEIList.c b/src/ranap/RANAP_IMEIList.c
new file mode 100644
index 0000000..643d88c
--- /dev/null
+++ b/src/ranap/RANAP_IMEIList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMEIList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_IMEIList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 6,  6,  1l,  64l }	/* (SIZE(1..64)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IMEIList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IMEI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IMEIList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_IMEIList_specs_1 = {
+	sizeof(struct RANAP_IMEIList),
+	offsetof(struct RANAP_IMEIList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMEIList = {
+	"RANAP_IMEIList",
+	"RANAP_IMEIList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IMEIList_tags_1,
+	sizeof(asn_DEF_RANAP_IMEIList_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEIList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IMEIList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IMEIList_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEIList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IMEIList_constr_1,
+	asn_MBR_RANAP_IMEIList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_IMEIList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IMEIList.h b/src/ranap/RANAP_IMEIList.h
new file mode 100644
index 0000000..07da405
--- /dev/null
+++ b/src/ranap/RANAP_IMEIList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IMEIList_H_
+#define	_RANAP_IMEIList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMEI.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMEIList */
+typedef struct RANAP_IMEIList {
+	A_SEQUENCE_OF(RANAP_IMEI_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IMEIList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMEIList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMEIList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMEISV.c b/src/ranap/RANAP_IMEISV.c
new file mode 100644
index 0000000..06dd575
--- /dev/null
+++ b/src/ranap/RANAP_IMEISV.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMEISV.h"
+
+int
+RANAP_IMEISV_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IMEISV_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_IMEISV_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IMEISV_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMEISV_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IMEISV_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMEISV_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IMEISV_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMEISV_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IMEISV_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IMEISV_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IMEISV_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IMEISV_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IMEISV_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IMEISV_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMEISV = {
+	"RANAP_IMEISV",
+	"RANAP_IMEISV",
+	RANAP_IMEISV_free,
+	RANAP_IMEISV_print,
+	RANAP_IMEISV_constraint,
+	RANAP_IMEISV_decode_ber,
+	RANAP_IMEISV_encode_der,
+	RANAP_IMEISV_decode_xer,
+	RANAP_IMEISV_encode_xer,
+	RANAP_IMEISV_decode_uper,
+	RANAP_IMEISV_encode_uper,
+	RANAP_IMEISV_decode_aper,
+	RANAP_IMEISV_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IMEISV_tags_1,
+	sizeof(asn_DEF_RANAP_IMEISV_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEISV_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IMEISV_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IMEISV_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEISV_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IMEISV_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IMEISV.h b/src/ranap/RANAP_IMEISV.h
new file mode 100644
index 0000000..2866172
--- /dev/null
+++ b/src/ranap/RANAP_IMEISV.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IMEISV_H_
+#define	_RANAP_IMEISV_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMEISV */
+typedef OCTET_STRING_t	 RANAP_IMEISV_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMEISV;
+asn_struct_free_f RANAP_IMEISV_free;
+asn_struct_print_f RANAP_IMEISV_print;
+asn_constr_check_f RANAP_IMEISV_constraint;
+ber_type_decoder_f RANAP_IMEISV_decode_ber;
+der_type_encoder_f RANAP_IMEISV_encode_der;
+xer_type_decoder_f RANAP_IMEISV_decode_xer;
+xer_type_encoder_f RANAP_IMEISV_encode_xer;
+per_type_decoder_f RANAP_IMEISV_decode_uper;
+per_type_encoder_f RANAP_IMEISV_encode_uper;
+per_type_decoder_f RANAP_IMEISV_decode_aper;
+per_type_encoder_f RANAP_IMEISV_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMEISV_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMEISVGroup.c b/src/ranap/RANAP_IMEISVGroup.c
new file mode 100644
index 0000000..3c6f036
--- /dev/null
+++ b/src/ranap/RANAP_IMEISVGroup.c
@@ -0,0 +1,119 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMEISVGroup.h"
+
+static int
+memb_iMEISVMask_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 7l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_iMEISVMask_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  7l,  7l }	/* (SIZE(7..7)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IMEISVGroup_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IMEISVGroup, iMEISV),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEISV,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMEISV"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IMEISVGroup, iMEISVMask),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_iMEISVMask_constraint_1,
+		&asn_PER_memb_iMEISVMask_constr_3,
+		0,
+		"iMEISVMask"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_IMEISVGroup, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_IMEISVGroup_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_IMEISVGroup_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IMEISVGroup_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iMEISV */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iMEISVMask */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_IMEISVGroup_specs_1 = {
+	sizeof(struct RANAP_IMEISVGroup),
+	offsetof(struct RANAP_IMEISVGroup, _asn_ctx),
+	asn_MAP_RANAP_IMEISVGroup_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_IMEISVGroup_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMEISVGroup = {
+	"RANAP_IMEISVGroup",
+	"RANAP_IMEISVGroup",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IMEISVGroup_tags_1,
+	sizeof(asn_DEF_RANAP_IMEISVGroup_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEISVGroup_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IMEISVGroup_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IMEISVGroup_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEISVGroup_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_IMEISVGroup_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_IMEISVGroup_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IMEISVGroup.h b/src/ranap/RANAP_IMEISVGroup.h
new file mode 100644
index 0000000..d1a423f
--- /dev/null
+++ b/src/ranap/RANAP_IMEISVGroup.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IMEISVGroup_H_
+#define	_RANAP_IMEISVGroup_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMEISV.h"
+#include <BIT_STRING.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMEISVGroup */
+typedef struct RANAP_IMEISVGroup {
+	RANAP_IMEISV_t	 iMEISV;
+	BIT_STRING_t	 iMEISVMask;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IMEISVGroup_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMEISVGroup;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMEISVGroup_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMEISVList.c b/src/ranap/RANAP_IMEISVList.c
new file mode 100644
index 0000000..6b19421
--- /dev/null
+++ b/src/ranap/RANAP_IMEISVList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMEISVList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_IMEISVList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 6,  6,  1l,  64l }	/* (SIZE(1..64)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IMEISVList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IMEISV,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IMEISVList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_IMEISVList_specs_1 = {
+	sizeof(struct RANAP_IMEISVList),
+	offsetof(struct RANAP_IMEISVList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMEISVList = {
+	"RANAP_IMEISVList",
+	"RANAP_IMEISVList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IMEISVList_tags_1,
+	sizeof(asn_DEF_RANAP_IMEISVList_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEISVList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IMEISVList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IMEISVList_tags_1)
+		/sizeof(asn_DEF_RANAP_IMEISVList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IMEISVList_constr_1,
+	asn_MBR_RANAP_IMEISVList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_IMEISVList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IMEISVList.h b/src/ranap/RANAP_IMEISVList.h
new file mode 100644
index 0000000..ebf9a63
--- /dev/null
+++ b/src/ranap/RANAP_IMEISVList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IMEISVList_H_
+#define	_RANAP_IMEISVList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMEISV.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMEISVList */
+typedef struct RANAP_IMEISVList {
+	A_SEQUENCE_OF(RANAP_IMEISV_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IMEISVList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMEISVList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMEISVList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IMSI.c b/src/ranap/RANAP_IMSI.c
new file mode 100644
index 0000000..89a85cd
--- /dev/null
+++ b/src/ranap/RANAP_IMSI.c
@@ -0,0 +1,162 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IMSI.h"
+
+int
+RANAP_IMSI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_RANAP_TBCD_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using RANAP_TBCD_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IMSI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_RANAP_TBCD_STRING.free_struct;
+	td->print_struct   = asn_DEF_RANAP_TBCD_STRING.print_struct;
+	td->check_constraints = asn_DEF_RANAP_TBCD_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_RANAP_TBCD_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_RANAP_TBCD_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_RANAP_TBCD_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_RANAP_TBCD_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_RANAP_TBCD_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_RANAP_TBCD_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_RANAP_TBCD_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_RANAP_TBCD_STRING.aper_encoder;
+	/* The next four lines are here because of -fknown-extern-type */
+	td->tags           = asn_DEF_RANAP_TBCD_STRING.tags;
+	td->tags_count     = asn_DEF_RANAP_TBCD_STRING.tags_count;
+	td->all_tags       = asn_DEF_RANAP_TBCD_STRING.all_tags;
+	td->all_tags_count = asn_DEF_RANAP_TBCD_STRING.all_tags_count;
+	/* End of these lines */
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_RANAP_TBCD_STRING.per_constraints;
+	td->elements       = asn_DEF_RANAP_TBCD_STRING.elements;
+	td->elements_count = asn_DEF_RANAP_TBCD_STRING.elements_count;
+	td->specifics      = asn_DEF_RANAP_TBCD_STRING.specifics;
+}
+
+void
+RANAP_IMSI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IMSI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMSI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IMSI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMSI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IMSI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IMSI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IMSI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IMSI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IMSI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IMSI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IMSI_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IMSI = {
+	"RANAP_IMSI",
+	"RANAP_IMSI",
+	RANAP_IMSI_free,
+	RANAP_IMSI_print,
+	RANAP_IMSI_constraint,
+	RANAP_IMSI_decode_ber,
+	RANAP_IMSI_encode_der,
+	RANAP_IMSI_decode_xer,
+	RANAP_IMSI_encode_xer,
+	RANAP_IMSI_decode_uper,
+	RANAP_IMSI_encode_uper,
+	RANAP_IMSI_decode_aper,
+	RANAP_IMSI_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_IMSI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IMSI.h b/src/ranap/RANAP_IMSI.h
new file mode 100644
index 0000000..6cf720d
--- /dev/null
+++ b/src/ranap/RANAP_IMSI.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+#include <constr_CHOICE.h>
+
+#ifndef	_RANAP_IMSI_H_
+#define	_RANAP_IMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TBCD-STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IMSI */
+typedef RANAP_TBCD_STRING_t	 RANAP_IMSI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IMSI;
+asn_struct_free_f RANAP_IMSI_free;
+asn_struct_print_f RANAP_IMSI_print;
+asn_constr_check_f RANAP_IMSI_constraint;
+ber_type_decoder_f RANAP_IMSI_decode_ber;
+der_type_encoder_f RANAP_IMSI_encode_der;
+xer_type_decoder_f RANAP_IMSI_decode_xer;
+xer_type_encoder_f RANAP_IMSI_encode_xer;
+per_type_decoder_f RANAP_IMSI_decode_uper;
+per_type_encoder_f RANAP_IMSI_encode_uper;
+per_type_decoder_f RANAP_IMSI_decode_aper;
+per_type_encoder_f RANAP_IMSI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IPMulticastAddress.c b/src/ranap/RANAP_IPMulticastAddress.c
new file mode 100644
index 0000000..7efb111
--- /dev/null
+++ b/src/ranap/RANAP_IPMulticastAddress.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IPMulticastAddress.h"
+
+int
+RANAP_IPMulticastAddress_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 4l && size <= 16l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_IPMulticastAddress_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IPMulticastAddress_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IPMulticastAddress_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IPMulticastAddress_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IPMulticastAddress_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IPMulticastAddress_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IPMulticastAddress_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IPMulticastAddress_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IPMulticastAddress_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IPMulticastAddress_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IPMulticastAddress_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IPMulticastAddress_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  4l,  16l }	/* (SIZE(4..16)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IPMulticastAddress_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IPMulticastAddress = {
+	"RANAP_IPMulticastAddress",
+	"RANAP_IPMulticastAddress",
+	RANAP_IPMulticastAddress_free,
+	RANAP_IPMulticastAddress_print,
+	RANAP_IPMulticastAddress_constraint,
+	RANAP_IPMulticastAddress_decode_ber,
+	RANAP_IPMulticastAddress_encode_der,
+	RANAP_IPMulticastAddress_decode_xer,
+	RANAP_IPMulticastAddress_encode_xer,
+	RANAP_IPMulticastAddress_decode_uper,
+	RANAP_IPMulticastAddress_encode_uper,
+	RANAP_IPMulticastAddress_decode_aper,
+	RANAP_IPMulticastAddress_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IPMulticastAddress_tags_1,
+	sizeof(asn_DEF_RANAP_IPMulticastAddress_tags_1)
+		/sizeof(asn_DEF_RANAP_IPMulticastAddress_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IPMulticastAddress_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IPMulticastAddress_tags_1)
+		/sizeof(asn_DEF_RANAP_IPMulticastAddress_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IPMulticastAddress_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IPMulticastAddress.h b/src/ranap/RANAP_IPMulticastAddress.h
new file mode 100644
index 0000000..8724d11
--- /dev/null
+++ b/src/ranap/RANAP_IPMulticastAddress.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IPMulticastAddress_H_
+#define	_RANAP_IPMulticastAddress_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IPMulticastAddress */
+typedef OCTET_STRING_t	 RANAP_IPMulticastAddress_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IPMulticastAddress;
+asn_struct_free_f RANAP_IPMulticastAddress_free;
+asn_struct_print_f RANAP_IPMulticastAddress_print;
+asn_constr_check_f RANAP_IPMulticastAddress_constraint;
+ber_type_decoder_f RANAP_IPMulticastAddress_decode_ber;
+der_type_encoder_f RANAP_IPMulticastAddress_encode_der;
+xer_type_decoder_f RANAP_IPMulticastAddress_decode_xer;
+xer_type_encoder_f RANAP_IPMulticastAddress_encode_xer;
+per_type_decoder_f RANAP_IPMulticastAddress_decode_uper;
+per_type_encoder_f RANAP_IPMulticastAddress_encode_uper;
+per_type_decoder_f RANAP_IPMulticastAddress_decode_aper;
+per_type_encoder_f RANAP_IPMulticastAddress_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IPMulticastAddress_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IRAT-Measurement-Configuration.c b/src/ranap/RANAP_IRAT-Measurement-Configuration.c
new file mode 100644
index 0000000..257f282
--- /dev/null
+++ b/src/ranap/RANAP_IRAT-Measurement-Configuration.c
@@ -0,0 +1,153 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IRAT-Measurement-Configuration.h"
+
+static int
+memb_rSRP_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 97l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_rSRQ_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 34l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_rSRP_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  97l }	/* (0..97) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rSRQ_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 6,  6,  0l,  34l }	/* (0..34) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IRAT_Measurement_Configuration_1[] = {
+	{ ATF_POINTER, 2, offsetof(struct RANAP_IRAT_Measurement_Configuration, rSRP),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_rSRP_constraint_1,
+		&asn_PER_memb_rSRP_constr_2,
+		0,
+		"rSRP"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_IRAT_Measurement_Configuration, rSRQ),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_rSRQ_constraint_1,
+		&asn_PER_memb_rSRQ_constr_3,
+		0,
+		"rSRQ"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IRAT_Measurement_Configuration, iRATmeasurementParameters),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IRATmeasurementParameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iRATmeasurementParameters"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_IRAT_Measurement_Configuration, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_IRAT_Measurement_Configuration_oms_1[] = { 0, 1, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IRAT_Measurement_Configuration_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rSRP */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rSRQ */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* iRATmeasurementParameters */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_IRAT_Measurement_Configuration_specs_1 = {
+	sizeof(struct RANAP_IRAT_Measurement_Configuration),
+	offsetof(struct RANAP_IRAT_Measurement_Configuration, _asn_ctx),
+	asn_MAP_RANAP_IRAT_Measurement_Configuration_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_IRAT_Measurement_Configuration_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IRAT_Measurement_Configuration = {
+	"RANAP_IRAT-Measurement-Configuration",
+	"RANAP_IRAT-Measurement-Configuration",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1,
+	sizeof(asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1)
+		/sizeof(asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1)
+		/sizeof(asn_DEF_RANAP_IRAT_Measurement_Configuration_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_IRAT_Measurement_Configuration_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_IRAT_Measurement_Configuration_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IRAT-Measurement-Configuration.h b/src/ranap/RANAP_IRAT-Measurement-Configuration.h
new file mode 100644
index 0000000..2feb139
--- /dev/null
+++ b/src/ranap/RANAP_IRAT-Measurement-Configuration.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IRAT_Measurement_Configuration_H_
+#define	_RANAP_IRAT_Measurement_Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "RANAP_IRATmeasurementParameters.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IRAT-Measurement-Configuration */
+typedef struct RANAP_IRAT_Measurement_Configuration {
+	long	*rSRP	/* OPTIONAL */;
+	long	*rSRQ	/* OPTIONAL */;
+	RANAP_IRATmeasurementParameters_t	 iRATmeasurementParameters;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IRAT_Measurement_Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IRAT_Measurement_Configuration;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IRAT_Measurement_Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IRATmeasurementParameters.c b/src/ranap/RANAP_IRATmeasurementParameters.c
new file mode 100644
index 0000000..d558177
--- /dev/null
+++ b/src/ranap/RANAP_IRATmeasurementParameters.c
@@ -0,0 +1,113 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IRATmeasurementParameters.h"
+
+static int
+memb_measurementDuration_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 100l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_measurementDuration_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  1l,  100l }	/* (1..100) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IRATmeasurementParameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IRATmeasurementParameters, measurementDuration),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_measurementDuration_constraint_1,
+		&asn_PER_memb_measurementDuration_constr_2,
+		0,
+		"measurementDuration"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_IRATmeasurementParameters, eUTRANFrequencies),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_EUTRANFrequencies,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"eUTRANFrequencies"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_IRATmeasurementParameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_IRATmeasurementParameters_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_IRATmeasurementParameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IRATmeasurementParameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* measurementDuration */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* eUTRANFrequencies */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_IRATmeasurementParameters_specs_1 = {
+	sizeof(struct RANAP_IRATmeasurementParameters),
+	offsetof(struct RANAP_IRATmeasurementParameters, _asn_ctx),
+	asn_MAP_RANAP_IRATmeasurementParameters_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_IRATmeasurementParameters_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IRATmeasurementParameters = {
+	"RANAP_IRATmeasurementParameters",
+	"RANAP_IRATmeasurementParameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IRATmeasurementParameters_tags_1,
+	sizeof(asn_DEF_RANAP_IRATmeasurementParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_IRATmeasurementParameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IRATmeasurementParameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IRATmeasurementParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_IRATmeasurementParameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_IRATmeasurementParameters_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_IRATmeasurementParameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IRATmeasurementParameters.h b/src/ranap/RANAP_IRATmeasurementParameters.h
new file mode 100644
index 0000000..740585f
--- /dev/null
+++ b/src/ranap/RANAP_IRATmeasurementParameters.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IRATmeasurementParameters_H_
+#define	_RANAP_IRATmeasurementParameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "RANAP_EUTRANFrequencies.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IRATmeasurementParameters */
+typedef struct RANAP_IRATmeasurementParameters {
+	long	 measurementDuration;
+	RANAP_EUTRANFrequencies_t	*eUTRANFrequencies	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IRATmeasurementParameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IRATmeasurementParameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IRATmeasurementParameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ImmediateMDT.c b/src/ranap/RANAP_ImmediateMDT.c
new file mode 100644
index 0000000..43cc167
--- /dev/null
+++ b/src/ranap/RANAP_ImmediateMDT.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ImmediateMDT.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_ImmediateMDT_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ImmediateMDT, measurementsToActivate),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MeasurementsToActivate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"measurementsToActivate"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_ImmediateMDT, m1report),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_M1Report,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m1report"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_ImmediateMDT, m2report),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_M2Report,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m2report"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_ImmediateMDT, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_ImmediateMDT_oms_1[] = { 1, 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_ImmediateMDT_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ImmediateMDT_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* measurementsToActivate */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* m1report */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* m2report */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ImmediateMDT_specs_1 = {
+	sizeof(struct RANAP_ImmediateMDT),
+	offsetof(struct RANAP_ImmediateMDT, _asn_ctx),
+	asn_MAP_RANAP_ImmediateMDT_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_ImmediateMDT_oms_1,	/* Optional members */
+	2, 1,	/* Root/Additions */
+	2,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ImmediateMDT = {
+	"RANAP_ImmediateMDT",
+	"RANAP_ImmediateMDT",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ImmediateMDT_tags_1,
+	sizeof(asn_DEF_RANAP_ImmediateMDT_tags_1)
+		/sizeof(asn_DEF_RANAP_ImmediateMDT_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ImmediateMDT_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ImmediateMDT_tags_1)
+		/sizeof(asn_DEF_RANAP_ImmediateMDT_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ImmediateMDT_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_ImmediateMDT_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ImmediateMDT.h b/src/ranap/RANAP_ImmediateMDT.h
new file mode 100644
index 0000000..65a64f7
--- /dev/null
+++ b/src/ranap/RANAP_ImmediateMDT.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ImmediateMDT_H_
+#define	_RANAP_ImmediateMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MeasurementsToActivate.h"
+#include "RANAP_M1Report.h"
+#include "RANAP_M2Report.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ImmediateMDT */
+typedef struct RANAP_ImmediateMDT {
+	RANAP_MeasurementsToActivate_t	 measurementsToActivate;
+	RANAP_M1Report_t	*m1report	/* OPTIONAL */;
+	RANAP_M2Report_t	*m2report	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ImmediateMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ImmediateMDT;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ImmediateMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IncludeVelocity.c b/src/ranap/RANAP_IncludeVelocity.c
new file mode 100644
index 0000000..66d3eb0
--- /dev/null
+++ b/src/ranap/RANAP_IncludeVelocity.c
@@ -0,0 +1,163 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IncludeVelocity.h"
+
+int
+RANAP_IncludeVelocity_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_IncludeVelocity_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IncludeVelocity_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IncludeVelocity_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IncludeVelocity_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IncludeVelocity_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IncludeVelocity_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IncludeVelocity_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IncludeVelocity_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IncludeVelocity_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IncludeVelocity_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IncludeVelocity_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IncludeVelocity_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 0,  0,  0l,  0l }	/* (0..0) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_IncludeVelocity_value2enum_1[] = {
+	{ 0,	9,	"requested" }
+};
+static const unsigned int asn_MAP_RANAP_IncludeVelocity_enum2value_1[] = {
+	0	/* requested(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_IncludeVelocity_specs_1 = {
+	asn_MAP_RANAP_IncludeVelocity_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_IncludeVelocity_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IncludeVelocity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IncludeVelocity = {
+	"RANAP_IncludeVelocity",
+	"RANAP_IncludeVelocity",
+	RANAP_IncludeVelocity_free,
+	RANAP_IncludeVelocity_print,
+	RANAP_IncludeVelocity_constraint,
+	RANAP_IncludeVelocity_decode_ber,
+	RANAP_IncludeVelocity_encode_der,
+	RANAP_IncludeVelocity_decode_xer,
+	RANAP_IncludeVelocity_encode_xer,
+	RANAP_IncludeVelocity_decode_uper,
+	RANAP_IncludeVelocity_encode_uper,
+	RANAP_IncludeVelocity_decode_aper,
+	RANAP_IncludeVelocity_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IncludeVelocity_tags_1,
+	sizeof(asn_DEF_RANAP_IncludeVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_IncludeVelocity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IncludeVelocity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IncludeVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_IncludeVelocity_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IncludeVelocity_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_IncludeVelocity_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IncludeVelocity.h b/src/ranap/RANAP_IncludeVelocity.h
new file mode 100644
index 0000000..913d320
--- /dev/null
+++ b/src/ranap/RANAP_IncludeVelocity.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IncludeVelocity_H_
+#define	_RANAP_IncludeVelocity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_IncludeVelocity {
+	RANAP_IncludeVelocity_requested	= 0
+} e_RANAP_IncludeVelocity;
+
+/* RANAP_IncludeVelocity */
+typedef long	 RANAP_IncludeVelocity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IncludeVelocity;
+asn_struct_free_f RANAP_IncludeVelocity_free;
+asn_struct_print_f RANAP_IncludeVelocity_print;
+asn_constr_check_f RANAP_IncludeVelocity_constraint;
+ber_type_decoder_f RANAP_IncludeVelocity_decode_ber;
+der_type_encoder_f RANAP_IncludeVelocity_encode_der;
+xer_type_decoder_f RANAP_IncludeVelocity_decode_xer;
+xer_type_encoder_f RANAP_IncludeVelocity_encode_xer;
+per_type_decoder_f RANAP_IncludeVelocity_decode_uper;
+per_type_encoder_f RANAP_IncludeVelocity_encode_uper;
+per_type_decoder_f RANAP_IncludeVelocity_decode_aper;
+per_type_encoder_f RANAP_IncludeVelocity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IncludeVelocity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationExchangeID.c b/src/ranap/RANAP_InformationExchangeID.c
new file mode 100644
index 0000000..6b144ec
--- /dev/null
+++ b/src/ranap/RANAP_InformationExchangeID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InformationExchangeID.h"
+
+int
+RANAP_InformationExchangeID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 1048575l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_InformationExchangeID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_InformationExchangeID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_InformationExchangeID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_InformationExchangeID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 20, -1,  0l,  1048575l }	/* (0..1048575) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InformationExchangeID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationExchangeID = {
+	"RANAP_InformationExchangeID",
+	"RANAP_InformationExchangeID",
+	RANAP_InformationExchangeID_free,
+	RANAP_InformationExchangeID_print,
+	RANAP_InformationExchangeID_constraint,
+	RANAP_InformationExchangeID_decode_ber,
+	RANAP_InformationExchangeID_encode_der,
+	RANAP_InformationExchangeID_decode_xer,
+	RANAP_InformationExchangeID_encode_xer,
+	RANAP_InformationExchangeID_decode_uper,
+	RANAP_InformationExchangeID_encode_uper,
+	RANAP_InformationExchangeID_decode_aper,
+	RANAP_InformationExchangeID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InformationExchangeID_tags_1,
+	sizeof(asn_DEF_RANAP_InformationExchangeID_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationExchangeID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InformationExchangeID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InformationExchangeID_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationExchangeID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_InformationExchangeID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_InformationExchangeID.h b/src/ranap/RANAP_InformationExchangeID.h
new file mode 100644
index 0000000..a5aac13
--- /dev/null
+++ b/src/ranap/RANAP_InformationExchangeID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InformationExchangeID_H_
+#define	_RANAP_InformationExchangeID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InformationExchangeID */
+typedef long	 RANAP_InformationExchangeID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationExchangeID;
+asn_struct_free_f RANAP_InformationExchangeID_free;
+asn_struct_print_f RANAP_InformationExchangeID_print;
+asn_constr_check_f RANAP_InformationExchangeID_constraint;
+ber_type_decoder_f RANAP_InformationExchangeID_decode_ber;
+der_type_encoder_f RANAP_InformationExchangeID_encode_der;
+xer_type_decoder_f RANAP_InformationExchangeID_decode_xer;
+xer_type_encoder_f RANAP_InformationExchangeID_encode_xer;
+per_type_decoder_f RANAP_InformationExchangeID_decode_uper;
+per_type_encoder_f RANAP_InformationExchangeID_encode_uper;
+per_type_decoder_f RANAP_InformationExchangeID_decode_aper;
+per_type_encoder_f RANAP_InformationExchangeID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationExchangeID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationExchangeType.c b/src/ranap/RANAP_InformationExchangeType.c
new file mode 100644
index 0000000..dce099e
--- /dev/null
+++ b/src/ranap/RANAP_InformationExchangeType.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InformationExchangeType.h"
+
+int
+RANAP_InformationExchangeType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_InformationExchangeType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_InformationExchangeType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_InformationExchangeType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_InformationExchangeType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_InformationExchangeType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_InformationExchangeType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_InformationExchangeType_value2enum_1[] = {
+	{ 0,	8,	"transfer" },
+	{ 1,	7,	"request" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_InformationExchangeType_enum2value_1[] = {
+	1,	/* request(1) */
+	0	/* transfer(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_InformationExchangeType_specs_1 = {
+	asn_MAP_RANAP_InformationExchangeType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_InformationExchangeType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InformationExchangeType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationExchangeType = {
+	"RANAP_InformationExchangeType",
+	"RANAP_InformationExchangeType",
+	RANAP_InformationExchangeType_free,
+	RANAP_InformationExchangeType_print,
+	RANAP_InformationExchangeType_constraint,
+	RANAP_InformationExchangeType_decode_ber,
+	RANAP_InformationExchangeType_encode_der,
+	RANAP_InformationExchangeType_decode_xer,
+	RANAP_InformationExchangeType_encode_xer,
+	RANAP_InformationExchangeType_decode_uper,
+	RANAP_InformationExchangeType_encode_uper,
+	RANAP_InformationExchangeType_decode_aper,
+	RANAP_InformationExchangeType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InformationExchangeType_tags_1,
+	sizeof(asn_DEF_RANAP_InformationExchangeType_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationExchangeType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InformationExchangeType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InformationExchangeType_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationExchangeType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_InformationExchangeType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_InformationExchangeType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationExchangeType.h b/src/ranap/RANAP_InformationExchangeType.h
new file mode 100644
index 0000000..57d05b9
--- /dev/null
+++ b/src/ranap/RANAP_InformationExchangeType.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InformationExchangeType_H_
+#define	_RANAP_InformationExchangeType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_InformationExchangeType {
+	RANAP_InformationExchangeType_transfer	= 0,
+	RANAP_InformationExchangeType_request	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_InformationExchangeType;
+
+/* RANAP_InformationExchangeType */
+typedef long	 RANAP_InformationExchangeType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationExchangeType;
+asn_struct_free_f RANAP_InformationExchangeType_free;
+asn_struct_print_f RANAP_InformationExchangeType_print;
+asn_constr_check_f RANAP_InformationExchangeType_constraint;
+ber_type_decoder_f RANAP_InformationExchangeType_decode_ber;
+der_type_encoder_f RANAP_InformationExchangeType_encode_der;
+xer_type_decoder_f RANAP_InformationExchangeType_decode_xer;
+xer_type_encoder_f RANAP_InformationExchangeType_encode_xer;
+per_type_decoder_f RANAP_InformationExchangeType_decode_uper;
+per_type_encoder_f RANAP_InformationExchangeType_encode_uper;
+per_type_decoder_f RANAP_InformationExchangeType_decode_aper;
+per_type_encoder_f RANAP_InformationExchangeType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationExchangeType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationRequestType.c b/src/ranap/RANAP_InformationRequestType.c
new file mode 100644
index 0000000..ae38503
--- /dev/null
+++ b/src/ranap/RANAP_InformationRequestType.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InformationRequestType.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_InformationRequestType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_InformationRequestType_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationRequestType, choice.mBMSIPMulticastAddressandAPNRequest),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"mBMSIPMulticastAddressandAPNRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationRequestType, choice.permanentNAS_UE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_PermanentNAS_UE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"permanentNAS-UE-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InformationRequestType_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* mBMSIPMulticastAddressandAPNRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* permanentNAS-UE-ID */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_InformationRequestType_specs_1 = {
+	sizeof(struct RANAP_InformationRequestType),
+	offsetof(struct RANAP_InformationRequestType, _asn_ctx),
+	offsetof(struct RANAP_InformationRequestType, present),
+	sizeof(((struct RANAP_InformationRequestType *)0)->present),
+	asn_MAP_RANAP_InformationRequestType_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationRequestType = {
+	"RANAP_InformationRequestType",
+	"RANAP_InformationRequestType",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_InformationRequestType_constr_1,
+	asn_MBR_RANAP_InformationRequestType_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_InformationRequestType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationRequestType.h b/src/ranap/RANAP_InformationRequestType.h
new file mode 100644
index 0000000..9fbbc10
--- /dev/null
+++ b/src/ranap/RANAP_InformationRequestType.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InformationRequestType_H_
+#define	_RANAP_InformationRequestType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MBMSIPMulticastAddressandAPNRequest.h"
+#include "RANAP_PermanentNAS-UE-ID.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_InformationRequestType_PR {
+	RANAP_InformationRequestType_PR_NOTHING,	/* No components present */
+	RANAP_InformationRequestType_PR_mBMSIPMulticastAddressandAPNRequest,
+	RANAP_InformationRequestType_PR_permanentNAS_UE_ID,
+	/* Extensions may appear below */
+	
+} RANAP_InformationRequestType_PR;
+
+/* RANAP_InformationRequestType */
+typedef struct RANAP_InformationRequestType {
+	RANAP_InformationRequestType_PR present;
+	union RANAP_InformationRequestType_u {
+		RANAP_MBMSIPMulticastAddressandAPNRequest_t	 mBMSIPMulticastAddressandAPNRequest;
+		RANAP_PermanentNAS_UE_ID_t	 permanentNAS_UE_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InformationRequestType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationRequestType;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationRequestType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationRequested.c b/src/ranap/RANAP_InformationRequested.c
new file mode 100644
index 0000000..b51025a
--- /dev/null
+++ b/src/ranap/RANAP_InformationRequested.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InformationRequested.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_InformationRequested_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_InformationRequested_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationRequested, choice.requestedMBMSIPMulticastAddressandAPNRequest),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"requestedMBMSIPMulticastAddressandAPNRequest"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationRequested, choice.requestedMulticastServiceList),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RequestedMulticastServiceList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"requestedMulticastServiceList"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InformationRequested_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* requestedMBMSIPMulticastAddressandAPNRequest */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* requestedMulticastServiceList */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_InformationRequested_specs_1 = {
+	sizeof(struct RANAP_InformationRequested),
+	offsetof(struct RANAP_InformationRequested, _asn_ctx),
+	offsetof(struct RANAP_InformationRequested, present),
+	sizeof(((struct RANAP_InformationRequested *)0)->present),
+	asn_MAP_RANAP_InformationRequested_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationRequested = {
+	"RANAP_InformationRequested",
+	"RANAP_InformationRequested",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_InformationRequested_constr_1,
+	asn_MBR_RANAP_InformationRequested_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_InformationRequested_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationRequested.h b/src/ranap/RANAP_InformationRequested.h
new file mode 100644
index 0000000..227d0cc
--- /dev/null
+++ b/src/ranap/RANAP_InformationRequested.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InformationRequested_H_
+#define	_RANAP_InformationRequested_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.h"
+#include "RANAP_RequestedMulticastServiceList.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_InformationRequested_PR {
+	RANAP_InformationRequested_PR_NOTHING,	/* No components present */
+	RANAP_InformationRequested_PR_requestedMBMSIPMulticastAddressandAPNRequest,
+	RANAP_InformationRequested_PR_requestedMulticastServiceList,
+	/* Extensions may appear below */
+	
+} RANAP_InformationRequested_PR;
+
+/* RANAP_InformationRequested */
+typedef struct RANAP_InformationRequested {
+	RANAP_InformationRequested_PR present;
+	union RANAP_InformationRequested_u {
+		RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_t	 requestedMBMSIPMulticastAddressandAPNRequest;
+		RANAP_RequestedMulticastServiceList_t	 requestedMulticastServiceList;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InformationRequested_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationRequested;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationRequested_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationTransferConfirmation.c b/src/ranap/RANAP_InformationTransferConfirmation.c
new file mode 100644
index 0000000..0850204
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferConfirmation.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_InformationTransferConfirmation.h"
+
+static int
+memb_informationTransferConfirmation_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_informationTransferConfirmation_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_informationTransferConfirmation_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_informationTransferConfirmation_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_informationTransferConfirmation_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_informationTransferConfirmation_ies_specs_2 = {
+	sizeof(struct informationTransferConfirmation_ies),
+	offsetof(struct informationTransferConfirmation_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_informationTransferConfirmation_ies_2 = {
+	"informationTransferConfirmation-ies",
+	"informationTransferConfirmation-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_informationTransferConfirmation_ies_tags_2,
+	sizeof(asn_DEF_informationTransferConfirmation_ies_tags_2)
+		/sizeof(asn_DEF_informationTransferConfirmation_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_informationTransferConfirmation_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_informationTransferConfirmation_ies_tags_2)
+		/sizeof(asn_DEF_informationTransferConfirmation_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_informationTransferConfirmation_ies_constr_2,
+	asn_MBR_informationTransferConfirmation_ies_2,
+	1,	/* Single element */
+	&asn_SPC_informationTransferConfirmation_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_InformationTransferConfirmation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationTransferConfirmation, informationTransferConfirmation_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_informationTransferConfirmation_ies_2,
+		memb_informationTransferConfirmation_ies_constraint_1,
+		&asn_PER_memb_informationTransferConfirmation_ies_constr_2,
+		0,
+		"informationTransferConfirmation-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InformationTransferConfirmation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InformationTransferConfirmation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* informationTransferConfirmation-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InformationTransferConfirmation_specs_1 = {
+	sizeof(struct RANAP_InformationTransferConfirmation),
+	offsetof(struct RANAP_InformationTransferConfirmation, _asn_ctx),
+	asn_MAP_RANAP_InformationTransferConfirmation_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferConfirmation = {
+	"RANAP_InformationTransferConfirmation",
+	"RANAP_InformationTransferConfirmation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InformationTransferConfirmation_tags_1,
+	sizeof(asn_DEF_RANAP_InformationTransferConfirmation_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferConfirmation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InformationTransferConfirmation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InformationTransferConfirmation_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferConfirmation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InformationTransferConfirmation_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_InformationTransferConfirmation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationTransferConfirmation.h b/src/ranap/RANAP_InformationTransferConfirmation.h
new file mode 100644
index 0000000..55a4247
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferConfirmation.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_InformationTransferConfirmation_H_
+#define	_RANAP_InformationTransferConfirmation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InformationTransferConfirmation */
+typedef struct RANAP_InformationTransferConfirmation {
+	struct informationTransferConfirmation_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} informationTransferConfirmation_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InformationTransferConfirmation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferConfirmation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationTransferConfirmation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationTransferFailure.c b/src/ranap/RANAP_InformationTransferFailure.c
new file mode 100644
index 0000000..5ee04d6
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_InformationTransferFailure.h"
+
+static int
+memb_informationTransferFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_informationTransferFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_informationTransferFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_informationTransferFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_informationTransferFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_informationTransferFailure_ies_specs_2 = {
+	sizeof(struct informationTransferFailure_ies),
+	offsetof(struct informationTransferFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_informationTransferFailure_ies_2 = {
+	"informationTransferFailure-ies",
+	"informationTransferFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_informationTransferFailure_ies_tags_2,
+	sizeof(asn_DEF_informationTransferFailure_ies_tags_2)
+		/sizeof(asn_DEF_informationTransferFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_informationTransferFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_informationTransferFailure_ies_tags_2)
+		/sizeof(asn_DEF_informationTransferFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_informationTransferFailure_ies_constr_2,
+	asn_MBR_informationTransferFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_informationTransferFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_InformationTransferFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationTransferFailure, informationTransferFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_informationTransferFailure_ies_2,
+		memb_informationTransferFailure_ies_constraint_1,
+		&asn_PER_memb_informationTransferFailure_ies_constr_2,
+		0,
+		"informationTransferFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InformationTransferFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InformationTransferFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* informationTransferFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InformationTransferFailure_specs_1 = {
+	sizeof(struct RANAP_InformationTransferFailure),
+	offsetof(struct RANAP_InformationTransferFailure, _asn_ctx),
+	asn_MAP_RANAP_InformationTransferFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferFailure = {
+	"RANAP_InformationTransferFailure",
+	"RANAP_InformationTransferFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InformationTransferFailure_tags_1,
+	sizeof(asn_DEF_RANAP_InformationTransferFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InformationTransferFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InformationTransferFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InformationTransferFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_InformationTransferFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationTransferFailure.h b/src/ranap/RANAP_InformationTransferFailure.h
new file mode 100644
index 0000000..0a987c7
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_InformationTransferFailure_H_
+#define	_RANAP_InformationTransferFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InformationTransferFailure */
+typedef struct RANAP_InformationTransferFailure {
+	struct informationTransferFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} informationTransferFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InformationTransferFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationTransferFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationTransferID.c b/src/ranap/RANAP_InformationTransferID.c
new file mode 100644
index 0000000..ff9be4d
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InformationTransferID.h"
+
+int
+RANAP_InformationTransferID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 1048575l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_InformationTransferID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_InformationTransferID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_InformationTransferID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationTransferID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_InformationTransferID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationTransferID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_InformationTransferID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_InformationTransferID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_InformationTransferID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_InformationTransferID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_InformationTransferID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_InformationTransferID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_InformationTransferID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 20, -1,  0l,  1048575l }	/* (0..1048575) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InformationTransferID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferID = {
+	"RANAP_InformationTransferID",
+	"RANAP_InformationTransferID",
+	RANAP_InformationTransferID_free,
+	RANAP_InformationTransferID_print,
+	RANAP_InformationTransferID_constraint,
+	RANAP_InformationTransferID_decode_ber,
+	RANAP_InformationTransferID_encode_der,
+	RANAP_InformationTransferID_decode_xer,
+	RANAP_InformationTransferID_encode_xer,
+	RANAP_InformationTransferID_decode_uper,
+	RANAP_InformationTransferID_encode_uper,
+	RANAP_InformationTransferID_decode_aper,
+	RANAP_InformationTransferID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InformationTransferID_tags_1,
+	sizeof(asn_DEF_RANAP_InformationTransferID_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InformationTransferID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InformationTransferID_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_InformationTransferID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_InformationTransferID.h b/src/ranap/RANAP_InformationTransferID.h
new file mode 100644
index 0000000..cc002aa
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InformationTransferID_H_
+#define	_RANAP_InformationTransferID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InformationTransferID */
+typedef long	 RANAP_InformationTransferID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferID;
+asn_struct_free_f RANAP_InformationTransferID_free;
+asn_struct_print_f RANAP_InformationTransferID_print;
+asn_constr_check_f RANAP_InformationTransferID_constraint;
+ber_type_decoder_f RANAP_InformationTransferID_decode_ber;
+der_type_encoder_f RANAP_InformationTransferID_encode_der;
+xer_type_decoder_f RANAP_InformationTransferID_decode_xer;
+xer_type_encoder_f RANAP_InformationTransferID_encode_xer;
+per_type_decoder_f RANAP_InformationTransferID_decode_uper;
+per_type_encoder_f RANAP_InformationTransferID_encode_uper;
+per_type_decoder_f RANAP_InformationTransferID_decode_aper;
+per_type_encoder_f RANAP_InformationTransferID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationTransferID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationTransferIndication.c b/src/ranap/RANAP_InformationTransferIndication.c
new file mode 100644
index 0000000..4778799
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferIndication.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_InformationTransferIndication.h"
+
+static int
+memb_informationTransferIndication_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_informationTransferIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_informationTransferIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_informationTransferIndication_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_informationTransferIndication_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_informationTransferIndication_ies_specs_2 = {
+	sizeof(struct informationTransferIndication_ies),
+	offsetof(struct informationTransferIndication_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_informationTransferIndication_ies_2 = {
+	"informationTransferIndication-ies",
+	"informationTransferIndication-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_informationTransferIndication_ies_tags_2,
+	sizeof(asn_DEF_informationTransferIndication_ies_tags_2)
+		/sizeof(asn_DEF_informationTransferIndication_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_informationTransferIndication_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_informationTransferIndication_ies_tags_2)
+		/sizeof(asn_DEF_informationTransferIndication_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_informationTransferIndication_ies_constr_2,
+	asn_MBR_informationTransferIndication_ies_2,
+	1,	/* Single element */
+	&asn_SPC_informationTransferIndication_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_InformationTransferIndication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationTransferIndication, informationTransferIndication_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_informationTransferIndication_ies_2,
+		memb_informationTransferIndication_ies_constraint_1,
+		&asn_PER_memb_informationTransferIndication_ies_constr_2,
+		0,
+		"informationTransferIndication-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InformationTransferIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InformationTransferIndication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* informationTransferIndication-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InformationTransferIndication_specs_1 = {
+	sizeof(struct RANAP_InformationTransferIndication),
+	offsetof(struct RANAP_InformationTransferIndication, _asn_ctx),
+	asn_MAP_RANAP_InformationTransferIndication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferIndication = {
+	"RANAP_InformationTransferIndication",
+	"RANAP_InformationTransferIndication",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InformationTransferIndication_tags_1,
+	sizeof(asn_DEF_RANAP_InformationTransferIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InformationTransferIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InformationTransferIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_InformationTransferIndication_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InformationTransferIndication_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_InformationTransferIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationTransferIndication.h b/src/ranap/RANAP_InformationTransferIndication.h
new file mode 100644
index 0000000..50a56b8
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferIndication.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_InformationTransferIndication_H_
+#define	_RANAP_InformationTransferIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InformationTransferIndication */
+typedef struct RANAP_InformationTransferIndication {
+	struct informationTransferIndication_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} informationTransferIndication_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InformationTransferIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationTransferIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InformationTransferType.c b/src/ranap/RANAP_InformationTransferType.c
new file mode 100644
index 0000000..abbdd8a
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferType.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InformationTransferType.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_InformationTransferType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_InformationTransferType_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InformationTransferType, choice.rNCTraceInformation),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RNCTraceInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rNCTraceInformation"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InformationTransferType_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rNCTraceInformation */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_InformationTransferType_specs_1 = {
+	sizeof(struct RANAP_InformationTransferType),
+	offsetof(struct RANAP_InformationTransferType, _asn_ctx),
+	offsetof(struct RANAP_InformationTransferType, present),
+	sizeof(((struct RANAP_InformationTransferType *)0)->present),
+	asn_MAP_RANAP_InformationTransferType_tag2el_1,
+	1,	/* Count of tags in the map */
+	0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferType = {
+	"RANAP_InformationTransferType",
+	"RANAP_InformationTransferType",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_InformationTransferType_constr_1,
+	asn_MBR_RANAP_InformationTransferType_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_InformationTransferType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InformationTransferType.h b/src/ranap/RANAP_InformationTransferType.h
new file mode 100644
index 0000000..93b41d2
--- /dev/null
+++ b/src/ranap/RANAP_InformationTransferType.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InformationTransferType_H_
+#define	_RANAP_InformationTransferType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RNCTraceInformation.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_InformationTransferType_PR {
+	RANAP_InformationTransferType_PR_NOTHING,	/* No components present */
+	RANAP_InformationTransferType_PR_rNCTraceInformation,
+	/* Extensions may appear below */
+	
+} RANAP_InformationTransferType_PR;
+
+/* RANAP_InformationTransferType */
+typedef struct RANAP_InformationTransferType {
+	RANAP_InformationTransferType_PR present;
+	union RANAP_InformationTransferType_u {
+		RANAP_RNCTraceInformation_t	 rNCTraceInformation;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InformationTransferType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InformationTransferType;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InformationTransferType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InitialUE-Message.c b/src/ranap/RANAP_InitialUE-Message.c
new file mode 100644
index 0000000..12797ac
--- /dev/null
+++ b/src/ranap/RANAP_InitialUE-Message.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_InitialUE-Message.h"
+
+static int
+memb_initialUE_Message_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_initialUE_Message_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_initialUE_Message_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_initialUE_Message_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_initialUE_Message_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_initialUE_Message_ies_specs_2 = {
+	sizeof(struct initialUE_Message_ies),
+	offsetof(struct initialUE_Message_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_initialUE_Message_ies_2 = {
+	"initialUE-Message-ies",
+	"initialUE-Message-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_initialUE_Message_ies_tags_2,
+	sizeof(asn_DEF_initialUE_Message_ies_tags_2)
+		/sizeof(asn_DEF_initialUE_Message_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_initialUE_Message_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_initialUE_Message_ies_tags_2)
+		/sizeof(asn_DEF_initialUE_Message_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_initialUE_Message_ies_constr_2,
+	asn_MBR_initialUE_Message_ies_2,
+	1,	/* Single element */
+	&asn_SPC_initialUE_Message_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_InitialUE_Message_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InitialUE_Message, initialUE_Message_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_initialUE_Message_ies_2,
+		memb_initialUE_Message_ies_constraint_1,
+		&asn_PER_memb_initialUE_Message_ies_constr_2,
+		0,
+		"initialUE-Message-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InitialUE_Message_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InitialUE_Message_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* initialUE-Message-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InitialUE_Message_specs_1 = {
+	sizeof(struct RANAP_InitialUE_Message),
+	offsetof(struct RANAP_InitialUE_Message, _asn_ctx),
+	asn_MAP_RANAP_InitialUE_Message_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InitialUE_Message = {
+	"RANAP_InitialUE-Message",
+	"RANAP_InitialUE-Message",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InitialUE_Message_tags_1,
+	sizeof(asn_DEF_RANAP_InitialUE_Message_tags_1)
+		/sizeof(asn_DEF_RANAP_InitialUE_Message_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InitialUE_Message_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InitialUE_Message_tags_1)
+		/sizeof(asn_DEF_RANAP_InitialUE_Message_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InitialUE_Message_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_InitialUE_Message_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InitialUE-Message.h b/src/ranap/RANAP_InitialUE-Message.h
new file mode 100644
index 0000000..ff302f8
--- /dev/null
+++ b/src/ranap/RANAP_InitialUE-Message.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_InitialUE_Message_H_
+#define	_RANAP_InitialUE_Message_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InitialUE-Message */
+typedef struct RANAP_InitialUE_Message {
+	struct initialUE_Message_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} initialUE_Message_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InitialUE_Message_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InitialUE_Message;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InitialUE_Message_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InitiatingMessage.c b/src/ranap/RANAP_InitiatingMessage.c
new file mode 100644
index 0000000..23d1cf0
--- /dev/null
+++ b/src/ranap/RANAP_InitiatingMessage.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_InitiatingMessage.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_InitiatingMessage_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InitiatingMessage, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InitiatingMessage, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InitiatingMessage, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_InitiatingMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InitiatingMessage_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InitiatingMessage_specs_1 = {
+	sizeof(struct RANAP_InitiatingMessage),
+	offsetof(struct RANAP_InitiatingMessage, _asn_ctx),
+	asn_MAP_RANAP_InitiatingMessage_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InitiatingMessage = {
+	"RANAP_InitiatingMessage",
+	"RANAP_InitiatingMessage",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InitiatingMessage_tags_1,
+	sizeof(asn_DEF_RANAP_InitiatingMessage_tags_1)
+		/sizeof(asn_DEF_RANAP_InitiatingMessage_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InitiatingMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InitiatingMessage_tags_1)
+		/sizeof(asn_DEF_RANAP_InitiatingMessage_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InitiatingMessage_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_InitiatingMessage_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InitiatingMessage.h b/src/ranap/RANAP_InitiatingMessage.h
new file mode 100644
index 0000000..c64dbff
--- /dev/null
+++ b/src/ranap/RANAP_InitiatingMessage.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_InitiatingMessage_H_
+#define	_RANAP_InitiatingMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ProcedureCode.h"
+#include "RANAP_Criticality.h"
+#include <ANY.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InitiatingMessage */
+typedef struct RANAP_InitiatingMessage {
+	RANAP_ProcedureCode_t	 procedureCode;
+	RANAP_Criticality_t	 criticality;
+	ANY_t	 value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InitiatingMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InitiatingMessage;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InitiatingMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IntegrityProtectionAlgorithm.c b/src/ranap/RANAP_IntegrityProtectionAlgorithm.c
new file mode 100644
index 0000000..4d7b33b
--- /dev/null
+++ b/src/ranap/RANAP_IntegrityProtectionAlgorithm.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IntegrityProtectionAlgorithm.h"
+
+int
+RANAP_IntegrityProtectionAlgorithm_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 15l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_IntegrityProtectionAlgorithm_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IntegrityProtectionAlgorithm_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionAlgorithm_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionAlgorithm_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionAlgorithm_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionAlgorithm_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionAlgorithm_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionAlgorithm_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionAlgorithm_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionAlgorithm_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IntegrityProtectionAlgorithm_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IntegrityProtectionAlgorithm_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  0l,  15l }	/* (0..15) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IntegrityProtectionAlgorithm = {
+	"RANAP_IntegrityProtectionAlgorithm",
+	"RANAP_IntegrityProtectionAlgorithm",
+	RANAP_IntegrityProtectionAlgorithm_free,
+	RANAP_IntegrityProtectionAlgorithm_print,
+	RANAP_IntegrityProtectionAlgorithm_constraint,
+	RANAP_IntegrityProtectionAlgorithm_decode_ber,
+	RANAP_IntegrityProtectionAlgorithm_encode_der,
+	RANAP_IntegrityProtectionAlgorithm_decode_xer,
+	RANAP_IntegrityProtectionAlgorithm_encode_xer,
+	RANAP_IntegrityProtectionAlgorithm_decode_uper,
+	RANAP_IntegrityProtectionAlgorithm_encode_uper,
+	RANAP_IntegrityProtectionAlgorithm_decode_aper,
+	RANAP_IntegrityProtectionAlgorithm_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1,
+	sizeof(asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1)
+		/sizeof(asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1)
+		/sizeof(asn_DEF_RANAP_IntegrityProtectionAlgorithm_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IntegrityProtectionAlgorithm_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IntegrityProtectionAlgorithm.h b/src/ranap/RANAP_IntegrityProtectionAlgorithm.h
new file mode 100644
index 0000000..7ed9284
--- /dev/null
+++ b/src/ranap/RANAP_IntegrityProtectionAlgorithm.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IntegrityProtectionAlgorithm_H_
+#define	_RANAP_IntegrityProtectionAlgorithm_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_IntegrityProtectionAlgorithm {
+	RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA1	= 0,
+	RANAP_IntegrityProtectionAlgorithm_standard_UMTS_integrity_algorithm_UIA2	= 1,
+	RANAP_IntegrityProtectionAlgorithm_no_value	= 15
+} e_RANAP_IntegrityProtectionAlgorithm;
+
+/* RANAP_IntegrityProtectionAlgorithm */
+typedef long	 RANAP_IntegrityProtectionAlgorithm_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IntegrityProtectionAlgorithm;
+asn_struct_free_f RANAP_IntegrityProtectionAlgorithm_free;
+asn_struct_print_f RANAP_IntegrityProtectionAlgorithm_print;
+asn_constr_check_f RANAP_IntegrityProtectionAlgorithm_constraint;
+ber_type_decoder_f RANAP_IntegrityProtectionAlgorithm_decode_ber;
+der_type_encoder_f RANAP_IntegrityProtectionAlgorithm_encode_der;
+xer_type_decoder_f RANAP_IntegrityProtectionAlgorithm_decode_xer;
+xer_type_encoder_f RANAP_IntegrityProtectionAlgorithm_encode_xer;
+per_type_decoder_f RANAP_IntegrityProtectionAlgorithm_decode_uper;
+per_type_encoder_f RANAP_IntegrityProtectionAlgorithm_encode_uper;
+per_type_decoder_f RANAP_IntegrityProtectionAlgorithm_decode_aper;
+per_type_encoder_f RANAP_IntegrityProtectionAlgorithm_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IntegrityProtectionAlgorithm_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IntegrityProtectionInformation.c b/src/ranap/RANAP_IntegrityProtectionInformation.c
new file mode 100644
index 0000000..ede800e
--- /dev/null
+++ b/src/ranap/RANAP_IntegrityProtectionInformation.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IntegrityProtectionInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_IntegrityProtectionInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IntegrityProtectionInformation, permittedAlgorithms),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"permittedAlgorithms"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IntegrityProtectionInformation, key),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IntegrityProtectionKey,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"key"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_IntegrityProtectionInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_IntegrityProtectionInformation_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_IntegrityProtectionInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IntegrityProtectionInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* permittedAlgorithms */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* key */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_IntegrityProtectionInformation_specs_1 = {
+	sizeof(struct RANAP_IntegrityProtectionInformation),
+	offsetof(struct RANAP_IntegrityProtectionInformation, _asn_ctx),
+	asn_MAP_RANAP_IntegrityProtectionInformation_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_IntegrityProtectionInformation_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IntegrityProtectionInformation = {
+	"RANAP_IntegrityProtectionInformation",
+	"RANAP_IntegrityProtectionInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IntegrityProtectionInformation_tags_1,
+	sizeof(asn_DEF_RANAP_IntegrityProtectionInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_IntegrityProtectionInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IntegrityProtectionInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IntegrityProtectionInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_IntegrityProtectionInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_IntegrityProtectionInformation_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_IntegrityProtectionInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IntegrityProtectionInformation.h b/src/ranap/RANAP_IntegrityProtectionInformation.h
new file mode 100644
index 0000000..7cb1f83
--- /dev/null
+++ b/src/ranap/RANAP_IntegrityProtectionInformation.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IntegrityProtectionInformation_H_
+#define	_RANAP_IntegrityProtectionInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PermittedIntegrityProtectionAlgorithms.h"
+#include "RANAP_IntegrityProtectionKey.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IntegrityProtectionInformation */
+typedef struct RANAP_IntegrityProtectionInformation {
+	RANAP_PermittedIntegrityProtectionAlgorithms_t	 permittedAlgorithms;
+	RANAP_IntegrityProtectionKey_t	 key;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IntegrityProtectionInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IntegrityProtectionInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IntegrityProtectionInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IntegrityProtectionKey.c b/src/ranap/RANAP_IntegrityProtectionKey.c
new file mode 100644
index 0000000..ee94a2c
--- /dev/null
+++ b/src/ranap/RANAP_IntegrityProtectionKey.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IntegrityProtectionKey.h"
+
+int
+RANAP_IntegrityProtectionKey_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_IntegrityProtectionKey_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IntegrityProtectionKey_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionKey_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionKey_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionKey_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionKey_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionKey_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionKey_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IntegrityProtectionKey_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IntegrityProtectionKey_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IntegrityProtectionKey_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IntegrityProtectionKey_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  128l,  128l }	/* (SIZE(128..128)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IntegrityProtectionKey_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IntegrityProtectionKey = {
+	"RANAP_IntegrityProtectionKey",
+	"RANAP_IntegrityProtectionKey",
+	RANAP_IntegrityProtectionKey_free,
+	RANAP_IntegrityProtectionKey_print,
+	RANAP_IntegrityProtectionKey_constraint,
+	RANAP_IntegrityProtectionKey_decode_ber,
+	RANAP_IntegrityProtectionKey_encode_der,
+	RANAP_IntegrityProtectionKey_decode_xer,
+	RANAP_IntegrityProtectionKey_encode_xer,
+	RANAP_IntegrityProtectionKey_decode_uper,
+	RANAP_IntegrityProtectionKey_encode_uper,
+	RANAP_IntegrityProtectionKey_decode_aper,
+	RANAP_IntegrityProtectionKey_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IntegrityProtectionKey_tags_1,
+	sizeof(asn_DEF_RANAP_IntegrityProtectionKey_tags_1)
+		/sizeof(asn_DEF_RANAP_IntegrityProtectionKey_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IntegrityProtectionKey_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IntegrityProtectionKey_tags_1)
+		/sizeof(asn_DEF_RANAP_IntegrityProtectionKey_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IntegrityProtectionKey_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IntegrityProtectionKey.h b/src/ranap/RANAP_IntegrityProtectionKey.h
new file mode 100644
index 0000000..4010d71
--- /dev/null
+++ b/src/ranap/RANAP_IntegrityProtectionKey.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IntegrityProtectionKey_H_
+#define	_RANAP_IntegrityProtectionKey_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IntegrityProtectionKey */
+typedef BIT_STRING_t	 RANAP_IntegrityProtectionKey_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IntegrityProtectionKey;
+asn_struct_free_f RANAP_IntegrityProtectionKey_free;
+asn_struct_print_f RANAP_IntegrityProtectionKey_print;
+asn_constr_check_f RANAP_IntegrityProtectionKey_constraint;
+ber_type_decoder_f RANAP_IntegrityProtectionKey_decode_ber;
+der_type_encoder_f RANAP_IntegrityProtectionKey_encode_der;
+xer_type_decoder_f RANAP_IntegrityProtectionKey_decode_xer;
+xer_type_encoder_f RANAP_IntegrityProtectionKey_encode_xer;
+per_type_decoder_f RANAP_IntegrityProtectionKey_decode_uper;
+per_type_encoder_f RANAP_IntegrityProtectionKey_encode_uper;
+per_type_decoder_f RANAP_IntegrityProtectionKey_decode_aper;
+per_type_encoder_f RANAP_IntegrityProtectionKey_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IntegrityProtectionKey_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InterSystemInformation-TransparentContainer.c b/src/ranap/RANAP_InterSystemInformation-TransparentContainer.c
new file mode 100644
index 0000000..31f62bd
--- /dev/null
+++ b/src/ranap/RANAP_InterSystemInformation-TransparentContainer.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InterSystemInformation-TransparentContainer.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_InterSystemInformation_TransparentContainer_1[] = {
+	{ ATF_POINTER, 3, offsetof(struct RANAP_InterSystemInformation_TransparentContainer, downlinkCellLoadInformation),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellLoadInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"downlinkCellLoadInformation"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_InterSystemInformation_TransparentContainer, uplinkCellLoadInformation),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellLoadInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uplinkCellLoadInformation"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_InterSystemInformation_TransparentContainer, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_InterSystemInformation_TransparentContainer_oms_1[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InterSystemInformation_TransparentContainer_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* downlinkCellLoadInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uplinkCellLoadInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InterSystemInformation_TransparentContainer_specs_1 = {
+	sizeof(struct RANAP_InterSystemInformation_TransparentContainer),
+	offsetof(struct RANAP_InterSystemInformation_TransparentContainer, _asn_ctx),
+	asn_MAP_RANAP_InterSystemInformation_TransparentContainer_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_InterSystemInformation_TransparentContainer_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InterSystemInformation_TransparentContainer = {
+	"RANAP_InterSystemInformation-TransparentContainer",
+	"RANAP_InterSystemInformation-TransparentContainer",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_InterSystemInformation_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InterSystemInformation_TransparentContainer_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_InterSystemInformation_TransparentContainer_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InterSystemInformation-TransparentContainer.h b/src/ranap/RANAP_InterSystemInformation-TransparentContainer.h
new file mode 100644
index 0000000..e53829b
--- /dev/null
+++ b/src/ranap/RANAP_InterSystemInformation-TransparentContainer.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InterSystemInformation_TransparentContainer_H_
+#define	_RANAP_InterSystemInformation_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_CellLoadInformation.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_InterSystemInformation-TransparentContainer */
+typedef struct RANAP_InterSystemInformation_TransparentContainer {
+	RANAP_CellLoadInformation_t	*downlinkCellLoadInformation	/* OPTIONAL */;
+	RANAP_CellLoadInformation_t	*uplinkCellLoadInformation	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InterSystemInformation_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InterSystemInformation_TransparentContainer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InterSystemInformation_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InterSystemInformationTransferType.c b/src/ranap/RANAP_InterSystemInformationTransferType.c
new file mode 100644
index 0000000..b66c82f
--- /dev/null
+++ b/src/ranap/RANAP_InterSystemInformationTransferType.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InterSystemInformationTransferType.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_InterSystemInformationTransferType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_InterSystemInformationTransferType_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InterSystemInformationTransferType, choice.rIM_Transfer),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RIM_Transfer,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rIM-Transfer"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InterSystemInformationTransferType_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rIM-Transfer */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_InterSystemInformationTransferType_specs_1 = {
+	sizeof(struct RANAP_InterSystemInformationTransferType),
+	offsetof(struct RANAP_InterSystemInformationTransferType, _asn_ctx),
+	offsetof(struct RANAP_InterSystemInformationTransferType, present),
+	sizeof(((struct RANAP_InterSystemInformationTransferType *)0)->present),
+	asn_MAP_RANAP_InterSystemInformationTransferType_tag2el_1,
+	1,	/* Count of tags in the map */
+	0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InterSystemInformationTransferType = {
+	"RANAP_InterSystemInformationTransferType",
+	"RANAP_InterSystemInformationTransferType",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_InterSystemInformationTransferType_constr_1,
+	asn_MBR_RANAP_InterSystemInformationTransferType_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_InterSystemInformationTransferType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InterSystemInformationTransferType.h b/src/ranap/RANAP_InterSystemInformationTransferType.h
new file mode 100644
index 0000000..d3f5225
--- /dev/null
+++ b/src/ranap/RANAP_InterSystemInformationTransferType.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InterSystemInformationTransferType_H_
+#define	_RANAP_InterSystemInformationTransferType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RIM-Transfer.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_InterSystemInformationTransferType_PR {
+	RANAP_InterSystemInformationTransferType_PR_NOTHING,	/* No components present */
+	RANAP_InterSystemInformationTransferType_PR_rIM_Transfer,
+	/* Extensions may appear below */
+	
+} RANAP_InterSystemInformationTransferType_PR;
+
+/* RANAP_InterSystemInformationTransferType */
+typedef struct RANAP_InterSystemInformationTransferType {
+	RANAP_InterSystemInformationTransferType_PR present;
+	union RANAP_InterSystemInformationTransferType_u {
+		RANAP_RIM_Transfer_t	 rIM_Transfer;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InterSystemInformationTransferType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InterSystemInformationTransferType;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InterSystemInformationTransferType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_InterfacesToTraceItem.c b/src/ranap/RANAP_InterfacesToTraceItem.c
new file mode 100644
index 0000000..bd97bdc
--- /dev/null
+++ b/src/ranap/RANAP_InterfacesToTraceItem.c
@@ -0,0 +1,240 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_InterfacesToTraceItem.h"
+
+static int
+interface_2_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+interface_2_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+static void
+interface_2_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	interface_2_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+static int
+interface_2_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+static asn_dec_rval_t
+interface_2_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+static asn_enc_rval_t
+interface_2_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+static asn_dec_rval_t
+interface_2_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+static asn_enc_rval_t
+interface_2_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+static asn_dec_rval_t
+interface_2_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_enc_rval_t
+interface_2_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_enc_rval_t
+interface_2_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_dec_rval_t
+interface_2_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	interface_2_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_interface_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  4l }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_interface_value2enum_2[] = {
+	{ 0,	5,	"iu-cs" },
+	{ 1,	5,	"iu-ps" },
+	{ 2,	3,	"iur" },
+	{ 3,	3,	"iub" },
+	{ 4,	2,	"uu" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_interface_enum2value_2[] = {
+	0,	/* iu-cs(0) */
+	1,	/* iu-ps(1) */
+	3,	/* iub(3) */
+	2,	/* iur(2) */
+	4	/* uu(4) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_interface_specs_2 = {
+	asn_MAP_interface_value2enum_2,	/* "tag" => N; sorted by tag */
+	asn_MAP_interface_enum2value_2,	/* N => "tag"; sorted by N */
+	5,	/* Number of elements in the maps */
+	6,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_interface_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_interface_2 = {
+	"interface",
+	"interface",
+	interface_2_free,
+	interface_2_print,
+	interface_2_constraint,
+	interface_2_decode_ber,
+	interface_2_encode_der,
+	interface_2_decode_xer,
+	interface_2_encode_xer,
+	interface_2_decode_uper,
+	interface_2_encode_uper,
+	interface_2_decode_aper,
+	interface_2_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_interface_tags_2,
+	sizeof(asn_DEF_interface_tags_2)
+		/sizeof(asn_DEF_interface_tags_2[0]) - 1, /* 1 */
+	asn_DEF_interface_tags_2,	/* Same as above */
+	sizeof(asn_DEF_interface_tags_2)
+		/sizeof(asn_DEF_interface_tags_2[0]), /* 2 */
+	&asn_PER_type_interface_constr_2,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_interface_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_InterfacesToTraceItem_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_InterfacesToTraceItem, interface),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_interface_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"interface"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_InterfacesToTraceItem, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_InterfacesToTraceItem_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_InterfacesToTraceItem_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_InterfacesToTraceItem_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* interface */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_InterfacesToTraceItem_specs_1 = {
+	sizeof(struct RANAP_InterfacesToTraceItem),
+	offsetof(struct RANAP_InterfacesToTraceItem, _asn_ctx),
+	asn_MAP_RANAP_InterfacesToTraceItem_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_InterfacesToTraceItem_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_InterfacesToTraceItem = {
+	"RANAP_InterfacesToTraceItem",
+	"RANAP_InterfacesToTraceItem",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_InterfacesToTraceItem_tags_1,
+	sizeof(asn_DEF_RANAP_InterfacesToTraceItem_tags_1)
+		/sizeof(asn_DEF_RANAP_InterfacesToTraceItem_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_InterfacesToTraceItem_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_InterfacesToTraceItem_tags_1)
+		/sizeof(asn_DEF_RANAP_InterfacesToTraceItem_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_InterfacesToTraceItem_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_InterfacesToTraceItem_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_InterfacesToTraceItem.h b/src/ranap/RANAP_InterfacesToTraceItem.h
new file mode 100644
index 0000000..5396375
--- /dev/null
+++ b/src/ranap/RANAP_InterfacesToTraceItem.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_InterfacesToTraceItem_H_
+#define	_RANAP_InterfacesToTraceItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum interface {
+	interface_iu_cs	= 0,
+	interface_iu_ps	= 1,
+	interface_iur	= 2,
+	interface_iub	= 3,
+	interface_uu	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_interface;
+
+/* RANAP_InterfacesToTraceItem */
+typedef struct RANAP_InterfacesToTraceItem {
+	long	 interface;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_InterfacesToTraceItem_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_interface_2;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_InterfacesToTraceItem;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_InterfacesToTraceItem_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Iu-ReleaseCommand.c b/src/ranap/RANAP_Iu-ReleaseCommand.c
new file mode 100644
index 0000000..2d64a5b
--- /dev/null
+++ b/src/ranap/RANAP_Iu-ReleaseCommand.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Iu-ReleaseCommand.h"
+
+static int
+memb_iu_ReleaseCommand_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_iu_ReleaseCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_iu_ReleaseCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_iu_ReleaseCommand_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_iu_ReleaseCommand_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_iu_ReleaseCommand_ies_specs_2 = {
+	sizeof(struct iu_ReleaseCommand_ies),
+	offsetof(struct iu_ReleaseCommand_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_iu_ReleaseCommand_ies_2 = {
+	"iu-ReleaseCommand-ies",
+	"iu-ReleaseCommand-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_iu_ReleaseCommand_ies_tags_2,
+	sizeof(asn_DEF_iu_ReleaseCommand_ies_tags_2)
+		/sizeof(asn_DEF_iu_ReleaseCommand_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_iu_ReleaseCommand_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_iu_ReleaseCommand_ies_tags_2)
+		/sizeof(asn_DEF_iu_ReleaseCommand_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_iu_ReleaseCommand_ies_constr_2,
+	asn_MBR_iu_ReleaseCommand_ies_2,
+	1,	/* Single element */
+	&asn_SPC_iu_ReleaseCommand_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_Iu_ReleaseCommand_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Iu_ReleaseCommand, iu_ReleaseCommand_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_iu_ReleaseCommand_ies_2,
+		memb_iu_ReleaseCommand_ies_constraint_1,
+		&asn_PER_memb_iu_ReleaseCommand_ies_constr_2,
+		0,
+		"iu-ReleaseCommand-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Iu_ReleaseCommand_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Iu_ReleaseCommand_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* iu-ReleaseCommand-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Iu_ReleaseCommand_specs_1 = {
+	sizeof(struct RANAP_Iu_ReleaseCommand),
+	offsetof(struct RANAP_Iu_ReleaseCommand, _asn_ctx),
+	asn_MAP_RANAP_Iu_ReleaseCommand_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Iu_ReleaseCommand = {
+	"RANAP_Iu-ReleaseCommand",
+	"RANAP_Iu-ReleaseCommand",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Iu_ReleaseCommand_tags_1,
+	sizeof(asn_DEF_RANAP_Iu_ReleaseCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_Iu_ReleaseCommand_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Iu_ReleaseCommand_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Iu_ReleaseCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_Iu_ReleaseCommand_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Iu_ReleaseCommand_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Iu_ReleaseCommand_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Iu-ReleaseCommand.h b/src/ranap/RANAP_Iu-ReleaseCommand.h
new file mode 100644
index 0000000..938c5a0
--- /dev/null
+++ b/src/ranap/RANAP_Iu-ReleaseCommand.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Iu_ReleaseCommand_H_
+#define	_RANAP_Iu_ReleaseCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Iu-ReleaseCommand */
+typedef struct RANAP_Iu_ReleaseCommand {
+	struct iu_ReleaseCommand_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} iu_ReleaseCommand_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Iu_ReleaseCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Iu_ReleaseCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Iu_ReleaseCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Iu-ReleaseComplete.c b/src/ranap/RANAP_Iu-ReleaseComplete.c
new file mode 100644
index 0000000..3834835
--- /dev/null
+++ b/src/ranap/RANAP_Iu-ReleaseComplete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Iu-ReleaseComplete.h"
+
+static int
+memb_iu_ReleaseComplete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_iu_ReleaseComplete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_iu_ReleaseComplete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_iu_ReleaseComplete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_iu_ReleaseComplete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_iu_ReleaseComplete_ies_specs_2 = {
+	sizeof(struct iu_ReleaseComplete_ies),
+	offsetof(struct iu_ReleaseComplete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_iu_ReleaseComplete_ies_2 = {
+	"iu-ReleaseComplete-ies",
+	"iu-ReleaseComplete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_iu_ReleaseComplete_ies_tags_2,
+	sizeof(asn_DEF_iu_ReleaseComplete_ies_tags_2)
+		/sizeof(asn_DEF_iu_ReleaseComplete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_iu_ReleaseComplete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_iu_ReleaseComplete_ies_tags_2)
+		/sizeof(asn_DEF_iu_ReleaseComplete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_iu_ReleaseComplete_ies_constr_2,
+	asn_MBR_iu_ReleaseComplete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_iu_ReleaseComplete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_Iu_ReleaseComplete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Iu_ReleaseComplete, iu_ReleaseComplete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_iu_ReleaseComplete_ies_2,
+		memb_iu_ReleaseComplete_ies_constraint_1,
+		&asn_PER_memb_iu_ReleaseComplete_ies_constr_2,
+		0,
+		"iu-ReleaseComplete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Iu_ReleaseComplete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Iu_ReleaseComplete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* iu-ReleaseComplete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Iu_ReleaseComplete_specs_1 = {
+	sizeof(struct RANAP_Iu_ReleaseComplete),
+	offsetof(struct RANAP_Iu_ReleaseComplete, _asn_ctx),
+	asn_MAP_RANAP_Iu_ReleaseComplete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Iu_ReleaseComplete = {
+	"RANAP_Iu-ReleaseComplete",
+	"RANAP_Iu-ReleaseComplete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Iu_ReleaseComplete_tags_1,
+	sizeof(asn_DEF_RANAP_Iu_ReleaseComplete_tags_1)
+		/sizeof(asn_DEF_RANAP_Iu_ReleaseComplete_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Iu_ReleaseComplete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Iu_ReleaseComplete_tags_1)
+		/sizeof(asn_DEF_RANAP_Iu_ReleaseComplete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Iu_ReleaseComplete_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Iu_ReleaseComplete_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Iu-ReleaseComplete.h b/src/ranap/RANAP_Iu-ReleaseComplete.h
new file mode 100644
index 0000000..215b4c7
--- /dev/null
+++ b/src/ranap/RANAP_Iu-ReleaseComplete.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Iu_ReleaseComplete_H_
+#define	_RANAP_Iu_ReleaseComplete_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Iu-ReleaseComplete */
+typedef struct RANAP_Iu_ReleaseComplete {
+	struct iu_ReleaseComplete_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} iu_ReleaseComplete_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Iu_ReleaseComplete_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Iu_ReleaseComplete;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Iu_ReleaseComplete_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Iu-ReleaseRequest.c b/src/ranap/RANAP_Iu-ReleaseRequest.c
new file mode 100644
index 0000000..690db70
--- /dev/null
+++ b/src/ranap/RANAP_Iu-ReleaseRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Iu-ReleaseRequest.h"
+
+static int
+memb_iu_ReleaseRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_iu_ReleaseRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_iu_ReleaseRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_iu_ReleaseRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_iu_ReleaseRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_iu_ReleaseRequest_ies_specs_2 = {
+	sizeof(struct iu_ReleaseRequest_ies),
+	offsetof(struct iu_ReleaseRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_iu_ReleaseRequest_ies_2 = {
+	"iu-ReleaseRequest-ies",
+	"iu-ReleaseRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_iu_ReleaseRequest_ies_tags_2,
+	sizeof(asn_DEF_iu_ReleaseRequest_ies_tags_2)
+		/sizeof(asn_DEF_iu_ReleaseRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_iu_ReleaseRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_iu_ReleaseRequest_ies_tags_2)
+		/sizeof(asn_DEF_iu_ReleaseRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_iu_ReleaseRequest_ies_constr_2,
+	asn_MBR_iu_ReleaseRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_iu_ReleaseRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_Iu_ReleaseRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Iu_ReleaseRequest, iu_ReleaseRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_iu_ReleaseRequest_ies_2,
+		memb_iu_ReleaseRequest_ies_constraint_1,
+		&asn_PER_memb_iu_ReleaseRequest_ies_constr_2,
+		0,
+		"iu-ReleaseRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Iu_ReleaseRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Iu_ReleaseRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* iu-ReleaseRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Iu_ReleaseRequest_specs_1 = {
+	sizeof(struct RANAP_Iu_ReleaseRequest),
+	offsetof(struct RANAP_Iu_ReleaseRequest, _asn_ctx),
+	asn_MAP_RANAP_Iu_ReleaseRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Iu_ReleaseRequest = {
+	"RANAP_Iu-ReleaseRequest",
+	"RANAP_Iu-ReleaseRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Iu_ReleaseRequest_tags_1,
+	sizeof(asn_DEF_RANAP_Iu_ReleaseRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_Iu_ReleaseRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Iu_ReleaseRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Iu_ReleaseRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_Iu_ReleaseRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Iu_ReleaseRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Iu_ReleaseRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Iu-ReleaseRequest.h b/src/ranap/RANAP_Iu-ReleaseRequest.h
new file mode 100644
index 0000000..45963f0
--- /dev/null
+++ b/src/ranap/RANAP_Iu-ReleaseRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Iu_ReleaseRequest_H_
+#define	_RANAP_Iu_ReleaseRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Iu-ReleaseRequest */
+typedef struct RANAP_Iu_ReleaseRequest {
+	struct iu_ReleaseRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} iu_ReleaseRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Iu_ReleaseRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Iu_ReleaseRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Iu_ReleaseRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IuSignallingConnectionIdentifier.c b/src/ranap/RANAP_IuSignallingConnectionIdentifier.c
new file mode 100644
index 0000000..2f23007
--- /dev/null
+++ b/src/ranap/RANAP_IuSignallingConnectionIdentifier.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IuSignallingConnectionIdentifier.h"
+
+int
+RANAP_IuSignallingConnectionIdentifier_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 24l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_IuSignallingConnectionIdentifier_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_IuSignallingConnectionIdentifier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IuSignallingConnectionIdentifier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_IuSignallingConnectionIdentifier_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IuSignallingConnectionIdentifier_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_IuSignallingConnectionIdentifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_IuSignallingConnectionIdentifier_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_IuSignallingConnectionIdentifier_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_IuSignallingConnectionIdentifier_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_IuSignallingConnectionIdentifier_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_IuSignallingConnectionIdentifier_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_IuSignallingConnectionIdentifier_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  24l,  24l }	/* (SIZE(24..24)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IuSignallingConnectionIdentifier = {
+	"RANAP_IuSignallingConnectionIdentifier",
+	"RANAP_IuSignallingConnectionIdentifier",
+	RANAP_IuSignallingConnectionIdentifier_free,
+	RANAP_IuSignallingConnectionIdentifier_print,
+	RANAP_IuSignallingConnectionIdentifier_constraint,
+	RANAP_IuSignallingConnectionIdentifier_decode_ber,
+	RANAP_IuSignallingConnectionIdentifier_encode_der,
+	RANAP_IuSignallingConnectionIdentifier_decode_xer,
+	RANAP_IuSignallingConnectionIdentifier_encode_xer,
+	RANAP_IuSignallingConnectionIdentifier_decode_uper,
+	RANAP_IuSignallingConnectionIdentifier_encode_uper,
+	RANAP_IuSignallingConnectionIdentifier_decode_aper,
+	RANAP_IuSignallingConnectionIdentifier_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1,
+	sizeof(asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1)
+		/sizeof(asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1)
+		/sizeof(asn_DEF_RANAP_IuSignallingConnectionIdentifier_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_IuSignallingConnectionIdentifier_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_IuSignallingConnectionIdentifier.h b/src/ranap/RANAP_IuSignallingConnectionIdentifier.h
new file mode 100644
index 0000000..b334891
--- /dev/null
+++ b/src/ranap/RANAP_IuSignallingConnectionIdentifier.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IuSignallingConnectionIdentifier_H_
+#define	_RANAP_IuSignallingConnectionIdentifier_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_IuSignallingConnectionIdentifier */
+typedef BIT_STRING_t	 RANAP_IuSignallingConnectionIdentifier_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IuSignallingConnectionIdentifier;
+asn_struct_free_f RANAP_IuSignallingConnectionIdentifier_free;
+asn_struct_print_f RANAP_IuSignallingConnectionIdentifier_print;
+asn_constr_check_f RANAP_IuSignallingConnectionIdentifier_constraint;
+ber_type_decoder_f RANAP_IuSignallingConnectionIdentifier_decode_ber;
+der_type_encoder_f RANAP_IuSignallingConnectionIdentifier_encode_der;
+xer_type_decoder_f RANAP_IuSignallingConnectionIdentifier_decode_xer;
+xer_type_encoder_f RANAP_IuSignallingConnectionIdentifier_encode_xer;
+per_type_decoder_f RANAP_IuSignallingConnectionIdentifier_decode_uper;
+per_type_encoder_f RANAP_IuSignallingConnectionIdentifier_encode_uper;
+per_type_decoder_f RANAP_IuSignallingConnectionIdentifier_decode_aper;
+per_type_encoder_f RANAP_IuSignallingConnectionIdentifier_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IuSignallingConnectionIdentifier_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_IuTransportAssociation.c b/src/ranap/RANAP_IuTransportAssociation.c
new file mode 100644
index 0000000..ee7b796
--- /dev/null
+++ b/src/ranap/RANAP_IuTransportAssociation.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_IuTransportAssociation.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_IuTransportAssociation_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_IuTransportAssociation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IuTransportAssociation, choice.gTP_TEI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GTP_TEI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"gTP-TEI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_IuTransportAssociation, choice.bindingID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_BindingID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"bindingID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_IuTransportAssociation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* gTP-TEI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* bindingID */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_IuTransportAssociation_specs_1 = {
+	sizeof(struct RANAP_IuTransportAssociation),
+	offsetof(struct RANAP_IuTransportAssociation, _asn_ctx),
+	offsetof(struct RANAP_IuTransportAssociation, present),
+	sizeof(((struct RANAP_IuTransportAssociation *)0)->present),
+	asn_MAP_RANAP_IuTransportAssociation_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_IuTransportAssociation = {
+	"RANAP_IuTransportAssociation",
+	"RANAP_IuTransportAssociation",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_IuTransportAssociation_constr_1,
+	asn_MBR_RANAP_IuTransportAssociation_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_IuTransportAssociation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_IuTransportAssociation.h b/src/ranap/RANAP_IuTransportAssociation.h
new file mode 100644
index 0000000..c39705b
--- /dev/null
+++ b/src/ranap/RANAP_IuTransportAssociation.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_IuTransportAssociation_H_
+#define	_RANAP_IuTransportAssociation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GTP-TEI.h"
+#include "RANAP_BindingID.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_IuTransportAssociation_PR {
+	RANAP_IuTransportAssociation_PR_NOTHING,	/* No components present */
+	RANAP_IuTransportAssociation_PR_gTP_TEI,
+	RANAP_IuTransportAssociation_PR_bindingID,
+	/* Extensions may appear below */
+	
+} RANAP_IuTransportAssociation_PR;
+
+/* RANAP_IuTransportAssociation */
+typedef struct RANAP_IuTransportAssociation {
+	RANAP_IuTransportAssociation_PR present;
+	union RANAP_IuTransportAssociation_u {
+		RANAP_GTP_TEI_t	 gTP_TEI;
+		RANAP_BindingID_t	 bindingID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_IuTransportAssociation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_IuTransportAssociation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_IuTransportAssociation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_KeyStatus.c b/src/ranap/RANAP_KeyStatus.c
new file mode 100644
index 0000000..0ff0189
--- /dev/null
+++ b/src/ranap/RANAP_KeyStatus.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_KeyStatus.h"
+
+int
+RANAP_KeyStatus_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_KeyStatus_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_KeyStatus_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_KeyStatus_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_KeyStatus_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_KeyStatus_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_KeyStatus_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_KeyStatus_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_KeyStatus_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_KeyStatus_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_KeyStatus_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_KeyStatus_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_KeyStatus_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_KeyStatus_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_KeyStatus_value2enum_1[] = {
+	{ 0,	3,	"old" },
+	{ 1,	3,	"new" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_KeyStatus_enum2value_1[] = {
+	1,	/* new(1) */
+	0	/* old(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_KeyStatus_specs_1 = {
+	asn_MAP_RANAP_KeyStatus_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_KeyStatus_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_KeyStatus_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_KeyStatus = {
+	"RANAP_KeyStatus",
+	"RANAP_KeyStatus",
+	RANAP_KeyStatus_free,
+	RANAP_KeyStatus_print,
+	RANAP_KeyStatus_constraint,
+	RANAP_KeyStatus_decode_ber,
+	RANAP_KeyStatus_encode_der,
+	RANAP_KeyStatus_decode_xer,
+	RANAP_KeyStatus_encode_xer,
+	RANAP_KeyStatus_decode_uper,
+	RANAP_KeyStatus_encode_uper,
+	RANAP_KeyStatus_decode_aper,
+	RANAP_KeyStatus_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_KeyStatus_tags_1,
+	sizeof(asn_DEF_RANAP_KeyStatus_tags_1)
+		/sizeof(asn_DEF_RANAP_KeyStatus_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_KeyStatus_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_KeyStatus_tags_1)
+		/sizeof(asn_DEF_RANAP_KeyStatus_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_KeyStatus_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_KeyStatus_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_KeyStatus.h b/src/ranap/RANAP_KeyStatus.h
new file mode 100644
index 0000000..1b61813
--- /dev/null
+++ b/src/ranap/RANAP_KeyStatus.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_KeyStatus_H_
+#define	_RANAP_KeyStatus_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_KeyStatus {
+	RANAP_KeyStatus_old	= 0,
+	RANAP_KeyStatus_new	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_KeyStatus;
+
+/* RANAP_KeyStatus */
+typedef long	 RANAP_KeyStatus_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_KeyStatus;
+asn_struct_free_f RANAP_KeyStatus_free;
+asn_struct_print_f RANAP_KeyStatus_print;
+asn_constr_check_f RANAP_KeyStatus_constraint;
+ber_type_decoder_f RANAP_KeyStatus_decode_ber;
+der_type_encoder_f RANAP_KeyStatus_encode_der;
+xer_type_decoder_f RANAP_KeyStatus_decode_xer;
+xer_type_encoder_f RANAP_KeyStatus_encode_xer;
+per_type_decoder_f RANAP_KeyStatus_decode_uper;
+per_type_encoder_f RANAP_KeyStatus_encode_uper;
+per_type_decoder_f RANAP_KeyStatus_decode_aper;
+per_type_encoder_f RANAP_KeyStatus_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_KeyStatus_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_L3-Information.c b/src/ranap/RANAP_L3-Information.c
new file mode 100644
index 0000000..be098c5
--- /dev/null
+++ b/src/ranap/RANAP_L3-Information.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_L3-Information.h"
+
+int
+RANAP_L3_Information_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_L3_Information_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_L3_Information_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_L3_Information_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_L3_Information_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_L3_Information_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_L3_Information_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_L3_Information_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_L3_Information_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_L3_Information_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_L3_Information_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_L3_Information_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_L3_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_L3_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_L3_Information = {
+	"RANAP_L3-Information",
+	"RANAP_L3-Information",
+	RANAP_L3_Information_free,
+	RANAP_L3_Information_print,
+	RANAP_L3_Information_constraint,
+	RANAP_L3_Information_decode_ber,
+	RANAP_L3_Information_encode_der,
+	RANAP_L3_Information_decode_xer,
+	RANAP_L3_Information_encode_xer,
+	RANAP_L3_Information_decode_uper,
+	RANAP_L3_Information_encode_uper,
+	RANAP_L3_Information_decode_aper,
+	RANAP_L3_Information_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_L3_Information_tags_1,
+	sizeof(asn_DEF_RANAP_L3_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_L3_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_L3_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_L3_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_L3_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_L3-Information.h b/src/ranap/RANAP_L3-Information.h
new file mode 100644
index 0000000..122c64d
--- /dev/null
+++ b/src/ranap/RANAP_L3-Information.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_L3_Information_H_
+#define	_RANAP_L3_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_L3-Information */
+typedef OCTET_STRING_t	 RANAP_L3_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_L3_Information;
+asn_struct_free_f RANAP_L3_Information_free;
+asn_struct_print_f RANAP_L3_Information_print;
+asn_constr_check_f RANAP_L3_Information_constraint;
+ber_type_decoder_f RANAP_L3_Information_decode_ber;
+der_type_encoder_f RANAP_L3_Information_encode_der;
+xer_type_decoder_f RANAP_L3_Information_decode_xer;
+xer_type_encoder_f RANAP_L3_Information_encode_xer;
+per_type_decoder_f RANAP_L3_Information_decode_uper;
+per_type_encoder_f RANAP_L3_Information_encode_uper;
+per_type_decoder_f RANAP_L3_Information_decode_aper;
+per_type_encoder_f RANAP_L3_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_L3_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LA-LIST.c b/src/ranap/RANAP_LA-LIST.c
new file mode 100644
index 0000000..4526c6a
--- /dev/null
+++ b/src/ranap/RANAP_LA-LIST.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LA-LIST.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_LA_LIST_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_MemberA_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, lAC),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAC"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, listOF_SNAs),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ListOF_SNAs,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"listOF-SNAs"
+		},
+	{ ATF_POINTER, 1, offsetof(struct MemberA, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_MemberA_oms_2[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_MemberA_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_MemberA_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* lAC */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* listOF-SNAs */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_MemberA_specs_2 = {
+	sizeof(struct MemberA),
+	offsetof(struct MemberA, _asn_ctx),
+	asn_MAP_MemberA_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_MemberA_oms_2,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_MemberA_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_MemberA_tags_2,
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	asn_DEF_MemberA_tags_2,	/* Same as above */
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_MemberA_2,
+	3,	/* Elements count */
+	&asn_SPC_MemberA_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_LA_LIST_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_MemberA_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LA_LIST_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_LA_LIST_specs_1 = {
+	sizeof(struct RANAP_LA_LIST),
+	offsetof(struct RANAP_LA_LIST, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LA_LIST = {
+	"RANAP_LA-LIST",
+	"RANAP_LA-LIST",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LA_LIST_tags_1,
+	sizeof(asn_DEF_RANAP_LA_LIST_tags_1)
+		/sizeof(asn_DEF_RANAP_LA_LIST_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LA_LIST_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LA_LIST_tags_1)
+		/sizeof(asn_DEF_RANAP_LA_LIST_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LA_LIST_constr_1,
+	asn_MBR_RANAP_LA_LIST_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_LA_LIST_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LA-LIST.h b/src/ranap/RANAP_LA-LIST.h
new file mode 100644
index 0000000..3242a58
--- /dev/null
+++ b/src/ranap/RANAP_LA-LIST.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LA_LIST_H_
+#define	_RANAP_LA_LIST_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_LAC.h"
+#include "RANAP_ListOF-SNAs.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LA-LIST */
+typedef struct RANAP_LA_LIST {
+	A_SEQUENCE_OF(struct MemberA {
+		RANAP_LAC_t	 lAC;
+		RANAP_ListOF_SNAs_t	 listOF_SNAs;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LA_LIST_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LA_LIST;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LA_LIST_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LABased.c b/src/ranap/RANAP_LABased.c
new file mode 100644
index 0000000..052bf3c
--- /dev/null
+++ b/src/ranap/RANAP_LABased.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LABased.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_LABased_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LABased, laiList),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAI_List,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"laiList"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LABased, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_LABased_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LABased_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LABased_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* laiList */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LABased_specs_1 = {
+	sizeof(struct RANAP_LABased),
+	offsetof(struct RANAP_LABased, _asn_ctx),
+	asn_MAP_RANAP_LABased_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_LABased_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LABased = {
+	"RANAP_LABased",
+	"RANAP_LABased",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LABased_tags_1,
+	sizeof(asn_DEF_RANAP_LABased_tags_1)
+		/sizeof(asn_DEF_RANAP_LABased_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LABased_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LABased_tags_1)
+		/sizeof(asn_DEF_RANAP_LABased_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LABased_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_LABased_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LABased.h b/src/ranap/RANAP_LABased.h
new file mode 100644
index 0000000..161594a
--- /dev/null
+++ b/src/ranap/RANAP_LABased.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LABased_H_
+#define	_RANAP_LABased_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI-List.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LABased */
+typedef struct RANAP_LABased {
+	RANAP_LAI_List_t	 laiList;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LABased_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LABased;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LABased_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LAC.c b/src/ranap/RANAP_LAC.c
new file mode 100644
index 0000000..c9d99f1
--- /dev/null
+++ b/src/ranap/RANAP_LAC.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LAC.h"
+
+int
+RANAP_LAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_LAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_LAC_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_LAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_LAC_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_LAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_LAC_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_LAC_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_LAC_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_LAC_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LAC_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LAC = {
+	"RANAP_LAC",
+	"RANAP_LAC",
+	RANAP_LAC_free,
+	RANAP_LAC_print,
+	RANAP_LAC_constraint,
+	RANAP_LAC_decode_ber,
+	RANAP_LAC_encode_der,
+	RANAP_LAC_decode_xer,
+	RANAP_LAC_encode_xer,
+	RANAP_LAC_decode_uper,
+	RANAP_LAC_encode_uper,
+	RANAP_LAC_decode_aper,
+	RANAP_LAC_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LAC_tags_1,
+	sizeof(asn_DEF_RANAP_LAC_tags_1)
+		/sizeof(asn_DEF_RANAP_LAC_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LAC_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LAC_tags_1)
+		/sizeof(asn_DEF_RANAP_LAC_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LAC_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_LAC.h b/src/ranap/RANAP_LAC.h
new file mode 100644
index 0000000..ff12809
--- /dev/null
+++ b/src/ranap/RANAP_LAC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LAC_H_
+#define	_RANAP_LAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LAC */
+typedef OCTET_STRING_t	 RANAP_LAC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LAC;
+asn_struct_free_f RANAP_LAC_free;
+asn_struct_print_f RANAP_LAC_print;
+asn_constr_check_f RANAP_LAC_constraint;
+ber_type_decoder_f RANAP_LAC_decode_ber;
+der_type_encoder_f RANAP_LAC_encode_der;
+xer_type_decoder_f RANAP_LAC_decode_xer;
+xer_type_encoder_f RANAP_LAC_encode_xer;
+per_type_decoder_f RANAP_LAC_decode_uper;
+per_type_encoder_f RANAP_LAC_encode_uper;
+per_type_decoder_f RANAP_LAC_decode_aper;
+per_type_encoder_f RANAP_LAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LAC_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LAI-List.c b/src/ranap/RANAP_LAI-List.c
new file mode 100644
index 0000000..ce3f543
--- /dev/null
+++ b/src/ranap/RANAP_LAI-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LAI-List.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_LAI_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 3,  3,  1l,  8l }	/* (SIZE(1..8)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_LAI_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_LAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LAI_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_LAI_List_specs_1 = {
+	sizeof(struct RANAP_LAI_List),
+	offsetof(struct RANAP_LAI_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LAI_List = {
+	"RANAP_LAI-List",
+	"RANAP_LAI-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LAI_List_tags_1,
+	sizeof(asn_DEF_RANAP_LAI_List_tags_1)
+		/sizeof(asn_DEF_RANAP_LAI_List_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LAI_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LAI_List_tags_1)
+		/sizeof(asn_DEF_RANAP_LAI_List_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LAI_List_constr_1,
+	asn_MBR_RANAP_LAI_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_LAI_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LAI-List.h b/src/ranap/RANAP_LAI-List.h
new file mode 100644
index 0000000..58242ee
--- /dev/null
+++ b/src/ranap/RANAP_LAI-List.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LAI_List_H_
+#define	_RANAP_LAI_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LAI-List */
+typedef struct RANAP_LAI_List {
+	A_SEQUENCE_OF(RANAP_LAI_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LAI_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LAI_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LAI_List_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LAI.c b/src/ranap/RANAP_LAI.c
new file mode 100644
index 0000000..d8aa1d7
--- /dev/null
+++ b/src/ranap/RANAP_LAI.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LAI.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_LAI_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LAI, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LAI, lAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAC"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LAI, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_LAI_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LAI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LAI_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* lAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LAI_specs_1 = {
+	sizeof(struct RANAP_LAI),
+	offsetof(struct RANAP_LAI, _asn_ctx),
+	asn_MAP_RANAP_LAI_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_LAI_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LAI = {
+	"RANAP_LAI",
+	"RANAP_LAI",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LAI_tags_1,
+	sizeof(asn_DEF_RANAP_LAI_tags_1)
+		/sizeof(asn_DEF_RANAP_LAI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LAI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LAI_tags_1)
+		/sizeof(asn_DEF_RANAP_LAI_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LAI_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_LAI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LAI.h b/src/ranap/RANAP_LAI.h
new file mode 100644
index 0000000..8ef0f98
--- /dev/null
+++ b/src/ranap/RANAP_LAI.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LAI_H_
+#define	_RANAP_LAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_LAC.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LAI */
+typedef struct RANAP_LAI {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_LAC_t	 lAC;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LAI;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LAI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LAListofIdleModeUEs.c b/src/ranap/RANAP_LAListofIdleModeUEs.c
new file mode 100644
index 0000000..dea3aec
--- /dev/null
+++ b/src/ranap/RANAP_LAListofIdleModeUEs.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LAListofIdleModeUEs.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_LAListofIdleModeUEs_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_LAListofIdleModeUEs_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_LAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LAListofIdleModeUEs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_LAListofIdleModeUEs_specs_1 = {
+	sizeof(struct RANAP_LAListofIdleModeUEs),
+	offsetof(struct RANAP_LAListofIdleModeUEs, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LAListofIdleModeUEs = {
+	"RANAP_LAListofIdleModeUEs",
+	"RANAP_LAListofIdleModeUEs",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LAListofIdleModeUEs_tags_1,
+	sizeof(asn_DEF_RANAP_LAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_LAListofIdleModeUEs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LAListofIdleModeUEs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_LAListofIdleModeUEs_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LAListofIdleModeUEs_constr_1,
+	asn_MBR_RANAP_LAListofIdleModeUEs_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_LAListofIdleModeUEs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LAListofIdleModeUEs.h b/src/ranap/RANAP_LAListofIdleModeUEs.h
new file mode 100644
index 0000000..6b5ecca
--- /dev/null
+++ b/src/ranap/RANAP_LAListofIdleModeUEs.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LAListofIdleModeUEs_H_
+#define	_RANAP_LAListofIdleModeUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LAListofIdleModeUEs */
+typedef struct RANAP_LAListofIdleModeUEs {
+	A_SEQUENCE_OF(RANAP_LAI_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LAListofIdleModeUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LAListofIdleModeUEs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LAListofIdleModeUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LHN-ID.c b/src/ranap/RANAP_LHN-ID.c
new file mode 100644
index 0000000..95e2976
--- /dev/null
+++ b/src/ranap/RANAP_LHN-ID.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LHN-ID.h"
+
+int
+RANAP_LHN_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 32l && size <= 256l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_LHN_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_LHN_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_LHN_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LHN_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_LHN_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LHN_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_LHN_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LHN_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_LHN_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_LHN_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_LHN_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LHN_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_LHN_ID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  32l,  256l }	/* (SIZE(32..256)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LHN_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LHN_ID = {
+	"RANAP_LHN-ID",
+	"RANAP_LHN-ID",
+	RANAP_LHN_ID_free,
+	RANAP_LHN_ID_print,
+	RANAP_LHN_ID_constraint,
+	RANAP_LHN_ID_decode_ber,
+	RANAP_LHN_ID_encode_der,
+	RANAP_LHN_ID_decode_xer,
+	RANAP_LHN_ID_encode_xer,
+	RANAP_LHN_ID_decode_uper,
+	RANAP_LHN_ID_encode_uper,
+	RANAP_LHN_ID_decode_aper,
+	RANAP_LHN_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LHN_ID_tags_1,
+	sizeof(asn_DEF_RANAP_LHN_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_LHN_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LHN_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LHN_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_LHN_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LHN_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_LHN-ID.h b/src/ranap/RANAP_LHN-ID.h
new file mode 100644
index 0000000..a8776b8
--- /dev/null
+++ b/src/ranap/RANAP_LHN-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LHN_ID_H_
+#define	_RANAP_LHN_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LHN-ID */
+typedef OCTET_STRING_t	 RANAP_LHN_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LHN_ID;
+asn_struct_free_f RANAP_LHN_ID_free;
+asn_struct_print_f RANAP_LHN_ID_print;
+asn_constr_check_f RANAP_LHN_ID_constraint;
+ber_type_decoder_f RANAP_LHN_ID_decode_ber;
+der_type_encoder_f RANAP_LHN_ID_encode_der;
+xer_type_decoder_f RANAP_LHN_ID_decode_xer;
+xer_type_encoder_f RANAP_LHN_ID_encode_xer;
+per_type_decoder_f RANAP_LHN_ID_decode_uper;
+per_type_encoder_f RANAP_LHN_ID_encode_uper;
+per_type_decoder_f RANAP_LHN_ID_decode_aper;
+per_type_encoder_f RANAP_LHN_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LHN_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LastKnownServiceArea.c b/src/ranap/RANAP_LastKnownServiceArea.c
new file mode 100644
index 0000000..1360679
--- /dev/null
+++ b/src/ranap/RANAP_LastKnownServiceArea.c
@@ -0,0 +1,113 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LastKnownServiceArea.h"
+
+static int
+memb_ageOfSAI_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 32767l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_ageOfSAI_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 15,  15,  0l,  32767l }	/* (0..32767) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_LastKnownServiceArea_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LastKnownServiceArea, sAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sAI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LastKnownServiceArea, ageOfSAI),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_ageOfSAI_constraint_1,
+		&asn_PER_memb_ageOfSAI_constr_3,
+		0,
+		"ageOfSAI"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LastKnownServiceArea, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_LastKnownServiceArea_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LastKnownServiceArea_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LastKnownServiceArea_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ageOfSAI */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LastKnownServiceArea_specs_1 = {
+	sizeof(struct RANAP_LastKnownServiceArea),
+	offsetof(struct RANAP_LastKnownServiceArea, _asn_ctx),
+	asn_MAP_RANAP_LastKnownServiceArea_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_LastKnownServiceArea_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LastKnownServiceArea = {
+	"RANAP_LastKnownServiceArea",
+	"RANAP_LastKnownServiceArea",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LastKnownServiceArea_tags_1,
+	sizeof(asn_DEF_RANAP_LastKnownServiceArea_tags_1)
+		/sizeof(asn_DEF_RANAP_LastKnownServiceArea_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LastKnownServiceArea_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LastKnownServiceArea_tags_1)
+		/sizeof(asn_DEF_RANAP_LastKnownServiceArea_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LastKnownServiceArea_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_LastKnownServiceArea_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LastKnownServiceArea.h b/src/ranap/RANAP_LastKnownServiceArea.h
new file mode 100644
index 0000000..c29334f
--- /dev/null
+++ b/src/ranap/RANAP_LastKnownServiceArea.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LastKnownServiceArea_H_
+#define	_RANAP_LastKnownServiceArea_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SAI.h"
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LastKnownServiceArea */
+typedef struct RANAP_LastKnownServiceArea {
+	RANAP_SAI_t	 sAI;
+	long	 ageOfSAI;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LastKnownServiceArea_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LastKnownServiceArea;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LastKnownServiceArea_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LastVisitedUTRANCell-Item.c b/src/ranap/RANAP_LastVisitedUTRANCell-Item.c
new file mode 100644
index 0000000..61e4a1a
--- /dev/null
+++ b/src/ranap/RANAP_LastVisitedUTRANCell-Item.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LastVisitedUTRANCell-Item.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_LastVisitedUTRANCell_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LastVisitedUTRANCell_Item, uTRAN_CellID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UTRAN_CellID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uTRAN-CellID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LastVisitedUTRANCell_Item, cellType),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cellType"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LastVisitedUTRANCell_Item, time_UE_StayedInCell),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Time_UE_StayedInCell,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"time-UE-StayedInCell"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LastVisitedUTRANCell_Item, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_LastVisitedUTRANCell_Item_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LastVisitedUTRANCell_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uTRAN-CellID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cellType */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* time-UE-StayedInCell */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LastVisitedUTRANCell_Item_specs_1 = {
+	sizeof(struct RANAP_LastVisitedUTRANCell_Item),
+	offsetof(struct RANAP_LastVisitedUTRANCell_Item, _asn_ctx),
+	asn_MAP_RANAP_LastVisitedUTRANCell_Item_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_LastVisitedUTRANCell_Item_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LastVisitedUTRANCell_Item = {
+	"RANAP_LastVisitedUTRANCell-Item",
+	"RANAP_LastVisitedUTRANCell-Item",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1,
+	sizeof(asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1)
+		/sizeof(asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1)
+		/sizeof(asn_DEF_RANAP_LastVisitedUTRANCell_Item_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LastVisitedUTRANCell_Item_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_LastVisitedUTRANCell_Item_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LastVisitedUTRANCell-Item.h b/src/ranap/RANAP_LastVisitedUTRANCell-Item.h
new file mode 100644
index 0000000..de775e1
--- /dev/null
+++ b/src/ranap/RANAP_LastVisitedUTRANCell-Item.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LastVisitedUTRANCell_Item_H_
+#define	_RANAP_LastVisitedUTRANCell_Item_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_UTRAN-CellID.h"
+#include "RANAP_CellType.h"
+#include "RANAP_Time-UE-StayedInCell.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LastVisitedUTRANCell-Item */
+typedef struct RANAP_LastVisitedUTRANCell_Item {
+	RANAP_UTRAN_CellID_t	 uTRAN_CellID;
+	RANAP_CellType_t	 cellType;
+	RANAP_Time_UE_StayedInCell_t	 time_UE_StayedInCell;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LastVisitedUTRANCell_Item_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LastVisitedUTRANCell_Item;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LastVisitedUTRANCell_Item_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Links-to-log.c b/src/ranap/RANAP_Links-to-log.c
new file mode 100644
index 0000000..fe6b9ed
--- /dev/null
+++ b/src/ranap/RANAP_Links-to-log.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Links-to-log.h"
+
+int
+RANAP_Links_to_log_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Links_to_log_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Links_to_log_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Links_to_log_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Links_to_log_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Links_to_log_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Links_to_log_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Links_to_log_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Links_to_log_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Links_to_log_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Links_to_log_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Links_to_log_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Links_to_log_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Links_to_log_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Links_to_log_value2enum_1[] = {
+	{ 0,	6,	"uplink" },
+	{ 1,	8,	"downlink" },
+	{ 2,	24,	"both-uplink-and-downlink" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Links_to_log_enum2value_1[] = {
+	2,	/* both-uplink-and-downlink(2) */
+	1,	/* downlink(1) */
+	0	/* uplink(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Links_to_log_specs_1 = {
+	asn_MAP_RANAP_Links_to_log_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Links_to_log_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Links_to_log_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Links_to_log = {
+	"RANAP_Links-to-log",
+	"RANAP_Links-to-log",
+	RANAP_Links_to_log_free,
+	RANAP_Links_to_log_print,
+	RANAP_Links_to_log_constraint,
+	RANAP_Links_to_log_decode_ber,
+	RANAP_Links_to_log_encode_der,
+	RANAP_Links_to_log_decode_xer,
+	RANAP_Links_to_log_encode_xer,
+	RANAP_Links_to_log_decode_uper,
+	RANAP_Links_to_log_encode_uper,
+	RANAP_Links_to_log_decode_aper,
+	RANAP_Links_to_log_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Links_to_log_tags_1,
+	sizeof(asn_DEF_RANAP_Links_to_log_tags_1)
+		/sizeof(asn_DEF_RANAP_Links_to_log_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Links_to_log_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Links_to_log_tags_1)
+		/sizeof(asn_DEF_RANAP_Links_to_log_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Links_to_log_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Links_to_log_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Links-to-log.h b/src/ranap/RANAP_Links-to-log.h
new file mode 100644
index 0000000..8b11a7e
--- /dev/null
+++ b/src/ranap/RANAP_Links-to-log.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Links_to_log_H_
+#define	_RANAP_Links_to_log_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Links_to_log {
+	RANAP_Links_to_log_uplink	= 0,
+	RANAP_Links_to_log_downlink	= 1,
+	RANAP_Links_to_log_both_uplink_and_downlink	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Links_to_log;
+
+/* RANAP_Links-to-log */
+typedef long	 RANAP_Links_to_log_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Links_to_log;
+asn_struct_free_f RANAP_Links_to_log_free;
+asn_struct_print_f RANAP_Links_to_log_print;
+asn_constr_check_f RANAP_Links_to_log_constraint;
+ber_type_decoder_f RANAP_Links_to_log_decode_ber;
+der_type_encoder_f RANAP_Links_to_log_encode_der;
+xer_type_decoder_f RANAP_Links_to_log_decode_xer;
+xer_type_encoder_f RANAP_Links_to_log_encode_xer;
+per_type_decoder_f RANAP_Links_to_log_decode_uper;
+per_type_encoder_f RANAP_Links_to_log_encode_uper;
+per_type_decoder_f RANAP_Links_to_log_decode_aper;
+per_type_encoder_f RANAP_Links_to_log_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Links_to_log_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ListOF-SNAs.c b/src/ranap/RANAP_ListOF-SNAs.c
new file mode 100644
index 0000000..1a0d533
--- /dev/null
+++ b/src/ranap/RANAP_ListOF-SNAs.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ListOF-SNAs.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_ListOF_SNAs_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_ListOF_SNAs_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_SNAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ListOF_SNAs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_ListOF_SNAs_specs_1 = {
+	sizeof(struct RANAP_ListOF_SNAs),
+	offsetof(struct RANAP_ListOF_SNAs, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ListOF_SNAs = {
+	"RANAP_ListOF-SNAs",
+	"RANAP_ListOF-SNAs",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ListOF_SNAs_tags_1,
+	sizeof(asn_DEF_RANAP_ListOF_SNAs_tags_1)
+		/sizeof(asn_DEF_RANAP_ListOF_SNAs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ListOF_SNAs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ListOF_SNAs_tags_1)
+		/sizeof(asn_DEF_RANAP_ListOF_SNAs_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ListOF_SNAs_constr_1,
+	asn_MBR_RANAP_ListOF_SNAs_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_ListOF_SNAs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ListOF-SNAs.h b/src/ranap/RANAP_ListOF-SNAs.h
new file mode 100644
index 0000000..9a9c5d8
--- /dev/null
+++ b/src/ranap/RANAP_ListOF-SNAs.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ListOF_SNAs_H_
+#define	_RANAP_ListOF_SNAs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SNAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ListOF-SNAs */
+typedef struct RANAP_ListOF_SNAs {
+	A_SEQUENCE_OF(RANAP_SNAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ListOF_SNAs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ListOF_SNAs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ListOF_SNAs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ListOfInterfacesToTrace.c b/src/ranap/RANAP_ListOfInterfacesToTrace.c
new file mode 100644
index 0000000..2c87cd1
--- /dev/null
+++ b/src/ranap/RANAP_ListOfInterfacesToTrace.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ListOfInterfacesToTrace.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_ListOfInterfacesToTrace_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_ListOfInterfacesToTrace_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_InterfacesToTraceItem,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_ListOfInterfacesToTrace_specs_1 = {
+	sizeof(struct RANAP_ListOfInterfacesToTrace),
+	offsetof(struct RANAP_ListOfInterfacesToTrace, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ListOfInterfacesToTrace = {
+	"RANAP_ListOfInterfacesToTrace",
+	"RANAP_ListOfInterfacesToTrace",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1,
+	sizeof(asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1)
+		/sizeof(asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1)
+		/sizeof(asn_DEF_RANAP_ListOfInterfacesToTrace_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ListOfInterfacesToTrace_constr_1,
+	asn_MBR_RANAP_ListOfInterfacesToTrace_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_ListOfInterfacesToTrace_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ListOfInterfacesToTrace.h b/src/ranap/RANAP_ListOfInterfacesToTrace.h
new file mode 100644
index 0000000..9c522d8
--- /dev/null
+++ b/src/ranap/RANAP_ListOfInterfacesToTrace.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ListOfInterfacesToTrace_H_
+#define	_RANAP_ListOfInterfacesToTrace_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_InterfacesToTraceItem.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ListOfInterfacesToTrace */
+typedef struct RANAP_ListOfInterfacesToTrace {
+	A_SEQUENCE_OF(RANAP_InterfacesToTraceItem_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ListOfInterfacesToTrace_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ListOfInterfacesToTrace;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ListOfInterfacesToTrace_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LoadValue.c b/src/ranap/RANAP_LoadValue.c
new file mode 100644
index 0000000..fbb9b69
--- /dev/null
+++ b/src/ranap/RANAP_LoadValue.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LoadValue.h"
+
+int
+RANAP_LoadValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 100l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_LoadValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_LoadValue_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_LoadValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoadValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_LoadValue_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoadValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_LoadValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoadValue_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_LoadValue_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_LoadValue_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_LoadValue_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LoadValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_LoadValue_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  100l }	/* (0..100) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LoadValue_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LoadValue = {
+	"RANAP_LoadValue",
+	"RANAP_LoadValue",
+	RANAP_LoadValue_free,
+	RANAP_LoadValue_print,
+	RANAP_LoadValue_constraint,
+	RANAP_LoadValue_decode_ber,
+	RANAP_LoadValue_encode_der,
+	RANAP_LoadValue_decode_xer,
+	RANAP_LoadValue_encode_xer,
+	RANAP_LoadValue_decode_uper,
+	RANAP_LoadValue_encode_uper,
+	RANAP_LoadValue_decode_aper,
+	RANAP_LoadValue_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LoadValue_tags_1,
+	sizeof(asn_DEF_RANAP_LoadValue_tags_1)
+		/sizeof(asn_DEF_RANAP_LoadValue_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LoadValue_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LoadValue_tags_1)
+		/sizeof(asn_DEF_RANAP_LoadValue_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LoadValue_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_LoadValue.h b/src/ranap/RANAP_LoadValue.h
new file mode 100644
index 0000000..8cb072d
--- /dev/null
+++ b/src/ranap/RANAP_LoadValue.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LoadValue_H_
+#define	_RANAP_LoadValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LoadValue */
+typedef long	 RANAP_LoadValue_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LoadValue;
+asn_struct_free_f RANAP_LoadValue_free;
+asn_struct_print_f RANAP_LoadValue_print;
+asn_constr_check_f RANAP_LoadValue_constraint;
+ber_type_decoder_f RANAP_LoadValue_decode_ber;
+der_type_encoder_f RANAP_LoadValue_encode_der;
+xer_type_decoder_f RANAP_LoadValue_decode_xer;
+xer_type_encoder_f RANAP_LoadValue_encode_xer;
+per_type_decoder_f RANAP_LoadValue_decode_uper;
+per_type_encoder_f RANAP_LoadValue_encode_uper;
+per_type_decoder_f RANAP_LoadValue_decode_aper;
+per_type_encoder_f RANAP_LoadValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LoadValue_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationRelatedDataFailure.c b/src/ranap/RANAP_LocationRelatedDataFailure.c
new file mode 100644
index 0000000..9835619
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_LocationRelatedDataFailure.h"
+
+static int
+memb_locationRelatedDataFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_locationRelatedDataFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_locationRelatedDataFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_locationRelatedDataFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_locationRelatedDataFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_locationRelatedDataFailure_ies_specs_2 = {
+	sizeof(struct locationRelatedDataFailure_ies),
+	offsetof(struct locationRelatedDataFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_locationRelatedDataFailure_ies_2 = {
+	"locationRelatedDataFailure-ies",
+	"locationRelatedDataFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_locationRelatedDataFailure_ies_tags_2,
+	sizeof(asn_DEF_locationRelatedDataFailure_ies_tags_2)
+		/sizeof(asn_DEF_locationRelatedDataFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_locationRelatedDataFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_locationRelatedDataFailure_ies_tags_2)
+		/sizeof(asn_DEF_locationRelatedDataFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_locationRelatedDataFailure_ies_constr_2,
+	asn_MBR_locationRelatedDataFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_locationRelatedDataFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationRelatedDataFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationRelatedDataFailure, locationRelatedDataFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_locationRelatedDataFailure_ies_2,
+		memb_locationRelatedDataFailure_ies_constraint_1,
+		&asn_PER_memb_locationRelatedDataFailure_ies_constr_2,
+		0,
+		"locationRelatedDataFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationRelatedDataFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationRelatedDataFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* locationRelatedDataFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationRelatedDataFailure_specs_1 = {
+	sizeof(struct RANAP_LocationRelatedDataFailure),
+	offsetof(struct RANAP_LocationRelatedDataFailure, _asn_ctx),
+	asn_MAP_RANAP_LocationRelatedDataFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataFailure = {
+	"RANAP_LocationRelatedDataFailure",
+	"RANAP_LocationRelatedDataFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationRelatedDataFailure_tags_1,
+	sizeof(asn_DEF_RANAP_LocationRelatedDataFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationRelatedDataFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationRelatedDataFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationRelatedDataFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_LocationRelatedDataFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationRelatedDataFailure.h b/src/ranap/RANAP_LocationRelatedDataFailure.h
new file mode 100644
index 0000000..31fedf9
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_LocationRelatedDataFailure_H_
+#define	_RANAP_LocationRelatedDataFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationRelatedDataFailure */
+typedef struct RANAP_LocationRelatedDataFailure {
+	struct locationRelatedDataFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} locationRelatedDataFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationRelatedDataFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationRelatedDataFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationRelatedDataRequest.c b/src/ranap/RANAP_LocationRelatedDataRequest.c
new file mode 100644
index 0000000..0f22cce
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_LocationRelatedDataRequest.h"
+
+static int
+memb_locationRelatedDataRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_locationRelatedDataRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_locationRelatedDataRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_locationRelatedDataRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_locationRelatedDataRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_locationRelatedDataRequest_ies_specs_2 = {
+	sizeof(struct locationRelatedDataRequest_ies),
+	offsetof(struct locationRelatedDataRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_locationRelatedDataRequest_ies_2 = {
+	"locationRelatedDataRequest-ies",
+	"locationRelatedDataRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_locationRelatedDataRequest_ies_tags_2,
+	sizeof(asn_DEF_locationRelatedDataRequest_ies_tags_2)
+		/sizeof(asn_DEF_locationRelatedDataRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_locationRelatedDataRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_locationRelatedDataRequest_ies_tags_2)
+		/sizeof(asn_DEF_locationRelatedDataRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_locationRelatedDataRequest_ies_constr_2,
+	asn_MBR_locationRelatedDataRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_locationRelatedDataRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationRelatedDataRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationRelatedDataRequest, locationRelatedDataRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_locationRelatedDataRequest_ies_2,
+		memb_locationRelatedDataRequest_ies_constraint_1,
+		&asn_PER_memb_locationRelatedDataRequest_ies_constr_2,
+		0,
+		"locationRelatedDataRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationRelatedDataRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationRelatedDataRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* locationRelatedDataRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationRelatedDataRequest_specs_1 = {
+	sizeof(struct RANAP_LocationRelatedDataRequest),
+	offsetof(struct RANAP_LocationRelatedDataRequest, _asn_ctx),
+	asn_MAP_RANAP_LocationRelatedDataRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequest = {
+	"RANAP_LocationRelatedDataRequest",
+	"RANAP_LocationRelatedDataRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationRelatedDataRequest_tags_1,
+	sizeof(asn_DEF_RANAP_LocationRelatedDataRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationRelatedDataRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationRelatedDataRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationRelatedDataRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_LocationRelatedDataRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationRelatedDataRequest.h b/src/ranap/RANAP_LocationRelatedDataRequest.h
new file mode 100644
index 0000000..ec525e5
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_LocationRelatedDataRequest_H_
+#define	_RANAP_LocationRelatedDataRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationRelatedDataRequest */
+typedef struct RANAP_LocationRelatedDataRequest {
+	struct locationRelatedDataRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} locationRelatedDataRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationRelatedDataRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationRelatedDataRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationRelatedDataRequestType.c b/src/ranap/RANAP_LocationRelatedDataRequestType.c
new file mode 100644
index 0000000..680e760
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataRequestType.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LocationRelatedDataRequestType.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationRelatedDataRequestType_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationRelatedDataRequestType, requestedLocationRelatedDataType),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RequestedLocationRelatedDataType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"requestedLocationRelatedDataType"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LocationRelatedDataRequestType, requestedGPSAssistanceData),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RequestedGPSAssistanceData,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"requestedGPSAssistanceData"
+		},
+};
+static const int asn_MAP_RANAP_LocationRelatedDataRequestType_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationRelatedDataRequestType_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* requestedLocationRelatedDataType */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* requestedGPSAssistanceData */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationRelatedDataRequestType_specs_1 = {
+	sizeof(struct RANAP_LocationRelatedDataRequestType),
+	offsetof(struct RANAP_LocationRelatedDataRequestType, _asn_ctx),
+	asn_MAP_RANAP_LocationRelatedDataRequestType_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_LocationRelatedDataRequestType_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequestType = {
+	"RANAP_LocationRelatedDataRequestType",
+	"RANAP_LocationRelatedDataRequestType",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1,
+	sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequestType_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationRelatedDataRequestType_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_LocationRelatedDataRequestType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationRelatedDataRequestType.h b/src/ranap/RANAP_LocationRelatedDataRequestType.h
new file mode 100644
index 0000000..98fe123
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataRequestType.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LocationRelatedDataRequestType_H_
+#define	_RANAP_LocationRelatedDataRequestType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RequestedLocationRelatedDataType.h"
+#include "RANAP_RequestedGPSAssistanceData.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationRelatedDataRequestType */
+typedef struct RANAP_LocationRelatedDataRequestType {
+	RANAP_RequestedLocationRelatedDataType_t	 requestedLocationRelatedDataType;
+	RANAP_RequestedGPSAssistanceData_t	*requestedGPSAssistanceData	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationRelatedDataRequestType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequestType;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationRelatedDataRequestType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.c b/src/ranap/RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.c
new file mode 100644
index 0000000..7fae43a
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.h"
+
+int
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_value2enum_1[] = {
+	{ 0,	19,	"decipheringKeysEOTD" },
+	{ 1,	41,	"dedicatedMobileAssistedEOTDAssistanceData" },
+	{ 2,	38,	"dedicatedMobileBasedEOTDAssistanceData" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_enum2value_1[] = {
+	0,	/* decipheringKeysEOTD(0) */
+	1,	/* dedicatedMobileAssistedEOTDAssistanceData(1) */
+	2	/* dedicatedMobileBasedEOTDAssistanceData(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_specs_1 = {
+	asn_MAP_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode = {
+	"RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode",
+	"RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode",
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_free,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_print,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_constraint,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_ber,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_der,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_xer,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_xer,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_uper,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_uper,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_aper,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1,
+	sizeof(asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.h b/src/ranap/RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.h
new file mode 100644
index 0000000..bf80588
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_H_
+#define	_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode {
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decipheringKeysEOTD	= 0,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_dedicatedMobileAssistedEOTDAssistanceData	= 1,
+	RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_dedicatedMobileBasedEOTDAssistanceData	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode;
+
+/* RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode */
+typedef long	 RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode;
+asn_struct_free_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_free;
+asn_struct_print_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_print;
+asn_constr_check_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_constraint;
+ber_type_decoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_ber;
+der_type_encoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_der;
+xer_type_decoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_xer;
+xer_type_encoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_xer;
+per_type_decoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_uper;
+per_type_encoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_uper;
+per_type_decoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_decode_aper;
+per_type_encoder_f RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationRelatedDataRequestTypeSpecificToGERANIuMode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationRelatedDataResponse.c b/src/ranap/RANAP_LocationRelatedDataResponse.c
new file mode 100644
index 0000000..99e9384
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_LocationRelatedDataResponse.h"
+
+static int
+memb_locationRelatedDataResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_locationRelatedDataResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_locationRelatedDataResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_locationRelatedDataResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_locationRelatedDataResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_locationRelatedDataResponse_ies_specs_2 = {
+	sizeof(struct locationRelatedDataResponse_ies),
+	offsetof(struct locationRelatedDataResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_locationRelatedDataResponse_ies_2 = {
+	"locationRelatedDataResponse-ies",
+	"locationRelatedDataResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_locationRelatedDataResponse_ies_tags_2,
+	sizeof(asn_DEF_locationRelatedDataResponse_ies_tags_2)
+		/sizeof(asn_DEF_locationRelatedDataResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_locationRelatedDataResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_locationRelatedDataResponse_ies_tags_2)
+		/sizeof(asn_DEF_locationRelatedDataResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_locationRelatedDataResponse_ies_constr_2,
+	asn_MBR_locationRelatedDataResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_locationRelatedDataResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationRelatedDataResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationRelatedDataResponse, locationRelatedDataResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_locationRelatedDataResponse_ies_2,
+		memb_locationRelatedDataResponse_ies_constraint_1,
+		&asn_PER_memb_locationRelatedDataResponse_ies_constr_2,
+		0,
+		"locationRelatedDataResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationRelatedDataResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationRelatedDataResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* locationRelatedDataResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationRelatedDataResponse_specs_1 = {
+	sizeof(struct RANAP_LocationRelatedDataResponse),
+	offsetof(struct RANAP_LocationRelatedDataResponse, _asn_ctx),
+	asn_MAP_RANAP_LocationRelatedDataResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataResponse = {
+	"RANAP_LocationRelatedDataResponse",
+	"RANAP_LocationRelatedDataResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationRelatedDataResponse_tags_1,
+	sizeof(asn_DEF_RANAP_LocationRelatedDataResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationRelatedDataResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationRelatedDataResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationRelatedDataResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationRelatedDataResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_LocationRelatedDataResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationRelatedDataResponse.h b/src/ranap/RANAP_LocationRelatedDataResponse.h
new file mode 100644
index 0000000..f4c57a1
--- /dev/null
+++ b/src/ranap/RANAP_LocationRelatedDataResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_LocationRelatedDataResponse_H_
+#define	_RANAP_LocationRelatedDataResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationRelatedDataResponse */
+typedef struct RANAP_LocationRelatedDataResponse {
+	struct locationRelatedDataResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} locationRelatedDataResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationRelatedDataResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationRelatedDataResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationRelatedDataResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationReport.c b/src/ranap/RANAP_LocationReport.c
new file mode 100644
index 0000000..f38b717
--- /dev/null
+++ b/src/ranap/RANAP_LocationReport.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_LocationReport.h"
+
+static int
+memb_locationReport_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_locationReport_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_locationReport_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_locationReport_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_locationReport_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_locationReport_ies_specs_2 = {
+	sizeof(struct locationReport_ies),
+	offsetof(struct locationReport_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_locationReport_ies_2 = {
+	"locationReport-ies",
+	"locationReport-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_locationReport_ies_tags_2,
+	sizeof(asn_DEF_locationReport_ies_tags_2)
+		/sizeof(asn_DEF_locationReport_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_locationReport_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_locationReport_ies_tags_2)
+		/sizeof(asn_DEF_locationReport_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_locationReport_ies_constr_2,
+	asn_MBR_locationReport_ies_2,
+	1,	/* Single element */
+	&asn_SPC_locationReport_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationReport_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationReport, locationReport_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_locationReport_ies_2,
+		memb_locationReport_ies_constraint_1,
+		&asn_PER_memb_locationReport_ies_constr_2,
+		0,
+		"locationReport-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationReport_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationReport_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* locationReport-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationReport_specs_1 = {
+	sizeof(struct RANAP_LocationReport),
+	offsetof(struct RANAP_LocationReport, _asn_ctx),
+	asn_MAP_RANAP_LocationReport_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReport = {
+	"RANAP_LocationReport",
+	"RANAP_LocationReport",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationReport_tags_1,
+	sizeof(asn_DEF_RANAP_LocationReport_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationReport_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationReport_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationReport_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationReport_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationReport_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_LocationReport_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationReport.h b/src/ranap/RANAP_LocationReport.h
new file mode 100644
index 0000000..1939351
--- /dev/null
+++ b/src/ranap/RANAP_LocationReport.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_LocationReport_H_
+#define	_RANAP_LocationReport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationReport */
+typedef struct RANAP_LocationReport {
+	struct locationReport_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} locationReport_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationReport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationReport_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationReportingControl.c b/src/ranap/RANAP_LocationReportingControl.c
new file mode 100644
index 0000000..7a65a53
--- /dev/null
+++ b/src/ranap/RANAP_LocationReportingControl.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_LocationReportingControl.h"
+
+static int
+memb_locationReportingControl_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_locationReportingControl_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_locationReportingControl_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_locationReportingControl_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_locationReportingControl_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_locationReportingControl_ies_specs_2 = {
+	sizeof(struct locationReportingControl_ies),
+	offsetof(struct locationReportingControl_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_locationReportingControl_ies_2 = {
+	"locationReportingControl-ies",
+	"locationReportingControl-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_locationReportingControl_ies_tags_2,
+	sizeof(asn_DEF_locationReportingControl_ies_tags_2)
+		/sizeof(asn_DEF_locationReportingControl_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_locationReportingControl_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_locationReportingControl_ies_tags_2)
+		/sizeof(asn_DEF_locationReportingControl_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_locationReportingControl_ies_constr_2,
+	asn_MBR_locationReportingControl_ies_2,
+	1,	/* Single element */
+	&asn_SPC_locationReportingControl_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationReportingControl_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LocationReportingControl, locationReportingControl_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_locationReportingControl_ies_2,
+		memb_locationReportingControl_ies_constraint_1,
+		&asn_PER_memb_locationReportingControl_ies_constr_2,
+		0,
+		"locationReportingControl-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationReportingControl_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationReportingControl_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* locationReportingControl-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationReportingControl_specs_1 = {
+	sizeof(struct RANAP_LocationReportingControl),
+	offsetof(struct RANAP_LocationReportingControl, _asn_ctx),
+	asn_MAP_RANAP_LocationReportingControl_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReportingControl = {
+	"RANAP_LocationReportingControl",
+	"RANAP_LocationReportingControl",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationReportingControl_tags_1,
+	sizeof(asn_DEF_RANAP_LocationReportingControl_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationReportingControl_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationReportingControl_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationReportingControl_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationReportingControl_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationReportingControl_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_LocationReportingControl_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationReportingControl.h b/src/ranap/RANAP_LocationReportingControl.h
new file mode 100644
index 0000000..83e61d7
--- /dev/null
+++ b/src/ranap/RANAP_LocationReportingControl.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_LocationReportingControl_H_
+#define	_RANAP_LocationReportingControl_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationReportingControl */
+typedef struct RANAP_LocationReportingControl {
+	struct locationReportingControl_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} locationReportingControl_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationReportingControl_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReportingControl;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationReportingControl_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LocationReportingTransferInformation.c b/src/ranap/RANAP_LocationReportingTransferInformation.c
new file mode 100644
index 0000000..3521569
--- /dev/null
+++ b/src/ranap/RANAP_LocationReportingTransferInformation.c
@@ -0,0 +1,173 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LocationReportingTransferInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_LocationReportingTransferInformation_1[] = {
+	{ ATF_POINTER, 12, offsetof(struct RANAP_LocationReportingTransferInformation, reportChangeOfSAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ReportChangeOfSAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"reportChangeOfSAI"
+		},
+	{ ATF_POINTER, 11, offsetof(struct RANAP_LocationReportingTransferInformation, periodicReportingIndicator),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PeriodicReportingIndicator,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"periodicReportingIndicator"
+		},
+	{ ATF_POINTER, 10, offsetof(struct RANAP_LocationReportingTransferInformation, directReportingIndicator),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DirectReportingIndicator,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"directReportingIndicator"
+		},
+	{ ATF_POINTER, 9, offsetof(struct RANAP_LocationReportingTransferInformation, verticalAccuracyCode),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_VerticalAccuracyCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"verticalAccuracyCode"
+		},
+	{ ATF_POINTER, 8, offsetof(struct RANAP_LocationReportingTransferInformation, positioningPriorityChangeSAI),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PositioningPriority,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"positioningPriorityChangeSAI"
+		},
+	{ ATF_POINTER, 7, offsetof(struct RANAP_LocationReportingTransferInformation, positioningPriorityDirect),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PositioningPriority,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"positioningPriorityDirect"
+		},
+	{ ATF_POINTER, 6, offsetof(struct RANAP_LocationReportingTransferInformation, clientTypePeriodic),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ClientType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"clientTypePeriodic"
+		},
+	{ ATF_POINTER, 5, offsetof(struct RANAP_LocationReportingTransferInformation, clientTypeDirect),
+		(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ClientType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"clientTypeDirect"
+		},
+	{ ATF_POINTER, 4, offsetof(struct RANAP_LocationReportingTransferInformation, responseTime),
+		(ASN_TAG_CLASS_CONTEXT | (8 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ResponseTime,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"responseTime"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_LocationReportingTransferInformation, includeVelocity),
+		(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IncludeVelocity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"includeVelocity"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_LocationReportingTransferInformation, periodicLocationInfo),
+		(ASN_TAG_CLASS_CONTEXT | (10 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PeriodicLocationInfo,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"periodicLocationInfo"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LocationReportingTransferInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (11 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_LocationReportingTransferInformation_oms_1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LocationReportingTransferInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LocationReportingTransferInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* reportChangeOfSAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* periodicReportingIndicator */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* directReportingIndicator */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* verticalAccuracyCode */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* positioningPriorityChangeSAI */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* positioningPriorityDirect */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* clientTypePeriodic */
+    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* clientTypeDirect */
+    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* responseTime */
+    { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* includeVelocity */
+    { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* periodicLocationInfo */
+    { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LocationReportingTransferInformation_specs_1 = {
+	sizeof(struct RANAP_LocationReportingTransferInformation),
+	offsetof(struct RANAP_LocationReportingTransferInformation, _asn_ctx),
+	asn_MAP_RANAP_LocationReportingTransferInformation_tag2el_1,
+	12,	/* Count of tags in the map */
+	asn_MAP_RANAP_LocationReportingTransferInformation_oms_1,	/* Optional members */
+	12, 0,	/* Root/Additions */
+	11,	/* Start extensions */
+	13	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReportingTransferInformation = {
+	"RANAP_LocationReportingTransferInformation",
+	"RANAP_LocationReportingTransferInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LocationReportingTransferInformation_tags_1,
+	sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LocationReportingTransferInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_LocationReportingTransferInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LocationReportingTransferInformation_1,
+	12,	/* Elements count */
+	&asn_SPC_RANAP_LocationReportingTransferInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LocationReportingTransferInformation.h b/src/ranap/RANAP_LocationReportingTransferInformation.h
new file mode 100644
index 0000000..a80e5b2
--- /dev/null
+++ b/src/ranap/RANAP_LocationReportingTransferInformation.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LocationReportingTransferInformation_H_
+#define	_RANAP_LocationReportingTransferInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ReportChangeOfSAI.h"
+#include "RANAP_PeriodicReportingIndicator.h"
+#include "RANAP_DirectReportingIndicator.h"
+#include "RANAP_VerticalAccuracyCode.h"
+#include "RANAP_PositioningPriority.h"
+#include "RANAP_ClientType.h"
+#include "RANAP_ResponseTime.h"
+#include "RANAP_IncludeVelocity.h"
+#include "RANAP_PeriodicLocationInfo.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LocationReportingTransferInformation */
+typedef struct RANAP_LocationReportingTransferInformation {
+	RANAP_ReportChangeOfSAI_t	*reportChangeOfSAI	/* OPTIONAL */;
+	RANAP_PeriodicReportingIndicator_t	*periodicReportingIndicator	/* OPTIONAL */;
+	RANAP_DirectReportingIndicator_t	*directReportingIndicator	/* OPTIONAL */;
+	RANAP_VerticalAccuracyCode_t	*verticalAccuracyCode	/* OPTIONAL */;
+	RANAP_PositioningPriority_t	*positioningPriorityChangeSAI	/* OPTIONAL */;
+	RANAP_PositioningPriority_t	*positioningPriorityDirect	/* OPTIONAL */;
+	RANAP_ClientType_t	*clientTypePeriodic	/* OPTIONAL */;
+	RANAP_ClientType_t	*clientTypeDirect	/* OPTIONAL */;
+	RANAP_ResponseTime_t	*responseTime	/* OPTIONAL */;
+	RANAP_IncludeVelocity_t	*includeVelocity	/* OPTIONAL */;
+	RANAP_PeriodicLocationInfo_t	*periodicLocationInfo	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LocationReportingTransferInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LocationReportingTransferInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LocationReportingTransferInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LoggedMDT.c b/src/ranap/RANAP_LoggedMDT.c
new file mode 100644
index 0000000..9f0ca98
--- /dev/null
+++ b/src/ranap/RANAP_LoggedMDT.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LoggedMDT.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_LoggedMDT_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LoggedMDT, loggingInterval),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LoggingInterval,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"loggingInterval"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_LoggedMDT, loggingDuration),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LoggingDuration,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"loggingDuration"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_LoggedMDT, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_LoggedMDT_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_LoggedMDT_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_LoggedMDT_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* loggingInterval */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* loggingDuration */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_LoggedMDT_specs_1 = {
+	sizeof(struct RANAP_LoggedMDT),
+	offsetof(struct RANAP_LoggedMDT, _asn_ctx),
+	asn_MAP_RANAP_LoggedMDT_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_LoggedMDT_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LoggedMDT = {
+	"RANAP_LoggedMDT",
+	"RANAP_LoggedMDT",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LoggedMDT_tags_1,
+	sizeof(asn_DEF_RANAP_LoggedMDT_tags_1)
+		/sizeof(asn_DEF_RANAP_LoggedMDT_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LoggedMDT_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LoggedMDT_tags_1)
+		/sizeof(asn_DEF_RANAP_LoggedMDT_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_LoggedMDT_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_LoggedMDT_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LoggedMDT.h b/src/ranap/RANAP_LoggedMDT.h
new file mode 100644
index 0000000..05c608f
--- /dev/null
+++ b/src/ranap/RANAP_LoggedMDT.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LoggedMDT_H_
+#define	_RANAP_LoggedMDT_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LoggingInterval.h"
+#include "RANAP_LoggingDuration.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_LoggedMDT */
+typedef struct RANAP_LoggedMDT {
+	RANAP_LoggingInterval_t	 loggingInterval;
+	RANAP_LoggingDuration_t	 loggingDuration;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_LoggedMDT_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LoggedMDT;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LoggedMDT_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LoggingDuration.c b/src/ranap/RANAP_LoggingDuration.c
new file mode 100644
index 0000000..f801806
--- /dev/null
+++ b/src/ranap/RANAP_LoggingDuration.c
@@ -0,0 +1,175 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LoggingDuration.h"
+
+int
+RANAP_LoggingDuration_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_LoggingDuration_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_LoggingDuration_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_LoggingDuration_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoggingDuration_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_LoggingDuration_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoggingDuration_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_LoggingDuration_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoggingDuration_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_LoggingDuration_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_LoggingDuration_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_LoggingDuration_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LoggingDuration_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_LoggingDuration_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  5l }	/* (0..5,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_LoggingDuration_value2enum_1[] = {
+	{ 0,	5,	"min10" },
+	{ 1,	5,	"min20" },
+	{ 2,	5,	"min40" },
+	{ 3,	5,	"min60" },
+	{ 4,	5,	"min90" },
+	{ 5,	6,	"min120" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_LoggingDuration_enum2value_1[] = {
+	0,	/* min10(0) */
+	5,	/* min120(5) */
+	1,	/* min20(1) */
+	2,	/* min40(2) */
+	3,	/* min60(3) */
+	4	/* min90(4) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_LoggingDuration_specs_1 = {
+	asn_MAP_RANAP_LoggingDuration_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_LoggingDuration_enum2value_1,	/* N => "tag"; sorted by N */
+	6,	/* Number of elements in the maps */
+	7,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LoggingDuration_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LoggingDuration = {
+	"RANAP_LoggingDuration",
+	"RANAP_LoggingDuration",
+	RANAP_LoggingDuration_free,
+	RANAP_LoggingDuration_print,
+	RANAP_LoggingDuration_constraint,
+	RANAP_LoggingDuration_decode_ber,
+	RANAP_LoggingDuration_encode_der,
+	RANAP_LoggingDuration_decode_xer,
+	RANAP_LoggingDuration_encode_xer,
+	RANAP_LoggingDuration_decode_uper,
+	RANAP_LoggingDuration_encode_uper,
+	RANAP_LoggingDuration_decode_aper,
+	RANAP_LoggingDuration_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LoggingDuration_tags_1,
+	sizeof(asn_DEF_RANAP_LoggingDuration_tags_1)
+		/sizeof(asn_DEF_RANAP_LoggingDuration_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LoggingDuration_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LoggingDuration_tags_1)
+		/sizeof(asn_DEF_RANAP_LoggingDuration_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LoggingDuration_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_LoggingDuration_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LoggingDuration.h b/src/ranap/RANAP_LoggingDuration.h
new file mode 100644
index 0000000..90d4509
--- /dev/null
+++ b/src/ranap/RANAP_LoggingDuration.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LoggingDuration_H_
+#define	_RANAP_LoggingDuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_LoggingDuration {
+	RANAP_LoggingDuration_min10	= 0,
+	RANAP_LoggingDuration_min20	= 1,
+	RANAP_LoggingDuration_min40	= 2,
+	RANAP_LoggingDuration_min60	= 3,
+	RANAP_LoggingDuration_min90	= 4,
+	RANAP_LoggingDuration_min120	= 5
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_LoggingDuration;
+
+/* RANAP_LoggingDuration */
+typedef long	 RANAP_LoggingDuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LoggingDuration;
+asn_struct_free_f RANAP_LoggingDuration_free;
+asn_struct_print_f RANAP_LoggingDuration_print;
+asn_constr_check_f RANAP_LoggingDuration_constraint;
+ber_type_decoder_f RANAP_LoggingDuration_decode_ber;
+der_type_encoder_f RANAP_LoggingDuration_encode_der;
+xer_type_decoder_f RANAP_LoggingDuration_decode_xer;
+xer_type_encoder_f RANAP_LoggingDuration_encode_xer;
+per_type_decoder_f RANAP_LoggingDuration_decode_uper;
+per_type_encoder_f RANAP_LoggingDuration_encode_uper;
+per_type_decoder_f RANAP_LoggingDuration_decode_aper;
+per_type_encoder_f RANAP_LoggingDuration_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LoggingDuration_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_LoggingInterval.c b/src/ranap/RANAP_LoggingInterval.c
new file mode 100644
index 0000000..6b0ddb8
--- /dev/null
+++ b/src/ranap/RANAP_LoggingInterval.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_LoggingInterval.h"
+
+int
+RANAP_LoggingInterval_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_LoggingInterval_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_LoggingInterval_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_LoggingInterval_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoggingInterval_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_LoggingInterval_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoggingInterval_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_LoggingInterval_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_LoggingInterval_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_LoggingInterval_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_LoggingInterval_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_LoggingInterval_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_LoggingInterval_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_LoggingInterval_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  7l }	/* (0..7,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_LoggingInterval_value2enum_1[] = {
+	{ 0,	5,	"s1d28" },
+	{ 1,	5,	"s2d56" },
+	{ 2,	5,	"s5d12" },
+	{ 3,	6,	"s10d24" },
+	{ 4,	6,	"s20d48" },
+	{ 5,	6,	"s30d72" },
+	{ 6,	6,	"s40d96" },
+	{ 7,	6,	"s61d44" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_LoggingInterval_enum2value_1[] = {
+	3,	/* s10d24(3) */
+	0,	/* s1d28(0) */
+	4,	/* s20d48(4) */
+	1,	/* s2d56(1) */
+	5,	/* s30d72(5) */
+	6,	/* s40d96(6) */
+	2,	/* s5d12(2) */
+	7	/* s61d44(7) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_LoggingInterval_specs_1 = {
+	asn_MAP_RANAP_LoggingInterval_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_LoggingInterval_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	9,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_LoggingInterval_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_LoggingInterval = {
+	"RANAP_LoggingInterval",
+	"RANAP_LoggingInterval",
+	RANAP_LoggingInterval_free,
+	RANAP_LoggingInterval_print,
+	RANAP_LoggingInterval_constraint,
+	RANAP_LoggingInterval_decode_ber,
+	RANAP_LoggingInterval_encode_der,
+	RANAP_LoggingInterval_decode_xer,
+	RANAP_LoggingInterval_encode_xer,
+	RANAP_LoggingInterval_decode_uper,
+	RANAP_LoggingInterval_encode_uper,
+	RANAP_LoggingInterval_decode_aper,
+	RANAP_LoggingInterval_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_LoggingInterval_tags_1,
+	sizeof(asn_DEF_RANAP_LoggingInterval_tags_1)
+		/sizeof(asn_DEF_RANAP_LoggingInterval_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_LoggingInterval_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_LoggingInterval_tags_1)
+		/sizeof(asn_DEF_RANAP_LoggingInterval_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_LoggingInterval_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_LoggingInterval_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_LoggingInterval.h b/src/ranap/RANAP_LoggingInterval.h
new file mode 100644
index 0000000..60ebae5
--- /dev/null
+++ b/src/ranap/RANAP_LoggingInterval.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_LoggingInterval_H_
+#define	_RANAP_LoggingInterval_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_LoggingInterval {
+	RANAP_LoggingInterval_s1d28	= 0,
+	RANAP_LoggingInterval_s2d56	= 1,
+	RANAP_LoggingInterval_s5d12	= 2,
+	RANAP_LoggingInterval_s10d24	= 3,
+	RANAP_LoggingInterval_s20d48	= 4,
+	RANAP_LoggingInterval_s30d72	= 5,
+	RANAP_LoggingInterval_s40d96	= 6,
+	RANAP_LoggingInterval_s61d44	= 7
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_LoggingInterval;
+
+/* RANAP_LoggingInterval */
+typedef long	 RANAP_LoggingInterval_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_LoggingInterval;
+asn_struct_free_f RANAP_LoggingInterval_free;
+asn_struct_print_f RANAP_LoggingInterval_print;
+asn_constr_check_f RANAP_LoggingInterval_constraint;
+ber_type_decoder_f RANAP_LoggingInterval_decode_ber;
+der_type_encoder_f RANAP_LoggingInterval_encode_der;
+xer_type_decoder_f RANAP_LoggingInterval_decode_xer;
+xer_type_encoder_f RANAP_LoggingInterval_encode_xer;
+per_type_decoder_f RANAP_LoggingInterval_decode_uper;
+per_type_encoder_f RANAP_LoggingInterval_encode_uper;
+per_type_decoder_f RANAP_LoggingInterval_decode_aper;
+per_type_encoder_f RANAP_LoggingInterval_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_LoggingInterval_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M1Report.c b/src/ranap/RANAP_M1Report.c
new file mode 100644
index 0000000..67fa447
--- /dev/null
+++ b/src/ranap/RANAP_M1Report.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M1Report.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_M1Report_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_M1Report_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M1Report, choice.periodic),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MDT_Report_Parameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"periodic"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M1Report, choice.event1F),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Event1F_Parameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"event1F"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M1Report_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* periodic */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* event1F */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_M1Report_specs_1 = {
+	sizeof(struct RANAP_M1Report),
+	offsetof(struct RANAP_M1Report, _asn_ctx),
+	offsetof(struct RANAP_M1Report, present),
+	sizeof(((struct RANAP_M1Report *)0)->present),
+	asn_MAP_RANAP_M1Report_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M1Report = {
+	"RANAP_M1Report",
+	"RANAP_M1Report",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_M1Report_constr_1,
+	asn_MBR_RANAP_M1Report_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_M1Report_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M1Report.h b/src/ranap/RANAP_M1Report.h
new file mode 100644
index 0000000..e214312
--- /dev/null
+++ b/src/ranap/RANAP_M1Report.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M1Report_H_
+#define	_RANAP_M1Report_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MDT-Report-Parameters.h"
+#include "RANAP_Event1F-Parameters.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M1Report_PR {
+	RANAP_M1Report_PR_NOTHING,	/* No components present */
+	RANAP_M1Report_PR_periodic,
+	RANAP_M1Report_PR_event1F,
+	/* Extensions may appear below */
+	
+} RANAP_M1Report_PR;
+
+/* RANAP_M1Report */
+typedef struct RANAP_M1Report {
+	RANAP_M1Report_PR present;
+	union RANAP_M1Report_u {
+		RANAP_MDT_Report_Parameters_t	 periodic;
+		RANAP_Event1F_Parameters_t	 event1F;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M1Report_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M1Report;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M1Report_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M2Report.c b/src/ranap/RANAP_M2Report.c
new file mode 100644
index 0000000..768a3c4
--- /dev/null
+++ b/src/ranap/RANAP_M2Report.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M2Report.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_M2Report_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_M2Report_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M2Report, choice.periodic),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MDT_Report_Parameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"periodic"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M2Report, choice.event1I),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Event1I_Parameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"event1I"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M2Report_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* periodic */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* event1I */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_M2Report_specs_1 = {
+	sizeof(struct RANAP_M2Report),
+	offsetof(struct RANAP_M2Report, _asn_ctx),
+	offsetof(struct RANAP_M2Report, present),
+	sizeof(((struct RANAP_M2Report *)0)->present),
+	asn_MAP_RANAP_M2Report_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M2Report = {
+	"RANAP_M2Report",
+	"RANAP_M2Report",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_M2Report_constr_1,
+	asn_MBR_RANAP_M2Report_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_M2Report_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M2Report.h b/src/ranap/RANAP_M2Report.h
new file mode 100644
index 0000000..505751f
--- /dev/null
+++ b/src/ranap/RANAP_M2Report.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M2Report_H_
+#define	_RANAP_M2Report_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MDT-Report-Parameters.h"
+#include "RANAP_Event1I-Parameters.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M2Report_PR {
+	RANAP_M2Report_PR_NOTHING,	/* No components present */
+	RANAP_M2Report_PR_periodic,
+	RANAP_M2Report_PR_event1I,
+	/* Extensions may appear below */
+	
+} RANAP_M2Report_PR;
+
+/* RANAP_M2Report */
+typedef struct RANAP_M2Report {
+	RANAP_M2Report_PR present;
+	union RANAP_M2Report_u {
+		RANAP_MDT_Report_Parameters_t	 periodic;
+		RANAP_Event1I_Parameters_t	 event1I;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M2Report_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M2Report;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M2Report_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M4-Collection-Parameters.c b/src/ranap/RANAP_M4-Collection-Parameters.c
new file mode 100644
index 0000000..e964b55
--- /dev/null
+++ b/src/ranap/RANAP_M4-Collection-Parameters.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M4-Collection-Parameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_M4_Collection_Parameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M4_Collection_Parameters, m4_period),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_M4_Period,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m4-period"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_M4_Collection_Parameters, m4_threshold),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_M4_Threshold,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m4-threshold"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_M4_Collection_Parameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_M4_Collection_Parameters_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_M4_Collection_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M4_Collection_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m4-period */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* m4-threshold */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_M4_Collection_Parameters_specs_1 = {
+	sizeof(struct RANAP_M4_Collection_Parameters),
+	offsetof(struct RANAP_M4_Collection_Parameters, _asn_ctx),
+	asn_MAP_RANAP_M4_Collection_Parameters_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_M4_Collection_Parameters_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Collection_Parameters = {
+	"RANAP_M4-Collection-Parameters",
+	"RANAP_M4-Collection-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M4_Collection_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M4_Collection_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_M4_Collection_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_M4_Collection_Parameters_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_M4_Collection_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M4-Collection-Parameters.h b/src/ranap/RANAP_M4-Collection-Parameters.h
new file mode 100644
index 0000000..caf8a59
--- /dev/null
+++ b/src/ranap/RANAP_M4-Collection-Parameters.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M4_Collection_Parameters_H_
+#define	_RANAP_M4_Collection_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_M4-Period.h"
+#include "RANAP_M4-Threshold.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_M4-Collection-Parameters */
+typedef struct RANAP_M4_Collection_Parameters {
+	RANAP_M4_Period_t	 m4_period;
+	RANAP_M4_Threshold_t	*m4_threshold	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M4_Collection_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Collection_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M4_Collection_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M4-Period.c b/src/ranap/RANAP_M4-Period.c
new file mode 100644
index 0000000..f3254bf
--- /dev/null
+++ b/src/ranap/RANAP_M4-Period.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M4-Period.h"
+
+int
+RANAP_M4_Period_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_M4_Period_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_M4_Period_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_M4_Period_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M4_Period_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_M4_Period_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M4_Period_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_M4_Period_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M4_Period_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_M4_Period_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_M4_Period_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_M4_Period_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M4_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_M4_Period_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  7l }	/* (0..7,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_M4_Period_value2enum_1[] = {
+	{ 0,	5,	"ms100" },
+	{ 1,	5,	"ms250" },
+	{ 2,	5,	"ms500" },
+	{ 3,	6,	"ms1000" },
+	{ 4,	6,	"ms2000" },
+	{ 5,	6,	"ms3000" },
+	{ 6,	6,	"ms4000" },
+	{ 7,	6,	"ms6000" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_M4_Period_enum2value_1[] = {
+	0,	/* ms100(0) */
+	3,	/* ms1000(3) */
+	4,	/* ms2000(4) */
+	1,	/* ms250(1) */
+	5,	/* ms3000(5) */
+	6,	/* ms4000(6) */
+	2,	/* ms500(2) */
+	7	/* ms6000(7) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_M4_Period_specs_1 = {
+	asn_MAP_RANAP_M4_Period_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_M4_Period_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	9,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_M4_Period_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Period = {
+	"RANAP_M4-Period",
+	"RANAP_M4-Period",
+	RANAP_M4_Period_free,
+	RANAP_M4_Period_print,
+	RANAP_M4_Period_constraint,
+	RANAP_M4_Period_decode_ber,
+	RANAP_M4_Period_encode_der,
+	RANAP_M4_Period_decode_xer,
+	RANAP_M4_Period_encode_xer,
+	RANAP_M4_Period_decode_uper,
+	RANAP_M4_Period_encode_uper,
+	RANAP_M4_Period_decode_aper,
+	RANAP_M4_Period_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M4_Period_tags_1,
+	sizeof(asn_DEF_RANAP_M4_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M4_Period_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M4_Period_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M4_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M4_Period_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_M4_Period_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_M4_Period_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M4-Period.h b/src/ranap/RANAP_M4-Period.h
new file mode 100644
index 0000000..c6b615d
--- /dev/null
+++ b/src/ranap/RANAP_M4-Period.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M4_Period_H_
+#define	_RANAP_M4_Period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M4_Period {
+	RANAP_M4_Period_ms100	= 0,
+	RANAP_M4_Period_ms250	= 1,
+	RANAP_M4_Period_ms500	= 2,
+	RANAP_M4_Period_ms1000	= 3,
+	RANAP_M4_Period_ms2000	= 4,
+	RANAP_M4_Period_ms3000	= 5,
+	RANAP_M4_Period_ms4000	= 6,
+	RANAP_M4_Period_ms6000	= 7
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_M4_Period;
+
+/* RANAP_M4-Period */
+typedef long	 RANAP_M4_Period_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Period;
+asn_struct_free_f RANAP_M4_Period_free;
+asn_struct_print_f RANAP_M4_Period_print;
+asn_constr_check_f RANAP_M4_Period_constraint;
+ber_type_decoder_f RANAP_M4_Period_decode_ber;
+der_type_encoder_f RANAP_M4_Period_encode_der;
+xer_type_decoder_f RANAP_M4_Period_decode_xer;
+xer_type_encoder_f RANAP_M4_Period_encode_xer;
+per_type_decoder_f RANAP_M4_Period_decode_uper;
+per_type_encoder_f RANAP_M4_Period_encode_uper;
+per_type_decoder_f RANAP_M4_Period_decode_aper;
+per_type_encoder_f RANAP_M4_Period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M4_Period_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M4-Threshold.c b/src/ranap/RANAP_M4-Threshold.c
new file mode 100644
index 0000000..7ec7d4d
--- /dev/null
+++ b/src/ranap/RANAP_M4-Threshold.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M4-Threshold.h"
+
+int
+RANAP_M4_Threshold_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 31l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_M4_Threshold_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_M4_Threshold_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_M4_Threshold_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M4_Threshold_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_M4_Threshold_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M4_Threshold_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_M4_Threshold_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M4_Threshold_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_M4_Threshold_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_M4_Threshold_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_M4_Threshold_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M4_Threshold_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_M4_Threshold_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 5,  5,  0l,  31l }	/* (0..31) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_M4_Threshold_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Threshold = {
+	"RANAP_M4-Threshold",
+	"RANAP_M4-Threshold",
+	RANAP_M4_Threshold_free,
+	RANAP_M4_Threshold_print,
+	RANAP_M4_Threshold_constraint,
+	RANAP_M4_Threshold_decode_ber,
+	RANAP_M4_Threshold_encode_der,
+	RANAP_M4_Threshold_decode_xer,
+	RANAP_M4_Threshold_encode_xer,
+	RANAP_M4_Threshold_decode_uper,
+	RANAP_M4_Threshold_encode_uper,
+	RANAP_M4_Threshold_decode_aper,
+	RANAP_M4_Threshold_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M4_Threshold_tags_1,
+	sizeof(asn_DEF_RANAP_M4_Threshold_tags_1)
+		/sizeof(asn_DEF_RANAP_M4_Threshold_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M4_Threshold_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M4_Threshold_tags_1)
+		/sizeof(asn_DEF_RANAP_M4_Threshold_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_M4_Threshold_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_M4-Threshold.h b/src/ranap/RANAP_M4-Threshold.h
new file mode 100644
index 0000000..223cf9f
--- /dev/null
+++ b/src/ranap/RANAP_M4-Threshold.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M4_Threshold_H_
+#define	_RANAP_M4_Threshold_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_M4-Threshold */
+typedef long	 RANAP_M4_Threshold_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M4_Threshold;
+asn_struct_free_f RANAP_M4_Threshold_free;
+asn_struct_print_f RANAP_M4_Threshold_print;
+asn_constr_check_f RANAP_M4_Threshold_constraint;
+ber_type_decoder_f RANAP_M4_Threshold_decode_ber;
+der_type_encoder_f RANAP_M4_Threshold_encode_der;
+xer_type_decoder_f RANAP_M4_Threshold_decode_xer;
+xer_type_encoder_f RANAP_M4_Threshold_encode_xer;
+per_type_decoder_f RANAP_M4_Threshold_decode_uper;
+per_type_encoder_f RANAP_M4_Threshold_encode_uper;
+per_type_decoder_f RANAP_M4_Threshold_decode_aper;
+per_type_encoder_f RANAP_M4_Threshold_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M4_Threshold_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M4Report.c b/src/ranap/RANAP_M4Report.c
new file mode 100644
index 0000000..777c769
--- /dev/null
+++ b/src/ranap/RANAP_M4Report.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M4Report.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_M4Report_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_M4Report_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M4Report, choice.all),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NULL,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"all"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M4Report, choice.m4_collection_parameters),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_M4_Collection_Parameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m4-collection-parameters"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M4Report_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* all */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* m4-collection-parameters */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_M4Report_specs_1 = {
+	sizeof(struct RANAP_M4Report),
+	offsetof(struct RANAP_M4Report, _asn_ctx),
+	offsetof(struct RANAP_M4Report, present),
+	sizeof(((struct RANAP_M4Report *)0)->present),
+	asn_MAP_RANAP_M4Report_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M4Report = {
+	"RANAP_M4Report",
+	"RANAP_M4Report",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_M4Report_constr_1,
+	asn_MBR_RANAP_M4Report_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_M4Report_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M4Report.h b/src/ranap/RANAP_M4Report.h
new file mode 100644
index 0000000..c0ccb06
--- /dev/null
+++ b/src/ranap/RANAP_M4Report.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M4Report_H_
+#define	_RANAP_M4Report_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NULL.h>
+#include "RANAP_M4-Collection-Parameters.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M4Report_PR {
+	RANAP_M4Report_PR_NOTHING,	/* No components present */
+	RANAP_M4Report_PR_all,
+	RANAP_M4Report_PR_m4_collection_parameters,
+	/* Extensions may appear below */
+	
+} RANAP_M4Report_PR;
+
+/* RANAP_M4Report */
+typedef struct RANAP_M4Report {
+	RANAP_M4Report_PR present;
+	union RANAP_M4Report_u {
+		NULL_t	 all;
+		RANAP_M4_Collection_Parameters_t	 m4_collection_parameters;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M4Report_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M4Report;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M4Report_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M5-Period.c b/src/ranap/RANAP_M5-Period.c
new file mode 100644
index 0000000..403d645
--- /dev/null
+++ b/src/ranap/RANAP_M5-Period.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M5-Period.h"
+
+int
+RANAP_M5_Period_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_M5_Period_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_M5_Period_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_M5_Period_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M5_Period_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_M5_Period_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M5_Period_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_M5_Period_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M5_Period_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_M5_Period_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_M5_Period_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_M5_Period_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M5_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_M5_Period_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  7l }	/* (0..7,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_M5_Period_value2enum_1[] = {
+	{ 0,	5,	"ms100" },
+	{ 1,	5,	"ms250" },
+	{ 2,	5,	"ms500" },
+	{ 3,	6,	"ms1000" },
+	{ 4,	6,	"ms2000" },
+	{ 5,	6,	"ms3000" },
+	{ 6,	6,	"ms4000" },
+	{ 7,	6,	"ms6000" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_M5_Period_enum2value_1[] = {
+	0,	/* ms100(0) */
+	3,	/* ms1000(3) */
+	4,	/* ms2000(4) */
+	1,	/* ms250(1) */
+	5,	/* ms3000(5) */
+	6,	/* ms4000(6) */
+	2,	/* ms500(2) */
+	7	/* ms6000(7) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_M5_Period_specs_1 = {
+	asn_MAP_RANAP_M5_Period_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_M5_Period_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	9,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_M5_Period_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M5_Period = {
+	"RANAP_M5-Period",
+	"RANAP_M5-Period",
+	RANAP_M5_Period_free,
+	RANAP_M5_Period_print,
+	RANAP_M5_Period_constraint,
+	RANAP_M5_Period_decode_ber,
+	RANAP_M5_Period_encode_der,
+	RANAP_M5_Period_decode_xer,
+	RANAP_M5_Period_encode_xer,
+	RANAP_M5_Period_decode_uper,
+	RANAP_M5_Period_encode_uper,
+	RANAP_M5_Period_decode_aper,
+	RANAP_M5_Period_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M5_Period_tags_1,
+	sizeof(asn_DEF_RANAP_M5_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M5_Period_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M5_Period_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M5_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M5_Period_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_M5_Period_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_M5_Period_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M5-Period.h b/src/ranap/RANAP_M5-Period.h
new file mode 100644
index 0000000..9265658
--- /dev/null
+++ b/src/ranap/RANAP_M5-Period.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M5_Period_H_
+#define	_RANAP_M5_Period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M5_Period {
+	RANAP_M5_Period_ms100	= 0,
+	RANAP_M5_Period_ms250	= 1,
+	RANAP_M5_Period_ms500	= 2,
+	RANAP_M5_Period_ms1000	= 3,
+	RANAP_M5_Period_ms2000	= 4,
+	RANAP_M5_Period_ms3000	= 5,
+	RANAP_M5_Period_ms4000	= 6,
+	RANAP_M5_Period_ms6000	= 7
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_M5_Period;
+
+/* RANAP_M5-Period */
+typedef long	 RANAP_M5_Period_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M5_Period;
+asn_struct_free_f RANAP_M5_Period_free;
+asn_struct_print_f RANAP_M5_Period_print;
+asn_constr_check_f RANAP_M5_Period_constraint;
+ber_type_decoder_f RANAP_M5_Period_decode_ber;
+der_type_encoder_f RANAP_M5_Period_encode_der;
+xer_type_decoder_f RANAP_M5_Period_decode_xer;
+xer_type_encoder_f RANAP_M5_Period_encode_xer;
+per_type_decoder_f RANAP_M5_Period_decode_uper;
+per_type_encoder_f RANAP_M5_Period_encode_uper;
+per_type_decoder_f RANAP_M5_Period_decode_aper;
+per_type_encoder_f RANAP_M5_Period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M5_Period_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M5Report.c b/src/ranap/RANAP_M5Report.c
new file mode 100644
index 0000000..015aecb
--- /dev/null
+++ b/src/ranap/RANAP_M5Report.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M5Report.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_M5Report_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_M5Report_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M5Report, choice.when_available),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NULL,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"when-available"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M5Report, choice.m5_period),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_M5_Period,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m5-period"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M5Report_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* when-available */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* m5-period */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_M5Report_specs_1 = {
+	sizeof(struct RANAP_M5Report),
+	offsetof(struct RANAP_M5Report, _asn_ctx),
+	offsetof(struct RANAP_M5Report, present),
+	sizeof(((struct RANAP_M5Report *)0)->present),
+	asn_MAP_RANAP_M5Report_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M5Report = {
+	"RANAP_M5Report",
+	"RANAP_M5Report",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_M5Report_constr_1,
+	asn_MBR_RANAP_M5Report_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_M5Report_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M5Report.h b/src/ranap/RANAP_M5Report.h
new file mode 100644
index 0000000..9e3e379
--- /dev/null
+++ b/src/ranap/RANAP_M5Report.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M5Report_H_
+#define	_RANAP_M5Report_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NULL.h>
+#include "RANAP_M5-Period.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M5Report_PR {
+	RANAP_M5Report_PR_NOTHING,	/* No components present */
+	RANAP_M5Report_PR_when_available,
+	RANAP_M5Report_PR_m5_period,
+	/* Extensions may appear below */
+	
+} RANAP_M5Report_PR;
+
+/* RANAP_M5Report */
+typedef struct RANAP_M5Report {
+	RANAP_M5Report_PR present;
+	union RANAP_M5Report_u {
+		NULL_t	 when_available;
+		RANAP_M5_Period_t	 m5_period;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M5Report_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M5Report;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M5Report_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M6-Period.c b/src/ranap/RANAP_M6-Period.c
new file mode 100644
index 0000000..56b49d2
--- /dev/null
+++ b/src/ranap/RANAP_M6-Period.c
@@ -0,0 +1,189 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M6-Period.h"
+
+int
+RANAP_M6_Period_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_M6_Period_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_M6_Period_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_M6_Period_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M6_Period_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_M6_Period_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M6_Period_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_M6_Period_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M6_Period_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_M6_Period_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_M6_Period_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_M6_Period_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M6_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_M6_Period_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0l,  12l }	/* (0..12,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_M6_Period_value2enum_1[] = {
+	{ 0,	6,	"ms1000" },
+	{ 1,	6,	"ms2000" },
+	{ 2,	6,	"ms3000" },
+	{ 3,	6,	"ms4000" },
+	{ 4,	6,	"ms6000" },
+	{ 5,	6,	"ms8000" },
+	{ 6,	7,	"ms12000" },
+	{ 7,	7,	"ms16000" },
+	{ 8,	7,	"ms20000" },
+	{ 9,	7,	"ms24000" },
+	{ 10,	7,	"ms28000" },
+	{ 11,	7,	"ms32000" },
+	{ 12,	7,	"ms64000" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_M6_Period_enum2value_1[] = {
+	0,	/* ms1000(0) */
+	6,	/* ms12000(6) */
+	7,	/* ms16000(7) */
+	1,	/* ms2000(1) */
+	8,	/* ms20000(8) */
+	9,	/* ms24000(9) */
+	10,	/* ms28000(10) */
+	2,	/* ms3000(2) */
+	11,	/* ms32000(11) */
+	3,	/* ms4000(3) */
+	4,	/* ms6000(4) */
+	12,	/* ms64000(12) */
+	5	/* ms8000(5) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_M6_Period_specs_1 = {
+	asn_MAP_RANAP_M6_Period_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_M6_Period_enum2value_1,	/* N => "tag"; sorted by N */
+	13,	/* Number of elements in the maps */
+	14,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_M6_Period_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M6_Period = {
+	"RANAP_M6-Period",
+	"RANAP_M6-Period",
+	RANAP_M6_Period_free,
+	RANAP_M6_Period_print,
+	RANAP_M6_Period_constraint,
+	RANAP_M6_Period_decode_ber,
+	RANAP_M6_Period_encode_der,
+	RANAP_M6_Period_decode_xer,
+	RANAP_M6_Period_encode_xer,
+	RANAP_M6_Period_decode_uper,
+	RANAP_M6_Period_encode_uper,
+	RANAP_M6_Period_decode_aper,
+	RANAP_M6_Period_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M6_Period_tags_1,
+	sizeof(asn_DEF_RANAP_M6_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M6_Period_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M6_Period_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M6_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M6_Period_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_M6_Period_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_M6_Period_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M6-Period.h b/src/ranap/RANAP_M6-Period.h
new file mode 100644
index 0000000..90c8a84
--- /dev/null
+++ b/src/ranap/RANAP_M6-Period.h
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M6_Period_H_
+#define	_RANAP_M6_Period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M6_Period {
+	RANAP_M6_Period_ms1000	= 0,
+	RANAP_M6_Period_ms2000	= 1,
+	RANAP_M6_Period_ms3000	= 2,
+	RANAP_M6_Period_ms4000	= 3,
+	RANAP_M6_Period_ms6000	= 4,
+	RANAP_M6_Period_ms8000	= 5,
+	RANAP_M6_Period_ms12000	= 6,
+	RANAP_M6_Period_ms16000	= 7,
+	RANAP_M6_Period_ms20000	= 8,
+	RANAP_M6_Period_ms24000	= 9,
+	RANAP_M6_Period_ms28000	= 10,
+	RANAP_M6_Period_ms32000	= 11,
+	RANAP_M6_Period_ms64000	= 12
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_M6_Period;
+
+/* RANAP_M6-Period */
+typedef long	 RANAP_M6_Period_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M6_Period;
+asn_struct_free_f RANAP_M6_Period_free;
+asn_struct_print_f RANAP_M6_Period_print;
+asn_constr_check_f RANAP_M6_Period_constraint;
+ber_type_decoder_f RANAP_M6_Period_decode_ber;
+der_type_encoder_f RANAP_M6_Period_encode_der;
+xer_type_decoder_f RANAP_M6_Period_decode_xer;
+xer_type_encoder_f RANAP_M6_Period_encode_xer;
+per_type_decoder_f RANAP_M6_Period_decode_uper;
+per_type_encoder_f RANAP_M6_Period_encode_uper;
+per_type_decoder_f RANAP_M6_Period_decode_aper;
+per_type_encoder_f RANAP_M6_Period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M6_Period_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M6Report.c b/src/ranap/RANAP_M6Report.c
new file mode 100644
index 0000000..7e8fc65
--- /dev/null
+++ b/src/ranap/RANAP_M6Report.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M6Report.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_M6Report_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M6Report, m6_period),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_M6_Period,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m6-period"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M6Report, m6_links_to_log),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Links_to_log,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m6-links-to-log"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_M6Report, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_M6Report_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_M6Report_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M6Report_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m6-period */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* m6-links-to-log */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_M6Report_specs_1 = {
+	sizeof(struct RANAP_M6Report),
+	offsetof(struct RANAP_M6Report, _asn_ctx),
+	asn_MAP_RANAP_M6Report_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_M6Report_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M6Report = {
+	"RANAP_M6Report",
+	"RANAP_M6Report",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M6Report_tags_1,
+	sizeof(asn_DEF_RANAP_M6Report_tags_1)
+		/sizeof(asn_DEF_RANAP_M6Report_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M6Report_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M6Report_tags_1)
+		/sizeof(asn_DEF_RANAP_M6Report_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_M6Report_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_M6Report_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M6Report.h b/src/ranap/RANAP_M6Report.h
new file mode 100644
index 0000000..68dc7c5
--- /dev/null
+++ b/src/ranap/RANAP_M6Report.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M6Report_H_
+#define	_RANAP_M6Report_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_M6-Period.h"
+#include "RANAP_Links-to-log.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_M6Report */
+typedef struct RANAP_M6Report {
+	RANAP_M6_Period_t	 m6_period;
+	RANAP_Links_to_log_t	 m6_links_to_log;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M6Report_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M6Report;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M6Report_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M7-Period.c b/src/ranap/RANAP_M7-Period.c
new file mode 100644
index 0000000..6955d94
--- /dev/null
+++ b/src/ranap/RANAP_M7-Period.c
@@ -0,0 +1,189 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M7-Period.h"
+
+int
+RANAP_M7_Period_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_M7_Period_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_M7_Period_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_M7_Period_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M7_Period_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_M7_Period_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M7_Period_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_M7_Period_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_M7_Period_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_M7_Period_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_M7_Period_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_M7_Period_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_M7_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_M7_Period_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0l,  12l }	/* (0..12,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_M7_Period_value2enum_1[] = {
+	{ 0,	6,	"ms1000" },
+	{ 1,	6,	"ms2000" },
+	{ 2,	6,	"ms3000" },
+	{ 3,	6,	"ms4000" },
+	{ 4,	6,	"ms6000" },
+	{ 5,	6,	"ms8000" },
+	{ 6,	7,	"ms12000" },
+	{ 7,	7,	"ms16000" },
+	{ 8,	7,	"ms20000" },
+	{ 9,	7,	"ms24000" },
+	{ 10,	7,	"ms28000" },
+	{ 11,	7,	"ms32000" },
+	{ 12,	7,	"ms64000" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_M7_Period_enum2value_1[] = {
+	0,	/* ms1000(0) */
+	6,	/* ms12000(6) */
+	7,	/* ms16000(7) */
+	1,	/* ms2000(1) */
+	8,	/* ms20000(8) */
+	9,	/* ms24000(9) */
+	10,	/* ms28000(10) */
+	2,	/* ms3000(2) */
+	11,	/* ms32000(11) */
+	3,	/* ms4000(3) */
+	4,	/* ms6000(4) */
+	12,	/* ms64000(12) */
+	5	/* ms8000(5) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_M7_Period_specs_1 = {
+	asn_MAP_RANAP_M7_Period_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_M7_Period_enum2value_1,	/* N => "tag"; sorted by N */
+	13,	/* Number of elements in the maps */
+	14,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_M7_Period_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M7_Period = {
+	"RANAP_M7-Period",
+	"RANAP_M7-Period",
+	RANAP_M7_Period_free,
+	RANAP_M7_Period_print,
+	RANAP_M7_Period_constraint,
+	RANAP_M7_Period_decode_ber,
+	RANAP_M7_Period_encode_der,
+	RANAP_M7_Period_decode_xer,
+	RANAP_M7_Period_encode_xer,
+	RANAP_M7_Period_decode_uper,
+	RANAP_M7_Period_encode_uper,
+	RANAP_M7_Period_decode_aper,
+	RANAP_M7_Period_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M7_Period_tags_1,
+	sizeof(asn_DEF_RANAP_M7_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M7_Period_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M7_Period_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M7_Period_tags_1)
+		/sizeof(asn_DEF_RANAP_M7_Period_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_M7_Period_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_M7_Period_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M7-Period.h b/src/ranap/RANAP_M7-Period.h
new file mode 100644
index 0000000..3fcf0aa
--- /dev/null
+++ b/src/ranap/RANAP_M7-Period.h
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M7_Period_H_
+#define	_RANAP_M7_Period_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_M7_Period {
+	RANAP_M7_Period_ms1000	= 0,
+	RANAP_M7_Period_ms2000	= 1,
+	RANAP_M7_Period_ms3000	= 2,
+	RANAP_M7_Period_ms4000	= 3,
+	RANAP_M7_Period_ms6000	= 4,
+	RANAP_M7_Period_ms8000	= 5,
+	RANAP_M7_Period_ms12000	= 6,
+	RANAP_M7_Period_ms16000	= 7,
+	RANAP_M7_Period_ms20000	= 8,
+	RANAP_M7_Period_ms24000	= 9,
+	RANAP_M7_Period_ms28000	= 10,
+	RANAP_M7_Period_ms32000	= 11,
+	RANAP_M7_Period_ms64000	= 12
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_M7_Period;
+
+/* RANAP_M7-Period */
+typedef long	 RANAP_M7_Period_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M7_Period;
+asn_struct_free_f RANAP_M7_Period_free;
+asn_struct_print_f RANAP_M7_Period_print;
+asn_constr_check_f RANAP_M7_Period_constraint;
+ber_type_decoder_f RANAP_M7_Period_decode_ber;
+der_type_encoder_f RANAP_M7_Period_encode_der;
+xer_type_decoder_f RANAP_M7_Period_decode_xer;
+xer_type_encoder_f RANAP_M7_Period_encode_xer;
+per_type_decoder_f RANAP_M7_Period_decode_uper;
+per_type_encoder_f RANAP_M7_Period_encode_uper;
+per_type_decoder_f RANAP_M7_Period_decode_aper;
+per_type_encoder_f RANAP_M7_Period_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M7_Period_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_M7Report.c b/src/ranap/RANAP_M7Report.c
new file mode 100644
index 0000000..496c709
--- /dev/null
+++ b/src/ranap/RANAP_M7Report.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_M7Report.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_M7Report_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M7Report, m7_period),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_M7_Period,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m7-period"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_M7Report, m7_links_to_log),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Links_to_log,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"m7-links-to-log"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_M7Report, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_M7Report_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_M7Report_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_M7Report_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* m7-period */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* m7-links-to-log */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_M7Report_specs_1 = {
+	sizeof(struct RANAP_M7Report),
+	offsetof(struct RANAP_M7Report, _asn_ctx),
+	asn_MAP_RANAP_M7Report_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_M7Report_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_M7Report = {
+	"RANAP_M7Report",
+	"RANAP_M7Report",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_M7Report_tags_1,
+	sizeof(asn_DEF_RANAP_M7Report_tags_1)
+		/sizeof(asn_DEF_RANAP_M7Report_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_M7Report_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_M7Report_tags_1)
+		/sizeof(asn_DEF_RANAP_M7Report_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_M7Report_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_M7Report_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_M7Report.h b/src/ranap/RANAP_M7Report.h
new file mode 100644
index 0000000..1fe8697
--- /dev/null
+++ b/src/ranap/RANAP_M7Report.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_M7Report_H_
+#define	_RANAP_M7Report_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_M7-Period.h"
+#include "RANAP_Links-to-log.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_M7Report */
+typedef struct RANAP_M7Report {
+	RANAP_M7_Period_t	 m7_period;
+	RANAP_Links_to_log_t	 m7_links_to_log;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_M7Report_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_M7Report;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_M7Report_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMS-PTP-RAB-ID.c b/src/ranap/RANAP_MBMS-PTP-RAB-ID.c
new file mode 100644
index 0000000..8962aa9
--- /dev/null
+++ b/src/ranap/RANAP_MBMS-PTP-RAB-ID.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMS-PTP-RAB-ID.h"
+
+int
+RANAP_MBMS_PTP_RAB_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_MBMS_PTP_RAB_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMS_PTP_RAB_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMS_PTP_RAB_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMS_PTP_RAB_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMS_PTP_RAB_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMS_PTP_RAB_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMS_PTP_RAB_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMS_PTP_RAB_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMS_PTP_RAB_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMS_PTP_RAB_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMS_PTP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMS_PTP_RAB_ID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMS_PTP_RAB_ID = {
+	"RANAP_MBMS-PTP-RAB-ID",
+	"RANAP_MBMS-PTP-RAB-ID",
+	RANAP_MBMS_PTP_RAB_ID_free,
+	RANAP_MBMS_PTP_RAB_ID_print,
+	RANAP_MBMS_PTP_RAB_ID_constraint,
+	RANAP_MBMS_PTP_RAB_ID_decode_ber,
+	RANAP_MBMS_PTP_RAB_ID_encode_der,
+	RANAP_MBMS_PTP_RAB_ID_decode_xer,
+	RANAP_MBMS_PTP_RAB_ID_encode_xer,
+	RANAP_MBMS_PTP_RAB_ID_decode_uper,
+	RANAP_MBMS_PTP_RAB_ID_encode_uper,
+	RANAP_MBMS_PTP_RAB_ID_decode_aper,
+	RANAP_MBMS_PTP_RAB_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1,
+	sizeof(asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMS_PTP_RAB_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMS_PTP_RAB_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MBMS-PTP-RAB-ID.h b/src/ranap/RANAP_MBMS-PTP-RAB-ID.h
new file mode 100644
index 0000000..cbc2654
--- /dev/null
+++ b/src/ranap/RANAP_MBMS-PTP-RAB-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMS_PTP_RAB_ID_H_
+#define	_RANAP_MBMS_PTP_RAB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMS-PTP-RAB-ID */
+typedef BIT_STRING_t	 RANAP_MBMS_PTP_RAB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMS_PTP_RAB_ID;
+asn_struct_free_f RANAP_MBMS_PTP_RAB_ID_free;
+asn_struct_print_f RANAP_MBMS_PTP_RAB_ID_print;
+asn_constr_check_f RANAP_MBMS_PTP_RAB_ID_constraint;
+ber_type_decoder_f RANAP_MBMS_PTP_RAB_ID_decode_ber;
+der_type_encoder_f RANAP_MBMS_PTP_RAB_ID_encode_der;
+xer_type_decoder_f RANAP_MBMS_PTP_RAB_ID_decode_xer;
+xer_type_encoder_f RANAP_MBMS_PTP_RAB_ID_encode_xer;
+per_type_decoder_f RANAP_MBMS_PTP_RAB_ID_decode_uper;
+per_type_encoder_f RANAP_MBMS_PTP_RAB_ID_encode_uper;
+per_type_decoder_f RANAP_MBMS_PTP_RAB_ID_decode_aper;
+per_type_encoder_f RANAP_MBMS_PTP_RAB_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMS_PTP_RAB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSBearerServiceType.c b/src/ranap/RANAP_MBMSBearerServiceType.c
new file mode 100644
index 0000000..e6128f5
--- /dev/null
+++ b/src/ranap/RANAP_MBMSBearerServiceType.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSBearerServiceType.h"
+
+int
+RANAP_MBMSBearerServiceType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MBMSBearerServiceType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSBearerServiceType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSBearerServiceType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSBearerServiceType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSBearerServiceType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSBearerServiceType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSBearerServiceType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSBearerServiceType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSBearerServiceType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSBearerServiceType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSBearerServiceType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSBearerServiceType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MBMSBearerServiceType_value2enum_1[] = {
+	{ 0,	9,	"multicast" },
+	{ 1,	9,	"broadcast" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MBMSBearerServiceType_enum2value_1[] = {
+	1,	/* broadcast(1) */
+	0	/* multicast(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MBMSBearerServiceType_specs_1 = {
+	asn_MAP_RANAP_MBMSBearerServiceType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MBMSBearerServiceType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSBearerServiceType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSBearerServiceType = {
+	"RANAP_MBMSBearerServiceType",
+	"RANAP_MBMSBearerServiceType",
+	RANAP_MBMSBearerServiceType_free,
+	RANAP_MBMSBearerServiceType_print,
+	RANAP_MBMSBearerServiceType_constraint,
+	RANAP_MBMSBearerServiceType_decode_ber,
+	RANAP_MBMSBearerServiceType_encode_der,
+	RANAP_MBMSBearerServiceType_decode_xer,
+	RANAP_MBMSBearerServiceType_encode_xer,
+	RANAP_MBMSBearerServiceType_decode_uper,
+	RANAP_MBMSBearerServiceType_encode_uper,
+	RANAP_MBMSBearerServiceType_decode_aper,
+	RANAP_MBMSBearerServiceType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSBearerServiceType_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSBearerServiceType_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSBearerServiceType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSBearerServiceType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSBearerServiceType_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSBearerServiceType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSBearerServiceType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MBMSBearerServiceType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSBearerServiceType.h b/src/ranap/RANAP_MBMSBearerServiceType.h
new file mode 100644
index 0000000..03f32f3
--- /dev/null
+++ b/src/ranap/RANAP_MBMSBearerServiceType.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSBearerServiceType_H_
+#define	_RANAP_MBMSBearerServiceType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MBMSBearerServiceType {
+	RANAP_MBMSBearerServiceType_multicast	= 0,
+	RANAP_MBMSBearerServiceType_broadcast	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MBMSBearerServiceType;
+
+/* RANAP_MBMSBearerServiceType */
+typedef long	 RANAP_MBMSBearerServiceType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSBearerServiceType;
+asn_struct_free_f RANAP_MBMSBearerServiceType_free;
+asn_struct_print_f RANAP_MBMSBearerServiceType_print;
+asn_constr_check_f RANAP_MBMSBearerServiceType_constraint;
+ber_type_decoder_f RANAP_MBMSBearerServiceType_decode_ber;
+der_type_encoder_f RANAP_MBMSBearerServiceType_encode_der;
+xer_type_decoder_f RANAP_MBMSBearerServiceType_decode_xer;
+xer_type_encoder_f RANAP_MBMSBearerServiceType_encode_xer;
+per_type_decoder_f RANAP_MBMSBearerServiceType_decode_uper;
+per_type_encoder_f RANAP_MBMSBearerServiceType_encode_uper;
+per_type_decoder_f RANAP_MBMSBearerServiceType_decode_aper;
+per_type_encoder_f RANAP_MBMSBearerServiceType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSBearerServiceType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSCNDe-Registration.c b/src/ranap/RANAP_MBMSCNDe-Registration.c
new file mode 100644
index 0000000..ec35a23
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCNDe-Registration.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSCNDe-Registration.h"
+
+int
+RANAP_MBMSCNDe_Registration_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MBMSCNDe_Registration_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSCNDe_Registration_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCNDe_Registration_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCNDe_Registration_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCNDe_Registration_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCNDe_Registration_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCNDe_Registration_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCNDe_Registration_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCNDe_Registration_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCNDe_Registration_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSCNDe_Registration_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSCNDe_Registration_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MBMSCNDe_Registration_value2enum_1[] = {
+	{ 0,	17,	"normalsessionstop" },
+	{ 1,	10,	"deregister" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MBMSCNDe_Registration_enum2value_1[] = {
+	1,	/* deregister(1) */
+	0	/* normalsessionstop(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MBMSCNDe_Registration_specs_1 = {
+	asn_MAP_RANAP_MBMSCNDe_Registration_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MBMSCNDe_Registration_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSCNDe_Registration_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCNDe_Registration = {
+	"RANAP_MBMSCNDe-Registration",
+	"RANAP_MBMSCNDe-Registration",
+	RANAP_MBMSCNDe_Registration_free,
+	RANAP_MBMSCNDe_Registration_print,
+	RANAP_MBMSCNDe_Registration_constraint,
+	RANAP_MBMSCNDe_Registration_decode_ber,
+	RANAP_MBMSCNDe_Registration_encode_der,
+	RANAP_MBMSCNDe_Registration_decode_xer,
+	RANAP_MBMSCNDe_Registration_encode_xer,
+	RANAP_MBMSCNDe_Registration_decode_uper,
+	RANAP_MBMSCNDe_Registration_encode_uper,
+	RANAP_MBMSCNDe_Registration_decode_aper,
+	RANAP_MBMSCNDe_Registration_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSCNDe_Registration_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSCNDe_Registration_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCNDe_Registration_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSCNDe_Registration_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSCNDe_Registration_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCNDe_Registration_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSCNDe_Registration_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MBMSCNDe_Registration_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSCNDe-Registration.h b/src/ranap/RANAP_MBMSCNDe-Registration.h
new file mode 100644
index 0000000..793e2f7
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCNDe-Registration.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSCNDe_Registration_H_
+#define	_RANAP_MBMSCNDe_Registration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MBMSCNDe_Registration {
+	RANAP_MBMSCNDe_Registration_normalsessionstop	= 0,
+	RANAP_MBMSCNDe_Registration_deregister	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MBMSCNDe_Registration;
+
+/* RANAP_MBMSCNDe-Registration */
+typedef long	 RANAP_MBMSCNDe_Registration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCNDe_Registration;
+asn_struct_free_f RANAP_MBMSCNDe_Registration_free;
+asn_struct_print_f RANAP_MBMSCNDe_Registration_print;
+asn_constr_check_f RANAP_MBMSCNDe_Registration_constraint;
+ber_type_decoder_f RANAP_MBMSCNDe_Registration_decode_ber;
+der_type_encoder_f RANAP_MBMSCNDe_Registration_encode_der;
+xer_type_decoder_f RANAP_MBMSCNDe_Registration_decode_xer;
+xer_type_encoder_f RANAP_MBMSCNDe_Registration_encode_xer;
+per_type_decoder_f RANAP_MBMSCNDe_Registration_decode_uper;
+per_type_encoder_f RANAP_MBMSCNDe_Registration_encode_uper;
+per_type_decoder_f RANAP_MBMSCNDe_Registration_decode_aper;
+per_type_encoder_f RANAP_MBMSCNDe_Registration_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSCNDe_Registration_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSCNDe-RegistrationRequest.c b/src/ranap/RANAP_MBMSCNDe-RegistrationRequest.c
new file mode 100644
index 0000000..4abe8f3
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCNDe-RegistrationRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSCNDe-RegistrationRequest.h"
+
+static int
+memb_mBMSCNDe_RegistrationRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSCNDe_RegistrationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSCNDe_RegistrationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSCNDe_RegistrationRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSCNDe_RegistrationRequest_ies_specs_2 = {
+	sizeof(struct mBMSCNDe_RegistrationRequest_ies),
+	offsetof(struct mBMSCNDe_RegistrationRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSCNDe_RegistrationRequest_ies_2 = {
+	"mBMSCNDe-RegistrationRequest-ies",
+	"mBMSCNDe-RegistrationRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2,
+	sizeof(asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSCNDe_RegistrationRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSCNDe_RegistrationRequest_ies_constr_2,
+	asn_MBR_mBMSCNDe_RegistrationRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSCNDe_RegistrationRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSCNDe_RegistrationRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSCNDe_RegistrationRequest, mBMSCNDe_RegistrationRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSCNDe_RegistrationRequest_ies_2,
+		memb_mBMSCNDe_RegistrationRequest_ies_constraint_1,
+		&asn_PER_memb_mBMSCNDe_RegistrationRequest_ies_constr_2,
+		0,
+		"mBMSCNDe-RegistrationRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSCNDe_RegistrationRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSCNDe-RegistrationRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSCNDe_RegistrationRequest_specs_1 = {
+	sizeof(struct RANAP_MBMSCNDe_RegistrationRequest),
+	offsetof(struct RANAP_MBMSCNDe_RegistrationRequest, _asn_ctx),
+	asn_MAP_RANAP_MBMSCNDe_RegistrationRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCNDe_RegistrationRequest = {
+	"RANAP_MBMSCNDe-RegistrationRequest",
+	"RANAP_MBMSCNDe-RegistrationRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSCNDe_RegistrationRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSCNDe_RegistrationRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSCNDe-RegistrationRequest.h b/src/ranap/RANAP_MBMSCNDe-RegistrationRequest.h
new file mode 100644
index 0000000..efe34e0
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCNDe-RegistrationRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSCNDe_RegistrationRequest_H_
+#define	_RANAP_MBMSCNDe_RegistrationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSCNDe-RegistrationRequest */
+typedef struct RANAP_MBMSCNDe_RegistrationRequest {
+	struct mBMSCNDe_RegistrationRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSCNDe_RegistrationRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSCNDe_RegistrationRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCNDe_RegistrationRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSCNDe_RegistrationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSCNDe-RegistrationResponse.c b/src/ranap/RANAP_MBMSCNDe-RegistrationResponse.c
new file mode 100644
index 0000000..5bdbe6b
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCNDe-RegistrationResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSCNDe-RegistrationResponse.h"
+
+static int
+memb_mBMSCNDe_RegistrationResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSCNDe_RegistrationResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSCNDe_RegistrationResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSCNDe_RegistrationResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSCNDe_RegistrationResponse_ies_specs_2 = {
+	sizeof(struct mBMSCNDe_RegistrationResponse_ies),
+	offsetof(struct mBMSCNDe_RegistrationResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSCNDe_RegistrationResponse_ies_2 = {
+	"mBMSCNDe-RegistrationResponse-ies",
+	"mBMSCNDe-RegistrationResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2,
+	sizeof(asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSCNDe_RegistrationResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSCNDe_RegistrationResponse_ies_constr_2,
+	asn_MBR_mBMSCNDe_RegistrationResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSCNDe_RegistrationResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSCNDe_RegistrationResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSCNDe_RegistrationResponse, mBMSCNDe_RegistrationResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSCNDe_RegistrationResponse_ies_2,
+		memb_mBMSCNDe_RegistrationResponse_ies_constraint_1,
+		&asn_PER_memb_mBMSCNDe_RegistrationResponse_ies_constr_2,
+		0,
+		"mBMSCNDe-RegistrationResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSCNDe_RegistrationResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSCNDe-RegistrationResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSCNDe_RegistrationResponse_specs_1 = {
+	sizeof(struct RANAP_MBMSCNDe_RegistrationResponse),
+	offsetof(struct RANAP_MBMSCNDe_RegistrationResponse, _asn_ctx),
+	asn_MAP_RANAP_MBMSCNDe_RegistrationResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCNDe_RegistrationResponse = {
+	"RANAP_MBMSCNDe-RegistrationResponse",
+	"RANAP_MBMSCNDe-RegistrationResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCNDe_RegistrationResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSCNDe_RegistrationResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSCNDe_RegistrationResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSCNDe-RegistrationResponse.h b/src/ranap/RANAP_MBMSCNDe-RegistrationResponse.h
new file mode 100644
index 0000000..d9be786
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCNDe-RegistrationResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSCNDe_RegistrationResponse_H_
+#define	_RANAP_MBMSCNDe_RegistrationResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSCNDe-RegistrationResponse */
+typedef struct RANAP_MBMSCNDe_RegistrationResponse {
+	struct mBMSCNDe_RegistrationResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSCNDe_RegistrationResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSCNDe_RegistrationResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCNDe_RegistrationResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSCNDe_RegistrationResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSCountingInformation.c b/src/ranap/RANAP_MBMSCountingInformation.c
new file mode 100644
index 0000000..1804f22
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCountingInformation.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSCountingInformation.h"
+
+int
+RANAP_MBMSCountingInformation_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MBMSCountingInformation_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSCountingInformation_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCountingInformation_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCountingInformation_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCountingInformation_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCountingInformation_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCountingInformation_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCountingInformation_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSCountingInformation_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSCountingInformation_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSCountingInformation_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSCountingInformation_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MBMSCountingInformation_value2enum_1[] = {
+	{ 0,	8,	"counting" },
+	{ 1,	11,	"notcounting" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MBMSCountingInformation_enum2value_1[] = {
+	0,	/* counting(0) */
+	1	/* notcounting(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MBMSCountingInformation_specs_1 = {
+	asn_MAP_RANAP_MBMSCountingInformation_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MBMSCountingInformation_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSCountingInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCountingInformation = {
+	"RANAP_MBMSCountingInformation",
+	"RANAP_MBMSCountingInformation",
+	RANAP_MBMSCountingInformation_free,
+	RANAP_MBMSCountingInformation_print,
+	RANAP_MBMSCountingInformation_constraint,
+	RANAP_MBMSCountingInformation_decode_ber,
+	RANAP_MBMSCountingInformation_encode_der,
+	RANAP_MBMSCountingInformation_decode_xer,
+	RANAP_MBMSCountingInformation_encode_xer,
+	RANAP_MBMSCountingInformation_decode_uper,
+	RANAP_MBMSCountingInformation_encode_uper,
+	RANAP_MBMSCountingInformation_decode_aper,
+	RANAP_MBMSCountingInformation_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSCountingInformation_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSCountingInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCountingInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSCountingInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSCountingInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSCountingInformation_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSCountingInformation_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MBMSCountingInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSCountingInformation.h b/src/ranap/RANAP_MBMSCountingInformation.h
new file mode 100644
index 0000000..cb56317
--- /dev/null
+++ b/src/ranap/RANAP_MBMSCountingInformation.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSCountingInformation_H_
+#define	_RANAP_MBMSCountingInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MBMSCountingInformation {
+	RANAP_MBMSCountingInformation_counting	= 0,
+	RANAP_MBMSCountingInformation_notcounting	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MBMSCountingInformation;
+
+/* RANAP_MBMSCountingInformation */
+typedef long	 RANAP_MBMSCountingInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSCountingInformation;
+asn_struct_free_f RANAP_MBMSCountingInformation_free;
+asn_struct_print_f RANAP_MBMSCountingInformation_print;
+asn_constr_check_f RANAP_MBMSCountingInformation_constraint;
+ber_type_decoder_f RANAP_MBMSCountingInformation_decode_ber;
+der_type_encoder_f RANAP_MBMSCountingInformation_encode_der;
+xer_type_decoder_f RANAP_MBMSCountingInformation_decode_xer;
+xer_type_encoder_f RANAP_MBMSCountingInformation_encode_xer;
+per_type_decoder_f RANAP_MBMSCountingInformation_decode_uper;
+per_type_encoder_f RANAP_MBMSCountingInformation_encode_uper;
+per_type_decoder_f RANAP_MBMSCountingInformation_decode_aper;
+per_type_encoder_f RANAP_MBMSCountingInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSCountingInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSHCIndicator.c b/src/ranap/RANAP_MBMSHCIndicator.c
new file mode 100644
index 0000000..55afb2a
--- /dev/null
+++ b/src/ranap/RANAP_MBMSHCIndicator.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSHCIndicator.h"
+
+int
+RANAP_MBMSHCIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MBMSHCIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSHCIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSHCIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSHCIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSHCIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSHCIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSHCIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSHCIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSHCIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSHCIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSHCIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSHCIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MBMSHCIndicator_value2enum_1[] = {
+	{ 0,	19,	"uncompressed-header" },
+	{ 1,	17,	"compressed-header" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MBMSHCIndicator_enum2value_1[] = {
+	1,	/* compressed-header(1) */
+	0	/* uncompressed-header(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MBMSHCIndicator_specs_1 = {
+	asn_MAP_RANAP_MBMSHCIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MBMSHCIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSHCIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSHCIndicator = {
+	"RANAP_MBMSHCIndicator",
+	"RANAP_MBMSHCIndicator",
+	RANAP_MBMSHCIndicator_free,
+	RANAP_MBMSHCIndicator_print,
+	RANAP_MBMSHCIndicator_constraint,
+	RANAP_MBMSHCIndicator_decode_ber,
+	RANAP_MBMSHCIndicator_encode_der,
+	RANAP_MBMSHCIndicator_decode_xer,
+	RANAP_MBMSHCIndicator_encode_xer,
+	RANAP_MBMSHCIndicator_decode_uper,
+	RANAP_MBMSHCIndicator_encode_uper,
+	RANAP_MBMSHCIndicator_decode_aper,
+	RANAP_MBMSHCIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSHCIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSHCIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSHCIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSHCIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSHCIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSHCIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSHCIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MBMSHCIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSHCIndicator.h b/src/ranap/RANAP_MBMSHCIndicator.h
new file mode 100644
index 0000000..71cdccc
--- /dev/null
+++ b/src/ranap/RANAP_MBMSHCIndicator.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSHCIndicator_H_
+#define	_RANAP_MBMSHCIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MBMSHCIndicator {
+	RANAP_MBMSHCIndicator_uncompressed_header	= 0,
+	RANAP_MBMSHCIndicator_compressed_header	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MBMSHCIndicator;
+
+/* RANAP_MBMSHCIndicator */
+typedef long	 RANAP_MBMSHCIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSHCIndicator;
+asn_struct_free_f RANAP_MBMSHCIndicator_free;
+asn_struct_print_f RANAP_MBMSHCIndicator_print;
+asn_constr_check_f RANAP_MBMSHCIndicator_constraint;
+ber_type_decoder_f RANAP_MBMSHCIndicator_decode_ber;
+der_type_encoder_f RANAP_MBMSHCIndicator_encode_der;
+xer_type_decoder_f RANAP_MBMSHCIndicator_decode_xer;
+xer_type_encoder_f RANAP_MBMSHCIndicator_encode_xer;
+per_type_decoder_f RANAP_MBMSHCIndicator_decode_uper;
+per_type_encoder_f RANAP_MBMSHCIndicator_encode_uper;
+per_type_decoder_f RANAP_MBMSHCIndicator_decode_aper;
+per_type_encoder_f RANAP_MBMSHCIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSHCIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSIPMulticastAddressandAPNRequest.c b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNRequest.c
new file mode 100644
index 0000000..fdd21c1
--- /dev/null
+++ b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNRequest.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSIPMulticastAddressandAPNRequest.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSIPMulticastAddressandAPNRequest_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 9,  9,  1l,  512l }	/* (SIZE(1..512)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSIPMulticastAddressandAPNRequest_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_TMGI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_MBMSIPMulticastAddressandAPNRequest_specs_1 = {
+	sizeof(struct RANAP_MBMSIPMulticastAddressandAPNRequest),
+	offsetof(struct RANAP_MBMSIPMulticastAddressandAPNRequest, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest = {
+	"RANAP_MBMSIPMulticastAddressandAPNRequest",
+	"RANAP_MBMSIPMulticastAddressandAPNRequest",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSIPMulticastAddressandAPNRequest_constr_1,
+	asn_MBR_RANAP_MBMSIPMulticastAddressandAPNRequest_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_MBMSIPMulticastAddressandAPNRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSIPMulticastAddressandAPNRequest.h b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNRequest.h
new file mode 100644
index 0000000..4fceb72
--- /dev/null
+++ b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNRequest.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSIPMulticastAddressandAPNRequest_H_
+#define	_RANAP_MBMSIPMulticastAddressandAPNRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TMGI.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSIPMulticastAddressandAPNRequest */
+typedef struct RANAP_MBMSIPMulticastAddressandAPNRequest {
+	A_SEQUENCE_OF(RANAP_TMGI_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSIPMulticastAddressandAPNRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSIPMulticastAddressandAPNRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.c b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.c
new file mode 100644
index 0000000..c84c547
--- /dev/null
+++ b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSIPMulticastAddressandAPNlist.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSIPMulticastAddressandAPNlist_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, tMGI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TMGI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"tMGI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, iPMulticastAddress),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IPMulticastAddress,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iPMulticastAddress"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, aPN),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_APN,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"aPN"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tMGI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iPMulticastAddress */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* aPN */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSIPMulticastAddressandAPNlist_specs_1 = {
+	sizeof(struct RANAP_MBMSIPMulticastAddressandAPNlist),
+	offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, _asn_ctx),
+	asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist = {
+	"RANAP_MBMSIPMulticastAddressandAPNlist",
+	"RANAP_MBMSIPMulticastAddressandAPNlist",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSIPMulticastAddressandAPNlist_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_MBMSIPMulticastAddressandAPNlist_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.h b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.h
new file mode 100644
index 0000000..9654467
--- /dev/null
+++ b/src/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSIPMulticastAddressandAPNlist_H_
+#define	_RANAP_MBMSIPMulticastAddressandAPNlist_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TMGI.h"
+#include "RANAP_IPMulticastAddress.h"
+#include "RANAP_APN.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSIPMulticastAddressandAPNlist */
+typedef struct RANAP_MBMSIPMulticastAddressandAPNlist {
+	RANAP_TMGI_t	 tMGI;
+	RANAP_IPMulticastAddress_t	 iPMulticastAddress;
+	RANAP_APN_t	 aPN;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSIPMulticastAddressandAPNlist_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSIPMulticastAddressandAPNlist_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSLinkingInformation.c b/src/ranap/RANAP_MBMSLinkingInformation.c
new file mode 100644
index 0000000..77d5ffb
--- /dev/null
+++ b/src/ranap/RANAP_MBMSLinkingInformation.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSLinkingInformation.h"
+
+int
+RANAP_MBMSLinkingInformation_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MBMSLinkingInformation_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSLinkingInformation_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSLinkingInformation_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSLinkingInformation_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSLinkingInformation_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSLinkingInformation_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSLinkingInformation_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSLinkingInformation_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSLinkingInformation_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSLinkingInformation_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSLinkingInformation_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSLinkingInformation_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MBMSLinkingInformation_value2enum_1[] = {
+	{ 0,	32,	"uE-has-joined-multicast-services" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MBMSLinkingInformation_enum2value_1[] = {
+	0	/* uE-has-joined-multicast-services(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MBMSLinkingInformation_specs_1 = {
+	asn_MAP_RANAP_MBMSLinkingInformation_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MBMSLinkingInformation_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSLinkingInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSLinkingInformation = {
+	"RANAP_MBMSLinkingInformation",
+	"RANAP_MBMSLinkingInformation",
+	RANAP_MBMSLinkingInformation_free,
+	RANAP_MBMSLinkingInformation_print,
+	RANAP_MBMSLinkingInformation_constraint,
+	RANAP_MBMSLinkingInformation_decode_ber,
+	RANAP_MBMSLinkingInformation_encode_der,
+	RANAP_MBMSLinkingInformation_decode_xer,
+	RANAP_MBMSLinkingInformation_encode_xer,
+	RANAP_MBMSLinkingInformation_decode_uper,
+	RANAP_MBMSLinkingInformation_encode_uper,
+	RANAP_MBMSLinkingInformation_decode_aper,
+	RANAP_MBMSLinkingInformation_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSLinkingInformation_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSLinkingInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSLinkingInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSLinkingInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSLinkingInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSLinkingInformation_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSLinkingInformation_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MBMSLinkingInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSLinkingInformation.h b/src/ranap/RANAP_MBMSLinkingInformation.h
new file mode 100644
index 0000000..8ce5bc2
--- /dev/null
+++ b/src/ranap/RANAP_MBMSLinkingInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSLinkingInformation_H_
+#define	_RANAP_MBMSLinkingInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MBMSLinkingInformation {
+	RANAP_MBMSLinkingInformation_uE_has_joined_multicast_services	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MBMSLinkingInformation;
+
+/* RANAP_MBMSLinkingInformation */
+typedef long	 RANAP_MBMSLinkingInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSLinkingInformation;
+asn_struct_free_f RANAP_MBMSLinkingInformation_free;
+asn_struct_print_f RANAP_MBMSLinkingInformation_print;
+asn_constr_check_f RANAP_MBMSLinkingInformation_constraint;
+ber_type_decoder_f RANAP_MBMSLinkingInformation_decode_ber;
+der_type_encoder_f RANAP_MBMSLinkingInformation_encode_der;
+xer_type_decoder_f RANAP_MBMSLinkingInformation_decode_xer;
+xer_type_encoder_f RANAP_MBMSLinkingInformation_encode_xer;
+per_type_decoder_f RANAP_MBMSLinkingInformation_decode_uper;
+per_type_encoder_f RANAP_MBMSLinkingInformation_encode_uper;
+per_type_decoder_f RANAP_MBMSLinkingInformation_decode_aper;
+per_type_encoder_f RANAP_MBMSLinkingInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSLinkingInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRABEstablishmentIndication.c b/src/ranap/RANAP_MBMSRABEstablishmentIndication.c
new file mode 100644
index 0000000..78c0ae0
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABEstablishmentIndication.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRABEstablishmentIndication.h"
+
+static int
+memb_mBMSRABEstablishmentIndication_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRABEstablishmentIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRABEstablishmentIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRABEstablishmentIndication_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRABEstablishmentIndication_ies_specs_2 = {
+	sizeof(struct mBMSRABEstablishmentIndication_ies),
+	offsetof(struct mBMSRABEstablishmentIndication_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRABEstablishmentIndication_ies_2 = {
+	"mBMSRABEstablishmentIndication-ies",
+	"mBMSRABEstablishmentIndication-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2,
+	sizeof(asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABEstablishmentIndication_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRABEstablishmentIndication_ies_constr_2,
+	asn_MBR_mBMSRABEstablishmentIndication_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRABEstablishmentIndication_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRABEstablishmentIndication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRABEstablishmentIndication, mBMSRABEstablishmentIndication_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRABEstablishmentIndication_ies_2,
+		memb_mBMSRABEstablishmentIndication_ies_constraint_1,
+		&asn_PER_memb_mBMSRABEstablishmentIndication_ies_constr_2,
+		0,
+		"mBMSRABEstablishmentIndication-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRABEstablishmentIndication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRABEstablishmentIndication-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRABEstablishmentIndication_specs_1 = {
+	sizeof(struct RANAP_MBMSRABEstablishmentIndication),
+	offsetof(struct RANAP_MBMSRABEstablishmentIndication, _asn_ctx),
+	asn_MAP_RANAP_MBMSRABEstablishmentIndication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABEstablishmentIndication = {
+	"RANAP_MBMSRABEstablishmentIndication",
+	"RANAP_MBMSRABEstablishmentIndication",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABEstablishmentIndication_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRABEstablishmentIndication_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRABEstablishmentIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRABEstablishmentIndication.h b/src/ranap/RANAP_MBMSRABEstablishmentIndication.h
new file mode 100644
index 0000000..88972eb
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABEstablishmentIndication.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRABEstablishmentIndication_H_
+#define	_RANAP_MBMSRABEstablishmentIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRABEstablishmentIndication */
+typedef struct RANAP_MBMSRABEstablishmentIndication {
+	struct mBMSRABEstablishmentIndication_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRABEstablishmentIndication_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRABEstablishmentIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABEstablishmentIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRABEstablishmentIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRABRelease.c b/src/ranap/RANAP_MBMSRABRelease.c
new file mode 100644
index 0000000..8f29f6d
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABRelease.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRABRelease.h"
+
+static int
+memb_mBMSRABRelease_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRABRelease_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRABRelease_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRABRelease_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRABRelease_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRABRelease_ies_specs_2 = {
+	sizeof(struct mBMSRABRelease_ies),
+	offsetof(struct mBMSRABRelease_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRABRelease_ies_2 = {
+	"mBMSRABRelease-ies",
+	"mBMSRABRelease-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRABRelease_ies_tags_2,
+	sizeof(asn_DEF_mBMSRABRelease_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABRelease_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRABRelease_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRABRelease_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABRelease_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRABRelease_ies_constr_2,
+	asn_MBR_mBMSRABRelease_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRABRelease_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRABRelease_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRABRelease, mBMSRABRelease_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRABRelease_ies_2,
+		memb_mBMSRABRelease_ies_constraint_1,
+		&asn_PER_memb_mBMSRABRelease_ies_constr_2,
+		0,
+		"mBMSRABRelease-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRABRelease_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRABRelease_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRABRelease-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRABRelease_specs_1 = {
+	sizeof(struct RANAP_MBMSRABRelease),
+	offsetof(struct RANAP_MBMSRABRelease, _asn_ctx),
+	asn_MAP_RANAP_MBMSRABRelease_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABRelease = {
+	"RANAP_MBMSRABRelease",
+	"RANAP_MBMSRABRelease",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRABRelease_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRABRelease_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABRelease_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRABRelease_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRABRelease_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABRelease_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRABRelease_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRABRelease_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRABRelease.h b/src/ranap/RANAP_MBMSRABRelease.h
new file mode 100644
index 0000000..db2b5e9
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABRelease.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRABRelease_H_
+#define	_RANAP_MBMSRABRelease_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRABRelease */
+typedef struct RANAP_MBMSRABRelease {
+	struct mBMSRABRelease_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRABRelease_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRABRelease_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABRelease;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRABRelease_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRABReleaseFailure.c b/src/ranap/RANAP_MBMSRABReleaseFailure.c
new file mode 100644
index 0000000..e6c73f3
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABReleaseFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRABReleaseFailure.h"
+
+static int
+memb_mBMSRABReleaseFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRABReleaseFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRABReleaseFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRABReleaseFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRABReleaseFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRABReleaseFailure_ies_specs_2 = {
+	sizeof(struct mBMSRABReleaseFailure_ies),
+	offsetof(struct mBMSRABReleaseFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRABReleaseFailure_ies_2 = {
+	"mBMSRABReleaseFailure-ies",
+	"mBMSRABReleaseFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRABReleaseFailure_ies_tags_2,
+	sizeof(asn_DEF_mBMSRABReleaseFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABReleaseFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRABReleaseFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRABReleaseFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABReleaseFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRABReleaseFailure_ies_constr_2,
+	asn_MBR_mBMSRABReleaseFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRABReleaseFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRABReleaseFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRABReleaseFailure, mBMSRABReleaseFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRABReleaseFailure_ies_2,
+		memb_mBMSRABReleaseFailure_ies_constraint_1,
+		&asn_PER_memb_mBMSRABReleaseFailure_ies_constr_2,
+		0,
+		"mBMSRABReleaseFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRABReleaseFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRABReleaseFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRABReleaseFailure_specs_1 = {
+	sizeof(struct RANAP_MBMSRABReleaseFailure),
+	offsetof(struct RANAP_MBMSRABReleaseFailure, _asn_ctx),
+	asn_MAP_RANAP_MBMSRABReleaseFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABReleaseFailure = {
+	"RANAP_MBMSRABReleaseFailure",
+	"RANAP_MBMSRABReleaseFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABReleaseFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRABReleaseFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRABReleaseFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRABReleaseFailure.h b/src/ranap/RANAP_MBMSRABReleaseFailure.h
new file mode 100644
index 0000000..b3ec38b
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABReleaseFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRABReleaseFailure_H_
+#define	_RANAP_MBMSRABReleaseFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRABReleaseFailure */
+typedef struct RANAP_MBMSRABReleaseFailure {
+	struct mBMSRABReleaseFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRABReleaseFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRABReleaseFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABReleaseFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRABReleaseFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRABReleaseRequest.c b/src/ranap/RANAP_MBMSRABReleaseRequest.c
new file mode 100644
index 0000000..0de4127
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABReleaseRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRABReleaseRequest.h"
+
+static int
+memb_mBMSRABReleaseRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRABReleaseRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRABReleaseRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRABReleaseRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRABReleaseRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRABReleaseRequest_ies_specs_2 = {
+	sizeof(struct mBMSRABReleaseRequest_ies),
+	offsetof(struct mBMSRABReleaseRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRABReleaseRequest_ies_2 = {
+	"mBMSRABReleaseRequest-ies",
+	"mBMSRABReleaseRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRABReleaseRequest_ies_tags_2,
+	sizeof(asn_DEF_mBMSRABReleaseRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABReleaseRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRABReleaseRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRABReleaseRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRABReleaseRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRABReleaseRequest_ies_constr_2,
+	asn_MBR_mBMSRABReleaseRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRABReleaseRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRABReleaseRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRABReleaseRequest, mBMSRABReleaseRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRABReleaseRequest_ies_2,
+		memb_mBMSRABReleaseRequest_ies_constraint_1,
+		&asn_PER_memb_mBMSRABReleaseRequest_ies_constr_2,
+		0,
+		"mBMSRABReleaseRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRABReleaseRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRABReleaseRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRABReleaseRequest_specs_1 = {
+	sizeof(struct RANAP_MBMSRABReleaseRequest),
+	offsetof(struct RANAP_MBMSRABReleaseRequest, _asn_ctx),
+	asn_MAP_RANAP_MBMSRABReleaseRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABReleaseRequest = {
+	"RANAP_MBMSRABReleaseRequest",
+	"RANAP_MBMSRABReleaseRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRABReleaseRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRABReleaseRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRABReleaseRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRABReleaseRequest.h b/src/ranap/RANAP_MBMSRABReleaseRequest.h
new file mode 100644
index 0000000..6f9d34a
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRABReleaseRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRABReleaseRequest_H_
+#define	_RANAP_MBMSRABReleaseRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRABReleaseRequest */
+typedef struct RANAP_MBMSRABReleaseRequest {
+	struct mBMSRABReleaseRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRABReleaseRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRABReleaseRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRABReleaseRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRABReleaseRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRegistrationFailure.c b/src/ranap/RANAP_MBMSRegistrationFailure.c
new file mode 100644
index 0000000..f6a7301
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRegistrationFailure.h"
+
+static int
+memb_mBMSRegistrationFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRegistrationFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRegistrationFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRegistrationFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRegistrationFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRegistrationFailure_ies_specs_2 = {
+	sizeof(struct mBMSRegistrationFailure_ies),
+	offsetof(struct mBMSRegistrationFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRegistrationFailure_ies_2 = {
+	"mBMSRegistrationFailure-ies",
+	"mBMSRegistrationFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRegistrationFailure_ies_tags_2,
+	sizeof(asn_DEF_mBMSRegistrationFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRegistrationFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRegistrationFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRegistrationFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRegistrationFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRegistrationFailure_ies_constr_2,
+	asn_MBR_mBMSRegistrationFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRegistrationFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRegistrationFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRegistrationFailure, mBMSRegistrationFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRegistrationFailure_ies_2,
+		memb_mBMSRegistrationFailure_ies_constraint_1,
+		&asn_PER_memb_mBMSRegistrationFailure_ies_constr_2,
+		0,
+		"mBMSRegistrationFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRegistrationFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRegistrationFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRegistrationFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRegistrationFailure_specs_1 = {
+	sizeof(struct RANAP_MBMSRegistrationFailure),
+	offsetof(struct RANAP_MBMSRegistrationFailure, _asn_ctx),
+	asn_MAP_RANAP_MBMSRegistrationFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationFailure = {
+	"RANAP_MBMSRegistrationFailure",
+	"RANAP_MBMSRegistrationFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRegistrationFailure_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRegistrationFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRegistrationFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRegistrationFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRegistrationFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRegistrationFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRegistrationFailure.h b/src/ranap/RANAP_MBMSRegistrationFailure.h
new file mode 100644
index 0000000..2d673fc
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRegistrationFailure_H_
+#define	_RANAP_MBMSRegistrationFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRegistrationFailure */
+typedef struct RANAP_MBMSRegistrationFailure {
+	struct mBMSRegistrationFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRegistrationFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRegistrationFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRegistrationFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRegistrationRequest.c b/src/ranap/RANAP_MBMSRegistrationRequest.c
new file mode 100644
index 0000000..d70890a
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRegistrationRequest.h"
+
+static int
+memb_mBMSRegistrationRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRegistrationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRegistrationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRegistrationRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRegistrationRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRegistrationRequest_ies_specs_2 = {
+	sizeof(struct mBMSRegistrationRequest_ies),
+	offsetof(struct mBMSRegistrationRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRegistrationRequest_ies_2 = {
+	"mBMSRegistrationRequest-ies",
+	"mBMSRegistrationRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRegistrationRequest_ies_tags_2,
+	sizeof(asn_DEF_mBMSRegistrationRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRegistrationRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRegistrationRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRegistrationRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRegistrationRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRegistrationRequest_ies_constr_2,
+	asn_MBR_mBMSRegistrationRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRegistrationRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRegistrationRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRegistrationRequest, mBMSRegistrationRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRegistrationRequest_ies_2,
+		memb_mBMSRegistrationRequest_ies_constraint_1,
+		&asn_PER_memb_mBMSRegistrationRequest_ies_constr_2,
+		0,
+		"mBMSRegistrationRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRegistrationRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRegistrationRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRegistrationRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRegistrationRequest_specs_1 = {
+	sizeof(struct RANAP_MBMSRegistrationRequest),
+	offsetof(struct RANAP_MBMSRegistrationRequest, _asn_ctx),
+	asn_MAP_RANAP_MBMSRegistrationRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationRequest = {
+	"RANAP_MBMSRegistrationRequest",
+	"RANAP_MBMSRegistrationRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRegistrationRequest_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRegistrationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRegistrationRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRegistrationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRegistrationRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRegistrationRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRegistrationRequest.h b/src/ranap/RANAP_MBMSRegistrationRequest.h
new file mode 100644
index 0000000..5138504
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRegistrationRequest_H_
+#define	_RANAP_MBMSRegistrationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRegistrationRequest */
+typedef struct RANAP_MBMSRegistrationRequest {
+	struct mBMSRegistrationRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRegistrationRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRegistrationRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRegistrationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRegistrationRequestType.c b/src/ranap/RANAP_MBMSRegistrationRequestType.c
new file mode 100644
index 0000000..ab1d933
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationRequestType.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSRegistrationRequestType.h"
+
+int
+RANAP_MBMSRegistrationRequestType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MBMSRegistrationRequestType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSRegistrationRequestType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSRegistrationRequestType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSRegistrationRequestType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSRegistrationRequestType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSRegistrationRequestType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSRegistrationRequestType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSRegistrationRequestType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSRegistrationRequestType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSRegistrationRequestType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSRegistrationRequestType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSRegistrationRequestType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MBMSRegistrationRequestType_value2enum_1[] = {
+	{ 0,	8,	"register" },
+	{ 1,	10,	"deregister" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MBMSRegistrationRequestType_enum2value_1[] = {
+	1,	/* deregister(1) */
+	0	/* register(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MBMSRegistrationRequestType_specs_1 = {
+	asn_MAP_RANAP_MBMSRegistrationRequestType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MBMSRegistrationRequestType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationRequestType = {
+	"RANAP_MBMSRegistrationRequestType",
+	"RANAP_MBMSRegistrationRequestType",
+	RANAP_MBMSRegistrationRequestType_free,
+	RANAP_MBMSRegistrationRequestType_print,
+	RANAP_MBMSRegistrationRequestType_constraint,
+	RANAP_MBMSRegistrationRequestType_decode_ber,
+	RANAP_MBMSRegistrationRequestType_encode_der,
+	RANAP_MBMSRegistrationRequestType_decode_xer,
+	RANAP_MBMSRegistrationRequestType_encode_xer,
+	RANAP_MBMSRegistrationRequestType_decode_uper,
+	RANAP_MBMSRegistrationRequestType_encode_uper,
+	RANAP_MBMSRegistrationRequestType_decode_aper,
+	RANAP_MBMSRegistrationRequestType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationRequestType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSRegistrationRequestType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MBMSRegistrationRequestType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRegistrationRequestType.h b/src/ranap/RANAP_MBMSRegistrationRequestType.h
new file mode 100644
index 0000000..720b6a6
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationRequestType.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSRegistrationRequestType_H_
+#define	_RANAP_MBMSRegistrationRequestType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MBMSRegistrationRequestType {
+	RANAP_MBMSRegistrationRequestType_register	= 0,
+	RANAP_MBMSRegistrationRequestType_deregister	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MBMSRegistrationRequestType;
+
+/* RANAP_MBMSRegistrationRequestType */
+typedef long	 RANAP_MBMSRegistrationRequestType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationRequestType;
+asn_struct_free_f RANAP_MBMSRegistrationRequestType_free;
+asn_struct_print_f RANAP_MBMSRegistrationRequestType_print;
+asn_constr_check_f RANAP_MBMSRegistrationRequestType_constraint;
+ber_type_decoder_f RANAP_MBMSRegistrationRequestType_decode_ber;
+der_type_encoder_f RANAP_MBMSRegistrationRequestType_encode_der;
+xer_type_decoder_f RANAP_MBMSRegistrationRequestType_decode_xer;
+xer_type_encoder_f RANAP_MBMSRegistrationRequestType_encode_xer;
+per_type_decoder_f RANAP_MBMSRegistrationRequestType_decode_uper;
+per_type_encoder_f RANAP_MBMSRegistrationRequestType_encode_uper;
+per_type_decoder_f RANAP_MBMSRegistrationRequestType_decode_aper;
+per_type_encoder_f RANAP_MBMSRegistrationRequestType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRegistrationRequestType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSRegistrationResponse.c b/src/ranap/RANAP_MBMSRegistrationResponse.c
new file mode 100644
index 0000000..72ead77
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSRegistrationResponse.h"
+
+static int
+memb_mBMSRegistrationResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSRegistrationResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSRegistrationResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSRegistrationResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSRegistrationResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSRegistrationResponse_ies_specs_2 = {
+	sizeof(struct mBMSRegistrationResponse_ies),
+	offsetof(struct mBMSRegistrationResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSRegistrationResponse_ies_2 = {
+	"mBMSRegistrationResponse-ies",
+	"mBMSRegistrationResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSRegistrationResponse_ies_tags_2,
+	sizeof(asn_DEF_mBMSRegistrationResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRegistrationResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSRegistrationResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSRegistrationResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSRegistrationResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSRegistrationResponse_ies_constr_2,
+	asn_MBR_mBMSRegistrationResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSRegistrationResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSRegistrationResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSRegistrationResponse, mBMSRegistrationResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSRegistrationResponse_ies_2,
+		memb_mBMSRegistrationResponse_ies_constraint_1,
+		&asn_PER_memb_mBMSRegistrationResponse_ies_constr_2,
+		0,
+		"mBMSRegistrationResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSRegistrationResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSRegistrationResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSRegistrationResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSRegistrationResponse_specs_1 = {
+	sizeof(struct RANAP_MBMSRegistrationResponse),
+	offsetof(struct RANAP_MBMSRegistrationResponse, _asn_ctx),
+	asn_MAP_RANAP_MBMSRegistrationResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationResponse = {
+	"RANAP_MBMSRegistrationResponse",
+	"RANAP_MBMSRegistrationResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSRegistrationResponse_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSRegistrationResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSRegistrationResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSRegistrationResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSRegistrationResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSRegistrationResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSRegistrationResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSRegistrationResponse.h b/src/ranap/RANAP_MBMSRegistrationResponse.h
new file mode 100644
index 0000000..e83af69
--- /dev/null
+++ b/src/ranap/RANAP_MBMSRegistrationResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSRegistrationResponse_H_
+#define	_RANAP_MBMSRegistrationResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSRegistrationResponse */
+typedef struct RANAP_MBMSRegistrationResponse {
+	struct mBMSRegistrationResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSRegistrationResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSRegistrationResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSRegistrationResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSRegistrationResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSServiceArea.c b/src/ranap/RANAP_MBMSServiceArea.c
new file mode 100644
index 0000000..b103e9f
--- /dev/null
+++ b/src/ranap/RANAP_MBMSServiceArea.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSServiceArea.h"
+
+int
+RANAP_MBMSServiceArea_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_MBMSServiceArea_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSServiceArea_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSServiceArea_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSServiceArea_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSServiceArea_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSServiceArea_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSServiceArea_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSServiceArea_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSServiceArea_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSServiceArea_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSServiceArea_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSServiceArea_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSServiceArea = {
+	"RANAP_MBMSServiceArea",
+	"RANAP_MBMSServiceArea",
+	RANAP_MBMSServiceArea_free,
+	RANAP_MBMSServiceArea_print,
+	RANAP_MBMSServiceArea_constraint,
+	RANAP_MBMSServiceArea_decode_ber,
+	RANAP_MBMSServiceArea_encode_der,
+	RANAP_MBMSServiceArea_decode_xer,
+	RANAP_MBMSServiceArea_encode_xer,
+	RANAP_MBMSServiceArea_decode_uper,
+	RANAP_MBMSServiceArea_encode_uper,
+	RANAP_MBMSServiceArea_decode_aper,
+	RANAP_MBMSServiceArea_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSServiceArea_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSServiceArea_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSServiceArea_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSServiceArea_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSServiceArea_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSServiceArea_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MBMSServiceArea.h b/src/ranap/RANAP_MBMSServiceArea.h
new file mode 100644
index 0000000..fe0b524
--- /dev/null
+++ b/src/ranap/RANAP_MBMSServiceArea.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSServiceArea_H_
+#define	_RANAP_MBMSServiceArea_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSServiceArea */
+typedef OCTET_STRING_t	 RANAP_MBMSServiceArea_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSServiceArea;
+asn_struct_free_f RANAP_MBMSServiceArea_free;
+asn_struct_print_f RANAP_MBMSServiceArea_print;
+asn_constr_check_f RANAP_MBMSServiceArea_constraint;
+ber_type_decoder_f RANAP_MBMSServiceArea_decode_ber;
+der_type_encoder_f RANAP_MBMSServiceArea_encode_der;
+xer_type_decoder_f RANAP_MBMSServiceArea_decode_xer;
+xer_type_encoder_f RANAP_MBMSServiceArea_encode_xer;
+per_type_decoder_f RANAP_MBMSServiceArea_decode_uper;
+per_type_encoder_f RANAP_MBMSServiceArea_encode_uper;
+per_type_decoder_f RANAP_MBMSServiceArea_decode_aper;
+per_type_encoder_f RANAP_MBMSServiceArea_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSServiceArea_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionDuration.c b/src/ranap/RANAP_MBMSSessionDuration.c
new file mode 100644
index 0000000..e072258
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionDuration.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSSessionDuration.h"
+
+int
+RANAP_MBMSSessionDuration_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 3l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_MBMSSessionDuration_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSSessionDuration_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionDuration_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionDuration_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionDuration_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionDuration_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionDuration_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionDuration_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionDuration_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionDuration_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSSessionDuration_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSSessionDuration_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  3l,  3l }	/* (SIZE(3..3)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionDuration_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionDuration = {
+	"RANAP_MBMSSessionDuration",
+	"RANAP_MBMSSessionDuration",
+	RANAP_MBMSSessionDuration_free,
+	RANAP_MBMSSessionDuration_print,
+	RANAP_MBMSSessionDuration_constraint,
+	RANAP_MBMSSessionDuration_decode_ber,
+	RANAP_MBMSSessionDuration_encode_der,
+	RANAP_MBMSSessionDuration_decode_xer,
+	RANAP_MBMSSessionDuration_encode_xer,
+	RANAP_MBMSSessionDuration_decode_uper,
+	RANAP_MBMSSessionDuration_encode_uper,
+	RANAP_MBMSSessionDuration_decode_aper,
+	RANAP_MBMSSessionDuration_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionDuration_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionDuration_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionDuration_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionDuration_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionDuration_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionDuration_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSSessionDuration_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionDuration.h b/src/ranap/RANAP_MBMSSessionDuration.h
new file mode 100644
index 0000000..208da5f
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionDuration.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionDuration_H_
+#define	_RANAP_MBMSSessionDuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionDuration */
+typedef OCTET_STRING_t	 RANAP_MBMSSessionDuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionDuration;
+asn_struct_free_f RANAP_MBMSSessionDuration_free;
+asn_struct_print_f RANAP_MBMSSessionDuration_print;
+asn_constr_check_f RANAP_MBMSSessionDuration_constraint;
+ber_type_decoder_f RANAP_MBMSSessionDuration_decode_ber;
+der_type_encoder_f RANAP_MBMSSessionDuration_encode_der;
+xer_type_decoder_f RANAP_MBMSSessionDuration_decode_xer;
+xer_type_encoder_f RANAP_MBMSSessionDuration_encode_xer;
+per_type_decoder_f RANAP_MBMSSessionDuration_decode_uper;
+per_type_encoder_f RANAP_MBMSSessionDuration_encode_uper;
+per_type_decoder_f RANAP_MBMSSessionDuration_decode_aper;
+per_type_encoder_f RANAP_MBMSSessionDuration_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionDuration_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionIdentity.c b/src/ranap/RANAP_MBMSSessionIdentity.c
new file mode 100644
index 0000000..e71c3b2
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionIdentity.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSSessionIdentity.h"
+
+int
+RANAP_MBMSSessionIdentity_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_MBMSSessionIdentity_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSSessionIdentity_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionIdentity_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionIdentity_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionIdentity_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionIdentity_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionIdentity_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionIdentity_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionIdentity_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionIdentity_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSSessionIdentity_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSSessionIdentity_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionIdentity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionIdentity = {
+	"RANAP_MBMSSessionIdentity",
+	"RANAP_MBMSSessionIdentity",
+	RANAP_MBMSSessionIdentity_free,
+	RANAP_MBMSSessionIdentity_print,
+	RANAP_MBMSSessionIdentity_constraint,
+	RANAP_MBMSSessionIdentity_decode_ber,
+	RANAP_MBMSSessionIdentity_encode_der,
+	RANAP_MBMSSessionIdentity_decode_xer,
+	RANAP_MBMSSessionIdentity_encode_xer,
+	RANAP_MBMSSessionIdentity_decode_uper,
+	RANAP_MBMSSessionIdentity_encode_uper,
+	RANAP_MBMSSessionIdentity_decode_aper,
+	RANAP_MBMSSessionIdentity_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionIdentity_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionIdentity_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionIdentity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionIdentity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionIdentity_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionIdentity_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSSessionIdentity_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionIdentity.h b/src/ranap/RANAP_MBMSSessionIdentity.h
new file mode 100644
index 0000000..f9d7892
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionIdentity.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionIdentity_H_
+#define	_RANAP_MBMSSessionIdentity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionIdentity */
+typedef OCTET_STRING_t	 RANAP_MBMSSessionIdentity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionIdentity;
+asn_struct_free_f RANAP_MBMSSessionIdentity_free;
+asn_struct_print_f RANAP_MBMSSessionIdentity_print;
+asn_constr_check_f RANAP_MBMSSessionIdentity_constraint;
+ber_type_decoder_f RANAP_MBMSSessionIdentity_decode_ber;
+der_type_encoder_f RANAP_MBMSSessionIdentity_encode_der;
+xer_type_decoder_f RANAP_MBMSSessionIdentity_decode_xer;
+xer_type_encoder_f RANAP_MBMSSessionIdentity_encode_xer;
+per_type_decoder_f RANAP_MBMSSessionIdentity_decode_uper;
+per_type_encoder_f RANAP_MBMSSessionIdentity_encode_uper;
+per_type_decoder_f RANAP_MBMSSessionIdentity_decode_aper;
+per_type_encoder_f RANAP_MBMSSessionIdentity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionIdentity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionRepetitionNumber.c b/src/ranap/RANAP_MBMSSessionRepetitionNumber.c
new file mode 100644
index 0000000..76a372b
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionRepetitionNumber.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MBMSSessionRepetitionNumber.h"
+
+int
+RANAP_MBMSSessionRepetitionNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_MBMSSessionRepetitionNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MBMSSessionRepetitionNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionRepetitionNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionRepetitionNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionRepetitionNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionRepetitionNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionRepetitionNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionRepetitionNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MBMSSessionRepetitionNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MBMSSessionRepetitionNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MBMSSessionRepetitionNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MBMSSessionRepetitionNumber_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionRepetitionNumber = {
+	"RANAP_MBMSSessionRepetitionNumber",
+	"RANAP_MBMSSessionRepetitionNumber",
+	RANAP_MBMSSessionRepetitionNumber_free,
+	RANAP_MBMSSessionRepetitionNumber_print,
+	RANAP_MBMSSessionRepetitionNumber_constraint,
+	RANAP_MBMSSessionRepetitionNumber_decode_ber,
+	RANAP_MBMSSessionRepetitionNumber_encode_der,
+	RANAP_MBMSSessionRepetitionNumber_decode_xer,
+	RANAP_MBMSSessionRepetitionNumber_encode_xer,
+	RANAP_MBMSSessionRepetitionNumber_decode_uper,
+	RANAP_MBMSSessionRepetitionNumber_encode_uper,
+	RANAP_MBMSSessionRepetitionNumber_decode_aper,
+	RANAP_MBMSSessionRepetitionNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionRepetitionNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MBMSSessionRepetitionNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionRepetitionNumber.h b/src/ranap/RANAP_MBMSSessionRepetitionNumber.h
new file mode 100644
index 0000000..980c186
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionRepetitionNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionRepetitionNumber_H_
+#define	_RANAP_MBMSSessionRepetitionNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionRepetitionNumber */
+typedef OCTET_STRING_t	 RANAP_MBMSSessionRepetitionNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionRepetitionNumber;
+asn_struct_free_f RANAP_MBMSSessionRepetitionNumber_free;
+asn_struct_print_f RANAP_MBMSSessionRepetitionNumber_print;
+asn_constr_check_f RANAP_MBMSSessionRepetitionNumber_constraint;
+ber_type_decoder_f RANAP_MBMSSessionRepetitionNumber_decode_ber;
+der_type_encoder_f RANAP_MBMSSessionRepetitionNumber_encode_der;
+xer_type_decoder_f RANAP_MBMSSessionRepetitionNumber_decode_xer;
+xer_type_encoder_f RANAP_MBMSSessionRepetitionNumber_encode_xer;
+per_type_decoder_f RANAP_MBMSSessionRepetitionNumber_decode_uper;
+per_type_encoder_f RANAP_MBMSSessionRepetitionNumber_encode_uper;
+per_type_decoder_f RANAP_MBMSSessionRepetitionNumber_decode_aper;
+per_type_encoder_f RANAP_MBMSSessionRepetitionNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionRepetitionNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionStart.c b/src/ranap/RANAP_MBMSSessionStart.c
new file mode 100644
index 0000000..507e9a4
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStart.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionStart.h"
+
+static int
+memb_mBMSSessionStart_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionStart_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionStart_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionStart_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionStart_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionStart_ies_specs_2 = {
+	sizeof(struct mBMSSessionStart_ies),
+	offsetof(struct mBMSSessionStart_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionStart_ies_2 = {
+	"mBMSSessionStart-ies",
+	"mBMSSessionStart-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionStart_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionStart_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStart_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionStart_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionStart_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStart_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionStart_ies_constr_2,
+	asn_MBR_mBMSSessionStart_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionStart_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionStart_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionStart, mBMSSessionStart_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionStart_ies_2,
+		memb_mBMSSessionStart_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionStart_ies_constr_2,
+		0,
+		"mBMSSessionStart-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionStart_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionStart_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionStart-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionStart_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionStart),
+	offsetof(struct RANAP_MBMSSessionStart, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionStart_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStart = {
+	"RANAP_MBMSSessionStart",
+	"RANAP_MBMSSessionStart",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionStart_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionStart_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStart_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionStart_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionStart_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStart_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionStart_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionStart_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionStart.h b/src/ranap/RANAP_MBMSSessionStart.h
new file mode 100644
index 0000000..4f3fa13
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStart.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionStart_H_
+#define	_RANAP_MBMSSessionStart_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionStart */
+typedef struct RANAP_MBMSSessionStart {
+	struct mBMSSessionStart_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionStart_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionStart_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStart;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionStart_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionStartFailure.c b/src/ranap/RANAP_MBMSSessionStartFailure.c
new file mode 100644
index 0000000..01f2af8
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStartFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionStartFailure.h"
+
+static int
+memb_mBMSSessionStartFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionStartFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionStartFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionStartFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionStartFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionStartFailure_ies_specs_2 = {
+	sizeof(struct mBMSSessionStartFailure_ies),
+	offsetof(struct mBMSSessionStartFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionStartFailure_ies_2 = {
+	"mBMSSessionStartFailure-ies",
+	"mBMSSessionStartFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionStartFailure_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionStartFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStartFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionStartFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionStartFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStartFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionStartFailure_ies_constr_2,
+	asn_MBR_mBMSSessionStartFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionStartFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionStartFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionStartFailure, mBMSSessionStartFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionStartFailure_ies_2,
+		memb_mBMSSessionStartFailure_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionStartFailure_ies_constr_2,
+		0,
+		"mBMSSessionStartFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionStartFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionStartFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionStartFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionStartFailure_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionStartFailure),
+	offsetof(struct RANAP_MBMSSessionStartFailure, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionStartFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStartFailure = {
+	"RANAP_MBMSSessionStartFailure",
+	"RANAP_MBMSSessionStartFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionStartFailure_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionStartFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStartFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionStartFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionStartFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStartFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionStartFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionStartFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionStartFailure.h b/src/ranap/RANAP_MBMSSessionStartFailure.h
new file mode 100644
index 0000000..ba73d35
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStartFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionStartFailure_H_
+#define	_RANAP_MBMSSessionStartFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionStartFailure */
+typedef struct RANAP_MBMSSessionStartFailure {
+	struct mBMSSessionStartFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionStartFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionStartFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStartFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionStartFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionStartResponse.c b/src/ranap/RANAP_MBMSSessionStartResponse.c
new file mode 100644
index 0000000..5fea9b4
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStartResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionStartResponse.h"
+
+static int
+memb_mBMSSessionStartResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionStartResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionStartResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionStartResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionStartResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionStartResponse_ies_specs_2 = {
+	sizeof(struct mBMSSessionStartResponse_ies),
+	offsetof(struct mBMSSessionStartResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionStartResponse_ies_2 = {
+	"mBMSSessionStartResponse-ies",
+	"mBMSSessionStartResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionStartResponse_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionStartResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStartResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionStartResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionStartResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStartResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionStartResponse_ies_constr_2,
+	asn_MBR_mBMSSessionStartResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionStartResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionStartResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionStartResponse, mBMSSessionStartResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionStartResponse_ies_2,
+		memb_mBMSSessionStartResponse_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionStartResponse_ies_constr_2,
+		0,
+		"mBMSSessionStartResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionStartResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionStartResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionStartResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionStartResponse_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionStartResponse),
+	offsetof(struct RANAP_MBMSSessionStartResponse, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionStartResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStartResponse = {
+	"RANAP_MBMSSessionStartResponse",
+	"RANAP_MBMSSessionStartResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionStartResponse_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionStartResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStartResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionStartResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionStartResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStartResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionStartResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionStartResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionStartResponse.h b/src/ranap/RANAP_MBMSSessionStartResponse.h
new file mode 100644
index 0000000..ebad774
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStartResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionStartResponse_H_
+#define	_RANAP_MBMSSessionStartResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionStartResponse */
+typedef struct RANAP_MBMSSessionStartResponse {
+	struct mBMSSessionStartResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionStartResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionStartResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStartResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionStartResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionStop.c b/src/ranap/RANAP_MBMSSessionStop.c
new file mode 100644
index 0000000..1797bea
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStop.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionStop.h"
+
+static int
+memb_mBMSSessionStop_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionStop_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionStop_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionStop_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionStop_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionStop_ies_specs_2 = {
+	sizeof(struct mBMSSessionStop_ies),
+	offsetof(struct mBMSSessionStop_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionStop_ies_2 = {
+	"mBMSSessionStop-ies",
+	"mBMSSessionStop-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionStop_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionStop_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStop_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionStop_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionStop_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStop_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionStop_ies_constr_2,
+	asn_MBR_mBMSSessionStop_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionStop_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionStop_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionStop, mBMSSessionStop_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionStop_ies_2,
+		memb_mBMSSessionStop_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionStop_ies_constr_2,
+		0,
+		"mBMSSessionStop-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionStop_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionStop_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionStop-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionStop_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionStop),
+	offsetof(struct RANAP_MBMSSessionStop, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionStop_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStop = {
+	"RANAP_MBMSSessionStop",
+	"RANAP_MBMSSessionStop",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionStop_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionStop_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStop_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionStop_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionStop_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStop_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionStop_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionStop_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionStop.h b/src/ranap/RANAP_MBMSSessionStop.h
new file mode 100644
index 0000000..eb4cc1a
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStop.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionStop_H_
+#define	_RANAP_MBMSSessionStop_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionStop */
+typedef struct RANAP_MBMSSessionStop {
+	struct mBMSSessionStop_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionStop_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionStop_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStop;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionStop_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionStopResponse.c b/src/ranap/RANAP_MBMSSessionStopResponse.c
new file mode 100644
index 0000000..a1730f5
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStopResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionStopResponse.h"
+
+static int
+memb_mBMSSessionStopResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionStopResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionStopResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionStopResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionStopResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionStopResponse_ies_specs_2 = {
+	sizeof(struct mBMSSessionStopResponse_ies),
+	offsetof(struct mBMSSessionStopResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionStopResponse_ies_2 = {
+	"mBMSSessionStopResponse-ies",
+	"mBMSSessionStopResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionStopResponse_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionStopResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStopResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionStopResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionStopResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionStopResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionStopResponse_ies_constr_2,
+	asn_MBR_mBMSSessionStopResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionStopResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionStopResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionStopResponse, mBMSSessionStopResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionStopResponse_ies_2,
+		memb_mBMSSessionStopResponse_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionStopResponse_ies_constr_2,
+		0,
+		"mBMSSessionStopResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionStopResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionStopResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionStopResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionStopResponse_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionStopResponse),
+	offsetof(struct RANAP_MBMSSessionStopResponse, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionStopResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStopResponse = {
+	"RANAP_MBMSSessionStopResponse",
+	"RANAP_MBMSSessionStopResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionStopResponse_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionStopResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStopResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionStopResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionStopResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionStopResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionStopResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionStopResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionStopResponse.h b/src/ranap/RANAP_MBMSSessionStopResponse.h
new file mode 100644
index 0000000..1cfc02e
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionStopResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionStopResponse_H_
+#define	_RANAP_MBMSSessionStopResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionStopResponse */
+typedef struct RANAP_MBMSSessionStopResponse {
+	struct mBMSSessionStopResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionStopResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionStopResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionStopResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionStopResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionUpdate.c b/src/ranap/RANAP_MBMSSessionUpdate.c
new file mode 100644
index 0000000..6d84b28
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionUpdate.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionUpdate.h"
+
+static int
+memb_mBMSSessionUpdate_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionUpdate_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionUpdate_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionUpdate_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionUpdate_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionUpdate_ies_specs_2 = {
+	sizeof(struct mBMSSessionUpdate_ies),
+	offsetof(struct mBMSSessionUpdate_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionUpdate_ies_2 = {
+	"mBMSSessionUpdate-ies",
+	"mBMSSessionUpdate-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionUpdate_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionUpdate_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionUpdate_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionUpdate_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionUpdate_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionUpdate_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionUpdate_ies_constr_2,
+	asn_MBR_mBMSSessionUpdate_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionUpdate_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionUpdate_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionUpdate, mBMSSessionUpdate_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionUpdate_ies_2,
+		memb_mBMSSessionUpdate_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionUpdate_ies_constr_2,
+		0,
+		"mBMSSessionUpdate-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionUpdate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionUpdate_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionUpdate-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionUpdate_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionUpdate),
+	offsetof(struct RANAP_MBMSSessionUpdate, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionUpdate_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionUpdate = {
+	"RANAP_MBMSSessionUpdate",
+	"RANAP_MBMSSessionUpdate",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionUpdate_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionUpdate_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionUpdate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionUpdate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionUpdate_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionUpdate_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionUpdate_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionUpdate_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionUpdate.h b/src/ranap/RANAP_MBMSSessionUpdate.h
new file mode 100644
index 0000000..515544b
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionUpdate.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionUpdate_H_
+#define	_RANAP_MBMSSessionUpdate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionUpdate */
+typedef struct RANAP_MBMSSessionUpdate {
+	struct mBMSSessionUpdate_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionUpdate_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionUpdate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionUpdate;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionUpdate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionUpdateFailure.c b/src/ranap/RANAP_MBMSSessionUpdateFailure.c
new file mode 100644
index 0000000..392de3a
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionUpdateFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionUpdateFailure.h"
+
+static int
+memb_mBMSSessionUpdateFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionUpdateFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionUpdateFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionUpdateFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionUpdateFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionUpdateFailure_ies_specs_2 = {
+	sizeof(struct mBMSSessionUpdateFailure_ies),
+	offsetof(struct mBMSSessionUpdateFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionUpdateFailure_ies_2 = {
+	"mBMSSessionUpdateFailure-ies",
+	"mBMSSessionUpdateFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionUpdateFailure_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionUpdateFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionUpdateFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionUpdateFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionUpdateFailure_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionUpdateFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionUpdateFailure_ies_constr_2,
+	asn_MBR_mBMSSessionUpdateFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionUpdateFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionUpdateFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionUpdateFailure, mBMSSessionUpdateFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionUpdateFailure_ies_2,
+		memb_mBMSSessionUpdateFailure_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionUpdateFailure_ies_constr_2,
+		0,
+		"mBMSSessionUpdateFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionUpdateFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionUpdateFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionUpdateFailure_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionUpdateFailure),
+	offsetof(struct RANAP_MBMSSessionUpdateFailure, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionUpdateFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionUpdateFailure = {
+	"RANAP_MBMSSessionUpdateFailure",
+	"RANAP_MBMSSessionUpdateFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionUpdateFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionUpdateFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionUpdateFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionUpdateFailure.h b/src/ranap/RANAP_MBMSSessionUpdateFailure.h
new file mode 100644
index 0000000..2913926
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionUpdateFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionUpdateFailure_H_
+#define	_RANAP_MBMSSessionUpdateFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionUpdateFailure */
+typedef struct RANAP_MBMSSessionUpdateFailure {
+	struct mBMSSessionUpdateFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionUpdateFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionUpdateFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionUpdateFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionUpdateFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSSessionUpdateResponse.c b/src/ranap/RANAP_MBMSSessionUpdateResponse.c
new file mode 100644
index 0000000..5c30885
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionUpdateResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSSessionUpdateResponse.h"
+
+static int
+memb_mBMSSessionUpdateResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSSessionUpdateResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSSessionUpdateResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSSessionUpdateResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSSessionUpdateResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSSessionUpdateResponse_ies_specs_2 = {
+	sizeof(struct mBMSSessionUpdateResponse_ies),
+	offsetof(struct mBMSSessionUpdateResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSSessionUpdateResponse_ies_2 = {
+	"mBMSSessionUpdateResponse-ies",
+	"mBMSSessionUpdateResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSSessionUpdateResponse_ies_tags_2,
+	sizeof(asn_DEF_mBMSSessionUpdateResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionUpdateResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSSessionUpdateResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSSessionUpdateResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSSessionUpdateResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSSessionUpdateResponse_ies_constr_2,
+	asn_MBR_mBMSSessionUpdateResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSSessionUpdateResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSSessionUpdateResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSSessionUpdateResponse, mBMSSessionUpdateResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSSessionUpdateResponse_ies_2,
+		memb_mBMSSessionUpdateResponse_ies_constraint_1,
+		&asn_PER_memb_mBMSSessionUpdateResponse_ies_constr_2,
+		0,
+		"mBMSSessionUpdateResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSSessionUpdateResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSSessionUpdateResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSSessionUpdateResponse_specs_1 = {
+	sizeof(struct RANAP_MBMSSessionUpdateResponse),
+	offsetof(struct RANAP_MBMSSessionUpdateResponse, _asn_ctx),
+	asn_MAP_RANAP_MBMSSessionUpdateResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionUpdateResponse = {
+	"RANAP_MBMSSessionUpdateResponse",
+	"RANAP_MBMSSessionUpdateResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSSessionUpdateResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSSessionUpdateResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSSessionUpdateResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSSessionUpdateResponse.h b/src/ranap/RANAP_MBMSSessionUpdateResponse.h
new file mode 100644
index 0000000..95d0f7f
--- /dev/null
+++ b/src/ranap/RANAP_MBMSSessionUpdateResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSSessionUpdateResponse_H_
+#define	_RANAP_MBMSSessionUpdateResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSSessionUpdateResponse */
+typedef struct RANAP_MBMSSessionUpdateResponse {
+	struct mBMSSessionUpdateResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSSessionUpdateResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSSessionUpdateResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSSessionUpdateResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSSessionUpdateResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSUELinkingRequest.c b/src/ranap/RANAP_MBMSUELinkingRequest.c
new file mode 100644
index 0000000..3f5e152
--- /dev/null
+++ b/src/ranap/RANAP_MBMSUELinkingRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSUELinkingRequest.h"
+
+static int
+memb_mBMSUELinkingRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSUELinkingRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSUELinkingRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSUELinkingRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSUELinkingRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSUELinkingRequest_ies_specs_2 = {
+	sizeof(struct mBMSUELinkingRequest_ies),
+	offsetof(struct mBMSUELinkingRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSUELinkingRequest_ies_2 = {
+	"mBMSUELinkingRequest-ies",
+	"mBMSUELinkingRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSUELinkingRequest_ies_tags_2,
+	sizeof(asn_DEF_mBMSUELinkingRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSUELinkingRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSUELinkingRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSUELinkingRequest_ies_tags_2)
+		/sizeof(asn_DEF_mBMSUELinkingRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSUELinkingRequest_ies_constr_2,
+	asn_MBR_mBMSUELinkingRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSUELinkingRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSUELinkingRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSUELinkingRequest, mBMSUELinkingRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSUELinkingRequest_ies_2,
+		memb_mBMSUELinkingRequest_ies_constraint_1,
+		&asn_PER_memb_mBMSUELinkingRequest_ies_constr_2,
+		0,
+		"mBMSUELinkingRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSUELinkingRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSUELinkingRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSUELinkingRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSUELinkingRequest_specs_1 = {
+	sizeof(struct RANAP_MBMSUELinkingRequest),
+	offsetof(struct RANAP_MBMSUELinkingRequest, _asn_ctx),
+	asn_MAP_RANAP_MBMSUELinkingRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSUELinkingRequest = {
+	"RANAP_MBMSUELinkingRequest",
+	"RANAP_MBMSUELinkingRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSUELinkingRequest_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSUELinkingRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSUELinkingRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSUELinkingRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSUELinkingRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSUELinkingRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSUELinkingRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSUELinkingRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSUELinkingRequest.h b/src/ranap/RANAP_MBMSUELinkingRequest.h
new file mode 100644
index 0000000..7f99842
--- /dev/null
+++ b/src/ranap/RANAP_MBMSUELinkingRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSUELinkingRequest_H_
+#define	_RANAP_MBMSUELinkingRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSUELinkingRequest */
+typedef struct RANAP_MBMSUELinkingRequest {
+	struct mBMSUELinkingRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSUELinkingRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSUELinkingRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSUELinkingRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSUELinkingRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MBMSUELinkingResponse.c b/src/ranap/RANAP_MBMSUELinkingResponse.c
new file mode 100644
index 0000000..9f04128
--- /dev/null
+++ b/src/ranap/RANAP_MBMSUELinkingResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_MBMSUELinkingResponse.h"
+
+static int
+memb_mBMSUELinkingResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_mBMSUELinkingResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_mBMSUELinkingResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_mBMSUELinkingResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_mBMSUELinkingResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_mBMSUELinkingResponse_ies_specs_2 = {
+	sizeof(struct mBMSUELinkingResponse_ies),
+	offsetof(struct mBMSUELinkingResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_mBMSUELinkingResponse_ies_2 = {
+	"mBMSUELinkingResponse-ies",
+	"mBMSUELinkingResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_mBMSUELinkingResponse_ies_tags_2,
+	sizeof(asn_DEF_mBMSUELinkingResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSUELinkingResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_mBMSUELinkingResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_mBMSUELinkingResponse_ies_tags_2)
+		/sizeof(asn_DEF_mBMSUELinkingResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_mBMSUELinkingResponse_ies_constr_2,
+	asn_MBR_mBMSUELinkingResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_mBMSUELinkingResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MBMSUELinkingResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSUELinkingResponse, mBMSUELinkingResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_mBMSUELinkingResponse_ies_2,
+		memb_mBMSUELinkingResponse_ies_constraint_1,
+		&asn_PER_memb_mBMSUELinkingResponse_ies_constr_2,
+		0,
+		"mBMSUELinkingResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MBMSUELinkingResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSUELinkingResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* mBMSUELinkingResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSUELinkingResponse_specs_1 = {
+	sizeof(struct RANAP_MBMSUELinkingResponse),
+	offsetof(struct RANAP_MBMSUELinkingResponse, _asn_ctx),
+	asn_MAP_RANAP_MBMSUELinkingResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSUELinkingResponse = {
+	"RANAP_MBMSUELinkingResponse",
+	"RANAP_MBMSUELinkingResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MBMSUELinkingResponse_tags_1,
+	sizeof(asn_DEF_RANAP_MBMSUELinkingResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSUELinkingResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MBMSUELinkingResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MBMSUELinkingResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_MBMSUELinkingResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MBMSUELinkingResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_MBMSUELinkingResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MBMSUELinkingResponse.h b/src/ranap/RANAP_MBMSUELinkingResponse.h
new file mode 100644
index 0000000..c68c1c4
--- /dev/null
+++ b/src/ranap/RANAP_MBMSUELinkingResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_MBMSUELinkingResponse_H_
+#define	_RANAP_MBMSUELinkingResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MBMSUELinkingResponse */
+typedef struct RANAP_MBMSUELinkingResponse {
+	struct mBMSUELinkingResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} mBMSUELinkingResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MBMSUELinkingResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSUELinkingResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MBMSUELinkingResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MDT-Activation.c b/src/ranap/RANAP_MDT-Activation.c
new file mode 100644
index 0000000..4269a33
--- /dev/null
+++ b/src/ranap/RANAP_MDT-Activation.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MDT-Activation.h"
+
+int
+RANAP_MDT_Activation_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MDT_Activation_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MDT_Activation_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MDT_Activation_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MDT_Activation_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MDT_Activation_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MDT_Activation_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MDT_Activation_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MDT_Activation_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MDT_Activation_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MDT_Activation_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MDT_Activation_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MDT_Activation_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MDT_Activation_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MDT_Activation_value2enum_1[] = {
+	{ 0,	16,	"immediateMDTonly" },
+	{ 1,	13,	"loggedMDTonly" },
+	{ 2,	20,	"immediateMDTandTrace" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MDT_Activation_enum2value_1[] = {
+	2,	/* immediateMDTandTrace(2) */
+	0,	/* immediateMDTonly(0) */
+	1	/* loggedMDTonly(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MDT_Activation_specs_1 = {
+	asn_MAP_RANAP_MDT_Activation_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MDT_Activation_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MDT_Activation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_Activation = {
+	"RANAP_MDT-Activation",
+	"RANAP_MDT-Activation",
+	RANAP_MDT_Activation_free,
+	RANAP_MDT_Activation_print,
+	RANAP_MDT_Activation_constraint,
+	RANAP_MDT_Activation_decode_ber,
+	RANAP_MDT_Activation_encode_der,
+	RANAP_MDT_Activation_decode_xer,
+	RANAP_MDT_Activation_encode_xer,
+	RANAP_MDT_Activation_decode_uper,
+	RANAP_MDT_Activation_encode_uper,
+	RANAP_MDT_Activation_decode_aper,
+	RANAP_MDT_Activation_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MDT_Activation_tags_1,
+	sizeof(asn_DEF_RANAP_MDT_Activation_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_Activation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MDT_Activation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MDT_Activation_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_Activation_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MDT_Activation_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MDT_Activation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MDT-Activation.h b/src/ranap/RANAP_MDT-Activation.h
new file mode 100644
index 0000000..d74a08a
--- /dev/null
+++ b/src/ranap/RANAP_MDT-Activation.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MDT_Activation_H_
+#define	_RANAP_MDT_Activation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MDT_Activation {
+	RANAP_MDT_Activation_immediateMDTonly	= 0,
+	RANAP_MDT_Activation_loggedMDTonly	= 1,
+	RANAP_MDT_Activation_immediateMDTandTrace	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MDT_Activation;
+
+/* RANAP_MDT-Activation */
+typedef long	 RANAP_MDT_Activation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_Activation;
+asn_struct_free_f RANAP_MDT_Activation_free;
+asn_struct_print_f RANAP_MDT_Activation_print;
+asn_constr_check_f RANAP_MDT_Activation_constraint;
+ber_type_decoder_f RANAP_MDT_Activation_decode_ber;
+der_type_encoder_f RANAP_MDT_Activation_encode_der;
+xer_type_decoder_f RANAP_MDT_Activation_decode_xer;
+xer_type_encoder_f RANAP_MDT_Activation_encode_xer;
+per_type_decoder_f RANAP_MDT_Activation_decode_uper;
+per_type_encoder_f RANAP_MDT_Activation_encode_uper;
+per_type_decoder_f RANAP_MDT_Activation_decode_aper;
+per_type_encoder_f RANAP_MDT_Activation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MDT_Activation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MDT-Configuration.c b/src/ranap/RANAP_MDT-Configuration.c
new file mode 100644
index 0000000..3d3efd1
--- /dev/null
+++ b/src/ranap/RANAP_MDT-Configuration.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MDT-Configuration.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_MDT_Configuration_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDT_Configuration, mdtActivation),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MDT_Activation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"mdtActivation"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDT_Configuration, mdtAreaScope),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_MDTAreaScope,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"mdtAreaScope"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDT_Configuration, mdtMode),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_MDTMode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"mdtMode"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_MDT_Configuration, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_MDT_Configuration_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_MDT_Configuration_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MDT_Configuration_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* mdtActivation */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* mdtAreaScope */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* mdtMode */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MDT_Configuration_specs_1 = {
+	sizeof(struct RANAP_MDT_Configuration),
+	offsetof(struct RANAP_MDT_Configuration, _asn_ctx),
+	asn_MAP_RANAP_MDT_Configuration_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_MDT_Configuration_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_Configuration = {
+	"RANAP_MDT-Configuration",
+	"RANAP_MDT-Configuration",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MDT_Configuration_tags_1,
+	sizeof(asn_DEF_RANAP_MDT_Configuration_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_Configuration_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MDT_Configuration_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MDT_Configuration_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_Configuration_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MDT_Configuration_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_MDT_Configuration_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MDT-Configuration.h b/src/ranap/RANAP_MDT-Configuration.h
new file mode 100644
index 0000000..128cc7c
--- /dev/null
+++ b/src/ranap/RANAP_MDT-Configuration.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MDT_Configuration_H_
+#define	_RANAP_MDT_Configuration_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MDT-Activation.h"
+#include "RANAP_MDTAreaScope.h"
+#include "RANAP_MDTMode.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MDT-Configuration */
+typedef struct RANAP_MDT_Configuration {
+	RANAP_MDT_Activation_t	 mdtActivation;
+	RANAP_MDTAreaScope_t	 mdtAreaScope;
+	RANAP_MDTMode_t	 mdtMode;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MDT_Configuration_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_Configuration;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MDT_Configuration_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MDT-PLMN-List.c b/src/ranap/RANAP_MDT-PLMN-List.c
new file mode 100644
index 0000000..e24381d
--- /dev/null
+++ b/src/ranap/RANAP_MDT-PLMN-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MDT-PLMN-List.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_MDT_PLMN_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_MDT_PLMN_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MDT_PLMN_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_MDT_PLMN_List_specs_1 = {
+	sizeof(struct RANAP_MDT_PLMN_List),
+	offsetof(struct RANAP_MDT_PLMN_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_PLMN_List = {
+	"RANAP_MDT-PLMN-List",
+	"RANAP_MDT-PLMN-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MDT_PLMN_List_tags_1,
+	sizeof(asn_DEF_RANAP_MDT_PLMN_List_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_PLMN_List_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MDT_PLMN_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MDT_PLMN_List_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_PLMN_List_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MDT_PLMN_List_constr_1,
+	asn_MBR_RANAP_MDT_PLMN_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_MDT_PLMN_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MDT-PLMN-List.h b/src/ranap/RANAP_MDT-PLMN-List.h
new file mode 100644
index 0000000..329f2fd
--- /dev/null
+++ b/src/ranap/RANAP_MDT-PLMN-List.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MDT_PLMN_List_H_
+#define	_RANAP_MDT_PLMN_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MDT-PLMN-List */
+typedef struct RANAP_MDT_PLMN_List {
+	A_SEQUENCE_OF(RANAP_PLMNidentity_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MDT_PLMN_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_PLMN_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MDT_PLMN_List_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MDT-Report-Parameters.c b/src/ranap/RANAP_MDT-Report-Parameters.c
new file mode 100644
index 0000000..da15db3
--- /dev/null
+++ b/src/ranap/RANAP_MDT-Report-Parameters.c
@@ -0,0 +1,71 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MDT-Report-Parameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_MDT_Report_Parameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDT_Report_Parameters, reportInterval),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ReportInterval,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"reportInterval"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDT_Report_Parameters, reportAmount),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ReportAmount,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"reportAmount"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MDT_Report_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MDT_Report_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* reportInterval */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* reportAmount */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MDT_Report_Parameters_specs_1 = {
+	sizeof(struct RANAP_MDT_Report_Parameters),
+	offsetof(struct RANAP_MDT_Report_Parameters, _asn_ctx),
+	asn_MAP_RANAP_MDT_Report_Parameters_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_Report_Parameters = {
+	"RANAP_MDT-Report-Parameters",
+	"RANAP_MDT-Report-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MDT_Report_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_MDT_Report_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_Report_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MDT_Report_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MDT_Report_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_MDT_Report_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_MDT_Report_Parameters_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_MDT_Report_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MDT-Report-Parameters.h b/src/ranap/RANAP_MDT-Report-Parameters.h
new file mode 100644
index 0000000..2b1225b
--- /dev/null
+++ b/src/ranap/RANAP_MDT-Report-Parameters.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MDT_Report_Parameters_H_
+#define	_RANAP_MDT_Report_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ReportInterval.h"
+#include "RANAP_ReportAmount.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MDT-Report-Parameters */
+typedef struct RANAP_MDT_Report_Parameters {
+	RANAP_ReportInterval_t	 reportInterval;
+	RANAP_ReportAmount_t	 reportAmount;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MDT_Report_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MDT_Report_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MDT_Report_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MDTAreaScope.c b/src/ranap/RANAP_MDTAreaScope.c
new file mode 100644
index 0000000..dc00852
--- /dev/null
+++ b/src/ranap/RANAP_MDTAreaScope.c
@@ -0,0 +1,92 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MDTAreaScope.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_MDTAreaScope_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_MDTAreaScope_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTAreaScope, choice.cellbased),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CellBased,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cellbased"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTAreaScope, choice.labased),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LABased,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"labased"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTAreaScope, choice.rabased),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RABased,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rabased"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTAreaScope, choice.plmn_area_based),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NULL,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"plmn-area-based"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MDTAreaScope_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* cellbased */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* labased */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* rabased */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* plmn-area-based */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_MDTAreaScope_specs_1 = {
+	sizeof(struct RANAP_MDTAreaScope),
+	offsetof(struct RANAP_MDTAreaScope, _asn_ctx),
+	offsetof(struct RANAP_MDTAreaScope, present),
+	sizeof(((struct RANAP_MDTAreaScope *)0)->present),
+	asn_MAP_RANAP_MDTAreaScope_tag2el_1,
+	4,	/* Count of tags in the map */
+	0,
+	4	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MDTAreaScope = {
+	"RANAP_MDTAreaScope",
+	"RANAP_MDTAreaScope",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_MDTAreaScope_constr_1,
+	asn_MBR_RANAP_MDTAreaScope_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_MDTAreaScope_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MDTAreaScope.h b/src/ranap/RANAP_MDTAreaScope.h
new file mode 100644
index 0000000..d538daa
--- /dev/null
+++ b/src/ranap/RANAP_MDTAreaScope.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MDTAreaScope_H_
+#define	_RANAP_MDTAreaScope_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_CellBased.h"
+#include "RANAP_LABased.h"
+#include "RANAP_RABased.h"
+#include <NULL.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MDTAreaScope_PR {
+	RANAP_MDTAreaScope_PR_NOTHING,	/* No components present */
+	RANAP_MDTAreaScope_PR_cellbased,
+	RANAP_MDTAreaScope_PR_labased,
+	RANAP_MDTAreaScope_PR_rabased,
+	RANAP_MDTAreaScope_PR_plmn_area_based,
+	/* Extensions may appear below */
+	
+} RANAP_MDTAreaScope_PR;
+
+/* RANAP_MDTAreaScope */
+typedef struct RANAP_MDTAreaScope {
+	RANAP_MDTAreaScope_PR present;
+	union RANAP_MDTAreaScope_u {
+		RANAP_CellBased_t	 cellbased;
+		RANAP_LABased_t	 labased;
+		RANAP_RABased_t	 rabased;
+		NULL_t	 plmn_area_based;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MDTAreaScope_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MDTAreaScope;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MDTAreaScope_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MDTMode.c b/src/ranap/RANAP_MDTMode.c
new file mode 100644
index 0000000..0391501
--- /dev/null
+++ b/src/ranap/RANAP_MDTMode.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MDTMode.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_MDTMode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_MDTMode_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTMode, choice.immediateMDT),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ImmediateMDT,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"immediateMDT"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTMode, choice.loggedMDT),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LoggedMDT,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"loggedMDT"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_MDTMode_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* immediateMDT */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* loggedMDT */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_MDTMode_specs_1 = {
+	sizeof(struct RANAP_MDTMode),
+	offsetof(struct RANAP_MDTMode, _asn_ctx),
+	offsetof(struct RANAP_MDTMode, present),
+	sizeof(((struct RANAP_MDTMode *)0)->present),
+	asn_MAP_RANAP_MDTMode_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MDTMode = {
+	"RANAP_MDTMode",
+	"RANAP_MDTMode",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_MDTMode_constr_1,
+	asn_MBR_RANAP_MDTMode_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_MDTMode_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MDTMode.h b/src/ranap/RANAP_MDTMode.h
new file mode 100644
index 0000000..71da3af
--- /dev/null
+++ b/src/ranap/RANAP_MDTMode.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MDTMode_H_
+#define	_RANAP_MDTMode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ImmediateMDT.h"
+#include "RANAP_LoggedMDT.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MDTMode_PR {
+	RANAP_MDTMode_PR_NOTHING,	/* No components present */
+	RANAP_MDTMode_PR_immediateMDT,
+	RANAP_MDTMode_PR_loggedMDT,
+	/* Extensions may appear below */
+	
+} RANAP_MDTMode_PR;
+
+/* RANAP_MDTMode */
+typedef struct RANAP_MDTMode {
+	RANAP_MDTMode_PR present;
+	union RANAP_MDTMode_u {
+		RANAP_ImmediateMDT_t	 immediateMDT;
+		RANAP_LoggedMDT_t	 loggedMDT;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MDTMode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MDTMode;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MDTMode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MSISDN.c b/src/ranap/RANAP_MSISDN.c
new file mode 100644
index 0000000..c359e3f
--- /dev/null
+++ b/src/ranap/RANAP_MSISDN.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MSISDN.h"
+
+int
+RANAP_MSISDN_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 1l && size <= 9l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MSISDN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_MSISDN_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MSISDN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MSISDN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MSISDN_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MSISDN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MSISDN_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MSISDN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MSISDN_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MSISDN_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MSISDN_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MSISDN_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MSISDN_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  9l }	/* (SIZE(1..9)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MSISDN_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MSISDN = {
+	"RANAP_MSISDN",
+	"RANAP_MSISDN",
+	RANAP_MSISDN_free,
+	RANAP_MSISDN_print,
+	RANAP_MSISDN_constraint,
+	RANAP_MSISDN_decode_ber,
+	RANAP_MSISDN_encode_der,
+	RANAP_MSISDN_decode_xer,
+	RANAP_MSISDN_encode_xer,
+	RANAP_MSISDN_decode_uper,
+	RANAP_MSISDN_encode_uper,
+	RANAP_MSISDN_decode_aper,
+	RANAP_MSISDN_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MSISDN_tags_1,
+	sizeof(asn_DEF_RANAP_MSISDN_tags_1)
+		/sizeof(asn_DEF_RANAP_MSISDN_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MSISDN_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MSISDN_tags_1)
+		/sizeof(asn_DEF_RANAP_MSISDN_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MSISDN_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MSISDN.h b/src/ranap/RANAP_MSISDN.h
new file mode 100644
index 0000000..5b248fb
--- /dev/null
+++ b/src/ranap/RANAP_MSISDN.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MSISDN_H_
+#define	_RANAP_MSISDN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MSISDN */
+typedef OCTET_STRING_t	 RANAP_MSISDN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MSISDN;
+asn_struct_free_f RANAP_MSISDN_free;
+asn_struct_print_f RANAP_MSISDN_print;
+asn_constr_check_f RANAP_MSISDN_constraint;
+ber_type_decoder_f RANAP_MSISDN_decode_ber;
+der_type_encoder_f RANAP_MSISDN_encode_der;
+xer_type_decoder_f RANAP_MSISDN_decode_xer;
+xer_type_encoder_f RANAP_MSISDN_encode_xer;
+per_type_decoder_f RANAP_MSISDN_decode_uper;
+per_type_encoder_f RANAP_MSISDN_encode_uper;
+per_type_decoder_f RANAP_MSISDN_decode_aper;
+per_type_encoder_f RANAP_MSISDN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MSISDN_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Management-Based-MDT-Allowed.c b/src/ranap/RANAP_Management-Based-MDT-Allowed.c
new file mode 100644
index 0000000..e48be5c
--- /dev/null
+++ b/src/ranap/RANAP_Management-Based-MDT-Allowed.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Management-Based-MDT-Allowed.h"
+
+int
+RANAP_Management_Based_MDT_Allowed_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Management_Based_MDT_Allowed_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Management_Based_MDT_Allowed_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Management_Based_MDT_Allowed_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Management_Based_MDT_Allowed_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Management_Based_MDT_Allowed_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Management_Based_MDT_Allowed_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Management_Based_MDT_Allowed_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Management_Based_MDT_Allowed_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Management_Based_MDT_Allowed_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Management_Based_MDT_Allowed_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Management_Based_MDT_Allowed_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Management_Based_MDT_Allowed_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Management_Based_MDT_Allowed_value2enum_1[] = {
+	{ 0,	7,	"allowed" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Management_Based_MDT_Allowed_enum2value_1[] = {
+	0	/* allowed(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Management_Based_MDT_Allowed_specs_1 = {
+	asn_MAP_RANAP_Management_Based_MDT_Allowed_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Management_Based_MDT_Allowed_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Management_Based_MDT_Allowed = {
+	"RANAP_Management-Based-MDT-Allowed",
+	"RANAP_Management-Based-MDT-Allowed",
+	RANAP_Management_Based_MDT_Allowed_free,
+	RANAP_Management_Based_MDT_Allowed_print,
+	RANAP_Management_Based_MDT_Allowed_constraint,
+	RANAP_Management_Based_MDT_Allowed_decode_ber,
+	RANAP_Management_Based_MDT_Allowed_encode_der,
+	RANAP_Management_Based_MDT_Allowed_decode_xer,
+	RANAP_Management_Based_MDT_Allowed_encode_xer,
+	RANAP_Management_Based_MDT_Allowed_decode_uper,
+	RANAP_Management_Based_MDT_Allowed_encode_uper,
+	RANAP_Management_Based_MDT_Allowed_decode_aper,
+	RANAP_Management_Based_MDT_Allowed_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1,
+	sizeof(asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1)
+		/sizeof(asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1)
+		/sizeof(asn_DEF_RANAP_Management_Based_MDT_Allowed_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Management_Based_MDT_Allowed_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Management_Based_MDT_Allowed_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Management-Based-MDT-Allowed.h b/src/ranap/RANAP_Management-Based-MDT-Allowed.h
new file mode 100644
index 0000000..48ad306
--- /dev/null
+++ b/src/ranap/RANAP_Management-Based-MDT-Allowed.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Management_Based_MDT_Allowed_H_
+#define	_RANAP_Management_Based_MDT_Allowed_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Management_Based_MDT_Allowed {
+	RANAP_Management_Based_MDT_Allowed_allowed	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Management_Based_MDT_Allowed;
+
+/* RANAP_Management-Based-MDT-Allowed */
+typedef long	 RANAP_Management_Based_MDT_Allowed_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Management_Based_MDT_Allowed;
+asn_struct_free_f RANAP_Management_Based_MDT_Allowed_free;
+asn_struct_print_f RANAP_Management_Based_MDT_Allowed_print;
+asn_constr_check_f RANAP_Management_Based_MDT_Allowed_constraint;
+ber_type_decoder_f RANAP_Management_Based_MDT_Allowed_decode_ber;
+der_type_encoder_f RANAP_Management_Based_MDT_Allowed_encode_der;
+xer_type_decoder_f RANAP_Management_Based_MDT_Allowed_decode_xer;
+xer_type_encoder_f RANAP_Management_Based_MDT_Allowed_encode_xer;
+per_type_decoder_f RANAP_Management_Based_MDT_Allowed_decode_uper;
+per_type_encoder_f RANAP_Management_Based_MDT_Allowed_encode_uper;
+per_type_decoder_f RANAP_Management_Based_MDT_Allowed_decode_aper;
+per_type_encoder_f RANAP_Management_Based_MDT_Allowed_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Management_Based_MDT_Allowed_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MaxBitrate.c b/src/ranap/RANAP_MaxBitrate.c
new file mode 100644
index 0000000..72c4720
--- /dev/null
+++ b/src/ranap/RANAP_MaxBitrate.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MaxBitrate.h"
+
+int
+RANAP_MaxBitrate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 16000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MaxBitrate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_MaxBitrate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MaxBitrate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MaxBitrate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MaxBitrate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MaxBitrate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MaxBitrate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MaxBitrate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MaxBitrate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MaxBitrate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MaxBitrate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MaxBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MaxBitrate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 24, -1,  1l,  16000000l }	/* (1..16000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MaxBitrate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MaxBitrate = {
+	"RANAP_MaxBitrate",
+	"RANAP_MaxBitrate",
+	RANAP_MaxBitrate_free,
+	RANAP_MaxBitrate_print,
+	RANAP_MaxBitrate_constraint,
+	RANAP_MaxBitrate_decode_ber,
+	RANAP_MaxBitrate_encode_der,
+	RANAP_MaxBitrate_decode_xer,
+	RANAP_MaxBitrate_encode_xer,
+	RANAP_MaxBitrate_decode_uper,
+	RANAP_MaxBitrate_encode_uper,
+	RANAP_MaxBitrate_decode_aper,
+	RANAP_MaxBitrate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MaxBitrate_tags_1,
+	sizeof(asn_DEF_RANAP_MaxBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_MaxBitrate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MaxBitrate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MaxBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_MaxBitrate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MaxBitrate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MaxBitrate.h b/src/ranap/RANAP_MaxBitrate.h
new file mode 100644
index 0000000..2dad1b6
--- /dev/null
+++ b/src/ranap/RANAP_MaxBitrate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MaxBitrate_H_
+#define	_RANAP_MaxBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MaxBitrate */
+typedef long	 RANAP_MaxBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MaxBitrate;
+asn_struct_free_f RANAP_MaxBitrate_free;
+asn_struct_print_f RANAP_MaxBitrate_print;
+asn_constr_check_f RANAP_MaxBitrate_constraint;
+ber_type_decoder_f RANAP_MaxBitrate_decode_ber;
+der_type_encoder_f RANAP_MaxBitrate_encode_der;
+xer_type_decoder_f RANAP_MaxBitrate_decode_xer;
+xer_type_encoder_f RANAP_MaxBitrate_encode_xer;
+per_type_decoder_f RANAP_MaxBitrate_decode_uper;
+per_type_encoder_f RANAP_MaxBitrate_encode_uper;
+per_type_decoder_f RANAP_MaxBitrate_decode_aper;
+per_type_encoder_f RANAP_MaxBitrate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MaxBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MaxSDU-Size.c b/src/ranap/RANAP_MaxSDU-Size.c
new file mode 100644
index 0000000..2dfaa2e
--- /dev/null
+++ b/src/ranap/RANAP_MaxSDU-Size.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MaxSDU-Size.h"
+
+int
+RANAP_MaxSDU_Size_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 32768l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_MaxSDU_Size_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MaxSDU_Size_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MaxSDU_Size_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MaxSDU_Size_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MaxSDU_Size_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MaxSDU_Size_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MaxSDU_Size_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MaxSDU_Size_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MaxSDU_Size_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MaxSDU_Size_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MaxSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MaxSDU_Size_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  32768l }	/* (0..32768) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MaxSDU_Size_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MaxSDU_Size = {
+	"RANAP_MaxSDU-Size",
+	"RANAP_MaxSDU-Size",
+	RANAP_MaxSDU_Size_free,
+	RANAP_MaxSDU_Size_print,
+	RANAP_MaxSDU_Size_constraint,
+	RANAP_MaxSDU_Size_decode_ber,
+	RANAP_MaxSDU_Size_encode_der,
+	RANAP_MaxSDU_Size_decode_xer,
+	RANAP_MaxSDU_Size_encode_xer,
+	RANAP_MaxSDU_Size_decode_uper,
+	RANAP_MaxSDU_Size_encode_uper,
+	RANAP_MaxSDU_Size_decode_aper,
+	RANAP_MaxSDU_Size_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MaxSDU_Size_tags_1,
+	sizeof(asn_DEF_RANAP_MaxSDU_Size_tags_1)
+		/sizeof(asn_DEF_RANAP_MaxSDU_Size_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MaxSDU_Size_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MaxSDU_Size_tags_1)
+		/sizeof(asn_DEF_RANAP_MaxSDU_Size_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MaxSDU_Size_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MaxSDU-Size.h b/src/ranap/RANAP_MaxSDU-Size.h
new file mode 100644
index 0000000..cf680ba
--- /dev/null
+++ b/src/ranap/RANAP_MaxSDU-Size.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MaxSDU_Size_H_
+#define	_RANAP_MaxSDU_Size_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MaxSDU-Size */
+typedef long	 RANAP_MaxSDU_Size_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MaxSDU_Size;
+asn_struct_free_f RANAP_MaxSDU_Size_free;
+asn_struct_print_f RANAP_MaxSDU_Size_print;
+asn_constr_check_f RANAP_MaxSDU_Size_constraint;
+ber_type_decoder_f RANAP_MaxSDU_Size_decode_ber;
+der_type_encoder_f RANAP_MaxSDU_Size_encode_der;
+xer_type_decoder_f RANAP_MaxSDU_Size_decode_xer;
+xer_type_encoder_f RANAP_MaxSDU_Size_encode_xer;
+per_type_decoder_f RANAP_MaxSDU_Size_decode_uper;
+per_type_encoder_f RANAP_MaxSDU_Size_encode_uper;
+per_type_decoder_f RANAP_MaxSDU_Size_decode_aper;
+per_type_encoder_f RANAP_MaxSDU_Size_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MaxSDU_Size_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MeasBand.c b/src/ranap/RANAP_MeasBand.c
new file mode 100644
index 0000000..feb6867
--- /dev/null
+++ b/src/ranap/RANAP_MeasBand.c
@@ -0,0 +1,173 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MeasBand.h"
+
+int
+RANAP_MeasBand_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MeasBand_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MeasBand_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MeasBand_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasBand_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MeasBand_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasBand_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MeasBand_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasBand_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MeasBand_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MeasBand_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MeasBand_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MeasBand_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MeasBand_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 3,  3,  0l,  5l }	/* (0..5) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MeasBand_value2enum_1[] = {
+	{ 0,	2,	"v6" },
+	{ 1,	3,	"v15" },
+	{ 2,	3,	"v25" },
+	{ 3,	3,	"v50" },
+	{ 4,	3,	"v75" },
+	{ 5,	4,	"v100" }
+};
+static const unsigned int asn_MAP_RANAP_MeasBand_enum2value_1[] = {
+	5,	/* v100(5) */
+	1,	/* v15(1) */
+	2,	/* v25(2) */
+	3,	/* v50(3) */
+	0,	/* v6(0) */
+	4	/* v75(4) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MeasBand_specs_1 = {
+	asn_MAP_RANAP_MeasBand_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MeasBand_enum2value_1,	/* N => "tag"; sorted by N */
+	6,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MeasBand_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MeasBand = {
+	"RANAP_MeasBand",
+	"RANAP_MeasBand",
+	RANAP_MeasBand_free,
+	RANAP_MeasBand_print,
+	RANAP_MeasBand_constraint,
+	RANAP_MeasBand_decode_ber,
+	RANAP_MeasBand_encode_der,
+	RANAP_MeasBand_decode_xer,
+	RANAP_MeasBand_encode_xer,
+	RANAP_MeasBand_decode_uper,
+	RANAP_MeasBand_encode_uper,
+	RANAP_MeasBand_decode_aper,
+	RANAP_MeasBand_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MeasBand_tags_1,
+	sizeof(asn_DEF_RANAP_MeasBand_tags_1)
+		/sizeof(asn_DEF_RANAP_MeasBand_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MeasBand_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MeasBand_tags_1)
+		/sizeof(asn_DEF_RANAP_MeasBand_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MeasBand_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MeasBand_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MeasBand.h b/src/ranap/RANAP_MeasBand.h
new file mode 100644
index 0000000..580cd33
--- /dev/null
+++ b/src/ranap/RANAP_MeasBand.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MeasBand_H_
+#define	_RANAP_MeasBand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MeasBand {
+	RANAP_MeasBand_v6	= 0,
+	RANAP_MeasBand_v15	= 1,
+	RANAP_MeasBand_v25	= 2,
+	RANAP_MeasBand_v50	= 3,
+	RANAP_MeasBand_v75	= 4,
+	RANAP_MeasBand_v100	= 5
+} e_RANAP_MeasBand;
+
+/* RANAP_MeasBand */
+typedef long	 RANAP_MeasBand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MeasBand;
+asn_struct_free_f RANAP_MeasBand_free;
+asn_struct_print_f RANAP_MeasBand_print;
+asn_constr_check_f RANAP_MeasBand_constraint;
+ber_type_decoder_f RANAP_MeasBand_decode_ber;
+der_type_encoder_f RANAP_MeasBand_encode_der;
+xer_type_decoder_f RANAP_MeasBand_decode_xer;
+xer_type_encoder_f RANAP_MeasBand_encode_xer;
+per_type_decoder_f RANAP_MeasBand_decode_uper;
+per_type_encoder_f RANAP_MeasBand_encode_uper;
+per_type_decoder_f RANAP_MeasBand_decode_aper;
+per_type_encoder_f RANAP_MeasBand_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MeasBand_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MeasurementQuantity.c b/src/ranap/RANAP_MeasurementQuantity.c
new file mode 100644
index 0000000..19e367d
--- /dev/null
+++ b/src/ranap/RANAP_MeasurementQuantity.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MeasurementQuantity.h"
+
+int
+RANAP_MeasurementQuantity_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_MeasurementQuantity_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MeasurementQuantity_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementQuantity_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementQuantity_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementQuantity_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementQuantity_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementQuantity_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementQuantity_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementQuantity_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementQuantity_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MeasurementQuantity_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MeasurementQuantity_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_MeasurementQuantity_value2enum_1[] = {
+	{ 0,	9,	"cpichEcNo" },
+	{ 1,	9,	"cpichRSCP" },
+	{ 2,	8,	"pathloss" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_MeasurementQuantity_enum2value_1[] = {
+	0,	/* cpichEcNo(0) */
+	1,	/* cpichRSCP(1) */
+	2	/* pathloss(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_MeasurementQuantity_specs_1 = {
+	asn_MAP_RANAP_MeasurementQuantity_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_MeasurementQuantity_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MeasurementQuantity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MeasurementQuantity = {
+	"RANAP_MeasurementQuantity",
+	"RANAP_MeasurementQuantity",
+	RANAP_MeasurementQuantity_free,
+	RANAP_MeasurementQuantity_print,
+	RANAP_MeasurementQuantity_constraint,
+	RANAP_MeasurementQuantity_decode_ber,
+	RANAP_MeasurementQuantity_encode_der,
+	RANAP_MeasurementQuantity_decode_xer,
+	RANAP_MeasurementQuantity_encode_xer,
+	RANAP_MeasurementQuantity_decode_uper,
+	RANAP_MeasurementQuantity_encode_uper,
+	RANAP_MeasurementQuantity_decode_aper,
+	RANAP_MeasurementQuantity_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MeasurementQuantity_tags_1,
+	sizeof(asn_DEF_RANAP_MeasurementQuantity_tags_1)
+		/sizeof(asn_DEF_RANAP_MeasurementQuantity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MeasurementQuantity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MeasurementQuantity_tags_1)
+		/sizeof(asn_DEF_RANAP_MeasurementQuantity_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MeasurementQuantity_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_MeasurementQuantity_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MeasurementQuantity.h b/src/ranap/RANAP_MeasurementQuantity.h
new file mode 100644
index 0000000..4685528
--- /dev/null
+++ b/src/ranap/RANAP_MeasurementQuantity.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MeasurementQuantity_H_
+#define	_RANAP_MeasurementQuantity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_MeasurementQuantity {
+	RANAP_MeasurementQuantity_cpichEcNo	= 0,
+	RANAP_MeasurementQuantity_cpichRSCP	= 1,
+	RANAP_MeasurementQuantity_pathloss	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_MeasurementQuantity;
+
+/* RANAP_MeasurementQuantity */
+typedef long	 RANAP_MeasurementQuantity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MeasurementQuantity;
+asn_struct_free_f RANAP_MeasurementQuantity_free;
+asn_struct_print_f RANAP_MeasurementQuantity_print;
+asn_constr_check_f RANAP_MeasurementQuantity_constraint;
+ber_type_decoder_f RANAP_MeasurementQuantity_decode_ber;
+der_type_encoder_f RANAP_MeasurementQuantity_encode_der;
+xer_type_decoder_f RANAP_MeasurementQuantity_decode_xer;
+xer_type_encoder_f RANAP_MeasurementQuantity_encode_xer;
+per_type_decoder_f RANAP_MeasurementQuantity_decode_uper;
+per_type_encoder_f RANAP_MeasurementQuantity_encode_uper;
+per_type_decoder_f RANAP_MeasurementQuantity_decode_aper;
+per_type_encoder_f RANAP_MeasurementQuantity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MeasurementQuantity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MeasurementsToActivate.c b/src/ranap/RANAP_MeasurementsToActivate.c
new file mode 100644
index 0000000..7396470
--- /dev/null
+++ b/src/ranap/RANAP_MeasurementsToActivate.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MeasurementsToActivate.h"
+
+int
+RANAP_MeasurementsToActivate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_MeasurementsToActivate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_MeasurementsToActivate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementsToActivate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementsToActivate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementsToActivate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementsToActivate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementsToActivate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementsToActivate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_MeasurementsToActivate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_MeasurementsToActivate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_MeasurementsToActivate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_MeasurementsToActivate_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MeasurementsToActivate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MeasurementsToActivate = {
+	"RANAP_MeasurementsToActivate",
+	"RANAP_MeasurementsToActivate",
+	RANAP_MeasurementsToActivate_free,
+	RANAP_MeasurementsToActivate_print,
+	RANAP_MeasurementsToActivate_constraint,
+	RANAP_MeasurementsToActivate_decode_ber,
+	RANAP_MeasurementsToActivate_encode_der,
+	RANAP_MeasurementsToActivate_decode_xer,
+	RANAP_MeasurementsToActivate_encode_xer,
+	RANAP_MeasurementsToActivate_decode_uper,
+	RANAP_MeasurementsToActivate_encode_uper,
+	RANAP_MeasurementsToActivate_decode_aper,
+	RANAP_MeasurementsToActivate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MeasurementsToActivate_tags_1,
+	sizeof(asn_DEF_RANAP_MeasurementsToActivate_tags_1)
+		/sizeof(asn_DEF_RANAP_MeasurementsToActivate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MeasurementsToActivate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MeasurementsToActivate_tags_1)
+		/sizeof(asn_DEF_RANAP_MeasurementsToActivate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MeasurementsToActivate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_MeasurementsToActivate.h b/src/ranap/RANAP_MeasurementsToActivate.h
new file mode 100644
index 0000000..b0c3695
--- /dev/null
+++ b/src/ranap/RANAP_MeasurementsToActivate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MeasurementsToActivate_H_
+#define	_RANAP_MeasurementsToActivate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MeasurementsToActivate */
+typedef BIT_STRING_t	 RANAP_MeasurementsToActivate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MeasurementsToActivate;
+asn_struct_free_f RANAP_MeasurementsToActivate_free;
+asn_struct_print_f RANAP_MeasurementsToActivate_print;
+asn_constr_check_f RANAP_MeasurementsToActivate_constraint;
+ber_type_decoder_f RANAP_MeasurementsToActivate_decode_ber;
+der_type_encoder_f RANAP_MeasurementsToActivate_encode_der;
+xer_type_decoder_f RANAP_MeasurementsToActivate_decode_xer;
+xer_type_encoder_f RANAP_MeasurementsToActivate_encode_xer;
+per_type_decoder_f RANAP_MeasurementsToActivate_decode_uper;
+per_type_encoder_f RANAP_MeasurementsToActivate_encode_uper;
+per_type_decoder_f RANAP_MeasurementsToActivate_decode_aper;
+per_type_encoder_f RANAP_MeasurementsToActivate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MeasurementsToActivate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_MessageStructure.c b/src/ranap/RANAP_MessageStructure.c
new file mode 100644
index 0000000..e41b0da
--- /dev/null
+++ b/src/ranap/RANAP_MessageStructure.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_MessageStructure.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_MessageStructure_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, iE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProtocolIE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-ID"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, repetitionNumber),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RepetitionNumber1,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"repetitionNumber"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iE-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* repetitionNumber */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	3,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_MessageStructure_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_MessageStructure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_MessageStructure_specs_1 = {
+	sizeof(struct RANAP_MessageStructure),
+	offsetof(struct RANAP_MessageStructure, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_MessageStructure = {
+	"RANAP_MessageStructure",
+	"RANAP_MessageStructure",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_MessageStructure_tags_1,
+	sizeof(asn_DEF_RANAP_MessageStructure_tags_1)
+		/sizeof(asn_DEF_RANAP_MessageStructure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_MessageStructure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_MessageStructure_tags_1)
+		/sizeof(asn_DEF_RANAP_MessageStructure_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_MessageStructure_constr_1,
+	asn_MBR_RANAP_MessageStructure_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_MessageStructure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_MessageStructure.h b/src/ranap/RANAP_MessageStructure.h
new file mode 100644
index 0000000..d1f2829
--- /dev/null
+++ b/src/ranap/RANAP_MessageStructure.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_MessageStructure_H_
+#define	_RANAP_MessageStructure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_ProtocolIE-ID.h"
+#include "RANAP_RepetitionNumber1.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_MessageStructure */
+typedef struct RANAP_MessageStructure {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_ProtocolIE_ID_t	 iE_ID;
+		RANAP_RepetitionNumber1_t	*repetitionNumber	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_MessageStructure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_MessageStructure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_MessageStructure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NAS-PDU.c b/src/ranap/RANAP_NAS-PDU.c
new file mode 100644
index 0000000..7f03fce
--- /dev/null
+++ b/src/ranap/RANAP_NAS-PDU.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NAS-PDU.h"
+
+int
+RANAP_NAS_PDU_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NAS_PDU_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_NAS_PDU_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NAS_PDU_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_PDU_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NAS_PDU_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_PDU_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NAS_PDU_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_PDU_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NAS_PDU_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NAS_PDU_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NAS_PDU_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NAS_PDU_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_NAS_PDU_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NAS_PDU = {
+	"RANAP_NAS-PDU",
+	"RANAP_NAS-PDU",
+	RANAP_NAS_PDU_free,
+	RANAP_NAS_PDU_print,
+	RANAP_NAS_PDU_constraint,
+	RANAP_NAS_PDU_decode_ber,
+	RANAP_NAS_PDU_encode_der,
+	RANAP_NAS_PDU_decode_xer,
+	RANAP_NAS_PDU_encode_xer,
+	RANAP_NAS_PDU_decode_uper,
+	RANAP_NAS_PDU_encode_uper,
+	RANAP_NAS_PDU_decode_aper,
+	RANAP_NAS_PDU_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NAS_PDU_tags_1,
+	sizeof(asn_DEF_RANAP_NAS_PDU_tags_1)
+		/sizeof(asn_DEF_RANAP_NAS_PDU_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NAS_PDU_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NAS_PDU_tags_1)
+		/sizeof(asn_DEF_RANAP_NAS_PDU_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NAS-PDU.h b/src/ranap/RANAP_NAS-PDU.h
new file mode 100644
index 0000000..52a85ee
--- /dev/null
+++ b/src/ranap/RANAP_NAS-PDU.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NAS_PDU_H_
+#define	_RANAP_NAS_PDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NAS-PDU */
+typedef OCTET_STRING_t	 RANAP_NAS_PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NAS_PDU;
+asn_struct_free_f RANAP_NAS_PDU_free;
+asn_struct_print_f RANAP_NAS_PDU_print;
+asn_constr_check_f RANAP_NAS_PDU_constraint;
+ber_type_decoder_f RANAP_NAS_PDU_decode_ber;
+der_type_encoder_f RANAP_NAS_PDU_encode_der;
+xer_type_decoder_f RANAP_NAS_PDU_decode_xer;
+xer_type_encoder_f RANAP_NAS_PDU_encode_xer;
+per_type_decoder_f RANAP_NAS_PDU_decode_uper;
+per_type_encoder_f RANAP_NAS_PDU_encode_uper;
+per_type_decoder_f RANAP_NAS_PDU_decode_aper;
+per_type_encoder_f RANAP_NAS_PDU_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NAS_PDU_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NAS-SequenceNumber.c b/src/ranap/RANAP_NAS-SequenceNumber.c
new file mode 100644
index 0000000..2603154
--- /dev/null
+++ b/src/ranap/RANAP_NAS-SequenceNumber.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NAS-SequenceNumber.h"
+
+int
+RANAP_NAS_SequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_NAS_SequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NAS_SequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NAS_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_NAS_SequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NAS_SequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NAS_SequenceNumber = {
+	"RANAP_NAS-SequenceNumber",
+	"RANAP_NAS-SequenceNumber",
+	RANAP_NAS_SequenceNumber_free,
+	RANAP_NAS_SequenceNumber_print,
+	RANAP_NAS_SequenceNumber_constraint,
+	RANAP_NAS_SequenceNumber_decode_ber,
+	RANAP_NAS_SequenceNumber_encode_der,
+	RANAP_NAS_SequenceNumber_decode_xer,
+	RANAP_NAS_SequenceNumber_encode_xer,
+	RANAP_NAS_SequenceNumber_decode_uper,
+	RANAP_NAS_SequenceNumber_encode_uper,
+	RANAP_NAS_SequenceNumber_decode_aper,
+	RANAP_NAS_SequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NAS_SequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_NAS_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_NAS_SequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NAS_SequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NAS_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_NAS_SequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NAS_SequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NAS-SequenceNumber.h b/src/ranap/RANAP_NAS-SequenceNumber.h
new file mode 100644
index 0000000..a394e2d
--- /dev/null
+++ b/src/ranap/RANAP_NAS-SequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NAS_SequenceNumber_H_
+#define	_RANAP_NAS_SequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NAS-SequenceNumber */
+typedef BIT_STRING_t	 RANAP_NAS_SequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NAS_SequenceNumber;
+asn_struct_free_f RANAP_NAS_SequenceNumber_free;
+asn_struct_print_f RANAP_NAS_SequenceNumber_print;
+asn_constr_check_f RANAP_NAS_SequenceNumber_constraint;
+ber_type_decoder_f RANAP_NAS_SequenceNumber_decode_ber;
+der_type_encoder_f RANAP_NAS_SequenceNumber_encode_der;
+xer_type_decoder_f RANAP_NAS_SequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_NAS_SequenceNumber_encode_xer;
+per_type_decoder_f RANAP_NAS_SequenceNumber_decode_uper;
+per_type_encoder_f RANAP_NAS_SequenceNumber_encode_uper;
+per_type_decoder_f RANAP_NAS_SequenceNumber_decode_aper;
+per_type_encoder_f RANAP_NAS_SequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NAS_SequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NAS-SynchronisationIndicator.c b/src/ranap/RANAP_NAS-SynchronisationIndicator.c
new file mode 100644
index 0000000..16dcaed
--- /dev/null
+++ b/src/ranap/RANAP_NAS-SynchronisationIndicator.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NAS-SynchronisationIndicator.h"
+
+int
+RANAP_NAS_SynchronisationIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_NAS_SynchronisationIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NAS_SynchronisationIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SynchronisationIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SynchronisationIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SynchronisationIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SynchronisationIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SynchronisationIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SynchronisationIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NAS_SynchronisationIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NAS_SynchronisationIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NAS_SynchronisationIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_NAS_SynchronisationIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NAS_SynchronisationIndicator = {
+	"RANAP_NAS-SynchronisationIndicator",
+	"RANAP_NAS-SynchronisationIndicator",
+	RANAP_NAS_SynchronisationIndicator_free,
+	RANAP_NAS_SynchronisationIndicator_print,
+	RANAP_NAS_SynchronisationIndicator_constraint,
+	RANAP_NAS_SynchronisationIndicator_decode_ber,
+	RANAP_NAS_SynchronisationIndicator_encode_der,
+	RANAP_NAS_SynchronisationIndicator_decode_xer,
+	RANAP_NAS_SynchronisationIndicator_encode_xer,
+	RANAP_NAS_SynchronisationIndicator_decode_uper,
+	RANAP_NAS_SynchronisationIndicator_encode_uper,
+	RANAP_NAS_SynchronisationIndicator_decode_aper,
+	RANAP_NAS_SynchronisationIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_NAS_SynchronisationIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NAS_SynchronisationIndicator_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NAS-SynchronisationIndicator.h b/src/ranap/RANAP_NAS-SynchronisationIndicator.h
new file mode 100644
index 0000000..dcd8856
--- /dev/null
+++ b/src/ranap/RANAP_NAS-SynchronisationIndicator.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NAS_SynchronisationIndicator_H_
+#define	_RANAP_NAS_SynchronisationIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NAS-SynchronisationIndicator */
+typedef BIT_STRING_t	 RANAP_NAS_SynchronisationIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NAS_SynchronisationIndicator;
+asn_struct_free_f RANAP_NAS_SynchronisationIndicator_free;
+asn_struct_print_f RANAP_NAS_SynchronisationIndicator_print;
+asn_constr_check_f RANAP_NAS_SynchronisationIndicator_constraint;
+ber_type_decoder_f RANAP_NAS_SynchronisationIndicator_decode_ber;
+der_type_encoder_f RANAP_NAS_SynchronisationIndicator_encode_der;
+xer_type_decoder_f RANAP_NAS_SynchronisationIndicator_decode_xer;
+xer_type_encoder_f RANAP_NAS_SynchronisationIndicator_encode_xer;
+per_type_decoder_f RANAP_NAS_SynchronisationIndicator_decode_uper;
+per_type_encoder_f RANAP_NAS_SynchronisationIndicator_encode_uper;
+per_type_decoder_f RANAP_NAS_SynchronisationIndicator_decode_aper;
+per_type_encoder_f RANAP_NAS_SynchronisationIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NAS_SynchronisationIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NRTLoadInformationValue.c b/src/ranap/RANAP_NRTLoadInformationValue.c
new file mode 100644
index 0000000..2bfb0b4
--- /dev/null
+++ b/src/ranap/RANAP_NRTLoadInformationValue.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NRTLoadInformationValue.h"
+
+int
+RANAP_NRTLoadInformationValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 3l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_NRTLoadInformationValue_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NRTLoadInformationValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NRTLoadInformationValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NRTLoadInformationValue_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NRTLoadInformationValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NRTLoadInformationValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NRTLoadInformationValue_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NRTLoadInformationValue_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NRTLoadInformationValue_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NRTLoadInformationValue_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NRTLoadInformationValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_NRTLoadInformationValue_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  3l }	/* (0..3) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NRTLoadInformationValue_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NRTLoadInformationValue = {
+	"RANAP_NRTLoadInformationValue",
+	"RANAP_NRTLoadInformationValue",
+	RANAP_NRTLoadInformationValue_free,
+	RANAP_NRTLoadInformationValue_print,
+	RANAP_NRTLoadInformationValue_constraint,
+	RANAP_NRTLoadInformationValue_decode_ber,
+	RANAP_NRTLoadInformationValue_encode_der,
+	RANAP_NRTLoadInformationValue_decode_xer,
+	RANAP_NRTLoadInformationValue_encode_xer,
+	RANAP_NRTLoadInformationValue_decode_uper,
+	RANAP_NRTLoadInformationValue_encode_uper,
+	RANAP_NRTLoadInformationValue_decode_aper,
+	RANAP_NRTLoadInformationValue_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NRTLoadInformationValue_tags_1,
+	sizeof(asn_DEF_RANAP_NRTLoadInformationValue_tags_1)
+		/sizeof(asn_DEF_RANAP_NRTLoadInformationValue_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NRTLoadInformationValue_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NRTLoadInformationValue_tags_1)
+		/sizeof(asn_DEF_RANAP_NRTLoadInformationValue_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NRTLoadInformationValue_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NRTLoadInformationValue.h b/src/ranap/RANAP_NRTLoadInformationValue.h
new file mode 100644
index 0000000..33db0a0
--- /dev/null
+++ b/src/ranap/RANAP_NRTLoadInformationValue.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NRTLoadInformationValue_H_
+#define	_RANAP_NRTLoadInformationValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NRTLoadInformationValue */
+typedef long	 RANAP_NRTLoadInformationValue_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NRTLoadInformationValue;
+asn_struct_free_f RANAP_NRTLoadInformationValue_free;
+asn_struct_print_f RANAP_NRTLoadInformationValue_print;
+asn_constr_check_f RANAP_NRTLoadInformationValue_constraint;
+ber_type_decoder_f RANAP_NRTLoadInformationValue_decode_ber;
+der_type_encoder_f RANAP_NRTLoadInformationValue_encode_der;
+xer_type_decoder_f RANAP_NRTLoadInformationValue_decode_xer;
+xer_type_encoder_f RANAP_NRTLoadInformationValue_encode_xer;
+per_type_decoder_f RANAP_NRTLoadInformationValue_decode_uper;
+per_type_encoder_f RANAP_NRTLoadInformationValue_encode_uper;
+per_type_decoder_f RANAP_NRTLoadInformationValue_decode_aper;
+per_type_encoder_f RANAP_NRTLoadInformationValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NRTLoadInformationValue_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NewBSS-To-OldBSS-Information.c b/src/ranap/RANAP_NewBSS-To-OldBSS-Information.c
new file mode 100644
index 0000000..46d434e
--- /dev/null
+++ b/src/ranap/RANAP_NewBSS-To-OldBSS-Information.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NewBSS-To-OldBSS-Information.h"
+
+int
+RANAP_NewBSS_To_OldBSS_Information_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_NewBSS_To_OldBSS_Information_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NewBSS_To_OldBSS_Information_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NewBSS_To_OldBSS_Information_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NewBSS_To_OldBSS_Information_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NewBSS_To_OldBSS_Information_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NewBSS_To_OldBSS_Information_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NewBSS_To_OldBSS_Information_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NewBSS_To_OldBSS_Information_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NewBSS_To_OldBSS_Information_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NewBSS_To_OldBSS_Information_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NewBSS_To_OldBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NewBSS_To_OldBSS_Information = {
+	"RANAP_NewBSS-To-OldBSS-Information",
+	"RANAP_NewBSS-To-OldBSS-Information",
+	RANAP_NewBSS_To_OldBSS_Information_free,
+	RANAP_NewBSS_To_OldBSS_Information_print,
+	RANAP_NewBSS_To_OldBSS_Information_constraint,
+	RANAP_NewBSS_To_OldBSS_Information_decode_ber,
+	RANAP_NewBSS_To_OldBSS_Information_encode_der,
+	RANAP_NewBSS_To_OldBSS_Information_decode_xer,
+	RANAP_NewBSS_To_OldBSS_Information_encode_xer,
+	RANAP_NewBSS_To_OldBSS_Information_decode_uper,
+	RANAP_NewBSS_To_OldBSS_Information_encode_uper,
+	RANAP_NewBSS_To_OldBSS_Information_decode_aper,
+	RANAP_NewBSS_To_OldBSS_Information_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1,
+	sizeof(asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_NewBSS_To_OldBSS_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NewBSS-To-OldBSS-Information.h b/src/ranap/RANAP_NewBSS-To-OldBSS-Information.h
new file mode 100644
index 0000000..13317df
--- /dev/null
+++ b/src/ranap/RANAP_NewBSS-To-OldBSS-Information.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NewBSS_To_OldBSS_Information_H_
+#define	_RANAP_NewBSS_To_OldBSS_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NewBSS-To-OldBSS-Information */
+typedef OCTET_STRING_t	 RANAP_NewBSS_To_OldBSS_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NewBSS_To_OldBSS_Information;
+asn_struct_free_f RANAP_NewBSS_To_OldBSS_Information_free;
+asn_struct_print_f RANAP_NewBSS_To_OldBSS_Information_print;
+asn_constr_check_f RANAP_NewBSS_To_OldBSS_Information_constraint;
+ber_type_decoder_f RANAP_NewBSS_To_OldBSS_Information_decode_ber;
+der_type_encoder_f RANAP_NewBSS_To_OldBSS_Information_encode_der;
+xer_type_decoder_f RANAP_NewBSS_To_OldBSS_Information_decode_xer;
+xer_type_encoder_f RANAP_NewBSS_To_OldBSS_Information_encode_xer;
+per_type_decoder_f RANAP_NewBSS_To_OldBSS_Information_decode_uper;
+per_type_encoder_f RANAP_NewBSS_To_OldBSS_Information_encode_uper;
+per_type_decoder_f RANAP_NewBSS_To_OldBSS_Information_decode_aper;
+per_type_encoder_f RANAP_NewBSS_To_OldBSS_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NewBSS_To_OldBSS_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NewRAListofIdleModeUEs.c b/src/ranap/RANAP_NewRAListofIdleModeUEs.c
new file mode 100644
index 0000000..ff9ebed
--- /dev/null
+++ b/src/ranap/RANAP_NewRAListofIdleModeUEs.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NewRAListofIdleModeUEs.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_NewRAListofIdleModeUEs_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_NewRAListofIdleModeUEs_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_RAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_NewRAListofIdleModeUEs_specs_1 = {
+	sizeof(struct RANAP_NewRAListofIdleModeUEs),
+	offsetof(struct RANAP_NewRAListofIdleModeUEs, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NewRAListofIdleModeUEs = {
+	"RANAP_NewRAListofIdleModeUEs",
+	"RANAP_NewRAListofIdleModeUEs",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1,
+	sizeof(asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_NewRAListofIdleModeUEs_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NewRAListofIdleModeUEs_constr_1,
+	asn_MBR_RANAP_NewRAListofIdleModeUEs_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_NewRAListofIdleModeUEs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_NewRAListofIdleModeUEs.h b/src/ranap/RANAP_NewRAListofIdleModeUEs.h
new file mode 100644
index 0000000..8d1b527
--- /dev/null
+++ b/src/ranap/RANAP_NewRAListofIdleModeUEs.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NewRAListofIdleModeUEs_H_
+#define	_RANAP_NewRAListofIdleModeUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NewRAListofIdleModeUEs */
+typedef struct RANAP_NewRAListofIdleModeUEs {
+	A_SEQUENCE_OF(RANAP_RAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_NewRAListofIdleModeUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NewRAListofIdleModeUEs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NewRAListofIdleModeUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NonSearchingIndication.c b/src/ranap/RANAP_NonSearchingIndication.c
new file mode 100644
index 0000000..245a0e6
--- /dev/null
+++ b/src/ranap/RANAP_NonSearchingIndication.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NonSearchingIndication.h"
+
+int
+RANAP_NonSearchingIndication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_NonSearchingIndication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NonSearchingIndication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NonSearchingIndication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NonSearchingIndication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NonSearchingIndication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NonSearchingIndication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NonSearchingIndication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NonSearchingIndication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NonSearchingIndication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NonSearchingIndication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NonSearchingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_NonSearchingIndication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_NonSearchingIndication_value2enum_1[] = {
+	{ 0,	13,	"non-searching" },
+	{ 1,	9,	"searching" }
+};
+static const unsigned int asn_MAP_RANAP_NonSearchingIndication_enum2value_1[] = {
+	0,	/* non-searching(0) */
+	1	/* searching(1) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_NonSearchingIndication_specs_1 = {
+	asn_MAP_RANAP_NonSearchingIndication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_NonSearchingIndication_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NonSearchingIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NonSearchingIndication = {
+	"RANAP_NonSearchingIndication",
+	"RANAP_NonSearchingIndication",
+	RANAP_NonSearchingIndication_free,
+	RANAP_NonSearchingIndication_print,
+	RANAP_NonSearchingIndication_constraint,
+	RANAP_NonSearchingIndication_decode_ber,
+	RANAP_NonSearchingIndication_encode_der,
+	RANAP_NonSearchingIndication_decode_xer,
+	RANAP_NonSearchingIndication_encode_xer,
+	RANAP_NonSearchingIndication_decode_uper,
+	RANAP_NonSearchingIndication_encode_uper,
+	RANAP_NonSearchingIndication_decode_aper,
+	RANAP_NonSearchingIndication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NonSearchingIndication_tags_1,
+	sizeof(asn_DEF_RANAP_NonSearchingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_NonSearchingIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NonSearchingIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NonSearchingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_NonSearchingIndication_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NonSearchingIndication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_NonSearchingIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_NonSearchingIndication.h b/src/ranap/RANAP_NonSearchingIndication.h
new file mode 100644
index 0000000..ea8d8bd
--- /dev/null
+++ b/src/ranap/RANAP_NonSearchingIndication.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NonSearchingIndication_H_
+#define	_RANAP_NonSearchingIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_NonSearchingIndication {
+	RANAP_NonSearchingIndication_non_searching	= 0,
+	RANAP_NonSearchingIndication_searching	= 1
+} e_RANAP_NonSearchingIndication;
+
+/* RANAP_NonSearchingIndication */
+typedef long	 RANAP_NonSearchingIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NonSearchingIndication;
+asn_struct_free_f RANAP_NonSearchingIndication_free;
+asn_struct_print_f RANAP_NonSearchingIndication_print;
+asn_constr_check_f RANAP_NonSearchingIndication_constraint;
+ber_type_decoder_f RANAP_NonSearchingIndication_decode_ber;
+der_type_encoder_f RANAP_NonSearchingIndication_encode_der;
+xer_type_decoder_f RANAP_NonSearchingIndication_decode_xer;
+xer_type_encoder_f RANAP_NonSearchingIndication_encode_xer;
+per_type_decoder_f RANAP_NonSearchingIndication_decode_uper;
+per_type_encoder_f RANAP_NonSearchingIndication_encode_uper;
+per_type_decoder_f RANAP_NonSearchingIndication_decode_aper;
+per_type_encoder_f RANAP_NonSearchingIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NonSearchingIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NotEmptyRAListofIdleModeUEs.c b/src/ranap/RANAP_NotEmptyRAListofIdleModeUEs.c
new file mode 100644
index 0000000..72a4e11
--- /dev/null
+++ b/src/ranap/RANAP_NotEmptyRAListofIdleModeUEs.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NotEmptyRAListofIdleModeUEs.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_NotEmptyRAListofIdleModeUEs_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_NotEmptyRAListofIdleModeUEs, rAofIdleModeUEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAofIdleModeUEs,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAofIdleModeUEs"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_NotEmptyRAListofIdleModeUEs, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_NotEmptyRAListofIdleModeUEs_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_NotEmptyRAListofIdleModeUEs_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rAofIdleModeUEs */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_NotEmptyRAListofIdleModeUEs_specs_1 = {
+	sizeof(struct RANAP_NotEmptyRAListofIdleModeUEs),
+	offsetof(struct RANAP_NotEmptyRAListofIdleModeUEs, _asn_ctx),
+	asn_MAP_RANAP_NotEmptyRAListofIdleModeUEs_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_NotEmptyRAListofIdleModeUEs_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs = {
+	"RANAP_NotEmptyRAListofIdleModeUEs",
+	"RANAP_NotEmptyRAListofIdleModeUEs",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1,
+	sizeof(asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_NotEmptyRAListofIdleModeUEs_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_NotEmptyRAListofIdleModeUEs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_NotEmptyRAListofIdleModeUEs.h b/src/ranap/RANAP_NotEmptyRAListofIdleModeUEs.h
new file mode 100644
index 0000000..2561166
--- /dev/null
+++ b/src/ranap/RANAP_NotEmptyRAListofIdleModeUEs.h
@@ -0,0 +1,39 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NotEmptyRAListofIdleModeUEs_H_
+#define	_RANAP_NotEmptyRAListofIdleModeUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAofIdleModeUEs.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NotEmptyRAListofIdleModeUEs */
+typedef struct RANAP_NotEmptyRAListofIdleModeUEs {
+	RANAP_RAofIdleModeUEs_t	 rAofIdleModeUEs;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_NotEmptyRAListofIdleModeUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NotEmptyRAListofIdleModeUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NumberOfIuInstances.c b/src/ranap/RANAP_NumberOfIuInstances.c
new file mode 100644
index 0000000..3ce7ae0
--- /dev/null
+++ b/src/ranap/RANAP_NumberOfIuInstances.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NumberOfIuInstances.h"
+
+int
+RANAP_NumberOfIuInstances_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_NumberOfIuInstances_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NumberOfIuInstances_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfIuInstances_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfIuInstances_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfIuInstances_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfIuInstances_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfIuInstances_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfIuInstances_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfIuInstances_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfIuInstances_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NumberOfIuInstances_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_NumberOfIuInstances_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (1..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NumberOfIuInstances_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NumberOfIuInstances = {
+	"RANAP_NumberOfIuInstances",
+	"RANAP_NumberOfIuInstances",
+	RANAP_NumberOfIuInstances_free,
+	RANAP_NumberOfIuInstances_print,
+	RANAP_NumberOfIuInstances_constraint,
+	RANAP_NumberOfIuInstances_decode_ber,
+	RANAP_NumberOfIuInstances_encode_der,
+	RANAP_NumberOfIuInstances_decode_xer,
+	RANAP_NumberOfIuInstances_encode_xer,
+	RANAP_NumberOfIuInstances_decode_uper,
+	RANAP_NumberOfIuInstances_encode_uper,
+	RANAP_NumberOfIuInstances_decode_aper,
+	RANAP_NumberOfIuInstances_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NumberOfIuInstances_tags_1,
+	sizeof(asn_DEF_RANAP_NumberOfIuInstances_tags_1)
+		/sizeof(asn_DEF_RANAP_NumberOfIuInstances_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NumberOfIuInstances_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NumberOfIuInstances_tags_1)
+		/sizeof(asn_DEF_RANAP_NumberOfIuInstances_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NumberOfIuInstances_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NumberOfIuInstances.h b/src/ranap/RANAP_NumberOfIuInstances.h
new file mode 100644
index 0000000..c6c0ea3
--- /dev/null
+++ b/src/ranap/RANAP_NumberOfIuInstances.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NumberOfIuInstances_H_
+#define	_RANAP_NumberOfIuInstances_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NumberOfIuInstances */
+typedef long	 RANAP_NumberOfIuInstances_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NumberOfIuInstances;
+asn_struct_free_f RANAP_NumberOfIuInstances_free;
+asn_struct_print_f RANAP_NumberOfIuInstances_print;
+asn_constr_check_f RANAP_NumberOfIuInstances_constraint;
+ber_type_decoder_f RANAP_NumberOfIuInstances_decode_ber;
+der_type_encoder_f RANAP_NumberOfIuInstances_encode_der;
+xer_type_decoder_f RANAP_NumberOfIuInstances_decode_xer;
+xer_type_encoder_f RANAP_NumberOfIuInstances_encode_xer;
+per_type_decoder_f RANAP_NumberOfIuInstances_decode_uper;
+per_type_encoder_f RANAP_NumberOfIuInstances_encode_uper;
+per_type_decoder_f RANAP_NumberOfIuInstances_decode_aper;
+per_type_encoder_f RANAP_NumberOfIuInstances_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NumberOfIuInstances_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_NumberOfSteps.c b/src/ranap/RANAP_NumberOfSteps.c
new file mode 100644
index 0000000..cf67f2a
--- /dev/null
+++ b/src/ranap/RANAP_NumberOfSteps.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_NumberOfSteps.h"
+
+int
+RANAP_NumberOfSteps_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 16l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_NumberOfSteps_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_NumberOfSteps_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfSteps_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfSteps_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfSteps_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfSteps_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfSteps_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfSteps_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_NumberOfSteps_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_NumberOfSteps_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_NumberOfSteps_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_NumberOfSteps_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (1..16) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_NumberOfSteps_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_NumberOfSteps = {
+	"RANAP_NumberOfSteps",
+	"RANAP_NumberOfSteps",
+	RANAP_NumberOfSteps_free,
+	RANAP_NumberOfSteps_print,
+	RANAP_NumberOfSteps_constraint,
+	RANAP_NumberOfSteps_decode_ber,
+	RANAP_NumberOfSteps_encode_der,
+	RANAP_NumberOfSteps_decode_xer,
+	RANAP_NumberOfSteps_encode_xer,
+	RANAP_NumberOfSteps_decode_uper,
+	RANAP_NumberOfSteps_encode_uper,
+	RANAP_NumberOfSteps_decode_aper,
+	RANAP_NumberOfSteps_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_NumberOfSteps_tags_1,
+	sizeof(asn_DEF_RANAP_NumberOfSteps_tags_1)
+		/sizeof(asn_DEF_RANAP_NumberOfSteps_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_NumberOfSteps_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_NumberOfSteps_tags_1)
+		/sizeof(asn_DEF_RANAP_NumberOfSteps_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_NumberOfSteps_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_NumberOfSteps.h b/src/ranap/RANAP_NumberOfSteps.h
new file mode 100644
index 0000000..5509f49
--- /dev/null
+++ b/src/ranap/RANAP_NumberOfSteps.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_NumberOfSteps_H_
+#define	_RANAP_NumberOfSteps_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_NumberOfSteps */
+typedef long	 RANAP_NumberOfSteps_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_NumberOfSteps;
+asn_struct_free_f RANAP_NumberOfSteps_free;
+asn_struct_print_f RANAP_NumberOfSteps_print;
+asn_constr_check_f RANAP_NumberOfSteps_constraint;
+ber_type_decoder_f RANAP_NumberOfSteps_decode_ber;
+der_type_encoder_f RANAP_NumberOfSteps_encode_der;
+xer_type_decoder_f RANAP_NumberOfSteps_decode_xer;
+xer_type_encoder_f RANAP_NumberOfSteps_encode_xer;
+per_type_decoder_f RANAP_NumberOfSteps_decode_uper;
+per_type_encoder_f RANAP_NumberOfSteps_encode_uper;
+per_type_decoder_f RANAP_NumberOfSteps_decode_aper;
+per_type_encoder_f RANAP_NumberOfSteps_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_NumberOfSteps_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_OMC-ID.c b/src/ranap/RANAP_OMC-ID.c
new file mode 100644
index 0000000..23a2a44
--- /dev/null
+++ b/src/ranap/RANAP_OMC-ID.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_OMC-ID.h"
+
+int
+RANAP_OMC_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 3l && size <= 22l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_OMC_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_OMC_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_OMC_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_OMC_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_OMC_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_OMC_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_OMC_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_OMC_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_OMC_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_OMC_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_OMC_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_OMC_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_OMC_ID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  3l,  22l }	/* (SIZE(3..22)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_OMC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_OMC_ID = {
+	"RANAP_OMC-ID",
+	"RANAP_OMC-ID",
+	RANAP_OMC_ID_free,
+	RANAP_OMC_ID_print,
+	RANAP_OMC_ID_constraint,
+	RANAP_OMC_ID_decode_ber,
+	RANAP_OMC_ID_encode_der,
+	RANAP_OMC_ID_decode_xer,
+	RANAP_OMC_ID_encode_xer,
+	RANAP_OMC_ID_decode_uper,
+	RANAP_OMC_ID_encode_uper,
+	RANAP_OMC_ID_decode_aper,
+	RANAP_OMC_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_OMC_ID_tags_1,
+	sizeof(asn_DEF_RANAP_OMC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_OMC_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_OMC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_OMC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_OMC_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_OMC_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_OMC-ID.h b/src/ranap/RANAP_OMC-ID.h
new file mode 100644
index 0000000..042875a
--- /dev/null
+++ b/src/ranap/RANAP_OMC-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_OMC_ID_H_
+#define	_RANAP_OMC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_OMC-ID */
+typedef OCTET_STRING_t	 RANAP_OMC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_OMC_ID;
+asn_struct_free_f RANAP_OMC_ID_free;
+asn_struct_print_f RANAP_OMC_ID_print;
+asn_constr_check_f RANAP_OMC_ID_constraint;
+ber_type_decoder_f RANAP_OMC_ID_decode_ber;
+der_type_encoder_f RANAP_OMC_ID_encode_der;
+xer_type_decoder_f RANAP_OMC_ID_decode_xer;
+xer_type_encoder_f RANAP_OMC_ID_encode_xer;
+per_type_decoder_f RANAP_OMC_ID_decode_uper;
+per_type_encoder_f RANAP_OMC_ID_encode_uper;
+per_type_decoder_f RANAP_OMC_ID_decode_aper;
+per_type_encoder_f RANAP_OMC_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_OMC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Offload-RAB-Parameters-APN.c b/src/ranap/RANAP_Offload-RAB-Parameters-APN.c
new file mode 100644
index 0000000..3d8c38a
--- /dev/null
+++ b/src/ranap/RANAP_Offload-RAB-Parameters-APN.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Offload-RAB-Parameters-APN.h"
+
+int
+RANAP_Offload_RAB_Parameters_APN_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 1l && size <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_Offload_RAB_Parameters_APN_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Offload_RAB_Parameters_APN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_APN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_APN_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_APN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_APN_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_APN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_APN_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_APN_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_APN_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Offload_RAB_Parameters_APN_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Offload_RAB_Parameters_APN_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  255l }	/* (SIZE(1..255)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Offload_RAB_Parameters_APN = {
+	"RANAP_Offload-RAB-Parameters-APN",
+	"RANAP_Offload-RAB-Parameters-APN",
+	RANAP_Offload_RAB_Parameters_APN_free,
+	RANAP_Offload_RAB_Parameters_APN_print,
+	RANAP_Offload_RAB_Parameters_APN_constraint,
+	RANAP_Offload_RAB_Parameters_APN_decode_ber,
+	RANAP_Offload_RAB_Parameters_APN_encode_der,
+	RANAP_Offload_RAB_Parameters_APN_decode_xer,
+	RANAP_Offload_RAB_Parameters_APN_encode_xer,
+	RANAP_Offload_RAB_Parameters_APN_decode_uper,
+	RANAP_Offload_RAB_Parameters_APN_encode_uper,
+	RANAP_Offload_RAB_Parameters_APN_decode_aper,
+	RANAP_Offload_RAB_Parameters_APN_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1,
+	sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1)
+		/sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1)
+		/sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_APN_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Offload_RAB_Parameters_APN_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Offload-RAB-Parameters-APN.h b/src/ranap/RANAP_Offload-RAB-Parameters-APN.h
new file mode 100644
index 0000000..ba1bb02
--- /dev/null
+++ b/src/ranap/RANAP_Offload-RAB-Parameters-APN.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Offload_RAB_Parameters_APN_H_
+#define	_RANAP_Offload_RAB_Parameters_APN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Offload-RAB-Parameters-APN */
+typedef OCTET_STRING_t	 RANAP_Offload_RAB_Parameters_APN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Offload_RAB_Parameters_APN;
+asn_struct_free_f RANAP_Offload_RAB_Parameters_APN_free;
+asn_struct_print_f RANAP_Offload_RAB_Parameters_APN_print;
+asn_constr_check_f RANAP_Offload_RAB_Parameters_APN_constraint;
+ber_type_decoder_f RANAP_Offload_RAB_Parameters_APN_decode_ber;
+der_type_encoder_f RANAP_Offload_RAB_Parameters_APN_encode_der;
+xer_type_decoder_f RANAP_Offload_RAB_Parameters_APN_decode_xer;
+xer_type_encoder_f RANAP_Offload_RAB_Parameters_APN_encode_xer;
+per_type_decoder_f RANAP_Offload_RAB_Parameters_APN_decode_uper;
+per_type_encoder_f RANAP_Offload_RAB_Parameters_APN_encode_uper;
+per_type_decoder_f RANAP_Offload_RAB_Parameters_APN_decode_aper;
+per_type_encoder_f RANAP_Offload_RAB_Parameters_APN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Offload_RAB_Parameters_APN_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Offload-RAB-Parameters-ChargingCharacteristics.c b/src/ranap/RANAP_Offload-RAB-Parameters-ChargingCharacteristics.c
new file mode 100644
index 0000000..d7d3213
--- /dev/null
+++ b/src/ranap/RANAP_Offload-RAB-Parameters-ChargingCharacteristics.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Offload-RAB-Parameters-ChargingCharacteristics.h"
+
+int
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics = {
+	"RANAP_Offload-RAB-Parameters-ChargingCharacteristics",
+	"RANAP_Offload-RAB-Parameters-ChargingCharacteristics",
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_free,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_print,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_constraint,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_ber,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_der,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_xer,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_xer,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_uper,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_uper,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_aper,
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1,
+	sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1)
+		/sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1)
+		/sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Offload-RAB-Parameters-ChargingCharacteristics.h b/src/ranap/RANAP_Offload-RAB-Parameters-ChargingCharacteristics.h
new file mode 100644
index 0000000..90a89ff
--- /dev/null
+++ b/src/ranap/RANAP_Offload-RAB-Parameters-ChargingCharacteristics.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_H_
+#define	_RANAP_Offload_RAB_Parameters_ChargingCharacteristics_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Offload-RAB-Parameters-ChargingCharacteristics */
+typedef OCTET_STRING_t	 RANAP_Offload_RAB_Parameters_ChargingCharacteristics_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics;
+asn_struct_free_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_free;
+asn_struct_print_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_print;
+asn_constr_check_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_constraint;
+ber_type_decoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_ber;
+der_type_encoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_der;
+xer_type_decoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_xer;
+xer_type_encoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_xer;
+per_type_decoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_uper;
+per_type_encoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_uper;
+per_type_decoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_decode_aper;
+per_type_encoder_f RANAP_Offload_RAB_Parameters_ChargingCharacteristics_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Offload_RAB_Parameters_ChargingCharacteristics_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Offload-RAB-Parameters.c b/src/ranap/RANAP_Offload-RAB-Parameters.c
new file mode 100644
index 0000000..f4c0fab
--- /dev/null
+++ b/src/ranap/RANAP_Offload-RAB-Parameters.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Offload-RAB-Parameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Offload_RAB_Parameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Offload_RAB_Parameters, accessPointName),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Offload_RAB_Parameters_APN,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"accessPointName"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Offload_RAB_Parameters, chargingCharacteristics),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Offload_RAB_Parameters_ChargingCharacteristics,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"chargingCharacteristics"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Offload_RAB_Parameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Offload_RAB_Parameters_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Offload_RAB_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Offload_RAB_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* accessPointName */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* chargingCharacteristics */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Offload_RAB_Parameters_specs_1 = {
+	sizeof(struct RANAP_Offload_RAB_Parameters),
+	offsetof(struct RANAP_Offload_RAB_Parameters, _asn_ctx),
+	asn_MAP_RANAP_Offload_RAB_Parameters_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_Offload_RAB_Parameters_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Offload_RAB_Parameters = {
+	"RANAP_Offload-RAB-Parameters",
+	"RANAP_Offload-RAB-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Offload_RAB_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Offload_RAB_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_Offload_RAB_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Offload_RAB_Parameters_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Offload_RAB_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Offload-RAB-Parameters.h b/src/ranap/RANAP_Offload-RAB-Parameters.h
new file mode 100644
index 0000000..26c528f
--- /dev/null
+++ b/src/ranap/RANAP_Offload-RAB-Parameters.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Offload_RAB_Parameters_H_
+#define	_RANAP_Offload_RAB_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Offload-RAB-Parameters-APN.h"
+#include "RANAP_Offload-RAB-Parameters-ChargingCharacteristics.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Offload-RAB-Parameters */
+typedef struct RANAP_Offload_RAB_Parameters {
+	RANAP_Offload_RAB_Parameters_APN_t	 accessPointName;
+	RANAP_Offload_RAB_Parameters_ChargingCharacteristics_t	 chargingCharacteristics;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Offload_RAB_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Offload_RAB_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Offload_RAB_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_OldBSS-ToNewBSS-Information.c b/src/ranap/RANAP_OldBSS-ToNewBSS-Information.c
new file mode 100644
index 0000000..11098f8
--- /dev/null
+++ b/src/ranap/RANAP_OldBSS-ToNewBSS-Information.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_OldBSS-ToNewBSS-Information.h"
+
+int
+RANAP_OldBSS_ToNewBSS_Information_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_OldBSS_ToNewBSS_Information_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_OldBSS_ToNewBSS_Information_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_OldBSS_ToNewBSS_Information_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_OldBSS_ToNewBSS_Information_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_OldBSS_ToNewBSS_Information_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_OldBSS_ToNewBSS_Information_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_OldBSS_ToNewBSS_Information_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_OldBSS_ToNewBSS_Information_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_OldBSS_ToNewBSS_Information_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_OldBSS_ToNewBSS_Information_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_OldBSS_ToNewBSS_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_OldBSS_ToNewBSS_Information = {
+	"RANAP_OldBSS-ToNewBSS-Information",
+	"RANAP_OldBSS-ToNewBSS-Information",
+	RANAP_OldBSS_ToNewBSS_Information_free,
+	RANAP_OldBSS_ToNewBSS_Information_print,
+	RANAP_OldBSS_ToNewBSS_Information_constraint,
+	RANAP_OldBSS_ToNewBSS_Information_decode_ber,
+	RANAP_OldBSS_ToNewBSS_Information_encode_der,
+	RANAP_OldBSS_ToNewBSS_Information_decode_xer,
+	RANAP_OldBSS_ToNewBSS_Information_encode_xer,
+	RANAP_OldBSS_ToNewBSS_Information_decode_uper,
+	RANAP_OldBSS_ToNewBSS_Information_encode_uper,
+	RANAP_OldBSS_ToNewBSS_Information_decode_aper,
+	RANAP_OldBSS_ToNewBSS_Information_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1,
+	sizeof(asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_OldBSS_ToNewBSS_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_OldBSS-ToNewBSS-Information.h b/src/ranap/RANAP_OldBSS-ToNewBSS-Information.h
new file mode 100644
index 0000000..f44e01c
--- /dev/null
+++ b/src/ranap/RANAP_OldBSS-ToNewBSS-Information.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_OldBSS_ToNewBSS_Information_H_
+#define	_RANAP_OldBSS_ToNewBSS_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_OldBSS-ToNewBSS-Information */
+typedef OCTET_STRING_t	 RANAP_OldBSS_ToNewBSS_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_OldBSS_ToNewBSS_Information;
+asn_struct_free_f RANAP_OldBSS_ToNewBSS_Information_free;
+asn_struct_print_f RANAP_OldBSS_ToNewBSS_Information_print;
+asn_constr_check_f RANAP_OldBSS_ToNewBSS_Information_constraint;
+ber_type_decoder_f RANAP_OldBSS_ToNewBSS_Information_decode_ber;
+der_type_encoder_f RANAP_OldBSS_ToNewBSS_Information_encode_der;
+xer_type_decoder_f RANAP_OldBSS_ToNewBSS_Information_decode_xer;
+xer_type_encoder_f RANAP_OldBSS_ToNewBSS_Information_encode_xer;
+per_type_decoder_f RANAP_OldBSS_ToNewBSS_Information_decode_uper;
+per_type_encoder_f RANAP_OldBSS_ToNewBSS_Information_encode_uper;
+per_type_decoder_f RANAP_OldBSS_ToNewBSS_Information_decode_aper;
+per_type_encoder_f RANAP_OldBSS_ToNewBSS_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_OldBSS_ToNewBSS_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Out-Of-UTRAN.c b/src/ranap/RANAP_Out-Of-UTRAN.c
new file mode 100644
index 0000000..617fef9
--- /dev/null
+++ b/src/ranap/RANAP_Out-Of-UTRAN.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Out-Of-UTRAN.h"
+
+int
+RANAP_Out_Of_UTRAN_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Out_Of_UTRAN_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Out_Of_UTRAN_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Out_Of_UTRAN_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Out_Of_UTRAN_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Out_Of_UTRAN_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Out_Of_UTRAN_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Out_Of_UTRAN_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Out_Of_UTRAN_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Out_Of_UTRAN_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Out_Of_UTRAN_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Out_Of_UTRAN_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Out_Of_UTRAN_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Out_Of_UTRAN_value2enum_1[] = {
+	{ 0,	26,	"cell-reselection-to-EUTRAN" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Out_Of_UTRAN_enum2value_1[] = {
+	0	/* cell-reselection-to-EUTRAN(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Out_Of_UTRAN_specs_1 = {
+	asn_MAP_RANAP_Out_Of_UTRAN_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Out_Of_UTRAN_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Out_Of_UTRAN_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Out_Of_UTRAN = {
+	"RANAP_Out-Of-UTRAN",
+	"RANAP_Out-Of-UTRAN",
+	RANAP_Out_Of_UTRAN_free,
+	RANAP_Out_Of_UTRAN_print,
+	RANAP_Out_Of_UTRAN_constraint,
+	RANAP_Out_Of_UTRAN_decode_ber,
+	RANAP_Out_Of_UTRAN_encode_der,
+	RANAP_Out_Of_UTRAN_decode_xer,
+	RANAP_Out_Of_UTRAN_encode_xer,
+	RANAP_Out_Of_UTRAN_decode_uper,
+	RANAP_Out_Of_UTRAN_encode_uper,
+	RANAP_Out_Of_UTRAN_decode_aper,
+	RANAP_Out_Of_UTRAN_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Out_Of_UTRAN_tags_1,
+	sizeof(asn_DEF_RANAP_Out_Of_UTRAN_tags_1)
+		/sizeof(asn_DEF_RANAP_Out_Of_UTRAN_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Out_Of_UTRAN_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Out_Of_UTRAN_tags_1)
+		/sizeof(asn_DEF_RANAP_Out_Of_UTRAN_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Out_Of_UTRAN_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Out_Of_UTRAN_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Out-Of-UTRAN.h b/src/ranap/RANAP_Out-Of-UTRAN.h
new file mode 100644
index 0000000..fefb72d
--- /dev/null
+++ b/src/ranap/RANAP_Out-Of-UTRAN.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Out_Of_UTRAN_H_
+#define	_RANAP_Out_Of_UTRAN_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Out_Of_UTRAN {
+	RANAP_Out_Of_UTRAN_cell_reselection_to_EUTRAN	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Out_Of_UTRAN;
+
+/* RANAP_Out-Of-UTRAN */
+typedef long	 RANAP_Out_Of_UTRAN_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Out_Of_UTRAN;
+asn_struct_free_f RANAP_Out_Of_UTRAN_free;
+asn_struct_print_f RANAP_Out_Of_UTRAN_print;
+asn_constr_check_f RANAP_Out_Of_UTRAN_constraint;
+ber_type_decoder_f RANAP_Out_Of_UTRAN_decode_ber;
+der_type_encoder_f RANAP_Out_Of_UTRAN_encode_der;
+xer_type_decoder_f RANAP_Out_Of_UTRAN_decode_xer;
+xer_type_encoder_f RANAP_Out_Of_UTRAN_encode_xer;
+per_type_decoder_f RANAP_Out_Of_UTRAN_decode_uper;
+per_type_encoder_f RANAP_Out_Of_UTRAN_encode_uper;
+per_type_decoder_f RANAP_Out_Of_UTRAN_decode_aper;
+per_type_encoder_f RANAP_Out_Of_UTRAN_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Out_Of_UTRAN_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Outcome.c b/src/ranap/RANAP_Outcome.c
new file mode 100644
index 0000000..578fa6a
--- /dev/null
+++ b/src/ranap/RANAP_Outcome.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Outcome.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Outcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Outcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Outcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Outcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Outcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Outcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Outcome_specs_1 = {
+	sizeof(struct RANAP_Outcome),
+	offsetof(struct RANAP_Outcome, _asn_ctx),
+	asn_MAP_RANAP_Outcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Outcome = {
+	"RANAP_Outcome",
+	"RANAP_Outcome",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Outcome_tags_1,
+	sizeof(asn_DEF_RANAP_Outcome_tags_1)
+		/sizeof(asn_DEF_RANAP_Outcome_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Outcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Outcome_tags_1)
+		/sizeof(asn_DEF_RANAP_Outcome_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Outcome_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Outcome_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Outcome.h b/src/ranap/RANAP_Outcome.h
new file mode 100644
index 0000000..1c757e0
--- /dev/null
+++ b/src/ranap/RANAP_Outcome.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Outcome_H_
+#define	_RANAP_Outcome_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ProcedureCode.h"
+#include "RANAP_Criticality.h"
+#include <ANY.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Outcome */
+typedef struct RANAP_Outcome {
+	RANAP_ProcedureCode_t	 procedureCode;
+	RANAP_Criticality_t	 criticality;
+	ANY_t	 value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Outcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Outcome;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Outcome_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Overload.c b/src/ranap/RANAP_Overload.c
new file mode 100644
index 0000000..2313ee6
--- /dev/null
+++ b/src/ranap/RANAP_Overload.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Overload.h"
+
+static int
+memb_overload_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_overload_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_overload_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_overload_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_overload_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_overload_ies_specs_2 = {
+	sizeof(struct overload_ies),
+	offsetof(struct overload_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_overload_ies_2 = {
+	"overload-ies",
+	"overload-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_overload_ies_tags_2,
+	sizeof(asn_DEF_overload_ies_tags_2)
+		/sizeof(asn_DEF_overload_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_overload_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_overload_ies_tags_2)
+		/sizeof(asn_DEF_overload_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_overload_ies_constr_2,
+	asn_MBR_overload_ies_2,
+	1,	/* Single element */
+	&asn_SPC_overload_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_Overload_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Overload, overload_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_overload_ies_2,
+		memb_overload_ies_constraint_1,
+		&asn_PER_memb_overload_ies_constr_2,
+		0,
+		"overload-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Overload_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Overload_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* overload-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Overload_specs_1 = {
+	sizeof(struct RANAP_Overload),
+	offsetof(struct RANAP_Overload, _asn_ctx),
+	asn_MAP_RANAP_Overload_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Overload = {
+	"RANAP_Overload",
+	"RANAP_Overload",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Overload_tags_1,
+	sizeof(asn_DEF_RANAP_Overload_tags_1)
+		/sizeof(asn_DEF_RANAP_Overload_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Overload_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Overload_tags_1)
+		/sizeof(asn_DEF_RANAP_Overload_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Overload_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Overload_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Overload.h b/src/ranap/RANAP_Overload.h
new file mode 100644
index 0000000..856e3ec
--- /dev/null
+++ b/src/ranap/RANAP_Overload.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Overload_H_
+#define	_RANAP_Overload_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Overload */
+typedef struct RANAP_Overload {
+	struct overload_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} overload_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Overload_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Overload;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Overload_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_P-TMSI.c b/src/ranap/RANAP_P-TMSI.c
new file mode 100644
index 0000000..ea56cbd
--- /dev/null
+++ b/src/ranap/RANAP_P-TMSI.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_P-TMSI.h"
+
+int
+RANAP_P_TMSI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_P_TMSI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_P_TMSI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_P_TMSI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_P_TMSI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_P_TMSI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_P_TMSI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_P_TMSI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_P_TMSI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_P_TMSI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_P_TMSI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_P_TMSI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_P_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_P_TMSI_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_P_TMSI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_P_TMSI = {
+	"RANAP_P-TMSI",
+	"RANAP_P-TMSI",
+	RANAP_P_TMSI_free,
+	RANAP_P_TMSI_print,
+	RANAP_P_TMSI_constraint,
+	RANAP_P_TMSI_decode_ber,
+	RANAP_P_TMSI_encode_der,
+	RANAP_P_TMSI_decode_xer,
+	RANAP_P_TMSI_encode_xer,
+	RANAP_P_TMSI_decode_uper,
+	RANAP_P_TMSI_encode_uper,
+	RANAP_P_TMSI_decode_aper,
+	RANAP_P_TMSI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_P_TMSI_tags_1,
+	sizeof(asn_DEF_RANAP_P_TMSI_tags_1)
+		/sizeof(asn_DEF_RANAP_P_TMSI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_P_TMSI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_P_TMSI_tags_1)
+		/sizeof(asn_DEF_RANAP_P_TMSI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_P_TMSI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_P-TMSI.h b/src/ranap/RANAP_P-TMSI.h
new file mode 100644
index 0000000..800a4e2
--- /dev/null
+++ b/src/ranap/RANAP_P-TMSI.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_P_TMSI_H_
+#define	_RANAP_P_TMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_P-TMSI */
+typedef OCTET_STRING_t	 RANAP_P_TMSI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_P_TMSI;
+asn_struct_free_f RANAP_P_TMSI_free;
+asn_struct_print_f RANAP_P_TMSI_print;
+asn_constr_check_f RANAP_P_TMSI_constraint;
+ber_type_decoder_f RANAP_P_TMSI_decode_ber;
+der_type_encoder_f RANAP_P_TMSI_encode_der;
+xer_type_decoder_f RANAP_P_TMSI_decode_xer;
+xer_type_encoder_f RANAP_P_TMSI_encode_xer;
+per_type_decoder_f RANAP_P_TMSI_decode_uper;
+per_type_encoder_f RANAP_P_TMSI_encode_uper;
+per_type_decoder_f RANAP_P_TMSI_decode_aper;
+per_type_encoder_f RANAP_P_TMSI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_P_TMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PDP-Type-extension.c b/src/ranap/RANAP_PDP-Type-extension.c
new file mode 100644
index 0000000..81e775e
--- /dev/null
+++ b/src/ranap/RANAP_PDP-Type-extension.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PDP-Type-extension.h"
+
+int
+RANAP_PDP_Type_extension_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_PDP_Type_extension_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PDP_Type_extension_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_extension_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_extension_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_extension_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_extension_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_extension_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_extension_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_extension_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_extension_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PDP_Type_extension_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PDP_Type_extension_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_PDP_Type_extension_value2enum_1[] = {
+	{ 0,	13,	"ipv4-and-ipv6" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_PDP_Type_extension_enum2value_1[] = {
+	0	/* ipv4-and-ipv6(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_PDP_Type_extension_specs_1 = {
+	asn_MAP_RANAP_PDP_Type_extension_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_PDP_Type_extension_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PDP_Type_extension_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_Type_extension = {
+	"RANAP_PDP-Type-extension",
+	"RANAP_PDP-Type-extension",
+	RANAP_PDP_Type_extension_free,
+	RANAP_PDP_Type_extension_print,
+	RANAP_PDP_Type_extension_constraint,
+	RANAP_PDP_Type_extension_decode_ber,
+	RANAP_PDP_Type_extension_encode_der,
+	RANAP_PDP_Type_extension_decode_xer,
+	RANAP_PDP_Type_extension_encode_xer,
+	RANAP_PDP_Type_extension_decode_uper,
+	RANAP_PDP_Type_extension_encode_uper,
+	RANAP_PDP_Type_extension_decode_aper,
+	RANAP_PDP_Type_extension_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PDP_Type_extension_tags_1,
+	sizeof(asn_DEF_RANAP_PDP_Type_extension_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_Type_extension_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PDP_Type_extension_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PDP_Type_extension_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_Type_extension_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PDP_Type_extension_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_PDP_Type_extension_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PDP-Type-extension.h b/src/ranap/RANAP_PDP-Type-extension.h
new file mode 100644
index 0000000..7f13a18
--- /dev/null
+++ b/src/ranap/RANAP_PDP-Type-extension.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PDP_Type_extension_H_
+#define	_RANAP_PDP_Type_extension_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PDP_Type_extension {
+	RANAP_PDP_Type_extension_ipv4_and_ipv6	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_PDP_Type_extension;
+
+/* RANAP_PDP-Type-extension */
+typedef long	 RANAP_PDP_Type_extension_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_Type_extension;
+asn_struct_free_f RANAP_PDP_Type_extension_free;
+asn_struct_print_f RANAP_PDP_Type_extension_print;
+asn_constr_check_f RANAP_PDP_Type_extension_constraint;
+ber_type_decoder_f RANAP_PDP_Type_extension_decode_ber;
+der_type_encoder_f RANAP_PDP_Type_extension_encode_der;
+xer_type_decoder_f RANAP_PDP_Type_extension_decode_xer;
+xer_type_encoder_f RANAP_PDP_Type_extension_encode_xer;
+per_type_decoder_f RANAP_PDP_Type_extension_decode_uper;
+per_type_encoder_f RANAP_PDP_Type_extension_encode_uper;
+per_type_decoder_f RANAP_PDP_Type_extension_decode_aper;
+per_type_encoder_f RANAP_PDP_Type_extension_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PDP_Type_extension_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PDP-Type.c b/src/ranap/RANAP_PDP-Type.c
new file mode 100644
index 0000000..259f7a9
--- /dev/null
+++ b/src/ranap/RANAP_PDP-Type.c
@@ -0,0 +1,173 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PDP-Type.h"
+
+int
+RANAP_PDP_Type_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PDP_Type_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_PDP_Type_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PDP_Type_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PDP_Type_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PDP_Type_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PDP_Type_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PDP_Type_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  4l }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_PDP_Type_value2enum_1[] = {
+	{ 0,	5,	"empty" },
+	{ 1,	3,	"ppp" },
+	{ 2,	9,	"osp-ihoss" },
+	{ 3,	4,	"ipv4" },
+	{ 4,	4,	"ipv6" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_PDP_Type_enum2value_1[] = {
+	0,	/* empty(0) */
+	3,	/* ipv4(3) */
+	4,	/* ipv6(4) */
+	2,	/* osp-ihoss(2) */
+	1	/* ppp(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_PDP_Type_specs_1 = {
+	asn_MAP_RANAP_PDP_Type_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_PDP_Type_enum2value_1,	/* N => "tag"; sorted by N */
+	5,	/* Number of elements in the maps */
+	6,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PDP_Type_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_Type = {
+	"RANAP_PDP-Type",
+	"RANAP_PDP-Type",
+	RANAP_PDP_Type_free,
+	RANAP_PDP_Type_print,
+	RANAP_PDP_Type_constraint,
+	RANAP_PDP_Type_decode_ber,
+	RANAP_PDP_Type_encode_der,
+	RANAP_PDP_Type_decode_xer,
+	RANAP_PDP_Type_encode_xer,
+	RANAP_PDP_Type_decode_uper,
+	RANAP_PDP_Type_encode_uper,
+	RANAP_PDP_Type_decode_aper,
+	RANAP_PDP_Type_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PDP_Type_tags_1,
+	sizeof(asn_DEF_RANAP_PDP_Type_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_Type_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PDP_Type_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PDP_Type_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_Type_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PDP_Type_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_PDP_Type_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PDP-Type.h b/src/ranap/RANAP_PDP-Type.h
new file mode 100644
index 0000000..b1445a2
--- /dev/null
+++ b/src/ranap/RANAP_PDP-Type.h
@@ -0,0 +1,54 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PDP_Type_H_
+#define	_RANAP_PDP_Type_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PDP_Type {
+	RANAP_PDP_Type_empty	= 0,
+	RANAP_PDP_Type_ppp	= 1,
+	RANAP_PDP_Type_osp_ihoss	= 2,
+	RANAP_PDP_Type_ipv4	= 3,
+	RANAP_PDP_Type_ipv6	= 4
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_PDP_Type;
+
+/* RANAP_PDP-Type */
+typedef long	 RANAP_PDP_Type_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_Type;
+asn_struct_free_f RANAP_PDP_Type_free;
+asn_struct_print_f RANAP_PDP_Type_print;
+asn_constr_check_f RANAP_PDP_Type_constraint;
+ber_type_decoder_f RANAP_PDP_Type_decode_ber;
+der_type_encoder_f RANAP_PDP_Type_encode_der;
+xer_type_decoder_f RANAP_PDP_Type_decode_xer;
+xer_type_encoder_f RANAP_PDP_Type_encode_xer;
+per_type_decoder_f RANAP_PDP_Type_decode_uper;
+per_type_encoder_f RANAP_PDP_Type_encode_uper;
+per_type_decoder_f RANAP_PDP_Type_decode_aper;
+per_type_encoder_f RANAP_PDP_Type_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PDP_Type_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PDP-TypeInformation-extension.c b/src/ranap/RANAP_PDP-TypeInformation-extension.c
new file mode 100644
index 0000000..2e55308
--- /dev/null
+++ b/src/ranap/RANAP_PDP-TypeInformation-extension.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PDP-TypeInformation-extension.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PDP_TypeInformation_extension_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PDP_TypeInformation_extension_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_PDP_Type_extension,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_PDP_TypeInformation_extension_specs_1 = {
+	sizeof(struct RANAP_PDP_TypeInformation_extension),
+	offsetof(struct RANAP_PDP_TypeInformation_extension, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_TypeInformation_extension = {
+	"RANAP_PDP-TypeInformation-extension",
+	"RANAP_PDP-TypeInformation-extension",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1,
+	sizeof(asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_TypeInformation_extension_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PDP_TypeInformation_extension_constr_1,
+	asn_MBR_RANAP_PDP_TypeInformation_extension_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_PDP_TypeInformation_extension_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PDP-TypeInformation-extension.h b/src/ranap/RANAP_PDP-TypeInformation-extension.h
new file mode 100644
index 0000000..fc9e688
--- /dev/null
+++ b/src/ranap/RANAP_PDP-TypeInformation-extension.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PDP_TypeInformation_extension_H_
+#define	_RANAP_PDP_TypeInformation_extension_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PDP-Type-extension.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PDP-TypeInformation-extension */
+typedef struct RANAP_PDP_TypeInformation_extension {
+	A_SEQUENCE_OF(RANAP_PDP_Type_extension_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PDP_TypeInformation_extension_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_TypeInformation_extension;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PDP_TypeInformation_extension_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PDP-TypeInformation.c b/src/ranap/RANAP_PDP-TypeInformation.c
new file mode 100644
index 0000000..236520f
--- /dev/null
+++ b/src/ranap/RANAP_PDP-TypeInformation.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PDP-TypeInformation.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PDP_TypeInformation_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PDP_TypeInformation_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_PDP_Type,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PDP_TypeInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_PDP_TypeInformation_specs_1 = {
+	sizeof(struct RANAP_PDP_TypeInformation),
+	offsetof(struct RANAP_PDP_TypeInformation, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_TypeInformation = {
+	"RANAP_PDP-TypeInformation",
+	"RANAP_PDP-TypeInformation",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PDP_TypeInformation_tags_1,
+	sizeof(asn_DEF_RANAP_PDP_TypeInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_TypeInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PDP_TypeInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PDP_TypeInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_PDP_TypeInformation_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PDP_TypeInformation_constr_1,
+	asn_MBR_RANAP_PDP_TypeInformation_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_PDP_TypeInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PDP-TypeInformation.h b/src/ranap/RANAP_PDP-TypeInformation.h
new file mode 100644
index 0000000..f5e9076
--- /dev/null
+++ b/src/ranap/RANAP_PDP-TypeInformation.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PDP_TypeInformation_H_
+#define	_RANAP_PDP_TypeInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PDP-Type.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PDP-TypeInformation */
+typedef struct RANAP_PDP_TypeInformation {
+	A_SEQUENCE_OF(RANAP_PDP_Type_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PDP_TypeInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PDP_TypeInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PDP_TypeInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PDUType14FrameSequenceNumber.c b/src/ranap/RANAP_PDUType14FrameSequenceNumber.c
new file mode 100644
index 0000000..f82df49
--- /dev/null
+++ b/src/ranap/RANAP_PDUType14FrameSequenceNumber.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PDUType14FrameSequenceNumber.h"
+
+int
+RANAP_PDUType14FrameSequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 3l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_PDUType14FrameSequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PDUType14FrameSequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDUType14FrameSequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PDUType14FrameSequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDUType14FrameSequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PDUType14FrameSequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PDUType14FrameSequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PDUType14FrameSequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PDUType14FrameSequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PDUType14FrameSequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PDUType14FrameSequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PDUType14FrameSequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  3l }	/* (0..3) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PDUType14FrameSequenceNumber = {
+	"RANAP_PDUType14FrameSequenceNumber",
+	"RANAP_PDUType14FrameSequenceNumber",
+	RANAP_PDUType14FrameSequenceNumber_free,
+	RANAP_PDUType14FrameSequenceNumber_print,
+	RANAP_PDUType14FrameSequenceNumber_constraint,
+	RANAP_PDUType14FrameSequenceNumber_decode_ber,
+	RANAP_PDUType14FrameSequenceNumber_encode_der,
+	RANAP_PDUType14FrameSequenceNumber_decode_xer,
+	RANAP_PDUType14FrameSequenceNumber_encode_xer,
+	RANAP_PDUType14FrameSequenceNumber_decode_uper,
+	RANAP_PDUType14FrameSequenceNumber_encode_uper,
+	RANAP_PDUType14FrameSequenceNumber_decode_aper,
+	RANAP_PDUType14FrameSequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_PDUType14FrameSequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PDUType14FrameSequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_PDUType14FrameSequenceNumber.h b/src/ranap/RANAP_PDUType14FrameSequenceNumber.h
new file mode 100644
index 0000000..52c678b
--- /dev/null
+++ b/src/ranap/RANAP_PDUType14FrameSequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PDUType14FrameSequenceNumber_H_
+#define	_RANAP_PDUType14FrameSequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PDUType14FrameSequenceNumber */
+typedef long	 RANAP_PDUType14FrameSequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PDUType14FrameSequenceNumber;
+asn_struct_free_f RANAP_PDUType14FrameSequenceNumber_free;
+asn_struct_print_f RANAP_PDUType14FrameSequenceNumber_print;
+asn_constr_check_f RANAP_PDUType14FrameSequenceNumber_constraint;
+ber_type_decoder_f RANAP_PDUType14FrameSequenceNumber_decode_ber;
+der_type_encoder_f RANAP_PDUType14FrameSequenceNumber_encode_der;
+xer_type_decoder_f RANAP_PDUType14FrameSequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_PDUType14FrameSequenceNumber_encode_xer;
+per_type_decoder_f RANAP_PDUType14FrameSequenceNumber_decode_uper;
+per_type_encoder_f RANAP_PDUType14FrameSequenceNumber_encode_uper;
+per_type_decoder_f RANAP_PDUType14FrameSequenceNumber_decode_aper;
+per_type_encoder_f RANAP_PDUType14FrameSequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PDUType14FrameSequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PLMNidentity.c b/src/ranap/RANAP_PLMNidentity.c
new file mode 100644
index 0000000..08b3115
--- /dev/null
+++ b/src/ranap/RANAP_PLMNidentity.c
@@ -0,0 +1,162 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PLMNidentity.h"
+
+int
+RANAP_PLMNidentity_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_RANAP_TBCD_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using RANAP_TBCD_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PLMNidentity_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_RANAP_TBCD_STRING.free_struct;
+	td->print_struct   = asn_DEF_RANAP_TBCD_STRING.print_struct;
+	td->check_constraints = asn_DEF_RANAP_TBCD_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_RANAP_TBCD_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_RANAP_TBCD_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_RANAP_TBCD_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_RANAP_TBCD_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_RANAP_TBCD_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_RANAP_TBCD_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_RANAP_TBCD_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_RANAP_TBCD_STRING.aper_encoder;
+	/* The next four lines are here because of -fknown-extern-type */
+	td->tags           = asn_DEF_RANAP_TBCD_STRING.tags;
+	td->tags_count     = asn_DEF_RANAP_TBCD_STRING.tags_count;
+	td->all_tags       = asn_DEF_RANAP_TBCD_STRING.all_tags;
+	td->all_tags_count = asn_DEF_RANAP_TBCD_STRING.all_tags_count;
+	/* End of these lines */
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_RANAP_TBCD_STRING.per_constraints;
+	td->elements       = asn_DEF_RANAP_TBCD_STRING.elements;
+	td->elements_count = asn_DEF_RANAP_TBCD_STRING.elements_count;
+	td->specifics      = asn_DEF_RANAP_TBCD_STRING.specifics;
+}
+
+void
+RANAP_PLMNidentity_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PLMNidentity_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PLMNidentity_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PLMNidentity_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PLMNidentity_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PLMNidentity_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PLMNidentity_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PLMNidentity_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PLMNidentity_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PLMNidentity_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PLMNidentity_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PLMNidentity_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PLMNidentity = {
+	"RANAP_PLMNidentity",
+	"RANAP_PLMNidentity",
+	RANAP_PLMNidentity_free,
+	RANAP_PLMNidentity_print,
+	RANAP_PLMNidentity_constraint,
+	RANAP_PLMNidentity_decode_ber,
+	RANAP_PLMNidentity_encode_der,
+	RANAP_PLMNidentity_decode_xer,
+	RANAP_PLMNidentity_encode_xer,
+	RANAP_PLMNidentity_decode_uper,
+	RANAP_PLMNidentity_encode_uper,
+	RANAP_PLMNidentity_decode_aper,
+	RANAP_PLMNidentity_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_PLMNidentity_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_PLMNidentity.h b/src/ranap/RANAP_PLMNidentity.h
new file mode 100644
index 0000000..d9f09d4
--- /dev/null
+++ b/src/ranap/RANAP_PLMNidentity.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+#include <constr_CHOICE.h>
+
+#ifndef	_RANAP_PLMNidentity_H_
+#define	_RANAP_PLMNidentity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TBCD-STRING.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PLMNidentity */
+typedef RANAP_TBCD_STRING_t	 RANAP_PLMNidentity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PLMNidentity;
+asn_struct_free_f RANAP_PLMNidentity_free;
+asn_struct_print_f RANAP_PLMNidentity_print;
+asn_constr_check_f RANAP_PLMNidentity_constraint;
+ber_type_decoder_f RANAP_PLMNidentity_decode_ber;
+der_type_encoder_f RANAP_PLMNidentity_encode_der;
+xer_type_decoder_f RANAP_PLMNidentity_decode_xer;
+xer_type_encoder_f RANAP_PLMNidentity_encode_xer;
+per_type_decoder_f RANAP_PLMNidentity_decode_uper;
+per_type_encoder_f RANAP_PLMNidentity_encode_uper;
+per_type_decoder_f RANAP_PLMNidentity_decode_aper;
+per_type_encoder_f RANAP_PLMNidentity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PLMNidentity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PLMNs-in-shared-network.c b/src/ranap/RANAP_PLMNs-in-shared-network.c
new file mode 100644
index 0000000..4611d8a
--- /dev/null
+++ b/src/ranap/RANAP_PLMNs-in-shared-network.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PLMNs-in-shared-network.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PLMNs_in_shared_network_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  1l,  32l }	/* (SIZE(1..32)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, lA_LIST),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LA_LIST,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lA-LIST"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* lA-LIST */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	3,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_PLMNs_in_shared_network_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PLMNs_in_shared_network_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_PLMNs_in_shared_network_specs_1 = {
+	sizeof(struct RANAP_PLMNs_in_shared_network),
+	offsetof(struct RANAP_PLMNs_in_shared_network, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PLMNs_in_shared_network = {
+	"RANAP_PLMNs-in-shared-network",
+	"RANAP_PLMNs-in-shared-network",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PLMNs_in_shared_network_tags_1,
+	sizeof(asn_DEF_RANAP_PLMNs_in_shared_network_tags_1)
+		/sizeof(asn_DEF_RANAP_PLMNs_in_shared_network_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PLMNs_in_shared_network_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PLMNs_in_shared_network_tags_1)
+		/sizeof(asn_DEF_RANAP_PLMNs_in_shared_network_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PLMNs_in_shared_network_constr_1,
+	asn_MBR_RANAP_PLMNs_in_shared_network_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_PLMNs_in_shared_network_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PLMNs-in-shared-network.h b/src/ranap/RANAP_PLMNs-in-shared-network.h
new file mode 100644
index 0000000..512e0fc
--- /dev/null
+++ b/src/ranap/RANAP_PLMNs-in-shared-network.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PLMNs_in_shared_network_H_
+#define	_RANAP_PLMNs_in_shared_network_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_LA-LIST.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PLMNs-in-shared-network */
+typedef struct RANAP_PLMNs_in_shared_network {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_PLMNidentity_t	 pLMNidentity;
+		RANAP_LA_LIST_t	 lA_LIST;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PLMNs_in_shared_network_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PLMNs_in_shared_network;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PLMNs_in_shared_network_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Paging.c b/src/ranap/RANAP_Paging.c
new file mode 100644
index 0000000..adfa22e
--- /dev/null
+++ b/src/ranap/RANAP_Paging.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Paging.h"
+
+static int
+memb_paging_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_paging_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_paging_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_paging_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_paging_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_paging_ies_specs_2 = {
+	sizeof(struct paging_ies),
+	offsetof(struct paging_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_paging_ies_2 = {
+	"paging-ies",
+	"paging-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_paging_ies_tags_2,
+	sizeof(asn_DEF_paging_ies_tags_2)
+		/sizeof(asn_DEF_paging_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_paging_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_paging_ies_tags_2)
+		/sizeof(asn_DEF_paging_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_paging_ies_constr_2,
+	asn_MBR_paging_ies_2,
+	1,	/* Single element */
+	&asn_SPC_paging_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_Paging_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Paging, paging_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_paging_ies_2,
+		memb_paging_ies_constraint_1,
+		&asn_PER_memb_paging_ies_constr_2,
+		0,
+		"paging-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Paging_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Paging_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* paging-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Paging_specs_1 = {
+	sizeof(struct RANAP_Paging),
+	offsetof(struct RANAP_Paging, _asn_ctx),
+	asn_MAP_RANAP_Paging_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Paging = {
+	"RANAP_Paging",
+	"RANAP_Paging",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Paging_tags_1,
+	sizeof(asn_DEF_RANAP_Paging_tags_1)
+		/sizeof(asn_DEF_RANAP_Paging_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Paging_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Paging_tags_1)
+		/sizeof(asn_DEF_RANAP_Paging_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Paging_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Paging_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Paging.h b/src/ranap/RANAP_Paging.h
new file mode 100644
index 0000000..dae16c5
--- /dev/null
+++ b/src/ranap/RANAP_Paging.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Paging_H_
+#define	_RANAP_Paging_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Paging */
+typedef struct RANAP_Paging {
+	struct paging_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} paging_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Paging_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Paging;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Paging_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PagingAreaID.c b/src/ranap/RANAP_PagingAreaID.c
new file mode 100644
index 0000000..d00f797
--- /dev/null
+++ b/src/ranap/RANAP_PagingAreaID.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PagingAreaID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PagingAreaID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PagingAreaID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PagingAreaID, choice.lAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PagingAreaID, choice.rAI),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAI"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_PagingAreaID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* lAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* rAI */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_PagingAreaID_specs_1 = {
+	sizeof(struct RANAP_PagingAreaID),
+	offsetof(struct RANAP_PagingAreaID, _asn_ctx),
+	offsetof(struct RANAP_PagingAreaID, present),
+	sizeof(((struct RANAP_PagingAreaID *)0)->present),
+	asn_MAP_RANAP_PagingAreaID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PagingAreaID = {
+	"RANAP_PagingAreaID",
+	"RANAP_PagingAreaID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_PagingAreaID_constr_1,
+	asn_MBR_RANAP_PagingAreaID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_PagingAreaID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PagingAreaID.h b/src/ranap/RANAP_PagingAreaID.h
new file mode 100644
index 0000000..13b2507
--- /dev/null
+++ b/src/ranap/RANAP_PagingAreaID.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PagingAreaID_H_
+#define	_RANAP_PagingAreaID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI.h"
+#include "RANAP_RAI.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PagingAreaID_PR {
+	RANAP_PagingAreaID_PR_NOTHING,	/* No components present */
+	RANAP_PagingAreaID_PR_lAI,
+	RANAP_PagingAreaID_PR_rAI,
+	/* Extensions may appear below */
+	
+} RANAP_PagingAreaID_PR;
+
+/* RANAP_PagingAreaID */
+typedef struct RANAP_PagingAreaID {
+	RANAP_PagingAreaID_PR present;
+	union RANAP_PagingAreaID_u {
+		RANAP_LAI_t	 lAI;
+		RANAP_RAI_t	 rAI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PagingAreaID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PagingAreaID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PagingAreaID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PagingCause.c b/src/ranap/RANAP_PagingCause.c
new file mode 100644
index 0000000..5e1a26a
--- /dev/null
+++ b/src/ranap/RANAP_PagingCause.c
@@ -0,0 +1,175 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PagingCause.h"
+
+int
+RANAP_PagingCause_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PagingCause_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_PagingCause_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PagingCause_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PagingCause_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PagingCause_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PagingCause_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PagingCause_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PagingCause_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PagingCause_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PagingCause_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PagingCause_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PagingCause_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PagingCause_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  4l }	/* (0..4,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_PagingCause_value2enum_1[] = {
+	{ 0,	31,	"terminating-conversational-call" },
+	{ 1,	26,	"terminating-streaming-call" },
+	{ 2,	28,	"terminating-interactive-call" },
+	{ 3,	27,	"terminating-background-call" },
+	{ 4,	35,	"terminating-low-priority-signalling" },
+	{ 5,	36,	"terminating-high-priority-signalling" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_PagingCause_enum2value_1[] = {
+	3,	/* terminating-background-call(3) */
+	0,	/* terminating-conversational-call(0) */
+	5,	/* terminating-high-priority-signalling(5) */
+	2,	/* terminating-interactive-call(2) */
+	4,	/* terminating-low-priority-signalling(4) */
+	1	/* terminating-streaming-call(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_PagingCause_specs_1 = {
+	asn_MAP_RANAP_PagingCause_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_PagingCause_enum2value_1,	/* N => "tag"; sorted by N */
+	6,	/* Number of elements in the maps */
+	6,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PagingCause_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PagingCause = {
+	"RANAP_PagingCause",
+	"RANAP_PagingCause",
+	RANAP_PagingCause_free,
+	RANAP_PagingCause_print,
+	RANAP_PagingCause_constraint,
+	RANAP_PagingCause_decode_ber,
+	RANAP_PagingCause_encode_der,
+	RANAP_PagingCause_decode_xer,
+	RANAP_PagingCause_encode_xer,
+	RANAP_PagingCause_decode_uper,
+	RANAP_PagingCause_encode_uper,
+	RANAP_PagingCause_decode_aper,
+	RANAP_PagingCause_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PagingCause_tags_1,
+	sizeof(asn_DEF_RANAP_PagingCause_tags_1)
+		/sizeof(asn_DEF_RANAP_PagingCause_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PagingCause_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PagingCause_tags_1)
+		/sizeof(asn_DEF_RANAP_PagingCause_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PagingCause_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_PagingCause_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PagingCause.h b/src/ranap/RANAP_PagingCause.h
new file mode 100644
index 0000000..cf9167b
--- /dev/null
+++ b/src/ranap/RANAP_PagingCause.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PagingCause_H_
+#define	_RANAP_PagingCause_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PagingCause {
+	RANAP_PagingCause_terminating_conversational_call	= 0,
+	RANAP_PagingCause_terminating_streaming_call	= 1,
+	RANAP_PagingCause_terminating_interactive_call	= 2,
+	RANAP_PagingCause_terminating_background_call	= 3,
+	RANAP_PagingCause_terminating_low_priority_signalling	= 4,
+	/*
+	 * Enumeration is extensible
+	 */
+	RANAP_PagingCause_terminating_high_priority_signalling	= 5
+} e_RANAP_PagingCause;
+
+/* RANAP_PagingCause */
+typedef long	 RANAP_PagingCause_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PagingCause;
+asn_struct_free_f RANAP_PagingCause_free;
+asn_struct_print_f RANAP_PagingCause_print;
+asn_constr_check_f RANAP_PagingCause_constraint;
+ber_type_decoder_f RANAP_PagingCause_decode_ber;
+der_type_encoder_f RANAP_PagingCause_encode_der;
+xer_type_decoder_f RANAP_PagingCause_decode_xer;
+xer_type_encoder_f RANAP_PagingCause_encode_xer;
+per_type_decoder_f RANAP_PagingCause_decode_uper;
+per_type_encoder_f RANAP_PagingCause_encode_uper;
+per_type_decoder_f RANAP_PagingCause_decode_aper;
+per_type_encoder_f RANAP_PagingCause_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PagingCause_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PeriodicLocationInfo.c b/src/ranap/RANAP_PeriodicLocationInfo.c
new file mode 100644
index 0000000..754b226
--- /dev/null
+++ b/src/ranap/RANAP_PeriodicLocationInfo.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PeriodicLocationInfo.h"
+
+static int
+memb_reportingAmount_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 8639999l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_reportingInterval_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 8639999l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_reportingAmount_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  24, -1,  1l,  8639999l }	/* (1..8639999,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_reportingInterval_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  24, -1,  1l,  8639999l }	/* (1..8639999,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PeriodicLocationInfo_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PeriodicLocationInfo, reportingAmount),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_reportingAmount_constraint_1,
+		&asn_PER_memb_reportingAmount_constr_2,
+		0,
+		"reportingAmount"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PeriodicLocationInfo, reportingInterval),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_reportingInterval_constraint_1,
+		&asn_PER_memb_reportingInterval_constr_3,
+		0,
+		"reportingInterval"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_PeriodicLocationInfo, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_PeriodicLocationInfo_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_PeriodicLocationInfo_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_PeriodicLocationInfo_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* reportingAmount */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* reportingInterval */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_PeriodicLocationInfo_specs_1 = {
+	sizeof(struct RANAP_PeriodicLocationInfo),
+	offsetof(struct RANAP_PeriodicLocationInfo, _asn_ctx),
+	asn_MAP_RANAP_PeriodicLocationInfo_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_PeriodicLocationInfo_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PeriodicLocationInfo = {
+	"RANAP_PeriodicLocationInfo",
+	"RANAP_PeriodicLocationInfo",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PeriodicLocationInfo_tags_1,
+	sizeof(asn_DEF_RANAP_PeriodicLocationInfo_tags_1)
+		/sizeof(asn_DEF_RANAP_PeriodicLocationInfo_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PeriodicLocationInfo_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PeriodicLocationInfo_tags_1)
+		/sizeof(asn_DEF_RANAP_PeriodicLocationInfo_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_PeriodicLocationInfo_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_PeriodicLocationInfo_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PeriodicLocationInfo.h b/src/ranap/RANAP_PeriodicLocationInfo.h
new file mode 100644
index 0000000..b85224a
--- /dev/null
+++ b/src/ranap/RANAP_PeriodicLocationInfo.h
@@ -0,0 +1,44 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PeriodicLocationInfo_H_
+#define	_RANAP_PeriodicLocationInfo_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PeriodicLocationInfo */
+typedef struct RANAP_PeriodicLocationInfo {
+	long	 reportingAmount;
+	long	 reportingInterval;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PeriodicLocationInfo_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PeriodicLocationInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PeriodicLocationInfo_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PeriodicReportingIndicator.c b/src/ranap/RANAP_PeriodicReportingIndicator.c
new file mode 100644
index 0000000..ec9c5c2
--- /dev/null
+++ b/src/ranap/RANAP_PeriodicReportingIndicator.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PeriodicReportingIndicator.h"
+
+int
+RANAP_PeriodicReportingIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_PeriodicReportingIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PeriodicReportingIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PeriodicReportingIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PeriodicReportingIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PeriodicReportingIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PeriodicReportingIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PeriodicReportingIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PeriodicReportingIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PeriodicReportingIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PeriodicReportingIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PeriodicReportingIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PeriodicReportingIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_PeriodicReportingIndicator_value2enum_1[] = {
+	{ 0,	11,	"periodicSAI" },
+	{ 1,	11,	"periodicGeo" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_PeriodicReportingIndicator_enum2value_1[] = {
+	1,	/* periodicGeo(1) */
+	0	/* periodicSAI(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_PeriodicReportingIndicator_specs_1 = {
+	asn_MAP_RANAP_PeriodicReportingIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_PeriodicReportingIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PeriodicReportingIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PeriodicReportingIndicator = {
+	"RANAP_PeriodicReportingIndicator",
+	"RANAP_PeriodicReportingIndicator",
+	RANAP_PeriodicReportingIndicator_free,
+	RANAP_PeriodicReportingIndicator_print,
+	RANAP_PeriodicReportingIndicator_constraint,
+	RANAP_PeriodicReportingIndicator_decode_ber,
+	RANAP_PeriodicReportingIndicator_encode_der,
+	RANAP_PeriodicReportingIndicator_decode_xer,
+	RANAP_PeriodicReportingIndicator_encode_xer,
+	RANAP_PeriodicReportingIndicator_decode_uper,
+	RANAP_PeriodicReportingIndicator_encode_uper,
+	RANAP_PeriodicReportingIndicator_decode_aper,
+	RANAP_PeriodicReportingIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PeriodicReportingIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_PeriodicReportingIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_PeriodicReportingIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PeriodicReportingIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PeriodicReportingIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_PeriodicReportingIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PeriodicReportingIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_PeriodicReportingIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PeriodicReportingIndicator.h b/src/ranap/RANAP_PeriodicReportingIndicator.h
new file mode 100644
index 0000000..6b4bf5f
--- /dev/null
+++ b/src/ranap/RANAP_PeriodicReportingIndicator.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PeriodicReportingIndicator_H_
+#define	_RANAP_PeriodicReportingIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PeriodicReportingIndicator {
+	RANAP_PeriodicReportingIndicator_periodicSAI	= 0,
+	RANAP_PeriodicReportingIndicator_periodicGeo	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_PeriodicReportingIndicator;
+
+/* RANAP_PeriodicReportingIndicator */
+typedef long	 RANAP_PeriodicReportingIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PeriodicReportingIndicator;
+asn_struct_free_f RANAP_PeriodicReportingIndicator_free;
+asn_struct_print_f RANAP_PeriodicReportingIndicator_print;
+asn_constr_check_f RANAP_PeriodicReportingIndicator_constraint;
+ber_type_decoder_f RANAP_PeriodicReportingIndicator_decode_ber;
+der_type_encoder_f RANAP_PeriodicReportingIndicator_encode_der;
+xer_type_decoder_f RANAP_PeriodicReportingIndicator_decode_xer;
+xer_type_encoder_f RANAP_PeriodicReportingIndicator_encode_xer;
+per_type_decoder_f RANAP_PeriodicReportingIndicator_decode_uper;
+per_type_encoder_f RANAP_PeriodicReportingIndicator_encode_uper;
+per_type_decoder_f RANAP_PeriodicReportingIndicator_decode_aper;
+per_type_encoder_f RANAP_PeriodicReportingIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PeriodicReportingIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PermanentNAS-UE-ID.c b/src/ranap/RANAP_PermanentNAS-UE-ID.c
new file mode 100644
index 0000000..f36414e
--- /dev/null
+++ b/src/ranap/RANAP_PermanentNAS-UE-ID.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PermanentNAS-UE-ID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PermanentNAS_UE_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PermanentNAS_UE_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PermanentNAS_UE_ID, choice.iMSI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMSI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iMSI"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_PermanentNAS_UE_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* iMSI */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_PermanentNAS_UE_ID_specs_1 = {
+	sizeof(struct RANAP_PermanentNAS_UE_ID),
+	offsetof(struct RANAP_PermanentNAS_UE_ID, _asn_ctx),
+	offsetof(struct RANAP_PermanentNAS_UE_ID, present),
+	sizeof(((struct RANAP_PermanentNAS_UE_ID *)0)->present),
+	asn_MAP_RANAP_PermanentNAS_UE_ID_tag2el_1,
+	1,	/* Count of tags in the map */
+	0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PermanentNAS_UE_ID = {
+	"RANAP_PermanentNAS-UE-ID",
+	"RANAP_PermanentNAS-UE-ID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_PermanentNAS_UE_ID_constr_1,
+	asn_MBR_RANAP_PermanentNAS_UE_ID_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_PermanentNAS_UE_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PermanentNAS-UE-ID.h b/src/ranap/RANAP_PermanentNAS-UE-ID.h
new file mode 100644
index 0000000..9ad1dde
--- /dev/null
+++ b/src/ranap/RANAP_PermanentNAS-UE-ID.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PermanentNAS_UE_ID_H_
+#define	_RANAP_PermanentNAS_UE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMSI.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PermanentNAS_UE_ID_PR {
+	RANAP_PermanentNAS_UE_ID_PR_NOTHING,	/* No components present */
+	RANAP_PermanentNAS_UE_ID_PR_iMSI,
+	/* Extensions may appear below */
+	
+} RANAP_PermanentNAS_UE_ID_PR;
+
+/* RANAP_PermanentNAS-UE-ID */
+typedef struct RANAP_PermanentNAS_UE_ID {
+	RANAP_PermanentNAS_UE_ID_PR present;
+	union RANAP_PermanentNAS_UE_ID_u {
+		RANAP_IMSI_t	 iMSI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PermanentNAS_UE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PermanentNAS_UE_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PermanentNAS_UE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PermittedEncryptionAlgorithms.c b/src/ranap/RANAP_PermittedEncryptionAlgorithms.c
new file mode 100644
index 0000000..23a2b00
--- /dev/null
+++ b/src/ranap/RANAP_PermittedEncryptionAlgorithms.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PermittedEncryptionAlgorithms.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PermittedEncryptionAlgorithms_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PermittedEncryptionAlgorithms_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_EncryptionAlgorithm,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_PermittedEncryptionAlgorithms_specs_1 = {
+	sizeof(struct RANAP_PermittedEncryptionAlgorithms),
+	offsetof(struct RANAP_PermittedEncryptionAlgorithms, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PermittedEncryptionAlgorithms = {
+	"RANAP_PermittedEncryptionAlgorithms",
+	"RANAP_PermittedEncryptionAlgorithms",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1,
+	sizeof(asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1)
+		/sizeof(asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1)
+		/sizeof(asn_DEF_RANAP_PermittedEncryptionAlgorithms_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PermittedEncryptionAlgorithms_constr_1,
+	asn_MBR_RANAP_PermittedEncryptionAlgorithms_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_PermittedEncryptionAlgorithms_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PermittedEncryptionAlgorithms.h b/src/ranap/RANAP_PermittedEncryptionAlgorithms.h
new file mode 100644
index 0000000..542c232
--- /dev/null
+++ b/src/ranap/RANAP_PermittedEncryptionAlgorithms.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PermittedEncryptionAlgorithms_H_
+#define	_RANAP_PermittedEncryptionAlgorithms_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_EncryptionAlgorithm.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PermittedEncryptionAlgorithms */
+typedef struct RANAP_PermittedEncryptionAlgorithms {
+	A_SEQUENCE_OF(RANAP_EncryptionAlgorithm_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PermittedEncryptionAlgorithms_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PermittedEncryptionAlgorithms;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PermittedEncryptionAlgorithms_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PermittedIntegrityProtectionAlgorithms.c b/src/ranap/RANAP_PermittedIntegrityProtectionAlgorithms.c
new file mode 100644
index 0000000..0a20a97
--- /dev/null
+++ b/src/ranap/RANAP_PermittedIntegrityProtectionAlgorithms.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PermittedIntegrityProtectionAlgorithms.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PermittedIntegrityProtectionAlgorithms_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  16l }	/* (SIZE(1..16)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PermittedIntegrityProtectionAlgorithms_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IntegrityProtectionAlgorithm,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_PermittedIntegrityProtectionAlgorithms_specs_1 = {
+	sizeof(struct RANAP_PermittedIntegrityProtectionAlgorithms),
+	offsetof(struct RANAP_PermittedIntegrityProtectionAlgorithms, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms = {
+	"RANAP_PermittedIntegrityProtectionAlgorithms",
+	"RANAP_PermittedIntegrityProtectionAlgorithms",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1,
+	sizeof(asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1)
+		/sizeof(asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1)
+		/sizeof(asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PermittedIntegrityProtectionAlgorithms_constr_1,
+	asn_MBR_RANAP_PermittedIntegrityProtectionAlgorithms_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_PermittedIntegrityProtectionAlgorithms_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PermittedIntegrityProtectionAlgorithms.h b/src/ranap/RANAP_PermittedIntegrityProtectionAlgorithms.h
new file mode 100644
index 0000000..b6737f4
--- /dev/null
+++ b/src/ranap/RANAP_PermittedIntegrityProtectionAlgorithms.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PermittedIntegrityProtectionAlgorithms_H_
+#define	_RANAP_PermittedIntegrityProtectionAlgorithms_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IntegrityProtectionAlgorithm.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PermittedIntegrityProtectionAlgorithms */
+typedef struct RANAP_PermittedIntegrityProtectionAlgorithms {
+	A_SEQUENCE_OF(RANAP_IntegrityProtectionAlgorithm_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PermittedIntegrityProtectionAlgorithms_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PermittedIntegrityProtectionAlgorithms;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PermittedIntegrityProtectionAlgorithms_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Port-Number.c b/src/ranap/RANAP_Port-Number.c
new file mode 100644
index 0000000..5b41fed
--- /dev/null
+++ b/src/ranap/RANAP_Port-Number.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Port-Number.h"
+
+int
+RANAP_Port_Number_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Port_Number_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_Port_Number_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Port_Number_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Port_Number_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Port_Number_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Port_Number_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Port_Number_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Port_Number_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Port_Number_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Port_Number_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Port_Number_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Port_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Port_Number_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Port_Number_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Port_Number = {
+	"RANAP_Port-Number",
+	"RANAP_Port-Number",
+	RANAP_Port_Number_free,
+	RANAP_Port_Number_print,
+	RANAP_Port_Number_constraint,
+	RANAP_Port_Number_decode_ber,
+	RANAP_Port_Number_encode_der,
+	RANAP_Port_Number_decode_xer,
+	RANAP_Port_Number_encode_xer,
+	RANAP_Port_Number_decode_uper,
+	RANAP_Port_Number_encode_uper,
+	RANAP_Port_Number_decode_aper,
+	RANAP_Port_Number_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Port_Number_tags_1,
+	sizeof(asn_DEF_RANAP_Port_Number_tags_1)
+		/sizeof(asn_DEF_RANAP_Port_Number_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Port_Number_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Port_Number_tags_1)
+		/sizeof(asn_DEF_RANAP_Port_Number_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Port_Number_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Port-Number.h b/src/ranap/RANAP_Port-Number.h
new file mode 100644
index 0000000..3e64495
--- /dev/null
+++ b/src/ranap/RANAP_Port-Number.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Port_Number_H_
+#define	_RANAP_Port_Number_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Port-Number */
+typedef OCTET_STRING_t	 RANAP_Port_Number_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Port_Number;
+asn_struct_free_f RANAP_Port_Number_free;
+asn_struct_print_f RANAP_Port_Number_print;
+asn_constr_check_f RANAP_Port_Number_constraint;
+ber_type_decoder_f RANAP_Port_Number_decode_ber;
+der_type_encoder_f RANAP_Port_Number_encode_der;
+xer_type_decoder_f RANAP_Port_Number_decode_xer;
+xer_type_encoder_f RANAP_Port_Number_encode_xer;
+per_type_decoder_f RANAP_Port_Number_decode_uper;
+per_type_encoder_f RANAP_Port_Number_encode_uper;
+per_type_decoder_f RANAP_Port_Number_decode_aper;
+per_type_encoder_f RANAP_Port_Number_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Port_Number_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PositionData.c b/src/ranap/RANAP_PositionData.c
new file mode 100644
index 0000000..3f76e48
--- /dev/null
+++ b/src/ranap/RANAP_PositionData.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PositionData.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_PositionData_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PositionData, positioningDataDiscriminator),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PositioningDataDiscriminator,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"positioningDataDiscriminator"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_PositionData, positioningDataSet),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PositioningDataSet,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"positioningDataSet"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_PositionData, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_PositionData_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_PositionData_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_PositionData_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* positioningDataDiscriminator */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* positioningDataSet */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_PositionData_specs_1 = {
+	sizeof(struct RANAP_PositionData),
+	offsetof(struct RANAP_PositionData, _asn_ctx),
+	asn_MAP_RANAP_PositionData_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_PositionData_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PositionData = {
+	"RANAP_PositionData",
+	"RANAP_PositionData",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PositionData_tags_1,
+	sizeof(asn_DEF_RANAP_PositionData_tags_1)
+		/sizeof(asn_DEF_RANAP_PositionData_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PositionData_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PositionData_tags_1)
+		/sizeof(asn_DEF_RANAP_PositionData_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_PositionData_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_PositionData_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PositionData.h b/src/ranap/RANAP_PositionData.h
new file mode 100644
index 0000000..1bf8e6f
--- /dev/null
+++ b/src/ranap/RANAP_PositionData.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PositionData_H_
+#define	_RANAP_PositionData_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PositioningDataDiscriminator.h"
+#include "RANAP_PositioningDataSet.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PositionData */
+typedef struct RANAP_PositionData {
+	RANAP_PositioningDataDiscriminator_t	 positioningDataDiscriminator;
+	RANAP_PositioningDataSet_t	*positioningDataSet	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PositionData_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PositionData;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PositionData_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PositionDataSpecificToGERANIuMode.c b/src/ranap/RANAP_PositionDataSpecificToGERANIuMode.c
new file mode 100644
index 0000000..197fdf9
--- /dev/null
+++ b/src/ranap/RANAP_PositionDataSpecificToGERANIuMode.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PositionDataSpecificToGERANIuMode.h"
+
+int
+RANAP_PositionDataSpecificToGERANIuMode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_PositionDataSpecificToGERANIuMode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PositionDataSpecificToGERANIuMode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PositionDataSpecificToGERANIuMode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositionDataSpecificToGERANIuMode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PositionDataSpecificToGERANIuMode = {
+	"RANAP_PositionDataSpecificToGERANIuMode",
+	"RANAP_PositionDataSpecificToGERANIuMode",
+	RANAP_PositionDataSpecificToGERANIuMode_free,
+	RANAP_PositionDataSpecificToGERANIuMode_print,
+	RANAP_PositionDataSpecificToGERANIuMode_constraint,
+	RANAP_PositionDataSpecificToGERANIuMode_decode_ber,
+	RANAP_PositionDataSpecificToGERANIuMode_encode_der,
+	RANAP_PositionDataSpecificToGERANIuMode_decode_xer,
+	RANAP_PositionDataSpecificToGERANIuMode_encode_xer,
+	RANAP_PositionDataSpecificToGERANIuMode_decode_uper,
+	RANAP_PositionDataSpecificToGERANIuMode_encode_uper,
+	RANAP_PositionDataSpecificToGERANIuMode_decode_aper,
+	RANAP_PositionDataSpecificToGERANIuMode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1,
+	sizeof(asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1)
+		/sizeof(asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1)
+		/sizeof(asn_DEF_RANAP_PositionDataSpecificToGERANIuMode_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_PositionDataSpecificToGERANIuMode.h b/src/ranap/RANAP_PositionDataSpecificToGERANIuMode.h
new file mode 100644
index 0000000..e0692d6
--- /dev/null
+++ b/src/ranap/RANAP_PositionDataSpecificToGERANIuMode.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PositionDataSpecificToGERANIuMode_H_
+#define	_RANAP_PositionDataSpecificToGERANIuMode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PositionDataSpecificToGERANIuMode */
+typedef OCTET_STRING_t	 RANAP_PositionDataSpecificToGERANIuMode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PositionDataSpecificToGERANIuMode;
+asn_struct_free_f RANAP_PositionDataSpecificToGERANIuMode_free;
+asn_struct_print_f RANAP_PositionDataSpecificToGERANIuMode_print;
+asn_constr_check_f RANAP_PositionDataSpecificToGERANIuMode_constraint;
+ber_type_decoder_f RANAP_PositionDataSpecificToGERANIuMode_decode_ber;
+der_type_encoder_f RANAP_PositionDataSpecificToGERANIuMode_encode_der;
+xer_type_decoder_f RANAP_PositionDataSpecificToGERANIuMode_decode_xer;
+xer_type_encoder_f RANAP_PositionDataSpecificToGERANIuMode_encode_xer;
+per_type_decoder_f RANAP_PositionDataSpecificToGERANIuMode_decode_uper;
+per_type_encoder_f RANAP_PositionDataSpecificToGERANIuMode_encode_uper;
+per_type_decoder_f RANAP_PositionDataSpecificToGERANIuMode_decode_aper;
+per_type_encoder_f RANAP_PositionDataSpecificToGERANIuMode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PositionDataSpecificToGERANIuMode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PositioningDataDiscriminator.c b/src/ranap/RANAP_PositioningDataDiscriminator.c
new file mode 100644
index 0000000..111ad32
--- /dev/null
+++ b/src/ranap/RANAP_PositioningDataDiscriminator.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PositioningDataDiscriminator.h"
+
+int
+RANAP_PositioningDataDiscriminator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_PositioningDataDiscriminator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PositioningDataDiscriminator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningDataDiscriminator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PositioningDataDiscriminator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningDataDiscriminator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PositioningDataDiscriminator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningDataDiscriminator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PositioningDataDiscriminator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PositioningDataDiscriminator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PositioningDataDiscriminator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositioningDataDiscriminator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PositioningDataDiscriminator_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PositioningDataDiscriminator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningDataDiscriminator = {
+	"RANAP_PositioningDataDiscriminator",
+	"RANAP_PositioningDataDiscriminator",
+	RANAP_PositioningDataDiscriminator_free,
+	RANAP_PositioningDataDiscriminator_print,
+	RANAP_PositioningDataDiscriminator_constraint,
+	RANAP_PositioningDataDiscriminator_decode_ber,
+	RANAP_PositioningDataDiscriminator_encode_der,
+	RANAP_PositioningDataDiscriminator_decode_xer,
+	RANAP_PositioningDataDiscriminator_encode_xer,
+	RANAP_PositioningDataDiscriminator_decode_uper,
+	RANAP_PositioningDataDiscriminator_encode_uper,
+	RANAP_PositioningDataDiscriminator_decode_aper,
+	RANAP_PositioningDataDiscriminator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PositioningDataDiscriminator_tags_1,
+	sizeof(asn_DEF_RANAP_PositioningDataDiscriminator_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningDataDiscriminator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PositioningDataDiscriminator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PositioningDataDiscriminator_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningDataDiscriminator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PositioningDataDiscriminator_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_PositioningDataDiscriminator.h b/src/ranap/RANAP_PositioningDataDiscriminator.h
new file mode 100644
index 0000000..8e9da75
--- /dev/null
+++ b/src/ranap/RANAP_PositioningDataDiscriminator.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PositioningDataDiscriminator_H_
+#define	_RANAP_PositioningDataDiscriminator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PositioningDataDiscriminator */
+typedef BIT_STRING_t	 RANAP_PositioningDataDiscriminator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningDataDiscriminator;
+asn_struct_free_f RANAP_PositioningDataDiscriminator_free;
+asn_struct_print_f RANAP_PositioningDataDiscriminator_print;
+asn_constr_check_f RANAP_PositioningDataDiscriminator_constraint;
+ber_type_decoder_f RANAP_PositioningDataDiscriminator_decode_ber;
+der_type_encoder_f RANAP_PositioningDataDiscriminator_encode_der;
+xer_type_decoder_f RANAP_PositioningDataDiscriminator_decode_xer;
+xer_type_encoder_f RANAP_PositioningDataDiscriminator_encode_xer;
+per_type_decoder_f RANAP_PositioningDataDiscriminator_decode_uper;
+per_type_encoder_f RANAP_PositioningDataDiscriminator_encode_uper;
+per_type_decoder_f RANAP_PositioningDataDiscriminator_decode_aper;
+per_type_encoder_f RANAP_PositioningDataDiscriminator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PositioningDataDiscriminator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PositioningDataSet.c b/src/ranap/RANAP_PositioningDataSet.c
new file mode 100644
index 0000000..10ed3b1
--- /dev/null
+++ b/src/ranap/RANAP_PositioningDataSet.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PositioningDataSet.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_PositioningDataSet_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 4,  4,  1l,  9l }	/* (SIZE(1..9)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PositioningDataSet_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_PositioningMethodAndUsage,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PositioningDataSet_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_PositioningDataSet_specs_1 = {
+	sizeof(struct RANAP_PositioningDataSet),
+	offsetof(struct RANAP_PositioningDataSet, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningDataSet = {
+	"RANAP_PositioningDataSet",
+	"RANAP_PositioningDataSet",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PositioningDataSet_tags_1,
+	sizeof(asn_DEF_RANAP_PositioningDataSet_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningDataSet_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PositioningDataSet_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PositioningDataSet_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningDataSet_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PositioningDataSet_constr_1,
+	asn_MBR_RANAP_PositioningDataSet_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_PositioningDataSet_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PositioningDataSet.h b/src/ranap/RANAP_PositioningDataSet.h
new file mode 100644
index 0000000..1445dda
--- /dev/null
+++ b/src/ranap/RANAP_PositioningDataSet.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PositioningDataSet_H_
+#define	_RANAP_PositioningDataSet_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PositioningMethodAndUsage.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PositioningDataSet */
+typedef struct RANAP_PositioningDataSet {
+	A_SEQUENCE_OF(RANAP_PositioningMethodAndUsage_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PositioningDataSet_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningDataSet;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PositioningDataSet_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PositioningMethodAndUsage.c b/src/ranap/RANAP_PositioningMethodAndUsage.c
new file mode 100644
index 0000000..a42295a
--- /dev/null
+++ b/src/ranap/RANAP_PositioningMethodAndUsage.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PositioningMethodAndUsage.h"
+
+int
+RANAP_PositioningMethodAndUsage_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_PositioningMethodAndUsage_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PositioningMethodAndUsage_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningMethodAndUsage_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PositioningMethodAndUsage_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningMethodAndUsage_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PositioningMethodAndUsage_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningMethodAndUsage_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PositioningMethodAndUsage_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PositioningMethodAndUsage_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PositioningMethodAndUsage_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositioningMethodAndUsage_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PositioningMethodAndUsage_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PositioningMethodAndUsage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningMethodAndUsage = {
+	"RANAP_PositioningMethodAndUsage",
+	"RANAP_PositioningMethodAndUsage",
+	RANAP_PositioningMethodAndUsage_free,
+	RANAP_PositioningMethodAndUsage_print,
+	RANAP_PositioningMethodAndUsage_constraint,
+	RANAP_PositioningMethodAndUsage_decode_ber,
+	RANAP_PositioningMethodAndUsage_encode_der,
+	RANAP_PositioningMethodAndUsage_decode_xer,
+	RANAP_PositioningMethodAndUsage_encode_xer,
+	RANAP_PositioningMethodAndUsage_decode_uper,
+	RANAP_PositioningMethodAndUsage_encode_uper,
+	RANAP_PositioningMethodAndUsage_decode_aper,
+	RANAP_PositioningMethodAndUsage_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PositioningMethodAndUsage_tags_1,
+	sizeof(asn_DEF_RANAP_PositioningMethodAndUsage_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningMethodAndUsage_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PositioningMethodAndUsage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PositioningMethodAndUsage_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningMethodAndUsage_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PositioningMethodAndUsage_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_PositioningMethodAndUsage.h b/src/ranap/RANAP_PositioningMethodAndUsage.h
new file mode 100644
index 0000000..f8306f9
--- /dev/null
+++ b/src/ranap/RANAP_PositioningMethodAndUsage.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PositioningMethodAndUsage_H_
+#define	_RANAP_PositioningMethodAndUsage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PositioningMethodAndUsage */
+typedef OCTET_STRING_t	 RANAP_PositioningMethodAndUsage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningMethodAndUsage;
+asn_struct_free_f RANAP_PositioningMethodAndUsage_free;
+asn_struct_print_f RANAP_PositioningMethodAndUsage_print;
+asn_constr_check_f RANAP_PositioningMethodAndUsage_constraint;
+ber_type_decoder_f RANAP_PositioningMethodAndUsage_decode_ber;
+der_type_encoder_f RANAP_PositioningMethodAndUsage_encode_der;
+xer_type_decoder_f RANAP_PositioningMethodAndUsage_decode_xer;
+xer_type_encoder_f RANAP_PositioningMethodAndUsage_encode_xer;
+per_type_decoder_f RANAP_PositioningMethodAndUsage_decode_uper;
+per_type_encoder_f RANAP_PositioningMethodAndUsage_encode_uper;
+per_type_decoder_f RANAP_PositioningMethodAndUsage_decode_aper;
+per_type_encoder_f RANAP_PositioningMethodAndUsage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PositioningMethodAndUsage_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PositioningPriority.c b/src/ranap/RANAP_PositioningPriority.c
new file mode 100644
index 0000000..061b980
--- /dev/null
+++ b/src/ranap/RANAP_PositioningPriority.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PositioningPriority.h"
+
+int
+RANAP_PositioningPriority_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PositioningPriority_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_PositioningPriority_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PositioningPriority_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningPriority_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PositioningPriority_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningPriority_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PositioningPriority_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PositioningPriority_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PositioningPriority_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PositioningPriority_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PositioningPriority_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PositioningPriority_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PositioningPriority_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_PositioningPriority_value2enum_1[] = {
+	{ 0,	13,	"high-Priority" },
+	{ 1,	15,	"normal-Priority" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_PositioningPriority_enum2value_1[] = {
+	0,	/* high-Priority(0) */
+	1	/* normal-Priority(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_PositioningPriority_specs_1 = {
+	asn_MAP_RANAP_PositioningPriority_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_PositioningPriority_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PositioningPriority_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningPriority = {
+	"RANAP_PositioningPriority",
+	"RANAP_PositioningPriority",
+	RANAP_PositioningPriority_free,
+	RANAP_PositioningPriority_print,
+	RANAP_PositioningPriority_constraint,
+	RANAP_PositioningPriority_decode_ber,
+	RANAP_PositioningPriority_encode_der,
+	RANAP_PositioningPriority_decode_xer,
+	RANAP_PositioningPriority_encode_xer,
+	RANAP_PositioningPriority_decode_uper,
+	RANAP_PositioningPriority_encode_uper,
+	RANAP_PositioningPriority_decode_aper,
+	RANAP_PositioningPriority_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PositioningPriority_tags_1,
+	sizeof(asn_DEF_RANAP_PositioningPriority_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningPriority_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PositioningPriority_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PositioningPriority_tags_1)
+		/sizeof(asn_DEF_RANAP_PositioningPriority_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PositioningPriority_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_PositioningPriority_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PositioningPriority.h b/src/ranap/RANAP_PositioningPriority.h
new file mode 100644
index 0000000..673c475
--- /dev/null
+++ b/src/ranap/RANAP_PositioningPriority.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PositioningPriority_H_
+#define	_RANAP_PositioningPriority_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PositioningPriority {
+	RANAP_PositioningPriority_high_Priority	= 0,
+	RANAP_PositioningPriority_normal_Priority	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_PositioningPriority;
+
+/* RANAP_PositioningPriority */
+typedef long	 RANAP_PositioningPriority_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PositioningPriority;
+asn_struct_free_f RANAP_PositioningPriority_free;
+asn_struct_print_f RANAP_PositioningPriority_print;
+asn_constr_check_f RANAP_PositioningPriority_constraint;
+ber_type_decoder_f RANAP_PositioningPriority_decode_ber;
+der_type_encoder_f RANAP_PositioningPriority_encode_der;
+xer_type_decoder_f RANAP_PositioningPriority_decode_xer;
+xer_type_encoder_f RANAP_PositioningPriority_encode_xer;
+per_type_decoder_f RANAP_PositioningPriority_decode_uper;
+per_type_encoder_f RANAP_PositioningPriority_encode_uper;
+per_type_decoder_f RANAP_PositioningPriority_decode_aper;
+per_type_encoder_f RANAP_PositioningPriority_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PositioningPriority_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Pre-emptionCapability.c b/src/ranap/RANAP_Pre-emptionCapability.c
new file mode 100644
index 0000000..1f8f7ac
--- /dev/null
+++ b/src/ranap/RANAP_Pre-emptionCapability.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Pre-emptionCapability.h"
+
+int
+RANAP_Pre_emptionCapability_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Pre_emptionCapability_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Pre_emptionCapability_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionCapability_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionCapability_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionCapability_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionCapability_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionCapability_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionCapability_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionCapability_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionCapability_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Pre_emptionCapability_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Pre_emptionCapability_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Pre_emptionCapability_value2enum_1[] = {
+	{ 0,	29,	"shall-not-trigger-pre-emption" },
+	{ 1,	23,	"may-trigger-pre-emption" }
+};
+static const unsigned int asn_MAP_RANAP_Pre_emptionCapability_enum2value_1[] = {
+	1,	/* may-trigger-pre-emption(1) */
+	0	/* shall-not-trigger-pre-emption(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Pre_emptionCapability_specs_1 = {
+	asn_MAP_RANAP_Pre_emptionCapability_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Pre_emptionCapability_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Pre_emptionCapability_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Pre_emptionCapability = {
+	"RANAP_Pre-emptionCapability",
+	"RANAP_Pre-emptionCapability",
+	RANAP_Pre_emptionCapability_free,
+	RANAP_Pre_emptionCapability_print,
+	RANAP_Pre_emptionCapability_constraint,
+	RANAP_Pre_emptionCapability_decode_ber,
+	RANAP_Pre_emptionCapability_encode_der,
+	RANAP_Pre_emptionCapability_decode_xer,
+	RANAP_Pre_emptionCapability_encode_xer,
+	RANAP_Pre_emptionCapability_decode_uper,
+	RANAP_Pre_emptionCapability_encode_uper,
+	RANAP_Pre_emptionCapability_decode_aper,
+	RANAP_Pre_emptionCapability_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Pre_emptionCapability_tags_1,
+	sizeof(asn_DEF_RANAP_Pre_emptionCapability_tags_1)
+		/sizeof(asn_DEF_RANAP_Pre_emptionCapability_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Pre_emptionCapability_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Pre_emptionCapability_tags_1)
+		/sizeof(asn_DEF_RANAP_Pre_emptionCapability_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Pre_emptionCapability_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Pre_emptionCapability_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Pre-emptionCapability.h b/src/ranap/RANAP_Pre-emptionCapability.h
new file mode 100644
index 0000000..7bcdc26
--- /dev/null
+++ b/src/ranap/RANAP_Pre-emptionCapability.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Pre_emptionCapability_H_
+#define	_RANAP_Pre_emptionCapability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Pre_emptionCapability {
+	RANAP_Pre_emptionCapability_shall_not_trigger_pre_emption	= 0,
+	RANAP_Pre_emptionCapability_may_trigger_pre_emption	= 1
+} e_RANAP_Pre_emptionCapability;
+
+/* RANAP_Pre-emptionCapability */
+typedef long	 RANAP_Pre_emptionCapability_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Pre_emptionCapability;
+asn_struct_free_f RANAP_Pre_emptionCapability_free;
+asn_struct_print_f RANAP_Pre_emptionCapability_print;
+asn_constr_check_f RANAP_Pre_emptionCapability_constraint;
+ber_type_decoder_f RANAP_Pre_emptionCapability_decode_ber;
+der_type_encoder_f RANAP_Pre_emptionCapability_encode_der;
+xer_type_decoder_f RANAP_Pre_emptionCapability_decode_xer;
+xer_type_encoder_f RANAP_Pre_emptionCapability_encode_xer;
+per_type_decoder_f RANAP_Pre_emptionCapability_decode_uper;
+per_type_encoder_f RANAP_Pre_emptionCapability_encode_uper;
+per_type_decoder_f RANAP_Pre_emptionCapability_decode_aper;
+per_type_encoder_f RANAP_Pre_emptionCapability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Pre_emptionCapability_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Pre-emptionVulnerability.c b/src/ranap/RANAP_Pre-emptionVulnerability.c
new file mode 100644
index 0000000..6f6067a
--- /dev/null
+++ b/src/ranap/RANAP_Pre-emptionVulnerability.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Pre-emptionVulnerability.h"
+
+int
+RANAP_Pre_emptionVulnerability_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Pre_emptionVulnerability_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Pre_emptionVulnerability_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionVulnerability_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionVulnerability_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionVulnerability_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionVulnerability_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionVulnerability_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionVulnerability_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Pre_emptionVulnerability_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Pre_emptionVulnerability_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Pre_emptionVulnerability_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Pre_emptionVulnerability_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Pre_emptionVulnerability_value2enum_1[] = {
+	{ 0,	16,	"not-pre-emptable" },
+	{ 1,	12,	"pre-emptable" }
+};
+static const unsigned int asn_MAP_RANAP_Pre_emptionVulnerability_enum2value_1[] = {
+	0,	/* not-pre-emptable(0) */
+	1	/* pre-emptable(1) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Pre_emptionVulnerability_specs_1 = {
+	asn_MAP_RANAP_Pre_emptionVulnerability_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Pre_emptionVulnerability_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Pre_emptionVulnerability_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Pre_emptionVulnerability = {
+	"RANAP_Pre-emptionVulnerability",
+	"RANAP_Pre-emptionVulnerability",
+	RANAP_Pre_emptionVulnerability_free,
+	RANAP_Pre_emptionVulnerability_print,
+	RANAP_Pre_emptionVulnerability_constraint,
+	RANAP_Pre_emptionVulnerability_decode_ber,
+	RANAP_Pre_emptionVulnerability_encode_der,
+	RANAP_Pre_emptionVulnerability_decode_xer,
+	RANAP_Pre_emptionVulnerability_encode_xer,
+	RANAP_Pre_emptionVulnerability_decode_uper,
+	RANAP_Pre_emptionVulnerability_encode_uper,
+	RANAP_Pre_emptionVulnerability_decode_aper,
+	RANAP_Pre_emptionVulnerability_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Pre_emptionVulnerability_tags_1,
+	sizeof(asn_DEF_RANAP_Pre_emptionVulnerability_tags_1)
+		/sizeof(asn_DEF_RANAP_Pre_emptionVulnerability_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Pre_emptionVulnerability_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Pre_emptionVulnerability_tags_1)
+		/sizeof(asn_DEF_RANAP_Pre_emptionVulnerability_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Pre_emptionVulnerability_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Pre_emptionVulnerability_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Pre-emptionVulnerability.h b/src/ranap/RANAP_Pre-emptionVulnerability.h
new file mode 100644
index 0000000..d8ec7ee
--- /dev/null
+++ b/src/ranap/RANAP_Pre-emptionVulnerability.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Pre_emptionVulnerability_H_
+#define	_RANAP_Pre_emptionVulnerability_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Pre_emptionVulnerability {
+	RANAP_Pre_emptionVulnerability_not_pre_emptable	= 0,
+	RANAP_Pre_emptionVulnerability_pre_emptable	= 1
+} e_RANAP_Pre_emptionVulnerability;
+
+/* RANAP_Pre-emptionVulnerability */
+typedef long	 RANAP_Pre_emptionVulnerability_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Pre_emptionVulnerability;
+asn_struct_free_f RANAP_Pre_emptionVulnerability_free;
+asn_struct_print_f RANAP_Pre_emptionVulnerability_print;
+asn_constr_check_f RANAP_Pre_emptionVulnerability_constraint;
+ber_type_decoder_f RANAP_Pre_emptionVulnerability_decode_ber;
+der_type_encoder_f RANAP_Pre_emptionVulnerability_encode_der;
+xer_type_decoder_f RANAP_Pre_emptionVulnerability_decode_xer;
+xer_type_encoder_f RANAP_Pre_emptionVulnerability_encode_xer;
+per_type_decoder_f RANAP_Pre_emptionVulnerability_decode_uper;
+per_type_encoder_f RANAP_Pre_emptionVulnerability_encode_uper;
+per_type_decoder_f RANAP_Pre_emptionVulnerability_decode_aper;
+per_type_encoder_f RANAP_Pre_emptionVulnerability_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Pre_emptionVulnerability_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Presence.c b/src/ranap/RANAP_Presence.c
new file mode 100644
index 0000000..8d7bab5
--- /dev/null
+++ b/src/ranap/RANAP_Presence.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_Presence.h"
+
+int
+RANAP_Presence_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Presence_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Presence_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Presence_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Presence_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Presence_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Presence_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Presence_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Presence_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Presence_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Presence_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Presence_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Presence_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  2l }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Presence_value2enum_1[] = {
+	{ 0,	8,	"optional" },
+	{ 1,	11,	"conditional" },
+	{ 2,	9,	"mandatory" }
+};
+static const unsigned int asn_MAP_RANAP_Presence_enum2value_1[] = {
+	1,	/* conditional(1) */
+	2,	/* mandatory(2) */
+	0	/* optional(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Presence_specs_1 = {
+	asn_MAP_RANAP_Presence_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Presence_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Presence_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Presence = {
+	"RANAP_Presence",
+	"RANAP_Presence",
+	RANAP_Presence_free,
+	RANAP_Presence_print,
+	RANAP_Presence_constraint,
+	RANAP_Presence_decode_ber,
+	RANAP_Presence_encode_der,
+	RANAP_Presence_decode_xer,
+	RANAP_Presence_encode_xer,
+	RANAP_Presence_decode_uper,
+	RANAP_Presence_encode_uper,
+	RANAP_Presence_decode_aper,
+	RANAP_Presence_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Presence_tags_1,
+	sizeof(asn_DEF_RANAP_Presence_tags_1)
+		/sizeof(asn_DEF_RANAP_Presence_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Presence_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Presence_tags_1)
+		/sizeof(asn_DEF_RANAP_Presence_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Presence_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Presence_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Presence.h b/src/ranap/RANAP_Presence.h
new file mode 100644
index 0000000..ee14482
--- /dev/null
+++ b/src/ranap/RANAP_Presence.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_Presence_H_
+#define	_RANAP_Presence_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Presence {
+	RANAP_Presence_optional	= 0,
+	RANAP_Presence_conditional	= 1,
+	RANAP_Presence_mandatory	= 2
+} e_RANAP_Presence;
+
+/* RANAP_Presence */
+typedef long	 RANAP_Presence_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Presence;
+asn_struct_free_f RANAP_Presence_free;
+asn_struct_print_f RANAP_Presence_print;
+asn_constr_check_f RANAP_Presence_constraint;
+ber_type_decoder_f RANAP_Presence_decode_ber;
+der_type_encoder_f RANAP_Presence_encode_der;
+xer_type_decoder_f RANAP_Presence_decode_xer;
+xer_type_encoder_f RANAP_Presence_encode_xer;
+per_type_decoder_f RANAP_Presence_decode_uper;
+per_type_encoder_f RANAP_Presence_encode_uper;
+per_type_decoder_f RANAP_Presence_decode_aper;
+per_type_encoder_f RANAP_Presence_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Presence_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Priority-Class-Indicator.c b/src/ranap/RANAP_Priority-Class-Indicator.c
new file mode 100644
index 0000000..5c84304
--- /dev/null
+++ b/src/ranap/RANAP_Priority-Class-Indicator.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Priority-Class-Indicator.h"
+
+int
+RANAP_Priority_Class_Indicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_Priority_Class_Indicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Priority_Class_Indicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Priority_Class_Indicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Priority_Class_Indicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Priority_Class_Indicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Priority_Class_Indicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Priority_Class_Indicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Priority_Class_Indicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Priority_Class_Indicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Priority_Class_Indicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Priority_Class_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Priority_Class_Indicator_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Priority_Class_Indicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Priority_Class_Indicator = {
+	"RANAP_Priority-Class-Indicator",
+	"RANAP_Priority-Class-Indicator",
+	RANAP_Priority_Class_Indicator_free,
+	RANAP_Priority_Class_Indicator_print,
+	RANAP_Priority_Class_Indicator_constraint,
+	RANAP_Priority_Class_Indicator_decode_ber,
+	RANAP_Priority_Class_Indicator_encode_der,
+	RANAP_Priority_Class_Indicator_decode_xer,
+	RANAP_Priority_Class_Indicator_encode_xer,
+	RANAP_Priority_Class_Indicator_decode_uper,
+	RANAP_Priority_Class_Indicator_encode_uper,
+	RANAP_Priority_Class_Indicator_decode_aper,
+	RANAP_Priority_Class_Indicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Priority_Class_Indicator_tags_1,
+	sizeof(asn_DEF_RANAP_Priority_Class_Indicator_tags_1)
+		/sizeof(asn_DEF_RANAP_Priority_Class_Indicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Priority_Class_Indicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Priority_Class_Indicator_tags_1)
+		/sizeof(asn_DEF_RANAP_Priority_Class_Indicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Priority_Class_Indicator_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Priority-Class-Indicator.h b/src/ranap/RANAP_Priority-Class-Indicator.h
new file mode 100644
index 0000000..932cd87
--- /dev/null
+++ b/src/ranap/RANAP_Priority-Class-Indicator.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Priority_Class_Indicator_H_
+#define	_RANAP_Priority_Class_Indicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Priority-Class-Indicator */
+typedef BIT_STRING_t	 RANAP_Priority_Class_Indicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Priority_Class_Indicator;
+asn_struct_free_f RANAP_Priority_Class_Indicator_free;
+asn_struct_print_f RANAP_Priority_Class_Indicator_print;
+asn_constr_check_f RANAP_Priority_Class_Indicator_constraint;
+ber_type_decoder_f RANAP_Priority_Class_Indicator_decode_ber;
+der_type_encoder_f RANAP_Priority_Class_Indicator_encode_der;
+xer_type_decoder_f RANAP_Priority_Class_Indicator_decode_xer;
+xer_type_encoder_f RANAP_Priority_Class_Indicator_encode_xer;
+per_type_decoder_f RANAP_Priority_Class_Indicator_decode_uper;
+per_type_encoder_f RANAP_Priority_Class_Indicator_encode_uper;
+per_type_decoder_f RANAP_Priority_Class_Indicator_decode_aper;
+per_type_encoder_f RANAP_Priority_Class_Indicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Priority_Class_Indicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PriorityLevel.c b/src/ranap/RANAP_PriorityLevel.c
new file mode 100644
index 0000000..e36bae5
--- /dev/null
+++ b/src/ranap/RANAP_PriorityLevel.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_PriorityLevel.h"
+
+int
+RANAP_PriorityLevel_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 15l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_PriorityLevel_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_PriorityLevel_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_PriorityLevel_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PriorityLevel_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_PriorityLevel_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PriorityLevel_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_PriorityLevel_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_PriorityLevel_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_PriorityLevel_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_PriorityLevel_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_PriorityLevel_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_PriorityLevel_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_PriorityLevel_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  0l,  15l }	/* (0..15) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PriorityLevel_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PriorityLevel = {
+	"RANAP_PriorityLevel",
+	"RANAP_PriorityLevel",
+	RANAP_PriorityLevel_free,
+	RANAP_PriorityLevel_print,
+	RANAP_PriorityLevel_constraint,
+	RANAP_PriorityLevel_decode_ber,
+	RANAP_PriorityLevel_encode_der,
+	RANAP_PriorityLevel_decode_xer,
+	RANAP_PriorityLevel_encode_xer,
+	RANAP_PriorityLevel_decode_uper,
+	RANAP_PriorityLevel_encode_uper,
+	RANAP_PriorityLevel_decode_aper,
+	RANAP_PriorityLevel_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PriorityLevel_tags_1,
+	sizeof(asn_DEF_RANAP_PriorityLevel_tags_1)
+		/sizeof(asn_DEF_RANAP_PriorityLevel_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PriorityLevel_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PriorityLevel_tags_1)
+		/sizeof(asn_DEF_RANAP_PriorityLevel_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_PriorityLevel_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_PriorityLevel.h b/src/ranap/RANAP_PriorityLevel.h
new file mode 100644
index 0000000..75bc5d7
--- /dev/null
+++ b/src/ranap/RANAP_PriorityLevel.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_PriorityLevel_H_
+#define	_RANAP_PriorityLevel_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PriorityLevel {
+	RANAP_PriorityLevel_spare	= 0,
+	RANAP_PriorityLevel_highest	= 1,
+	RANAP_PriorityLevel_lowest	= 14,
+	RANAP_PriorityLevel_no_priority	= 15
+} e_RANAP_PriorityLevel;
+
+/* RANAP_PriorityLevel */
+typedef long	 RANAP_PriorityLevel_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PriorityLevel;
+asn_struct_free_f RANAP_PriorityLevel_free;
+asn_struct_print_f RANAP_PriorityLevel_print;
+asn_constr_check_f RANAP_PriorityLevel_constraint;
+ber_type_decoder_f RANAP_PriorityLevel_decode_ber;
+der_type_encoder_f RANAP_PriorityLevel_encode_der;
+xer_type_decoder_f RANAP_PriorityLevel_decode_xer;
+xer_type_encoder_f RANAP_PriorityLevel_encode_xer;
+per_type_decoder_f RANAP_PriorityLevel_decode_uper;
+per_type_encoder_f RANAP_PriorityLevel_encode_uper;
+per_type_decoder_f RANAP_PriorityLevel_decode_aper;
+per_type_encoder_f RANAP_PriorityLevel_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PriorityLevel_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PrivateIE-ID.c b/src/ranap/RANAP_PrivateIE-ID.c
new file mode 100644
index 0000000..34f6205
--- /dev/null
+++ b/src/ranap/RANAP_PrivateIE-ID.c
@@ -0,0 +1,102 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_PrivateIE-ID.h"
+
+static int
+memb_local_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_local_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_type_RANAP_PrivateIE_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_PrivateIE_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PrivateIE_ID, choice.local),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_local_constraint_1,
+		&asn_PER_memb_local_constr_2,
+		0,
+		"local"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PrivateIE_ID, choice.global),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OBJECT_IDENTIFIER,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"global"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_PrivateIE_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* local */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* global */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_PrivateIE_ID_specs_1 = {
+	sizeof(struct RANAP_PrivateIE_ID),
+	offsetof(struct RANAP_PrivateIE_ID, _asn_ctx),
+	offsetof(struct RANAP_PrivateIE_ID, present),
+	sizeof(((struct RANAP_PrivateIE_ID *)0)->present),
+	asn_MAP_RANAP_PrivateIE_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	-1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PrivateIE_ID = {
+	"RANAP_PrivateIE-ID",
+	"RANAP_PrivateIE-ID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_PrivateIE_ID_constr_1,
+	asn_MBR_RANAP_PrivateIE_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_PrivateIE_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PrivateIE-ID.h b/src/ranap/RANAP_PrivateIE-ID.h
new file mode 100644
index 0000000..59a28de
--- /dev/null
+++ b/src/ranap/RANAP_PrivateIE-ID.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_PrivateIE_ID_H_
+#define	_RANAP_PrivateIE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include <OBJECT_IDENTIFIER.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_PrivateIE_ID_PR {
+	RANAP_PrivateIE_ID_PR_NOTHING,	/* No components present */
+	RANAP_PrivateIE_ID_PR_local,
+	RANAP_PrivateIE_ID_PR_global
+} RANAP_PrivateIE_ID_PR;
+
+/* RANAP_PrivateIE-ID */
+typedef struct RANAP_PrivateIE_ID {
+	RANAP_PrivateIE_ID_PR present;
+	union RANAP_PrivateIE_ID_u {
+		long	 local;
+		OBJECT_IDENTIFIER_t	 global;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PrivateIE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PrivateIE_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PrivateIE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_PrivateMessage.c b/src/ranap/RANAP_PrivateMessage.c
new file mode 100644
index 0000000..52b5ec2
--- /dev/null
+++ b/src/ranap/RANAP_PrivateMessage.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_PrivateMessage.h"
+
+static int
+memb_privateMessage_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_privateMessage_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_privateMessage_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_privateMessage_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_privateMessage_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_privateMessage_ies_specs_2 = {
+	sizeof(struct privateMessage_ies),
+	offsetof(struct privateMessage_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_privateMessage_ies_2 = {
+	"privateMessage-ies",
+	"privateMessage-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_privateMessage_ies_tags_2,
+	sizeof(asn_DEF_privateMessage_ies_tags_2)
+		/sizeof(asn_DEF_privateMessage_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_privateMessage_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_privateMessage_ies_tags_2)
+		/sizeof(asn_DEF_privateMessage_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_privateMessage_ies_constr_2,
+	asn_MBR_privateMessage_ies_2,
+	1,	/* Single element */
+	&asn_SPC_privateMessage_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_PrivateMessage_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_PrivateMessage, privateMessage_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_privateMessage_ies_2,
+		memb_privateMessage_ies_constraint_1,
+		&asn_PER_memb_privateMessage_ies_constr_2,
+		0,
+		"privateMessage-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_PrivateMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_PrivateMessage_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* privateMessage-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_PrivateMessage_specs_1 = {
+	sizeof(struct RANAP_PrivateMessage),
+	offsetof(struct RANAP_PrivateMessage, _asn_ctx),
+	asn_MAP_RANAP_PrivateMessage_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_PrivateMessage = {
+	"RANAP_PrivateMessage",
+	"RANAP_PrivateMessage",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_PrivateMessage_tags_1,
+	sizeof(asn_DEF_RANAP_PrivateMessage_tags_1)
+		/sizeof(asn_DEF_RANAP_PrivateMessage_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_PrivateMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_PrivateMessage_tags_1)
+		/sizeof(asn_DEF_RANAP_PrivateMessage_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_PrivateMessage_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_PrivateMessage_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_PrivateMessage.h b/src/ranap/RANAP_PrivateMessage.h
new file mode 100644
index 0000000..37051f3
--- /dev/null
+++ b/src/ranap/RANAP_PrivateMessage.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_PrivateMessage_H_
+#define	_RANAP_PrivateMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_PrivateMessage */
+typedef struct RANAP_PrivateMessage {
+	struct privateMessage_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} privateMessage_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_PrivateMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_PrivateMessage;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_PrivateMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ProcedureCode.c b/src/ranap/RANAP_ProcedureCode.c
new file mode 100644
index 0000000..e76adc5
--- /dev/null
+++ b/src/ranap/RANAP_ProcedureCode.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_ProcedureCode.h"
+
+int
+RANAP_ProcedureCode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ProcedureCode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_ProcedureCode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ProcedureCode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProcedureCode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ProcedureCode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProcedureCode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ProcedureCode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProcedureCode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ProcedureCode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ProcedureCode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ProcedureCode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ProcedureCode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ProcedureCode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ProcedureCode = {
+	"RANAP_ProcedureCode",
+	"RANAP_ProcedureCode",
+	RANAP_ProcedureCode_free,
+	RANAP_ProcedureCode_print,
+	RANAP_ProcedureCode_constraint,
+	RANAP_ProcedureCode_decode_ber,
+	RANAP_ProcedureCode_encode_der,
+	RANAP_ProcedureCode_decode_xer,
+	RANAP_ProcedureCode_encode_xer,
+	RANAP_ProcedureCode_decode_uper,
+	RANAP_ProcedureCode_encode_uper,
+	RANAP_ProcedureCode_decode_aper,
+	RANAP_ProcedureCode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ProcedureCode_tags_1,
+	sizeof(asn_DEF_RANAP_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_RANAP_ProcedureCode_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ProcedureCode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_RANAP_ProcedureCode_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ProcedureCode_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ProcedureCode.h b/src/ranap/RANAP_ProcedureCode.h
new file mode 100644
index 0000000..9a7763c
--- /dev/null
+++ b/src/ranap/RANAP_ProcedureCode.h
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_ProcedureCode_H_
+#define	_RANAP_ProcedureCode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ProcedureCode {
+	RANAP_ProcedureCode_id_RAB_Assignment	= 0,
+	RANAP_ProcedureCode_id_Iu_Release	= 1,
+	RANAP_ProcedureCode_id_RelocationPreparation	= 2,
+	RANAP_ProcedureCode_id_RelocationResourceAllocation	= 3,
+	RANAP_ProcedureCode_id_RelocationCancel	= 4,
+	RANAP_ProcedureCode_id_SRNS_ContextTransfer	= 5,
+	RANAP_ProcedureCode_id_SecurityModeControl	= 6,
+	RANAP_ProcedureCode_id_DataVolumeReport	= 7,
+	RANAP_ProcedureCode_id_Reset	= 9,
+	RANAP_ProcedureCode_id_RAB_ReleaseRequest	= 10,
+	RANAP_ProcedureCode_id_Iu_ReleaseRequest	= 11,
+	RANAP_ProcedureCode_id_RelocationDetect	= 12,
+	RANAP_ProcedureCode_id_RelocationComplete	= 13,
+	RANAP_ProcedureCode_id_Paging	= 14,
+	RANAP_ProcedureCode_id_CommonID	= 15,
+	RANAP_ProcedureCode_id_CN_InvokeTrace	= 16,
+	RANAP_ProcedureCode_id_LocationReportingControl	= 17,
+	RANAP_ProcedureCode_id_LocationReport	= 18,
+	RANAP_ProcedureCode_id_InitialUE_Message	= 19,
+	RANAP_ProcedureCode_id_DirectTransfer	= 20,
+	RANAP_ProcedureCode_id_OverloadControl	= 21,
+	RANAP_ProcedureCode_id_ErrorIndication	= 22,
+	RANAP_ProcedureCode_id_SRNS_DataForward	= 23,
+	RANAP_ProcedureCode_id_ForwardSRNS_Context	= 24,
+	RANAP_ProcedureCode_id_privateMessage	= 25,
+	RANAP_ProcedureCode_id_CN_DeactivateTrace	= 26,
+	RANAP_ProcedureCode_id_ResetResource	= 27,
+	RANAP_ProcedureCode_id_RANAP_Relocation	= 28,
+	RANAP_ProcedureCode_id_RAB_ModifyRequest	= 29,
+	RANAP_ProcedureCode_id_LocationRelatedData	= 30,
+	RANAP_ProcedureCode_id_InformationTransfer	= 31,
+	RANAP_ProcedureCode_id_UESpecificInformation	= 32,
+	RANAP_ProcedureCode_id_UplinkInformationExchange	= 33,
+	RANAP_ProcedureCode_id_DirectInformationTransfer	= 34,
+	RANAP_ProcedureCode_id_MBMSSessionStart	= 35,
+	RANAP_ProcedureCode_id_MBMSSessionUpdate	= 36,
+	RANAP_ProcedureCode_id_MBMSSessionStop	= 37,
+	RANAP_ProcedureCode_id_MBMSUELinking	= 38,
+	RANAP_ProcedureCode_id_MBMSRegistration	= 39,
+	RANAP_ProcedureCode_id_MBMSCNDe_Registration_Procedure	= 40,
+	RANAP_ProcedureCode_id_MBMSRABEstablishmentIndication	= 41,
+	RANAP_ProcedureCode_id_MBMSRABRelease	= 42,
+	RANAP_ProcedureCode_id_enhancedRelocationComplete	= 43,
+	RANAP_ProcedureCode_id_enhancedRelocationCompleteConfirm	= 44,
+	RANAP_ProcedureCode_id_RANAPenhancedRelocation	= 45,
+	RANAP_ProcedureCode_id_SRVCCPreparation	= 46,
+	RANAP_ProcedureCode_id_UeRadioCapabilityMatch	= 47
+} e_RANAP_ProcedureCode;
+
+/* RANAP_ProcedureCode */
+typedef long	 RANAP_ProcedureCode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ProcedureCode;
+asn_struct_free_f RANAP_ProcedureCode_free;
+asn_struct_print_f RANAP_ProcedureCode_print;
+asn_constr_check_f RANAP_ProcedureCode_constraint;
+ber_type_decoder_f RANAP_ProcedureCode_decode_ber;
+der_type_encoder_f RANAP_ProcedureCode_encode_der;
+xer_type_decoder_f RANAP_ProcedureCode_decode_xer;
+xer_type_encoder_f RANAP_ProcedureCode_encode_xer;
+per_type_decoder_f RANAP_ProcedureCode_decode_uper;
+per_type_encoder_f RANAP_ProcedureCode_encode_uper;
+per_type_decoder_f RANAP_ProcedureCode_decode_aper;
+per_type_encoder_f RANAP_ProcedureCode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ProcedureCode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ProtocolExtensionID.c b/src/ranap/RANAP_ProtocolExtensionID.c
new file mode 100644
index 0000000..b7bd0a3
--- /dev/null
+++ b/src/ranap/RANAP_ProtocolExtensionID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_ProtocolExtensionID.h"
+
+int
+RANAP_ProtocolExtensionID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_ProtocolExtensionID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ProtocolExtensionID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolExtensionID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolExtensionID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolExtensionID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolExtensionID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolExtensionID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolExtensionID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolExtensionID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolExtensionID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ProtocolExtensionID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ProtocolExtensionID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ProtocolExtensionID = {
+	"RANAP_ProtocolExtensionID",
+	"RANAP_ProtocolExtensionID",
+	RANAP_ProtocolExtensionID_free,
+	RANAP_ProtocolExtensionID_print,
+	RANAP_ProtocolExtensionID_constraint,
+	RANAP_ProtocolExtensionID_decode_ber,
+	RANAP_ProtocolExtensionID_encode_der,
+	RANAP_ProtocolExtensionID_decode_xer,
+	RANAP_ProtocolExtensionID_encode_xer,
+	RANAP_ProtocolExtensionID_decode_uper,
+	RANAP_ProtocolExtensionID_encode_uper,
+	RANAP_ProtocolExtensionID_decode_aper,
+	RANAP_ProtocolExtensionID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ProtocolExtensionID_tags_1,
+	sizeof(asn_DEF_RANAP_ProtocolExtensionID_tags_1)
+		/sizeof(asn_DEF_RANAP_ProtocolExtensionID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ProtocolExtensionID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ProtocolExtensionID_tags_1)
+		/sizeof(asn_DEF_RANAP_ProtocolExtensionID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ProtocolExtensionID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ProtocolExtensionID.h b/src/ranap/RANAP_ProtocolExtensionID.h
new file mode 100644
index 0000000..83c5226
--- /dev/null
+++ b/src/ranap/RANAP_ProtocolExtensionID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_ProtocolExtensionID_H_
+#define	_RANAP_ProtocolExtensionID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ProtocolExtensionID */
+typedef long	 RANAP_ProtocolExtensionID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ProtocolExtensionID;
+asn_struct_free_f RANAP_ProtocolExtensionID_free;
+asn_struct_print_f RANAP_ProtocolExtensionID_print;
+asn_constr_check_f RANAP_ProtocolExtensionID_constraint;
+ber_type_decoder_f RANAP_ProtocolExtensionID_decode_ber;
+der_type_encoder_f RANAP_ProtocolExtensionID_encode_der;
+xer_type_decoder_f RANAP_ProtocolExtensionID_decode_xer;
+xer_type_encoder_f RANAP_ProtocolExtensionID_encode_xer;
+per_type_decoder_f RANAP_ProtocolExtensionID_decode_uper;
+per_type_encoder_f RANAP_ProtocolExtensionID_encode_uper;
+per_type_decoder_f RANAP_ProtocolExtensionID_decode_aper;
+per_type_encoder_f RANAP_ProtocolExtensionID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ProtocolExtensionID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ProtocolIE-ID.c b/src/ranap/RANAP_ProtocolIE-ID.c
new file mode 100644
index 0000000..802b811
--- /dev/null
+++ b/src/ranap/RANAP_ProtocolIE-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_ProtocolIE-ID.h"
+
+int
+RANAP_ProtocolIE_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_ProtocolIE_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ProtocolIE_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolIE_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolIE_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolIE_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolIE_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolIE_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolIE_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ProtocolIE_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ProtocolIE_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ProtocolIE_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ProtocolIE_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ProtocolIE_ID = {
+	"RANAP_ProtocolIE-ID",
+	"RANAP_ProtocolIE-ID",
+	RANAP_ProtocolIE_ID_free,
+	RANAP_ProtocolIE_ID_print,
+	RANAP_ProtocolIE_ID_constraint,
+	RANAP_ProtocolIE_ID_decode_ber,
+	RANAP_ProtocolIE_ID_encode_der,
+	RANAP_ProtocolIE_ID_decode_xer,
+	RANAP_ProtocolIE_ID_encode_xer,
+	RANAP_ProtocolIE_ID_decode_uper,
+	RANAP_ProtocolIE_ID_encode_uper,
+	RANAP_ProtocolIE_ID_decode_aper,
+	RANAP_ProtocolIE_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ProtocolIE_ID_tags_1,
+	sizeof(asn_DEF_RANAP_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_ProtocolIE_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ProtocolIE_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_ProtocolIE_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ProtocolIE_ID_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_ProtocolIE-ID.h b/src/ranap/RANAP_ProtocolIE-ID.h
new file mode 100644
index 0000000..9dbbc03
--- /dev/null
+++ b/src/ranap/RANAP_ProtocolIE-ID.h
@@ -0,0 +1,318 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_ProtocolIE_ID_H_
+#define	_RANAP_ProtocolIE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ProtocolIE_ID {
+	RANAP_ProtocolIE_ID_id_AreaIdentity	= 0,
+	RANAP_ProtocolIE_ID_id_CN_DomainIndicator	= 3,
+	RANAP_ProtocolIE_ID_id_Cause	= 4,
+	RANAP_ProtocolIE_ID_id_ChosenEncryptionAlgorithm	= 5,
+	RANAP_ProtocolIE_ID_id_ChosenIntegrityProtectionAlgorithm	= 6,
+	RANAP_ProtocolIE_ID_id_ClassmarkInformation2	= 7,
+	RANAP_ProtocolIE_ID_id_ClassmarkInformation3	= 8,
+	RANAP_ProtocolIE_ID_id_CriticalityDiagnostics	= 9,
+	RANAP_ProtocolIE_ID_id_DL_GTP_PDU_SequenceNumber	= 10,
+	RANAP_ProtocolIE_ID_id_EncryptionInformation	= 11,
+	RANAP_ProtocolIE_ID_id_IntegrityProtectionInformation	= 12,
+	RANAP_ProtocolIE_ID_id_IuTransportAssociation	= 13,
+	RANAP_ProtocolIE_ID_id_L3_Information	= 14,
+	RANAP_ProtocolIE_ID_id_LAI	= 15,
+	RANAP_ProtocolIE_ID_id_NAS_PDU	= 16,
+	RANAP_ProtocolIE_ID_id_NonSearchingIndication	= 17,
+	RANAP_ProtocolIE_ID_id_NumberOfSteps	= 18,
+	RANAP_ProtocolIE_ID_id_OMC_ID	= 19,
+	RANAP_ProtocolIE_ID_id_OldBSS_ToNewBSS_Information	= 20,
+	RANAP_ProtocolIE_ID_id_PagingAreaID	= 21,
+	RANAP_ProtocolIE_ID_id_PagingCause	= 22,
+	RANAP_ProtocolIE_ID_id_PermanentNAS_UE_ID	= 23,
+	RANAP_ProtocolIE_ID_id_RAB_ContextItem	= 24,
+	RANAP_ProtocolIE_ID_id_RAB_ContextList	= 25,
+	RANAP_ProtocolIE_ID_id_RAB_DataForwardingItem	= 26,
+	RANAP_ProtocolIE_ID_id_RAB_DataForwardingItem_SRNS_CtxReq	= 27,
+	RANAP_ProtocolIE_ID_id_RAB_DataForwardingList	= 28,
+	RANAP_ProtocolIE_ID_id_RAB_DataForwardingList_SRNS_CtxReq	= 29,
+	RANAP_ProtocolIE_ID_id_RAB_DataVolumeReportItem	= 30,
+	RANAP_ProtocolIE_ID_id_RAB_DataVolumeReportList	= 31,
+	RANAP_ProtocolIE_ID_id_RAB_DataVolumeReportRequestItem	= 32,
+	RANAP_ProtocolIE_ID_id_RAB_DataVolumeReportRequestList	= 33,
+	RANAP_ProtocolIE_ID_id_RAB_FailedItem	= 34,
+	RANAP_ProtocolIE_ID_id_RAB_FailedList	= 35,
+	RANAP_ProtocolIE_ID_id_RAB_ID	= 36,
+	RANAP_ProtocolIE_ID_id_RAB_QueuedItem	= 37,
+	RANAP_ProtocolIE_ID_id_RAB_QueuedList	= 38,
+	RANAP_ProtocolIE_ID_id_RAB_ReleaseFailedList	= 39,
+	RANAP_ProtocolIE_ID_id_RAB_ReleaseItem	= 40,
+	RANAP_ProtocolIE_ID_id_RAB_ReleaseList	= 41,
+	RANAP_ProtocolIE_ID_id_RAB_ReleasedItem	= 42,
+	RANAP_ProtocolIE_ID_id_RAB_ReleasedList	= 43,
+	RANAP_ProtocolIE_ID_id_RAB_ReleasedList_IuRelComp	= 44,
+	RANAP_ProtocolIE_ID_id_RAB_RelocationReleaseItem	= 45,
+	RANAP_ProtocolIE_ID_id_RAB_RelocationReleaseList	= 46,
+	RANAP_ProtocolIE_ID_id_RAB_SetupItem_RelocReq	= 47,
+	RANAP_ProtocolIE_ID_id_RAB_SetupItem_RelocReqAck	= 48,
+	RANAP_ProtocolIE_ID_id_RAB_SetupList_RelocReq	= 49,
+	RANAP_ProtocolIE_ID_id_RAB_SetupList_RelocReqAck	= 50,
+	RANAP_ProtocolIE_ID_id_RAB_SetupOrModifiedItem	= 51,
+	RANAP_ProtocolIE_ID_id_RAB_SetupOrModifiedList	= 52,
+	RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyItem	= 53,
+	RANAP_ProtocolIE_ID_id_RAB_SetupOrModifyList	= 54,
+	RANAP_ProtocolIE_ID_id_RAC	= 55,
+	RANAP_ProtocolIE_ID_id_RelocationType	= 56,
+	RANAP_ProtocolIE_ID_id_RequestType	= 57,
+	RANAP_ProtocolIE_ID_id_SAI	= 58,
+	RANAP_ProtocolIE_ID_id_SAPI	= 59,
+	RANAP_ProtocolIE_ID_id_SourceID	= 60,
+	RANAP_ProtocolIE_ID_id_Source_ToTarget_TransparentContainer	= 61,
+	RANAP_ProtocolIE_ID_id_TargetID	= 62,
+	RANAP_ProtocolIE_ID_id_Target_ToSource_TransparentContainer	= 63,
+	RANAP_ProtocolIE_ID_id_TemporaryUE_ID	= 64,
+	RANAP_ProtocolIE_ID_id_TraceReference	= 65,
+	RANAP_ProtocolIE_ID_id_TraceType	= 66,
+	RANAP_ProtocolIE_ID_id_TransportLayerAddress	= 67,
+	RANAP_ProtocolIE_ID_id_TriggerID	= 68,
+	RANAP_ProtocolIE_ID_id_UE_ID	= 69,
+	RANAP_ProtocolIE_ID_id_UL_GTP_PDU_SequenceNumber	= 70,
+	RANAP_ProtocolIE_ID_id_RAB_FailedtoReportItem	= 71,
+	RANAP_ProtocolIE_ID_id_RAB_FailedtoReportList	= 72,
+	RANAP_ProtocolIE_ID_id_KeyStatus	= 75,
+	RANAP_ProtocolIE_ID_id_DRX_CycleLengthCoefficient	= 76,
+	RANAP_ProtocolIE_ID_id_IuSigConIdList	= 77,
+	RANAP_ProtocolIE_ID_id_IuSigConIdItem	= 78,
+	RANAP_ProtocolIE_ID_id_IuSigConId	= 79,
+	RANAP_ProtocolIE_ID_id_DirectTransferInformationItem_RANAP_RelocInf	= 80,
+	RANAP_ProtocolIE_ID_id_DirectTransferInformationList_RANAP_RelocInf	= 81,
+	RANAP_ProtocolIE_ID_id_RAB_ContextItem_RANAP_RelocInf	= 82,
+	RANAP_ProtocolIE_ID_id_RAB_ContextList_RANAP_RelocInf	= 83,
+	RANAP_ProtocolIE_ID_id_RAB_ContextFailedtoTransferItem	= 84,
+	RANAP_ProtocolIE_ID_id_RAB_ContextFailedtoTransferList	= 85,
+	RANAP_ProtocolIE_ID_id_GlobalRNC_ID	= 86,
+	RANAP_ProtocolIE_ID_id_RAB_ReleasedItem_IuRelComp	= 87,
+	RANAP_ProtocolIE_ID_id_MessageStructure	= 88,
+	RANAP_ProtocolIE_ID_id_Alt_RAB_Parameters	= 89,
+	RANAP_ProtocolIE_ID_id_Ass_RAB_Parameters	= 90,
+	RANAP_ProtocolIE_ID_id_RAB_ModifyList	= 91,
+	RANAP_ProtocolIE_ID_id_RAB_ModifyItem	= 92,
+	RANAP_ProtocolIE_ID_id_TypeOfError	= 93,
+	RANAP_ProtocolIE_ID_id_BroadcastAssistanceDataDecipheringKeys	= 94,
+	RANAP_ProtocolIE_ID_id_LocationRelatedDataRequestType	= 95,
+	RANAP_ProtocolIE_ID_id_GlobalCN_ID	= 96,
+	RANAP_ProtocolIE_ID_id_LastKnownServiceArea	= 97,
+	RANAP_ProtocolIE_ID_id_SRB_TrCH_Mapping	= 98,
+	RANAP_ProtocolIE_ID_id_InterSystemInformation_TransparentContainer	= 99,
+	RANAP_ProtocolIE_ID_id_NewBSS_To_OldBSS_Information	= 100,
+	RANAP_ProtocolIE_ID_id_SourceRNC_PDCP_context_info	= 103,
+	RANAP_ProtocolIE_ID_id_InformationTransferID	= 104,
+	RANAP_ProtocolIE_ID_id_SNA_Access_Information	= 105,
+	RANAP_ProtocolIE_ID_id_ProvidedData	= 106,
+	RANAP_ProtocolIE_ID_id_GERAN_BSC_Container	= 107,
+	RANAP_ProtocolIE_ID_id_GERAN_Classmark	= 108,
+	RANAP_ProtocolIE_ID_id_GERAN_Iumode_RAB_Failed_RABAssgntResponse_Item	= 109,
+	RANAP_ProtocolIE_ID_id_GERAN_Iumode_RAB_FailedList_RABAssgntResponse	= 110,
+	RANAP_ProtocolIE_ID_id_VerticalAccuracyCode	= 111,
+	RANAP_ProtocolIE_ID_id_ResponseTime	= 112,
+	RANAP_ProtocolIE_ID_id_PositioningPriority	= 113,
+	RANAP_ProtocolIE_ID_id_ClientType	= 114,
+	RANAP_ProtocolIE_ID_id_LocationRelatedDataRequestTypeSpecificToGERANIuMode	= 115,
+	RANAP_ProtocolIE_ID_id_SignallingIndication	= 116,
+	RANAP_ProtocolIE_ID_id_hS_DSCH_MAC_d_Flow_ID	= 117,
+	RANAP_ProtocolIE_ID_id_UESBI_Iu	= 118,
+	RANAP_ProtocolIE_ID_id_PositionData	= 119,
+	RANAP_ProtocolIE_ID_id_PositionDataSpecificToGERANIuMode	= 120,
+	RANAP_ProtocolIE_ID_id_CellLoadInformationGroup	= 121,
+	RANAP_ProtocolIE_ID_id_AccuracyFulfilmentIndicator	= 122,
+	RANAP_ProtocolIE_ID_id_InformationTransferType	= 123,
+	RANAP_ProtocolIE_ID_id_TraceRecordingSessionInformation	= 124,
+	RANAP_ProtocolIE_ID_id_TracePropagationParameters	= 125,
+	RANAP_ProtocolIE_ID_id_InterSystemInformationTransferType	= 126,
+	RANAP_ProtocolIE_ID_id_SelectedPLMN_ID	= 127,
+	RANAP_ProtocolIE_ID_id_RedirectionCompleted	= 128,
+	RANAP_ProtocolIE_ID_id_RedirectionIndication	= 129,
+	RANAP_ProtocolIE_ID_id_NAS_SequenceNumber	= 130,
+	RANAP_ProtocolIE_ID_id_RejectCauseValue	= 131,
+	RANAP_ProtocolIE_ID_id_APN	= 132,
+	RANAP_ProtocolIE_ID_id_CNMBMSLinkingInformation	= 133,
+	RANAP_ProtocolIE_ID_id_DeltaRAListofIdleModeUEs	= 134,
+	RANAP_ProtocolIE_ID_id_FrequenceLayerConvergenceFlag	= 135,
+	RANAP_ProtocolIE_ID_id_InformationExchangeID	= 136,
+	RANAP_ProtocolIE_ID_id_InformationExchangeType	= 137,
+	RANAP_ProtocolIE_ID_id_InformationRequested	= 138,
+	RANAP_ProtocolIE_ID_id_InformationRequestType	= 139,
+	RANAP_ProtocolIE_ID_id_IPMulticastAddress	= 140,
+	RANAP_ProtocolIE_ID_id_JoinedMBMSBearerServicesList	= 141,
+	RANAP_ProtocolIE_ID_id_LeftMBMSBearerServicesList	= 142,
+	RANAP_ProtocolIE_ID_id_MBMSBearerServiceType	= 143,
+	RANAP_ProtocolIE_ID_id_MBMSCNDe_Registration	= 144,
+	RANAP_ProtocolIE_ID_id_MBMSServiceArea	= 145,
+	RANAP_ProtocolIE_ID_id_MBMSSessionDuration	= 146,
+	RANAP_ProtocolIE_ID_id_MBMSSessionIdentity	= 147,
+	RANAP_ProtocolIE_ID_id_PDP_TypeInformation	= 148,
+	RANAP_ProtocolIE_ID_id_RAB_Parameters	= 149,
+	RANAP_ProtocolIE_ID_id_RAListofIdleModeUEs	= 150,
+	RANAP_ProtocolIE_ID_id_MBMSRegistrationRequestType	= 151,
+	RANAP_ProtocolIE_ID_id_SessionUpdateID	= 152,
+	RANAP_ProtocolIE_ID_id_TMGI	= 153,
+	RANAP_ProtocolIE_ID_id_TransportLayerInformation	= 154,
+	RANAP_ProtocolIE_ID_id_UnsuccessfulLinkingList	= 155,
+	RANAP_ProtocolIE_ID_id_MBMSLinkingInformation	= 156,
+	RANAP_ProtocolIE_ID_id_MBMSSessionRepetitionNumber	= 157,
+	RANAP_ProtocolIE_ID_id_AlternativeRABConfiguration	= 158,
+	RANAP_ProtocolIE_ID_id_AlternativeRABConfigurationRequest	= 159,
+	RANAP_ProtocolIE_ID_id_E_DCH_MAC_d_Flow_ID	= 160,
+	RANAP_ProtocolIE_ID_id_SourceBSS_ToTargetBSS_TransparentContainer	= 161,
+	RANAP_ProtocolIE_ID_id_TargetBSS_ToSourceBSS_TransparentContainer	= 162,
+	RANAP_ProtocolIE_ID_id_TimeToMBMSDataTransfer	= 163,
+	RANAP_ProtocolIE_ID_id_IncludeVelocity	= 164,
+	RANAP_ProtocolIE_ID_id_VelocityEstimate	= 165,
+	RANAP_ProtocolIE_ID_id_RedirectAttemptFlag	= 166,
+	RANAP_ProtocolIE_ID_id_RAT_Type	= 167,
+	RANAP_ProtocolIE_ID_id_PeriodicLocationInfo	= 168,
+	RANAP_ProtocolIE_ID_id_MBMSCountingInformation	= 169,
+	RANAP_ProtocolIE_ID_id_170_not_to_be_used_for_IE_ids	= 170,
+	RANAP_ProtocolIE_ID_id_ExtendedRNC_ID	= 171,
+	RANAP_ProtocolIE_ID_id_Alt_RAB_Parameter_ExtendedGuaranteedBitrateInf	= 172,
+	RANAP_ProtocolIE_ID_id_Alt_RAB_Parameter_ExtendedMaxBitrateInf	= 173,
+	RANAP_ProtocolIE_ID_id_Ass_RAB_Parameter_ExtendedGuaranteedBitrateList	= 174,
+	RANAP_ProtocolIE_ID_id_Ass_RAB_Parameter_ExtendedMaxBitrateList	= 175,
+	RANAP_ProtocolIE_ID_id_RAB_Parameter_ExtendedGuaranteedBitrateList	= 176,
+	RANAP_ProtocolIE_ID_id_RAB_Parameter_ExtendedMaxBitrateList	= 177,
+	RANAP_ProtocolIE_ID_id_Requested_RAB_Parameter_ExtendedMaxBitrateList	= 178,
+	RANAP_ProtocolIE_ID_id_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList	= 179,
+	RANAP_ProtocolIE_ID_id_LAofIdleModeUEs	= 180,
+	RANAP_ProtocolIE_ID_id_newLAListofIdleModeUEs	= 181,
+	RANAP_ProtocolIE_ID_id_LAListwithNoIdleModeUEsAnyMore	= 182,
+	RANAP_ProtocolIE_ID_id_183_not_to_be_used_for_IE_ids	= 183,
+	RANAP_ProtocolIE_ID_id_GANSS_PositioningDataSet	= 184,
+	RANAP_ProtocolIE_ID_id_RequestedGANSSAssistanceData	= 185,
+	RANAP_ProtocolIE_ID_id_BroadcastGANSSAssistanceDataDecipheringKeys	= 186,
+	RANAP_ProtocolIE_ID_id_d_RNTI_for_NoIuCSUP	= 187,
+	RANAP_ProtocolIE_ID_id_RAB_SetupList_EnhancedRelocCompleteReq	= 188,
+	RANAP_ProtocolIE_ID_id_RAB_SetupItem_EnhancedRelocCompleteReq	= 189,
+	RANAP_ProtocolIE_ID_id_RAB_SetupList_EnhancedRelocCompleteRes	= 190,
+	RANAP_ProtocolIE_ID_id_RAB_SetupItem_EnhancedRelocCompleteRes	= 191,
+	RANAP_ProtocolIE_ID_id_RAB_SetupList_EnhRelocInfoReq	= 192,
+	RANAP_ProtocolIE_ID_id_RAB_SetupItem_EnhRelocInfoReq	= 193,
+	RANAP_ProtocolIE_ID_id_RAB_SetupList_EnhRelocInfoRes	= 194,
+	RANAP_ProtocolIE_ID_id_RAB_SetupItem_EnhRelocInfoRes	= 195,
+	RANAP_ProtocolIE_ID_id_OldIuSigConId	= 196,
+	RANAP_ProtocolIE_ID_id_RAB_FailedList_EnhRelocInfoRes	= 197,
+	RANAP_ProtocolIE_ID_id_RAB_FailedItem_EnhRelocInfoRes	= 198,
+	RANAP_ProtocolIE_ID_id_Global_ENB_ID	= 199,
+	RANAP_ProtocolIE_ID_id_UE_History_Information	= 200,
+	RANAP_ProtocolIE_ID_id_MBMSSynchronisationInformation	= 201,
+	RANAP_ProtocolIE_ID_id_SubscriberProfileIDforRFP	= 202,
+	RANAP_ProtocolIE_ID_id_CSG_Id	= 203,
+	RANAP_ProtocolIE_ID_id_OldIuSigConIdCS	= 204,
+	RANAP_ProtocolIE_ID_id_OldIuSigConIdPS	= 205,
+	RANAP_ProtocolIE_ID_id_GlobalCN_IDCS	= 206,
+	RANAP_ProtocolIE_ID_id_GlobalCN_IDPS	= 207,
+	RANAP_ProtocolIE_ID_id_SourceExtendedRNC_ID	= 208,
+	RANAP_ProtocolIE_ID_id_RAB_ToBeReleasedItem_EnhancedRelocCompleteRes	= 209,
+	RANAP_ProtocolIE_ID_id_RAB_ToBeReleasedList_EnhancedRelocCompleteRes	= 210,
+	RANAP_ProtocolIE_ID_id_SourceRNC_ID	= 211,
+	RANAP_ProtocolIE_ID_id_Relocation_TargetRNC_ID	= 212,
+	RANAP_ProtocolIE_ID_id_Relocation_TargetExtendedRNC_ID	= 213,
+	RANAP_ProtocolIE_ID_id_Alt_RAB_Parameter_SupportedGuaranteedBitrateInf	= 214,
+	RANAP_ProtocolIE_ID_id_Alt_RAB_Parameter_SupportedMaxBitrateInf	= 215,
+	RANAP_ProtocolIE_ID_id_Ass_RAB_Parameter_SupportedGuaranteedBitrateList	= 216,
+	RANAP_ProtocolIE_ID_id_Ass_RAB_Parameter_SupportedMaxBitrateList	= 217,
+	RANAP_ProtocolIE_ID_id_RAB_Parameter_SupportedGuaranteedBitrateList	= 218,
+	RANAP_ProtocolIE_ID_id_RAB_Parameter_SupportedMaxBitrateList	= 219,
+	RANAP_ProtocolIE_ID_id_Requested_RAB_Parameter_SupportedMaxBitrateList	= 220,
+	RANAP_ProtocolIE_ID_id_Requested_RAB_Parameter_SupportedGuaranteedBitrateList	= 221,
+	RANAP_ProtocolIE_ID_id_Relocation_SourceRNC_ID	= 222,
+	RANAP_ProtocolIE_ID_id_Relocation_SourceExtendedRNC_ID	= 223,
+	RANAP_ProtocolIE_ID_id_EncryptionKey	= 224,
+	RANAP_ProtocolIE_ID_id_IntegrityProtectionKey	= 225,
+	RANAP_ProtocolIE_ID_id_SRVCC_HO_Indication	= 226,
+	RANAP_ProtocolIE_ID_id_SRVCC_Information	= 227,
+	RANAP_ProtocolIE_ID_id_SRVCC_Operation_Possible	= 228,
+	RANAP_ProtocolIE_ID_id_CSG_Id_List	= 229,
+	RANAP_ProtocolIE_ID_id_PSRABtobeReplaced	= 230,
+	RANAP_ProtocolIE_ID_id_E_UTRAN_Service_Handover	= 231,
+	RANAP_ProtocolIE_ID_id_UE_AggregateMaximumBitRate	= 233,
+	RANAP_ProtocolIE_ID_id_CSG_Membership_Status	= 234,
+	RANAP_ProtocolIE_ID_id_Cell_Access_Mode	= 235,
+	RANAP_ProtocolIE_ID_id_IP_Source_Address	= 236,
+	RANAP_ProtocolIE_ID_id_CSFB_Information	= 237,
+	RANAP_ProtocolIE_ID_id_PDP_TypeInformation_extension	= 238,
+	RANAP_ProtocolIE_ID_id_MSISDN	= 239,
+	RANAP_ProtocolIE_ID_id_Offload_RAB_Parameters	= 240,
+	RANAP_ProtocolIE_ID_id_LGW_TransportLayerAddress	= 241,
+	RANAP_ProtocolIE_ID_id_Correlation_ID	= 242,
+	RANAP_ProtocolIE_ID_id_IRAT_Measurement_Configuration	= 243,
+	RANAP_ProtocolIE_ID_id_MDT_Configuration	= 244,
+	RANAP_ProtocolIE_ID_id_Priority_Class_Indicator	= 245,
+	RANAP_ProtocolIE_ID_id_RNSAPRelocationParameters	= 247,
+	RANAP_ProtocolIE_ID_id_RABParametersList	= 248,
+	RANAP_ProtocolIE_ID_id_Management_Based_MDT_Allowed	= 249,
+	RANAP_ProtocolIE_ID_id_HigherBitratesThan16MbpsFlag	= 250,
+	RANAP_ProtocolIE_ID_id_Trace_Collection_Entity_IP_Addess	= 251,
+	RANAP_ProtocolIE_ID_id_End_Of_CSFB	= 252,
+	RANAP_ProtocolIE_ID_id_Time_UE_StayedInCell_EnhancedGranularity	= 253,
+	RANAP_ProtocolIE_ID_id_Out_Of_UTRAN	= 254,
+	RANAP_ProtocolIE_ID_id_TraceRecordingSessionReference	= 255,
+	RANAP_ProtocolIE_ID_id_IMSI	= 256,
+	RANAP_ProtocolIE_ID_id_HO_Cause	= 257,
+	RANAP_ProtocolIE_ID_id_VoiceSupportMatchIndicator	= 258,
+	RANAP_ProtocolIE_ID_id_RSRVCC_HO_Indication	= 259,
+	RANAP_ProtocolIE_ID_id_RSRVCC_Information	= 260,
+	RANAP_ProtocolIE_ID_id_AnchorPLMN_ID	= 261,
+	RANAP_ProtocolIE_ID_id_Tunnel_Information_for_BBF	= 262,
+	RANAP_ProtocolIE_ID_id_Management_Based_MDT_PLMN_List	= 263,
+	RANAP_ProtocolIE_ID_id_SignallingBasedMDTPLMNList	= 264,
+	RANAP_ProtocolIE_ID_id_M4Report	= 265,
+	RANAP_ProtocolIE_ID_id_M5Report	= 266,
+	RANAP_ProtocolIE_ID_id_M6Report	= 267,
+	RANAP_ProtocolIE_ID_id_M7Report	= 268,
+	RANAP_ProtocolIE_ID_id_TimingDifferenceULDL	= 269,
+	RANAP_ProtocolIE_ID_id_Serving_Cell_Identifier	= 270,
+	RANAP_ProtocolIE_ID_id_EARFCN_Extended	= 271,
+	RANAP_ProtocolIE_ID_id_RSRVCC_Operation_Possible	= 272,
+	RANAP_ProtocolIE_ID_id_SIPTO_LGW_TransportLayerAddress	= 273,
+	RANAP_ProtocolIE_ID_id_SIPTO_Correlation_ID	= 274,
+	RANAP_ProtocolIE_ID_id_LHN_ID	= 275,
+	RANAP_ProtocolIE_ID_id_Session_Re_establishment_Indicator	= 276,
+	RANAP_ProtocolIE_ID_id_LastE_UTRANPLMNIdentity	= 277,
+	RANAP_ProtocolIE_ID_id_RSRQ_Type	= 278,
+	RANAP_ProtocolIE_ID_id_RSRQ_Extension	= 279
+} e_RANAP_ProtocolIE_ID;
+
+/* RANAP_ProtocolIE-ID */
+typedef long	 RANAP_ProtocolIE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ProtocolIE_ID;
+asn_struct_free_f RANAP_ProtocolIE_ID_free;
+asn_struct_print_f RANAP_ProtocolIE_ID_print;
+asn_constr_check_f RANAP_ProtocolIE_ID_constraint;
+ber_type_decoder_f RANAP_ProtocolIE_ID_decode_ber;
+der_type_encoder_f RANAP_ProtocolIE_ID_encode_der;
+xer_type_decoder_f RANAP_ProtocolIE_ID_decode_xer;
+xer_type_encoder_f RANAP_ProtocolIE_ID_encode_xer;
+per_type_decoder_f RANAP_ProtocolIE_ID_decode_uper;
+per_type_encoder_f RANAP_ProtocolIE_ID_encode_uper;
+per_type_decoder_f RANAP_ProtocolIE_ID_decode_aper;
+per_type_encoder_f RANAP_ProtocolIE_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ProtocolIE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ProvidedData.c b/src/ranap/RANAP_ProvidedData.c
new file mode 100644
index 0000000..2354cc4
--- /dev/null
+++ b/src/ranap/RANAP_ProvidedData.c
@@ -0,0 +1,62 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ProvidedData.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_ProvidedData_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_ProvidedData_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ProvidedData, choice.shared_network_information),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Shared_Network_Information,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"shared-network-information"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ProvidedData_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* shared-network-information */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_ProvidedData_specs_1 = {
+	sizeof(struct RANAP_ProvidedData),
+	offsetof(struct RANAP_ProvidedData, _asn_ctx),
+	offsetof(struct RANAP_ProvidedData, present),
+	sizeof(((struct RANAP_ProvidedData *)0)->present),
+	asn_MAP_RANAP_ProvidedData_tag2el_1,
+	1,	/* Count of tags in the map */
+	0,
+	1	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ProvidedData = {
+	"RANAP_ProvidedData",
+	"RANAP_ProvidedData",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_ProvidedData_constr_1,
+	asn_MBR_RANAP_ProvidedData_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_ProvidedData_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ProvidedData.h b/src/ranap/RANAP_ProvidedData.h
new file mode 100644
index 0000000..f35659f
--- /dev/null
+++ b/src/ranap/RANAP_ProvidedData.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ProvidedData_H_
+#define	_RANAP_ProvidedData_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Shared-Network-Information.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ProvidedData_PR {
+	RANAP_ProvidedData_PR_NOTHING,	/* No components present */
+	RANAP_ProvidedData_PR_shared_network_information,
+	/* Extensions may appear below */
+	
+} RANAP_ProvidedData_PR;
+
+/* RANAP_ProvidedData */
+typedef struct RANAP_ProvidedData {
+	RANAP_ProvidedData_PR present;
+	union RANAP_ProvidedData_u {
+		RANAP_Shared_Network_Information_t	 shared_network_information;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ProvidedData_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ProvidedData;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ProvidedData_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_QueuingAllowed.c b/src/ranap/RANAP_QueuingAllowed.c
new file mode 100644
index 0000000..6244198
--- /dev/null
+++ b/src/ranap/RANAP_QueuingAllowed.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_QueuingAllowed.h"
+
+int
+RANAP_QueuingAllowed_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_QueuingAllowed_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_QueuingAllowed_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_QueuingAllowed_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_QueuingAllowed_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_QueuingAllowed_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_QueuingAllowed_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_QueuingAllowed_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_QueuingAllowed_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_QueuingAllowed_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_QueuingAllowed_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_QueuingAllowed_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_QueuingAllowed_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_QueuingAllowed_value2enum_1[] = {
+	{ 0,	20,	"queueing-not-allowed" },
+	{ 1,	16,	"queueing-allowed" }
+};
+static const unsigned int asn_MAP_RANAP_QueuingAllowed_enum2value_1[] = {
+	1,	/* queueing-allowed(1) */
+	0	/* queueing-not-allowed(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_QueuingAllowed_specs_1 = {
+	asn_MAP_RANAP_QueuingAllowed_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_QueuingAllowed_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_QueuingAllowed_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_QueuingAllowed = {
+	"RANAP_QueuingAllowed",
+	"RANAP_QueuingAllowed",
+	RANAP_QueuingAllowed_free,
+	RANAP_QueuingAllowed_print,
+	RANAP_QueuingAllowed_constraint,
+	RANAP_QueuingAllowed_decode_ber,
+	RANAP_QueuingAllowed_encode_der,
+	RANAP_QueuingAllowed_decode_xer,
+	RANAP_QueuingAllowed_encode_xer,
+	RANAP_QueuingAllowed_decode_uper,
+	RANAP_QueuingAllowed_encode_uper,
+	RANAP_QueuingAllowed_decode_aper,
+	RANAP_QueuingAllowed_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_QueuingAllowed_tags_1,
+	sizeof(asn_DEF_RANAP_QueuingAllowed_tags_1)
+		/sizeof(asn_DEF_RANAP_QueuingAllowed_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_QueuingAllowed_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_QueuingAllowed_tags_1)
+		/sizeof(asn_DEF_RANAP_QueuingAllowed_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_QueuingAllowed_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_QueuingAllowed_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_QueuingAllowed.h b/src/ranap/RANAP_QueuingAllowed.h
new file mode 100644
index 0000000..3cf03c8
--- /dev/null
+++ b/src/ranap/RANAP_QueuingAllowed.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_QueuingAllowed_H_
+#define	_RANAP_QueuingAllowed_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_QueuingAllowed {
+	RANAP_QueuingAllowed_queueing_not_allowed	= 0,
+	RANAP_QueuingAllowed_queueing_allowed	= 1
+} e_RANAP_QueuingAllowed;
+
+/* RANAP_QueuingAllowed */
+typedef long	 RANAP_QueuingAllowed_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_QueuingAllowed;
+asn_struct_free_f RANAP_QueuingAllowed_free;
+asn_struct_print_f RANAP_QueuingAllowed_print;
+asn_constr_check_f RANAP_QueuingAllowed_constraint;
+ber_type_decoder_f RANAP_QueuingAllowed_decode_ber;
+der_type_encoder_f RANAP_QueuingAllowed_encode_der;
+xer_type_decoder_f RANAP_QueuingAllowed_decode_xer;
+xer_type_encoder_f RANAP_QueuingAllowed_encode_xer;
+per_type_decoder_f RANAP_QueuingAllowed_decode_uper;
+per_type_encoder_f RANAP_QueuingAllowed_encode_uper;
+per_type_decoder_f RANAP_QueuingAllowed_decode_aper;
+per_type_encoder_f RANAP_QueuingAllowed_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_QueuingAllowed_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-AssignmentRequest.c b/src/ranap/RANAP_RAB-AssignmentRequest.c
new file mode 100644
index 0000000..6d5c90e
--- /dev/null
+++ b/src/ranap/RANAP_RAB-AssignmentRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-AssignmentRequest.h"
+
+static int
+memb_rAB_AssignmentRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rAB_AssignmentRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rAB_AssignmentRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rAB_AssignmentRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rAB_AssignmentRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rAB_AssignmentRequest_ies_specs_2 = {
+	sizeof(struct rAB_AssignmentRequest_ies),
+	offsetof(struct rAB_AssignmentRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rAB_AssignmentRequest_ies_2 = {
+	"rAB-AssignmentRequest-ies",
+	"rAB-AssignmentRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rAB_AssignmentRequest_ies_tags_2,
+	sizeof(asn_DEF_rAB_AssignmentRequest_ies_tags_2)
+		/sizeof(asn_DEF_rAB_AssignmentRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rAB_AssignmentRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rAB_AssignmentRequest_ies_tags_2)
+		/sizeof(asn_DEF_rAB_AssignmentRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rAB_AssignmentRequest_ies_constr_2,
+	asn_MBR_rAB_AssignmentRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rAB_AssignmentRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_AssignmentRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_AssignmentRequest, rAB_AssignmentRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rAB_AssignmentRequest_ies_2,
+		memb_rAB_AssignmentRequest_ies_constraint_1,
+		&asn_PER_memb_rAB_AssignmentRequest_ies_constr_2,
+		0,
+		"rAB-AssignmentRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_AssignmentRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_AssignmentRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rAB-AssignmentRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_AssignmentRequest_specs_1 = {
+	sizeof(struct RANAP_RAB_AssignmentRequest),
+	offsetof(struct RANAP_RAB_AssignmentRequest, _asn_ctx),
+	asn_MAP_RANAP_RAB_AssignmentRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_AssignmentRequest = {
+	"RANAP_RAB-AssignmentRequest",
+	"RANAP_RAB-AssignmentRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_AssignmentRequest_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_AssignmentRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_AssignmentRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_AssignmentRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_AssignmentRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_AssignmentRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_AssignmentRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_AssignmentRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-AssignmentRequest.h b/src/ranap/RANAP_RAB-AssignmentRequest.h
new file mode 100644
index 0000000..60c84ac
--- /dev/null
+++ b/src/ranap/RANAP_RAB-AssignmentRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_AssignmentRequest_H_
+#define	_RANAP_RAB_AssignmentRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-AssignmentRequest */
+typedef struct RANAP_RAB_AssignmentRequest {
+	struct rAB_AssignmentRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rAB_AssignmentRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_AssignmentRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_AssignmentRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_AssignmentRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-AssignmentResponse.c b/src/ranap/RANAP_RAB-AssignmentResponse.c
new file mode 100644
index 0000000..a1565b1
--- /dev/null
+++ b/src/ranap/RANAP_RAB-AssignmentResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-AssignmentResponse.h"
+
+static int
+memb_rAB_AssignmentResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rAB_AssignmentResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rAB_AssignmentResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rAB_AssignmentResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rAB_AssignmentResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rAB_AssignmentResponse_ies_specs_2 = {
+	sizeof(struct rAB_AssignmentResponse_ies),
+	offsetof(struct rAB_AssignmentResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rAB_AssignmentResponse_ies_2 = {
+	"rAB-AssignmentResponse-ies",
+	"rAB-AssignmentResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rAB_AssignmentResponse_ies_tags_2,
+	sizeof(asn_DEF_rAB_AssignmentResponse_ies_tags_2)
+		/sizeof(asn_DEF_rAB_AssignmentResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rAB_AssignmentResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rAB_AssignmentResponse_ies_tags_2)
+		/sizeof(asn_DEF_rAB_AssignmentResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rAB_AssignmentResponse_ies_constr_2,
+	asn_MBR_rAB_AssignmentResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rAB_AssignmentResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_AssignmentResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_AssignmentResponse, rAB_AssignmentResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rAB_AssignmentResponse_ies_2,
+		memb_rAB_AssignmentResponse_ies_constraint_1,
+		&asn_PER_memb_rAB_AssignmentResponse_ies_constr_2,
+		0,
+		"rAB-AssignmentResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_AssignmentResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_AssignmentResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rAB-AssignmentResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_AssignmentResponse_specs_1 = {
+	sizeof(struct RANAP_RAB_AssignmentResponse),
+	offsetof(struct RANAP_RAB_AssignmentResponse, _asn_ctx),
+	asn_MAP_RANAP_RAB_AssignmentResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_AssignmentResponse = {
+	"RANAP_RAB-AssignmentResponse",
+	"RANAP_RAB-AssignmentResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_AssignmentResponse_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_AssignmentResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_AssignmentResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_AssignmentResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_AssignmentResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_AssignmentResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_AssignmentResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_AssignmentResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-AssignmentResponse.h b/src/ranap/RANAP_RAB-AssignmentResponse.h
new file mode 100644
index 0000000..a7e7655
--- /dev/null
+++ b/src/ranap/RANAP_RAB-AssignmentResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_AssignmentResponse_H_
+#define	_RANAP_RAB_AssignmentResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-AssignmentResponse */
+typedef struct RANAP_RAB_AssignmentResponse {
+	struct rAB_AssignmentResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rAB_AssignmentResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_AssignmentResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_AssignmentResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_AssignmentResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-AsymmetryIndicator.c b/src/ranap/RANAP_RAB-AsymmetryIndicator.c
new file mode 100644
index 0000000..50dafca
--- /dev/null
+++ b/src/ranap/RANAP_RAB-AsymmetryIndicator.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-AsymmetryIndicator.h"
+
+int
+RANAP_RAB_AsymmetryIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RAB_AsymmetryIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RAB_AsymmetryIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_AsymmetryIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RAB_AsymmetryIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_AsymmetryIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RAB_AsymmetryIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_AsymmetryIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RAB_AsymmetryIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RAB_AsymmetryIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RAB_AsymmetryIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAB_AsymmetryIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_AsymmetryIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RAB_AsymmetryIndicator_value2enum_1[] = {
+	{ 0,	23,	"symmetric-bidirectional" },
+	{ 1,	34,	"asymmetric-unidirectional-downlink" },
+	{ 2,	32,	"asymmetric-unidirectional-uplink" },
+	{ 3,	24,	"asymmetric-bidirectional" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RAB_AsymmetryIndicator_enum2value_1[] = {
+	3,	/* asymmetric-bidirectional(3) */
+	1,	/* asymmetric-unidirectional-downlink(1) */
+	2,	/* asymmetric-unidirectional-uplink(2) */
+	0	/* symmetric-bidirectional(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RAB_AsymmetryIndicator_specs_1 = {
+	asn_MAP_RANAP_RAB_AsymmetryIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RAB_AsymmetryIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	5,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_AsymmetryIndicator = {
+	"RANAP_RAB-AsymmetryIndicator",
+	"RANAP_RAB-AsymmetryIndicator",
+	RANAP_RAB_AsymmetryIndicator_free,
+	RANAP_RAB_AsymmetryIndicator_print,
+	RANAP_RAB_AsymmetryIndicator_constraint,
+	RANAP_RAB_AsymmetryIndicator_decode_ber,
+	RANAP_RAB_AsymmetryIndicator_encode_der,
+	RANAP_RAB_AsymmetryIndicator_decode_xer,
+	RANAP_RAB_AsymmetryIndicator_encode_xer,
+	RANAP_RAB_AsymmetryIndicator_decode_uper,
+	RANAP_RAB_AsymmetryIndicator_encode_uper,
+	RANAP_RAB_AsymmetryIndicator_decode_aper,
+	RANAP_RAB_AsymmetryIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_AsymmetryIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_AsymmetryIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RAB_AsymmetryIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-AsymmetryIndicator.h b/src/ranap/RANAP_RAB-AsymmetryIndicator.h
new file mode 100644
index 0000000..d5f5e09
--- /dev/null
+++ b/src/ranap/RANAP_RAB-AsymmetryIndicator.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_AsymmetryIndicator_H_
+#define	_RANAP_RAB_AsymmetryIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RAB_AsymmetryIndicator {
+	RANAP_RAB_AsymmetryIndicator_symmetric_bidirectional	= 0,
+	RANAP_RAB_AsymmetryIndicator_asymmetric_unidirectional_downlink	= 1,
+	RANAP_RAB_AsymmetryIndicator_asymmetric_unidirectional_uplink	= 2,
+	RANAP_RAB_AsymmetryIndicator_asymmetric_bidirectional	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_RAB_AsymmetryIndicator;
+
+/* RANAP_RAB-AsymmetryIndicator */
+typedef long	 RANAP_RAB_AsymmetryIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_AsymmetryIndicator;
+asn_struct_free_f RANAP_RAB_AsymmetryIndicator_free;
+asn_struct_print_f RANAP_RAB_AsymmetryIndicator_print;
+asn_constr_check_f RANAP_RAB_AsymmetryIndicator_constraint;
+ber_type_decoder_f RANAP_RAB_AsymmetryIndicator_decode_ber;
+der_type_encoder_f RANAP_RAB_AsymmetryIndicator_encode_der;
+xer_type_decoder_f RANAP_RAB_AsymmetryIndicator_decode_xer;
+xer_type_encoder_f RANAP_RAB_AsymmetryIndicator_encode_xer;
+per_type_decoder_f RANAP_RAB_AsymmetryIndicator_decode_uper;
+per_type_encoder_f RANAP_RAB_AsymmetryIndicator_encode_uper;
+per_type_decoder_f RANAP_RAB_AsymmetryIndicator_decode_aper;
+per_type_encoder_f RANAP_RAB_AsymmetryIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_AsymmetryIndicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ID.c b/src/ranap/RANAP_RAB-ID.c
new file mode 100644
index 0000000..7c35f0c
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ID.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-ID.h"
+
+int
+RANAP_RAB_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RAB_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_RAB_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RAB_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RAB_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RAB_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RAB_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RAB_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RAB_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAB_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_ID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ID = {
+	"RANAP_RAB-ID",
+	"RANAP_RAB-ID",
+	RANAP_RAB_ID_free,
+	RANAP_RAB_ID_print,
+	RANAP_RAB_ID_constraint,
+	RANAP_RAB_ID_decode_ber,
+	RANAP_RAB_ID_encode_der,
+	RANAP_RAB_ID_decode_xer,
+	RANAP_RAB_ID_encode_xer,
+	RANAP_RAB_ID_decode_uper,
+	RANAP_RAB_ID_encode_uper,
+	RANAP_RAB_ID_decode_aper,
+	RANAP_RAB_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_ID_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RAB-ID.h b/src/ranap/RANAP_RAB-ID.h
new file mode 100644
index 0000000..2166574
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_ID_H_
+#define	_RANAP_RAB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ID */
+typedef BIT_STRING_t	 RANAP_RAB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ID;
+asn_struct_free_f RANAP_RAB_ID_free;
+asn_struct_print_f RANAP_RAB_ID_print;
+asn_constr_check_f RANAP_RAB_ID_constraint;
+ber_type_decoder_f RANAP_RAB_ID_decode_ber;
+der_type_encoder_f RANAP_RAB_ID_encode_der;
+xer_type_decoder_f RANAP_RAB_ID_decode_xer;
+xer_type_encoder_f RANAP_RAB_ID_encode_xer;
+per_type_decoder_f RANAP_RAB_ID_decode_uper;
+per_type_encoder_f RANAP_RAB_ID_encode_uper;
+per_type_decoder_f RANAP_RAB_ID_decode_aper;
+per_type_encoder_f RANAP_RAB_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ModifyRequest.c b/src/ranap/RANAP_RAB-ModifyRequest.c
new file mode 100644
index 0000000..4dce204
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ModifyRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ModifyRequest.h"
+
+static int
+memb_rAB_ModifyRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rAB_ModifyRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rAB_ModifyRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rAB_ModifyRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rAB_ModifyRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rAB_ModifyRequest_ies_specs_2 = {
+	sizeof(struct rAB_ModifyRequest_ies),
+	offsetof(struct rAB_ModifyRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rAB_ModifyRequest_ies_2 = {
+	"rAB-ModifyRequest-ies",
+	"rAB-ModifyRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rAB_ModifyRequest_ies_tags_2,
+	sizeof(asn_DEF_rAB_ModifyRequest_ies_tags_2)
+		/sizeof(asn_DEF_rAB_ModifyRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rAB_ModifyRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rAB_ModifyRequest_ies_tags_2)
+		/sizeof(asn_DEF_rAB_ModifyRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rAB_ModifyRequest_ies_constr_2,
+	asn_MBR_rAB_ModifyRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rAB_ModifyRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ModifyRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ModifyRequest, rAB_ModifyRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rAB_ModifyRequest_ies_2,
+		memb_rAB_ModifyRequest_ies_constraint_1,
+		&asn_PER_memb_rAB_ModifyRequest_ies_constr_2,
+		0,
+		"rAB-ModifyRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ModifyRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ModifyRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rAB-ModifyRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ModifyRequest_specs_1 = {
+	sizeof(struct RANAP_RAB_ModifyRequest),
+	offsetof(struct RANAP_RAB_ModifyRequest, _asn_ctx),
+	asn_MAP_RANAP_RAB_ModifyRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ModifyRequest = {
+	"RANAP_RAB-ModifyRequest",
+	"RANAP_RAB-ModifyRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_ModifyRequest_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ModifyRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ModifyRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ModifyRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ModifyRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ModifyRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ModifyRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ModifyRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ModifyRequest.h b/src/ranap/RANAP_RAB-ModifyRequest.h
new file mode 100644
index 0000000..cf1c8d6
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ModifyRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ModifyRequest_H_
+#define	_RANAP_RAB_ModifyRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ModifyRequest */
+typedef struct RANAP_RAB_ModifyRequest {
+	struct rAB_ModifyRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rAB_ModifyRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ModifyRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ModifyRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ModifyRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.c b/src/ranap/RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.c
new file mode 100644
index 0000000..54dfd2b
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedGuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList),
+	offsetof(struct RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList = {
+	"RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList",
+	"RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.h b/src/ranap/RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.h
new file mode 100644
index 0000000..44c5e4c
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+#define	_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedGuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-Parameter-ExtendedGuaranteedBitrateList */
+typedef struct RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedGuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_Parameter_ExtendedGuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-Parameter-ExtendedMaxBitrateList.c b/src/ranap/RANAP_RAB-Parameter-ExtendedMaxBitrateList.c
new file mode 100644
index 0000000..840c2db
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-ExtendedMaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-Parameter-ExtendedMaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_Parameter_ExtendedMaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_Parameter_ExtendedMaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedMaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAB_Parameter_ExtendedMaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_RAB_Parameter_ExtendedMaxBitrateList),
+	offsetof(struct RANAP_RAB_Parameter_ExtendedMaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList = {
+	"RANAP_RAB-Parameter-ExtendedMaxBitrateList",
+	"RANAP_RAB-Parameter-ExtendedMaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_Parameter_ExtendedMaxBitrateList_constr_1,
+	asn_MBR_RANAP_RAB_Parameter_ExtendedMaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAB_Parameter_ExtendedMaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-Parameter-ExtendedMaxBitrateList.h b/src/ranap/RANAP_RAB-Parameter-ExtendedMaxBitrateList.h
new file mode 100644
index 0000000..c070574
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-ExtendedMaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_Parameter_ExtendedMaxBitrateList_H_
+#define	_RANAP_RAB_Parameter_ExtendedMaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedMaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-Parameter-ExtendedMaxBitrateList */
+typedef struct RANAP_RAB_Parameter_ExtendedMaxBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedMaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_Parameter_ExtendedMaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_ExtendedMaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_Parameter_ExtendedMaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-Parameter-GuaranteedBitrateList.c b/src/ranap/RANAP_RAB-Parameter-GuaranteedBitrateList.c
new file mode 100644
index 0000000..17c1d9c
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-GuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-Parameter-GuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_Parameter_GuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_Parameter_GuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_GuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAB_Parameter_GuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_RAB_Parameter_GuaranteedBitrateList),
+	offsetof(struct RANAP_RAB_Parameter_GuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList = {
+	"RANAP_RAB-Parameter-GuaranteedBitrateList",
+	"RANAP_RAB-Parameter-GuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_Parameter_GuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_RAB_Parameter_GuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAB_Parameter_GuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-Parameter-GuaranteedBitrateList.h b/src/ranap/RANAP_RAB-Parameter-GuaranteedBitrateList.h
new file mode 100644
index 0000000..bf5f333
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-GuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_Parameter_GuaranteedBitrateList_H_
+#define	_RANAP_RAB_Parameter_GuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-Parameter-GuaranteedBitrateList */
+typedef struct RANAP_RAB_Parameter_GuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_GuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_Parameter_GuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_Parameter_GuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-Parameter-MaxBitrateList.c b/src/ranap/RANAP_RAB-Parameter-MaxBitrateList.c
new file mode 100644
index 0000000..94dfba8
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-MaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-Parameter-MaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_Parameter_MaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_Parameter_MaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_MaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAB_Parameter_MaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_RAB_Parameter_MaxBitrateList),
+	offsetof(struct RANAP_RAB_Parameter_MaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_MaxBitrateList = {
+	"RANAP_RAB-Parameter-MaxBitrateList",
+	"RANAP_RAB-Parameter-MaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_Parameter_MaxBitrateList_constr_1,
+	asn_MBR_RANAP_RAB_Parameter_MaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAB_Parameter_MaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-Parameter-MaxBitrateList.h b/src/ranap/RANAP_RAB-Parameter-MaxBitrateList.h
new file mode 100644
index 0000000..3001287
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameter-MaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_Parameter_MaxBitrateList_H_
+#define	_RANAP_RAB_Parameter_MaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-Parameter-MaxBitrateList */
+typedef struct RANAP_RAB_Parameter_MaxBitrateList {
+	A_SEQUENCE_OF(RANAP_MaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_Parameter_MaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameter_MaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_Parameter_MaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-Parameters.c b/src/ranap/RANAP_RAB-Parameters.c
new file mode 100644
index 0000000..1739ce2
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameters.c
@@ -0,0 +1,183 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-Parameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_Parameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_Parameters, trafficClass),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TrafficClass,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"trafficClass"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_Parameters, rAB_AsymmetryIndicator),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_AsymmetryIndicator,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAB-AsymmetryIndicator"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_Parameters, maxBitrate),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_Parameter_MaxBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"maxBitrate"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RAB_Parameters, guaranteedBitRate),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_Parameter_GuaranteedBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"guaranteedBitRate"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_Parameters, deliveryOrder),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DeliveryOrder,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"deliveryOrder"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_Parameters, maxSDU_Size),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_MaxSDU_Size,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"maxSDU-Size"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_Parameters, sDU_Parameters),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SDU_Parameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sDU-Parameters"
+		},
+	{ ATF_POINTER, 6, offsetof(struct RANAP_RAB_Parameters, transferDelay),
+		(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TransferDelay,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"transferDelay"
+		},
+	{ ATF_POINTER, 5, offsetof(struct RANAP_RAB_Parameters, trafficHandlingPriority),
+		(ASN_TAG_CLASS_CONTEXT | (8 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TrafficHandlingPriority,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"trafficHandlingPriority"
+		},
+	{ ATF_POINTER, 4, offsetof(struct RANAP_RAB_Parameters, allocationOrRetentionPriority),
+		(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_AllocationOrRetentionPriority,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"allocationOrRetentionPriority"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_RAB_Parameters, sourceStatisticsDescriptor),
+		(ASN_TAG_CLASS_CONTEXT | (10 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SourceStatisticsDescriptor,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sourceStatisticsDescriptor"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_RAB_Parameters, relocationRequirement),
+		(ASN_TAG_CLASS_CONTEXT | (11 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RelocationRequirement,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"relocationRequirement"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RAB_Parameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (12 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RAB_Parameters_oms_1[] = { 3, 7, 8, 9, 10, 11, 12 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_Parameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trafficClass */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rAB-AsymmetryIndicator */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* maxBitrate */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* guaranteedBitRate */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* deliveryOrder */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* maxSDU-Size */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* sDU-Parameters */
+    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* transferDelay */
+    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* trafficHandlingPriority */
+    { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* allocationOrRetentionPriority */
+    { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* sourceStatisticsDescriptor */
+    { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* relocationRequirement */
+    { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_Parameters_specs_1 = {
+	sizeof(struct RANAP_RAB_Parameters),
+	offsetof(struct RANAP_RAB_Parameters, _asn_ctx),
+	asn_MAP_RANAP_RAB_Parameters_tag2el_1,
+	13,	/* Count of tags in the map */
+	asn_MAP_RANAP_RAB_Parameters_oms_1,	/* Optional members */
+	7, 0,	/* Root/Additions */
+	12,	/* Start extensions */
+	14	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameters = {
+	"RANAP_RAB-Parameters",
+	"RANAP_RAB-Parameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_Parameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_Parameters_1,
+	13,	/* Elements count */
+	&asn_SPC_RANAP_RAB_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-Parameters.h b/src/ranap/RANAP_RAB-Parameters.h
new file mode 100644
index 0000000..2629282
--- /dev/null
+++ b/src/ranap/RANAP_RAB-Parameters.h
@@ -0,0 +1,65 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_Parameters_H_
+#define	_RANAP_RAB_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TrafficClass.h"
+#include "RANAP_RAB-AsymmetryIndicator.h"
+#include "RANAP_RAB-Parameter-MaxBitrateList.h"
+#include "RANAP_RAB-Parameter-GuaranteedBitrateList.h"
+#include "RANAP_DeliveryOrder.h"
+#include "RANAP_MaxSDU-Size.h"
+#include "RANAP_SDU-Parameters.h"
+#include "RANAP_TransferDelay.h"
+#include "RANAP_TrafficHandlingPriority.h"
+#include "RANAP_AllocationOrRetentionPriority.h"
+#include "RANAP_SourceStatisticsDescriptor.h"
+#include "RANAP_RelocationRequirement.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-Parameters */
+typedef struct RANAP_RAB_Parameters {
+	RANAP_TrafficClass_t	 trafficClass;
+	RANAP_RAB_AsymmetryIndicator_t	 rAB_AsymmetryIndicator;
+	RANAP_RAB_Parameter_MaxBitrateList_t	 maxBitrate;
+	RANAP_RAB_Parameter_GuaranteedBitrateList_t	*guaranteedBitRate	/* OPTIONAL */;
+	RANAP_DeliveryOrder_t	 deliveryOrder;
+	RANAP_MaxSDU_Size_t	 maxSDU_Size;
+	RANAP_SDU_Parameters_t	 sDU_Parameters;
+	RANAP_TransferDelay_t	*transferDelay	/* OPTIONAL */;
+	RANAP_TrafficHandlingPriority_t	*trafficHandlingPriority	/* OPTIONAL */;
+	RANAP_AllocationOrRetentionPriority_t	*allocationOrRetentionPriority	/* OPTIONAL */;
+	RANAP_SourceStatisticsDescriptor_t	*sourceStatisticsDescriptor	/* OPTIONAL */;
+	RANAP_RelocationRequirement_t	*relocationRequirement	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ReleaseRequest.c b/src/ranap/RANAP_RAB-ReleaseRequest.c
new file mode 100644
index 0000000..2db478b
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ReleaseRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ReleaseRequest.h"
+
+static int
+memb_rAB_ReleaseRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rAB_ReleaseRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rAB_ReleaseRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rAB_ReleaseRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rAB_ReleaseRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rAB_ReleaseRequest_ies_specs_2 = {
+	sizeof(struct rAB_ReleaseRequest_ies),
+	offsetof(struct rAB_ReleaseRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rAB_ReleaseRequest_ies_2 = {
+	"rAB-ReleaseRequest-ies",
+	"rAB-ReleaseRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rAB_ReleaseRequest_ies_tags_2,
+	sizeof(asn_DEF_rAB_ReleaseRequest_ies_tags_2)
+		/sizeof(asn_DEF_rAB_ReleaseRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rAB_ReleaseRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rAB_ReleaseRequest_ies_tags_2)
+		/sizeof(asn_DEF_rAB_ReleaseRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rAB_ReleaseRequest_ies_constr_2,
+	asn_MBR_rAB_ReleaseRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rAB_ReleaseRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ReleaseRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ReleaseRequest, rAB_ReleaseRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rAB_ReleaseRequest_ies_2,
+		memb_rAB_ReleaseRequest_ies_constraint_1,
+		&asn_PER_memb_rAB_ReleaseRequest_ies_constr_2,
+		0,
+		"rAB-ReleaseRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ReleaseRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ReleaseRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rAB-ReleaseRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ReleaseRequest_specs_1 = {
+	sizeof(struct RANAP_RAB_ReleaseRequest),
+	offsetof(struct RANAP_RAB_ReleaseRequest, _asn_ctx),
+	asn_MAP_RANAP_RAB_ReleaseRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ReleaseRequest = {
+	"RANAP_RAB-ReleaseRequest",
+	"RANAP_RAB-ReleaseRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_ReleaseRequest_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ReleaseRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ReleaseRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ReleaseRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ReleaseRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ReleaseRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ReleaseRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ReleaseRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ReleaseRequest.h b/src/ranap/RANAP_RAB-ReleaseRequest.h
new file mode 100644
index 0000000..a4ba249
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ReleaseRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ReleaseRequest_H_
+#define	_RANAP_RAB_ReleaseRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ReleaseRequest */
+typedef struct RANAP_RAB_ReleaseRequest {
+	struct rAB_ReleaseRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rAB_ReleaseRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ReleaseRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ReleaseRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ReleaseRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SubflowCombinationBitRate.c b/src/ranap/RANAP_RAB-SubflowCombinationBitRate.c
new file mode 100644
index 0000000..075032a
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SubflowCombinationBitRate.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-SubflowCombinationBitRate.h"
+
+int
+RANAP_RAB_SubflowCombinationBitRate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 16000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_RAB_SubflowCombinationBitRate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RAB_SubflowCombinationBitRate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_SubflowCombinationBitRate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RAB_SubflowCombinationBitRate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_SubflowCombinationBitRate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RAB_SubflowCombinationBitRate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAB_SubflowCombinationBitRate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RAB_SubflowCombinationBitRate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RAB_SubflowCombinationBitRate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RAB_SubflowCombinationBitRate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAB_SubflowCombinationBitRate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_SubflowCombinationBitRate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 24, -1,  0l,  16000000l }	/* (0..16000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SubflowCombinationBitRate = {
+	"RANAP_RAB-SubflowCombinationBitRate",
+	"RANAP_RAB-SubflowCombinationBitRate",
+	RANAP_RAB_SubflowCombinationBitRate_free,
+	RANAP_RAB_SubflowCombinationBitRate_print,
+	RANAP_RAB_SubflowCombinationBitRate_constraint,
+	RANAP_RAB_SubflowCombinationBitRate_decode_ber,
+	RANAP_RAB_SubflowCombinationBitRate_encode_der,
+	RANAP_RAB_SubflowCombinationBitRate_decode_xer,
+	RANAP_RAB_SubflowCombinationBitRate_encode_xer,
+	RANAP_RAB_SubflowCombinationBitRate_decode_uper,
+	RANAP_RAB_SubflowCombinationBitRate_encode_uper,
+	RANAP_RAB_SubflowCombinationBitRate_decode_aper,
+	RANAP_RAB_SubflowCombinationBitRate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SubflowCombinationBitRate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_SubflowCombinationBitRate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RAB-SubflowCombinationBitRate.h b/src/ranap/RANAP_RAB-SubflowCombinationBitRate.h
new file mode 100644
index 0000000..6c3eaa4
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SubflowCombinationBitRate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_SubflowCombinationBitRate_H_
+#define	_RANAP_RAB_SubflowCombinationBitRate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SubflowCombinationBitRate */
+typedef long	 RANAP_RAB_SubflowCombinationBitRate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SubflowCombinationBitRate;
+asn_struct_free_f RANAP_RAB_SubflowCombinationBitRate_free;
+asn_struct_print_f RANAP_RAB_SubflowCombinationBitRate_print;
+asn_constr_check_f RANAP_RAB_SubflowCombinationBitRate_constraint;
+ber_type_decoder_f RANAP_RAB_SubflowCombinationBitRate_decode_ber;
+der_type_encoder_f RANAP_RAB_SubflowCombinationBitRate_encode_der;
+xer_type_decoder_f RANAP_RAB_SubflowCombinationBitRate_decode_xer;
+xer_type_encoder_f RANAP_RAB_SubflowCombinationBitRate_encode_xer;
+per_type_decoder_f RANAP_RAB_SubflowCombinationBitRate_decode_uper;
+per_type_encoder_f RANAP_RAB_SubflowCombinationBitRate_encode_uper;
+per_type_decoder_f RANAP_RAB_SubflowCombinationBitRate_decode_aper;
+per_type_encoder_f RANAP_RAB_SubflowCombinationBitRate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SubflowCombinationBitRate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-TrCH-Mapping.c b/src/ranap/RANAP_RAB-TrCH-Mapping.c
new file mode 100644
index 0000000..b73cd89
--- /dev/null
+++ b/src/ranap/RANAP_RAB-TrCH-Mapping.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-TrCH-Mapping.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAB_TrCH_Mapping_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_TrCH_Mapping_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_RAB_TrCH_MappingItem,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAB_TrCH_Mapping_specs_1 = {
+	sizeof(struct RANAP_RAB_TrCH_Mapping),
+	offsetof(struct RANAP_RAB_TrCH_Mapping, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_TrCH_Mapping = {
+	"RANAP_RAB-TrCH-Mapping",
+	"RANAP_RAB-TrCH-Mapping",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_TrCH_Mapping_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAB_TrCH_Mapping_constr_1,
+	asn_MBR_RANAP_RAB_TrCH_Mapping_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAB_TrCH_Mapping_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-TrCH-Mapping.h b/src/ranap/RANAP_RAB-TrCH-Mapping.h
new file mode 100644
index 0000000..d6f2027
--- /dev/null
+++ b/src/ranap/RANAP_RAB-TrCH-Mapping.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_TrCH_Mapping_H_
+#define	_RANAP_RAB_TrCH_Mapping_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAB-TrCH-MappingItem.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-TrCH-Mapping */
+typedef struct RANAP_RAB_TrCH_Mapping {
+	A_SEQUENCE_OF(RANAP_RAB_TrCH_MappingItem_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_TrCH_Mapping_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_TrCH_Mapping;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_TrCH_Mapping_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-TrCH-MappingItem.c b/src/ranap/RANAP_RAB-TrCH-MappingItem.c
new file mode 100644
index 0000000..ec6ef62
--- /dev/null
+++ b/src/ranap/RANAP_RAB-TrCH-MappingItem.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAB-TrCH-MappingItem.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_TrCH_MappingItem_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_TrCH_MappingItem, rAB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_TrCH_MappingItem, trCH_ID_List),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TrCH_ID_List,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"trCH-ID-List"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RAB_TrCH_MappingItem, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RAB_TrCH_MappingItem_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_TrCH_MappingItem_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rAB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* trCH-ID-List */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_TrCH_MappingItem_specs_1 = {
+	sizeof(struct RANAP_RAB_TrCH_MappingItem),
+	offsetof(struct RANAP_RAB_TrCH_MappingItem, _asn_ctx),
+	asn_MAP_RANAP_RAB_TrCH_MappingItem_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_RAB_TrCH_MappingItem_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_TrCH_MappingItem = {
+	"RANAP_RAB-TrCH-MappingItem",
+	"RANAP_RAB-TrCH-MappingItem",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_TrCH_MappingItem_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_TrCH_MappingItem_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_RAB_TrCH_MappingItem_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-TrCH-MappingItem.h b/src/ranap/RANAP_RAB-TrCH-MappingItem.h
new file mode 100644
index 0000000..a14fa91
--- /dev/null
+++ b/src/ranap/RANAP_RAB-TrCH-MappingItem.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAB_TrCH_MappingItem_H_
+#define	_RANAP_RAB_TrCH_MappingItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAB-ID.h"
+#include "RANAP_TrCH-ID-List.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-TrCH-MappingItem */
+typedef struct RANAP_RAB_TrCH_MappingItem {
+	RANAP_RAB_ID_t	 rAB_ID;
+	RANAP_TrCH_ID_List_t	 trCH_ID_List;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_TrCH_MappingItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_TrCH_MappingItem;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_TrCH_MappingItem_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RABDataVolumeReport.c b/src/ranap/RANAP_RABDataVolumeReport.c
new file mode 100644
index 0000000..06d21b6
--- /dev/null
+++ b/src/ranap/RANAP_RABDataVolumeReport.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RABDataVolumeReport.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RABDataVolumeReport_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, dl_UnsuccessfullyTransmittedDataVolume),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"dl-UnsuccessfullyTransmittedDataVolume"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, dataVolumeReference),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DataVolumeReference,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"dataVolumeReference"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dl-UnsuccessfullyTransmittedDataVolume */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dataVolumeReference */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	3,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RABDataVolumeReport_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RABDataVolumeReport_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RABDataVolumeReport_specs_1 = {
+	sizeof(struct RANAP_RABDataVolumeReport),
+	offsetof(struct RANAP_RABDataVolumeReport, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RABDataVolumeReport = {
+	"RANAP_RABDataVolumeReport",
+	"RANAP_RABDataVolumeReport",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RABDataVolumeReport_tags_1,
+	sizeof(asn_DEF_RANAP_RABDataVolumeReport_tags_1)
+		/sizeof(asn_DEF_RANAP_RABDataVolumeReport_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RABDataVolumeReport_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RABDataVolumeReport_tags_1)
+		/sizeof(asn_DEF_RANAP_RABDataVolumeReport_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RABDataVolumeReport_constr_1,
+	asn_MBR_RANAP_RABDataVolumeReport_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RABDataVolumeReport_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RABDataVolumeReport.h b/src/ranap/RANAP_RABDataVolumeReport.h
new file mode 100644
index 0000000..904c275
--- /dev/null
+++ b/src/ranap/RANAP_RABDataVolumeReport.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RABDataVolumeReport_H_
+#define	_RANAP_RABDataVolumeReport_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_UnsuccessfullyTransmittedDataVolume.h"
+#include "RANAP_DataVolumeReference.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RABDataVolumeReport */
+typedef struct RANAP_RABDataVolumeReport {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_UnsuccessfullyTransmittedDataVolume_t	 dl_UnsuccessfullyTransmittedDataVolume;
+		RANAP_DataVolumeReference_t	*dataVolumeReference	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RABDataVolumeReport_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RABDataVolumeReport;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RABDataVolumeReport_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RABParametersList.c b/src/ranap/RANAP_RABParametersList.c
new file mode 100644
index 0000000..d9193c3
--- /dev/null
+++ b/src/ranap/RANAP_RABParametersList.c
@@ -0,0 +1,155 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RABParametersList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RABParametersList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_MemberA_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, rab_Id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rab-Id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, cn_domain),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CN_DomainIndicator,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cn-domain"
+		},
+	{ ATF_POINTER, 3, offsetof(struct MemberA, rabDataVolumeReport),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RABDataVolumeReport,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rabDataVolumeReport"
+		},
+	{ ATF_POINTER, 2, offsetof(struct MemberA, upInformation),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UPInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"upInformation"
+		},
+	{ ATF_POINTER, 1, offsetof(struct MemberA, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_MemberA_oms_2[] = { 2, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_MemberA_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_MemberA_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rab-Id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cn-domain */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* rabDataVolumeReport */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* upInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_MemberA_specs_2 = {
+	sizeof(struct MemberA),
+	offsetof(struct MemberA, _asn_ctx),
+	asn_MAP_MemberA_tag2el_2,
+	5,	/* Count of tags in the map */
+	asn_MAP_MemberA_oms_2,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_MemberA_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_MemberA_tags_2,
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	asn_DEF_MemberA_tags_2,	/* Same as above */
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_MemberA_2,
+	5,	/* Elements count */
+	&asn_SPC_MemberA_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RABParametersList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_MemberA_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RABParametersList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RABParametersList_specs_1 = {
+	sizeof(struct RANAP_RABParametersList),
+	offsetof(struct RANAP_RABParametersList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RABParametersList = {
+	"RANAP_RABParametersList",
+	"RANAP_RABParametersList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RABParametersList_tags_1,
+	sizeof(asn_DEF_RANAP_RABParametersList_tags_1)
+		/sizeof(asn_DEF_RANAP_RABParametersList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RABParametersList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RABParametersList_tags_1)
+		/sizeof(asn_DEF_RANAP_RABParametersList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RABParametersList_constr_1,
+	asn_MBR_RANAP_RABParametersList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RABParametersList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RABParametersList.h b/src/ranap/RANAP_RABParametersList.h
new file mode 100644
index 0000000..0208cda
--- /dev/null
+++ b/src/ranap/RANAP_RABParametersList.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RABParametersList_H_
+#define	_RANAP_RABParametersList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_RAB-ID.h"
+#include "RANAP_CN-DomainIndicator.h"
+#include "RANAP_RABDataVolumeReport.h"
+#include "RANAP_UPInformation.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RABParametersList */
+typedef struct RANAP_RABParametersList {
+	A_SEQUENCE_OF(struct MemberA {
+		RANAP_RAB_ID_t	 rab_Id;
+		RANAP_CN_DomainIndicator_t	 cn_domain;
+		RANAP_RABDataVolumeReport_t	*rabDataVolumeReport	/* OPTIONAL */;
+		RANAP_UPInformation_t	*upInformation	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RABParametersList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RABParametersList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RABParametersList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RABased.c b/src/ranap/RANAP_RABased.c
new file mode 100644
index 0000000..46b5bf0
--- /dev/null
+++ b/src/ranap/RANAP_RABased.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RABased.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RABased_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RABased, raiList),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAI_List,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"raiList"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RABased, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RABased_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RABased_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RABased_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* raiList */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RABased_specs_1 = {
+	sizeof(struct RANAP_RABased),
+	offsetof(struct RANAP_RABased, _asn_ctx),
+	asn_MAP_RANAP_RABased_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_RABased_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RABased = {
+	"RANAP_RABased",
+	"RANAP_RABased",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RABased_tags_1,
+	sizeof(asn_DEF_RANAP_RABased_tags_1)
+		/sizeof(asn_DEF_RANAP_RABased_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RABased_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RABased_tags_1)
+		/sizeof(asn_DEF_RANAP_RABased_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RABased_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_RABased_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RABased.h b/src/ranap/RANAP_RABased.h
new file mode 100644
index 0000000..acd2c52
--- /dev/null
+++ b/src/ranap/RANAP_RABased.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RABased_H_
+#define	_RANAP_RABased_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAI-List.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RABased */
+typedef struct RANAP_RABased {
+	RANAP_RAI_List_t	 raiList;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RABased_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RABased;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RABased_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAC.c b/src/ranap/RANAP_RAC.c
new file mode 100644
index 0000000..6bf650a
--- /dev/null
+++ b/src/ranap/RANAP_RAC.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAC.h"
+
+int
+RANAP_RAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_RAC_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RAC_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RAC_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RAC_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RAC_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAC_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAC_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAC = {
+	"RANAP_RAC",
+	"RANAP_RAC",
+	RANAP_RAC_free,
+	RANAP_RAC_print,
+	RANAP_RAC_constraint,
+	RANAP_RAC_decode_ber,
+	RANAP_RAC_encode_der,
+	RANAP_RAC_decode_xer,
+	RANAP_RAC_encode_xer,
+	RANAP_RAC_decode_uper,
+	RANAP_RAC_encode_uper,
+	RANAP_RAC_decode_aper,
+	RANAP_RAC_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAC_tags_1,
+	sizeof(asn_DEF_RANAP_RAC_tags_1)
+		/sizeof(asn_DEF_RANAP_RAC_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAC_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAC_tags_1)
+		/sizeof(asn_DEF_RANAP_RAC_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAC_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RAC.h b/src/ranap/RANAP_RAC.h
new file mode 100644
index 0000000..1de733a
--- /dev/null
+++ b/src/ranap/RANAP_RAC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAC_H_
+#define	_RANAP_RAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAC */
+typedef OCTET_STRING_t	 RANAP_RAC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAC;
+asn_struct_free_f RANAP_RAC_free;
+asn_struct_print_f RANAP_RAC_print;
+asn_constr_check_f RANAP_RAC_constraint;
+ber_type_decoder_f RANAP_RAC_decode_ber;
+der_type_encoder_f RANAP_RAC_encode_der;
+xer_type_decoder_f RANAP_RAC_decode_xer;
+xer_type_encoder_f RANAP_RAC_encode_xer;
+per_type_decoder_f RANAP_RAC_decode_uper;
+per_type_encoder_f RANAP_RAC_encode_uper;
+per_type_decoder_f RANAP_RAC_decode_aper;
+per_type_encoder_f RANAP_RAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAC_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAI-List.c b/src/ranap/RANAP_RAI-List.c
new file mode 100644
index 0000000..165ca0d
--- /dev/null
+++ b/src/ranap/RANAP_RAI-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAI-List.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAI_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 3,  3,  1l,  8l }	/* (SIZE(1..8)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAI_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_RAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAI_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAI_List_specs_1 = {
+	sizeof(struct RANAP_RAI_List),
+	offsetof(struct RANAP_RAI_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAI_List = {
+	"RANAP_RAI-List",
+	"RANAP_RAI-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAI_List_tags_1,
+	sizeof(asn_DEF_RANAP_RAI_List_tags_1)
+		/sizeof(asn_DEF_RANAP_RAI_List_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAI_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAI_List_tags_1)
+		/sizeof(asn_DEF_RANAP_RAI_List_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAI_List_constr_1,
+	asn_MBR_RANAP_RAI_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAI_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAI-List.h b/src/ranap/RANAP_RAI-List.h
new file mode 100644
index 0000000..bddb466
--- /dev/null
+++ b/src/ranap/RANAP_RAI-List.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAI_List_H_
+#define	_RANAP_RAI_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAI.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAI-List */
+typedef struct RANAP_RAI_List {
+	A_SEQUENCE_OF(RANAP_RAI_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAI_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAI_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAI_List_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAI.c b/src/ranap/RANAP_RAI.c
new file mode 100644
index 0000000..2e62967
--- /dev/null
+++ b/src/ranap/RANAP_RAI.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAI.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAI_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAI, lAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAI, rAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAC"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RAI, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RAI_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RAI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAI_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* lAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAI_specs_1 = {
+	sizeof(struct RANAP_RAI),
+	offsetof(struct RANAP_RAI, _asn_ctx),
+	asn_MAP_RANAP_RAI_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_RAI_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAI = {
+	"RANAP_RAI",
+	"RANAP_RAI",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAI_tags_1,
+	sizeof(asn_DEF_RANAP_RAI_tags_1)
+		/sizeof(asn_DEF_RANAP_RAI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAI_tags_1)
+		/sizeof(asn_DEF_RANAP_RAI_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAI_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_RAI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAI.h b/src/ranap/RANAP_RAI.h
new file mode 100644
index 0000000..b9aa4c0
--- /dev/null
+++ b/src/ranap/RANAP_RAI.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAI_H_
+#define	_RANAP_RAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI.h"
+#include "RANAP_RAC.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAI */
+typedef struct RANAP_RAI {
+	RANAP_LAI_t	 lAI;
+	RANAP_RAC_t	 rAC;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAI;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAListofIdleModeUEs.c b/src/ranap/RANAP_RAListofIdleModeUEs.c
new file mode 100644
index 0000000..694b3cc
--- /dev/null
+++ b/src/ranap/RANAP_RAListofIdleModeUEs.c
@@ -0,0 +1,233 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAListofIdleModeUEs.h"
+
+static int
+emptyFullRAListofIdleModeUEs_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+static void
+emptyFullRAListofIdleModeUEs_3_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+static int
+emptyFullRAListofIdleModeUEs_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+static asn_dec_rval_t
+emptyFullRAListofIdleModeUEs_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+static asn_enc_rval_t
+emptyFullRAListofIdleModeUEs_3_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+static asn_dec_rval_t
+emptyFullRAListofIdleModeUEs_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+static asn_enc_rval_t
+emptyFullRAListofIdleModeUEs_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+static asn_dec_rval_t
+emptyFullRAListofIdleModeUEs_3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_enc_rval_t
+emptyFullRAListofIdleModeUEs_3_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_enc_rval_t
+emptyFullRAListofIdleModeUEs_3_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_dec_rval_t
+emptyFullRAListofIdleModeUEs_3_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	emptyFullRAListofIdleModeUEs_3_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_emptyFullRAListofIdleModeUEs_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_type_RANAP_RAListofIdleModeUEs_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_emptyFullRAListofIdleModeUEs_value2enum_3[] = {
+	{ 0,	9,	"emptylist" },
+	{ 1,	8,	"fulllist" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_emptyFullRAListofIdleModeUEs_enum2value_3[] = {
+	0,	/* emptylist(0) */
+	1	/* fulllist(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_emptyFullRAListofIdleModeUEs_specs_3 = {
+	asn_MAP_emptyFullRAListofIdleModeUEs_value2enum_3,	/* "tag" => N; sorted by tag */
+	asn_MAP_emptyFullRAListofIdleModeUEs_enum2value_3,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_emptyFullRAListofIdleModeUEs_tags_3[] = {
+	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_emptyFullRAListofIdleModeUEs_3 = {
+	"emptyFullRAListofIdleModeUEs",
+	"emptyFullRAListofIdleModeUEs",
+	emptyFullRAListofIdleModeUEs_3_free,
+	emptyFullRAListofIdleModeUEs_3_print,
+	emptyFullRAListofIdleModeUEs_3_constraint,
+	emptyFullRAListofIdleModeUEs_3_decode_ber,
+	emptyFullRAListofIdleModeUEs_3_encode_der,
+	emptyFullRAListofIdleModeUEs_3_decode_xer,
+	emptyFullRAListofIdleModeUEs_3_encode_xer,
+	emptyFullRAListofIdleModeUEs_3_decode_uper,
+	emptyFullRAListofIdleModeUEs_3_encode_uper,
+	emptyFullRAListofIdleModeUEs_3_decode_aper,
+	emptyFullRAListofIdleModeUEs_3_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_emptyFullRAListofIdleModeUEs_tags_3,
+	sizeof(asn_DEF_emptyFullRAListofIdleModeUEs_tags_3)
+		/sizeof(asn_DEF_emptyFullRAListofIdleModeUEs_tags_3[0]) - 1, /* 1 */
+	asn_DEF_emptyFullRAListofIdleModeUEs_tags_3,	/* Same as above */
+	sizeof(asn_DEF_emptyFullRAListofIdleModeUEs_tags_3)
+		/sizeof(asn_DEF_emptyFullRAListofIdleModeUEs_tags_3[0]), /* 2 */
+	&asn_PER_type_emptyFullRAListofIdleModeUEs_constr_3,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_emptyFullRAListofIdleModeUEs_specs_3	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAListofIdleModeUEs_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAListofIdleModeUEs, choice.notEmptyRAListofIdleModeUEs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_NotEmptyRAListofIdleModeUEs,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"notEmptyRAListofIdleModeUEs"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAListofIdleModeUEs, choice.emptyFullRAListofIdleModeUEs),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_emptyFullRAListofIdleModeUEs_3,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"emptyFullRAListofIdleModeUEs"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAListofIdleModeUEs_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* notEmptyRAListofIdleModeUEs */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* emptyFullRAListofIdleModeUEs */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_RAListofIdleModeUEs_specs_1 = {
+	sizeof(struct RANAP_RAListofIdleModeUEs),
+	offsetof(struct RANAP_RAListofIdleModeUEs, _asn_ctx),
+	offsetof(struct RANAP_RAListofIdleModeUEs, present),
+	sizeof(((struct RANAP_RAListofIdleModeUEs *)0)->present),
+	asn_MAP_RANAP_RAListofIdleModeUEs_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAListofIdleModeUEs = {
+	"RANAP_RAListofIdleModeUEs",
+	"RANAP_RAListofIdleModeUEs",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_RAListofIdleModeUEs_constr_1,
+	asn_MBR_RANAP_RAListofIdleModeUEs_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_RAListofIdleModeUEs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAListofIdleModeUEs.h b/src/ranap/RANAP_RAListofIdleModeUEs.h
new file mode 100644
index 0000000..db5f7c1
--- /dev/null
+++ b/src/ranap/RANAP_RAListofIdleModeUEs.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAListofIdleModeUEs_H_
+#define	_RANAP_RAListofIdleModeUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_NotEmptyRAListofIdleModeUEs.h"
+#include <NativeEnumerated.h>
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RAListofIdleModeUEs_PR {
+	RANAP_RAListofIdleModeUEs_PR_NOTHING,	/* No components present */
+	RANAP_RAListofIdleModeUEs_PR_notEmptyRAListofIdleModeUEs,
+	RANAP_RAListofIdleModeUEs_PR_emptyFullRAListofIdleModeUEs,
+	/* Extensions may appear below */
+	
+} RANAP_RAListofIdleModeUEs_PR;
+typedef enum emptyFullRAListofIdleModeUEs {
+	emptyFullRAListofIdleModeUEs_emptylist	= 0,
+	emptyFullRAListofIdleModeUEs_fulllist	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_emptyFullRAListofIdleModeUEs;
+
+/* RANAP_RAListofIdleModeUEs */
+typedef struct RANAP_RAListofIdleModeUEs {
+	RANAP_RAListofIdleModeUEs_PR present;
+	union RANAP_RAListofIdleModeUEs_u {
+		RANAP_NotEmptyRAListofIdleModeUEs_t	 notEmptyRAListofIdleModeUEs;
+		long	 emptyFullRAListofIdleModeUEs;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAListofIdleModeUEs_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_emptyFullRAListofIdleModeUEs_3;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAListofIdleModeUEs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAListofIdleModeUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAListwithNoIdleModeUEsAnyMore.c b/src/ranap/RANAP_RAListwithNoIdleModeUEsAnyMore.c
new file mode 100644
index 0000000..2bfeeb3
--- /dev/null
+++ b/src/ranap/RANAP_RAListwithNoIdleModeUEsAnyMore.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAListwithNoIdleModeUEsAnyMore.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAListwithNoIdleModeUEsAnyMore_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAListwithNoIdleModeUEsAnyMore_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_RAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAListwithNoIdleModeUEsAnyMore_specs_1 = {
+	sizeof(struct RANAP_RAListwithNoIdleModeUEsAnyMore),
+	offsetof(struct RANAP_RAListwithNoIdleModeUEsAnyMore, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore = {
+	"RANAP_RAListwithNoIdleModeUEsAnyMore",
+	"RANAP_RAListwithNoIdleModeUEsAnyMore",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1,
+	sizeof(asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1)
+		/sizeof(asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1)
+		/sizeof(asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAListwithNoIdleModeUEsAnyMore_constr_1,
+	asn_MBR_RANAP_RAListwithNoIdleModeUEsAnyMore_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAListwithNoIdleModeUEsAnyMore_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAListwithNoIdleModeUEsAnyMore.h b/src/ranap/RANAP_RAListwithNoIdleModeUEsAnyMore.h
new file mode 100644
index 0000000..0a9f0da
--- /dev/null
+++ b/src/ranap/RANAP_RAListwithNoIdleModeUEsAnyMore.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAListwithNoIdleModeUEsAnyMore_H_
+#define	_RANAP_RAListwithNoIdleModeUEsAnyMore_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAListwithNoIdleModeUEsAnyMore */
+typedef struct RANAP_RAListwithNoIdleModeUEsAnyMore {
+	A_SEQUENCE_OF(RANAP_RAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAListwithNoIdleModeUEsAnyMore_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAListwithNoIdleModeUEsAnyMore;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAListwithNoIdleModeUEsAnyMore_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RANAP-EnhancedRelocationInformationRequest.c b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationRequest.c
new file mode 100644
index 0000000..a79bbda
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RANAP-EnhancedRelocationInformationRequest.h"
+
+static int
+memb_rANAP_EnhancedRelocationInformationRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rANAP_EnhancedRelocationInformationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rANAP_EnhancedRelocationInformationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rANAP_EnhancedRelocationInformationRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rANAP_EnhancedRelocationInformationRequest_ies_specs_2 = {
+	sizeof(struct rANAP_EnhancedRelocationInformationRequest_ies),
+	offsetof(struct rANAP_EnhancedRelocationInformationRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_2 = {
+	"rANAP-EnhancedRelocationInformationRequest-ies",
+	"rANAP-EnhancedRelocationInformationRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2,
+	sizeof(asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2)
+		/sizeof(asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2)
+		/sizeof(asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rANAP_EnhancedRelocationInformationRequest_ies_constr_2,
+	asn_MBR_rANAP_EnhancedRelocationInformationRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rANAP_EnhancedRelocationInformationRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RANAP_EnhancedRelocationInformationRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_EnhancedRelocationInformationRequest, rANAP_EnhancedRelocationInformationRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rANAP_EnhancedRelocationInformationRequest_ies_2,
+		memb_rANAP_EnhancedRelocationInformationRequest_ies_constraint_1,
+		&asn_PER_memb_rANAP_EnhancedRelocationInformationRequest_ies_constr_2,
+		0,
+		"rANAP-EnhancedRelocationInformationRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RANAP_EnhancedRelocationInformationRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rANAP-EnhancedRelocationInformationRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RANAP_EnhancedRelocationInformationRequest_specs_1 = {
+	sizeof(struct RANAP_RANAP_EnhancedRelocationInformationRequest),
+	offsetof(struct RANAP_RANAP_EnhancedRelocationInformationRequest, _asn_ctx),
+	asn_MAP_RANAP_RANAP_EnhancedRelocationInformationRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest = {
+	"RANAP_RANAP-EnhancedRelocationInformationRequest",
+	"RANAP_RANAP-EnhancedRelocationInformationRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1,
+	sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RANAP_EnhancedRelocationInformationRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RANAP_EnhancedRelocationInformationRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RANAP-EnhancedRelocationInformationRequest.h b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationRequest.h
new file mode 100644
index 0000000..6fdaead
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RANAP_EnhancedRelocationInformationRequest_H_
+#define	_RANAP_RANAP_EnhancedRelocationInformationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RANAP-EnhancedRelocationInformationRequest */
+typedef struct RANAP_RANAP_EnhancedRelocationInformationRequest {
+	struct rANAP_EnhancedRelocationInformationRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rANAP_EnhancedRelocationInformationRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RANAP_EnhancedRelocationInformationRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_EnhancedRelocationInformationRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RANAP_EnhancedRelocationInformationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RANAP-EnhancedRelocationInformationResponse.c b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationResponse.c
new file mode 100644
index 0000000..6f29883
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RANAP-EnhancedRelocationInformationResponse.h"
+
+static int
+memb_rANAP_EnhancedRelocationInformationResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rANAP_EnhancedRelocationInformationResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rANAP_EnhancedRelocationInformationResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rANAP_EnhancedRelocationInformationResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rANAP_EnhancedRelocationInformationResponse_ies_specs_2 = {
+	sizeof(struct rANAP_EnhancedRelocationInformationResponse_ies),
+	offsetof(struct rANAP_EnhancedRelocationInformationResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_2 = {
+	"rANAP-EnhancedRelocationInformationResponse-ies",
+	"rANAP-EnhancedRelocationInformationResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2,
+	sizeof(asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2)
+		/sizeof(asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2)
+		/sizeof(asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rANAP_EnhancedRelocationInformationResponse_ies_constr_2,
+	asn_MBR_rANAP_EnhancedRelocationInformationResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rANAP_EnhancedRelocationInformationResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RANAP_EnhancedRelocationInformationResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_EnhancedRelocationInformationResponse, rANAP_EnhancedRelocationInformationResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rANAP_EnhancedRelocationInformationResponse_ies_2,
+		memb_rANAP_EnhancedRelocationInformationResponse_ies_constraint_1,
+		&asn_PER_memb_rANAP_EnhancedRelocationInformationResponse_ies_constr_2,
+		0,
+		"rANAP-EnhancedRelocationInformationResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RANAP_EnhancedRelocationInformationResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rANAP-EnhancedRelocationInformationResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RANAP_EnhancedRelocationInformationResponse_specs_1 = {
+	sizeof(struct RANAP_RANAP_EnhancedRelocationInformationResponse),
+	offsetof(struct RANAP_RANAP_EnhancedRelocationInformationResponse, _asn_ctx),
+	asn_MAP_RANAP_RANAP_EnhancedRelocationInformationResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse = {
+	"RANAP_RANAP-EnhancedRelocationInformationResponse",
+	"RANAP_RANAP-EnhancedRelocationInformationResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1,
+	sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RANAP_EnhancedRelocationInformationResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RANAP_EnhancedRelocationInformationResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RANAP-EnhancedRelocationInformationResponse.h b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationResponse.h
new file mode 100644
index 0000000..f1ee9e8
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-EnhancedRelocationInformationResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RANAP_EnhancedRelocationInformationResponse_H_
+#define	_RANAP_RANAP_EnhancedRelocationInformationResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RANAP-EnhancedRelocationInformationResponse */
+typedef struct RANAP_RANAP_EnhancedRelocationInformationResponse {
+	struct rANAP_EnhancedRelocationInformationResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rANAP_EnhancedRelocationInformationResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RANAP_EnhancedRelocationInformationResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_EnhancedRelocationInformationResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RANAP_EnhancedRelocationInformationResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RANAP-PDU.c b/src/ranap/RANAP_RANAP-PDU.c
new file mode 100644
index 0000000..06ab033
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-PDU.c
@@ -0,0 +1,92 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RANAP-PDU.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RANAP_PDU_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RANAP_PDU_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_PDU, choice.initiatingMessage),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_InitiatingMessage,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"initiatingMessage"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_PDU, choice.successfulOutcome),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SuccessfulOutcome,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"successfulOutcome"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_PDU, choice.unsuccessfulOutcome),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UnsuccessfulOutcome,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"unsuccessfulOutcome"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_PDU, choice.outcome),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Outcome,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"outcome"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RANAP_PDU_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* initiatingMessage */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* successfulOutcome */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* unsuccessfulOutcome */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* outcome */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_RANAP_PDU_specs_1 = {
+	sizeof(struct RANAP_RANAP_PDU),
+	offsetof(struct RANAP_RANAP_PDU, _asn_ctx),
+	offsetof(struct RANAP_RANAP_PDU, present),
+	sizeof(((struct RANAP_RANAP_PDU *)0)->present),
+	asn_MAP_RANAP_RANAP_PDU_tag2el_1,
+	4,	/* Count of tags in the map */
+	0,
+	4	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_PDU = {
+	"RANAP_RANAP-PDU",
+	"RANAP_RANAP-PDU",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_RANAP_PDU_constr_1,
+	asn_MBR_RANAP_RANAP_PDU_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_RANAP_PDU_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RANAP-PDU.h b/src/ranap/RANAP_RANAP-PDU.h
new file mode 100644
index 0000000..6f93183
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-PDU.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RANAP_PDU_H_
+#define	_RANAP_RANAP_PDU_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_InitiatingMessage.h"
+#include "RANAP_SuccessfulOutcome.h"
+#include "RANAP_UnsuccessfulOutcome.h"
+#include "RANAP_Outcome.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RANAP_PDU_PR {
+	RANAP_RANAP_PDU_PR_NOTHING,	/* No components present */
+	RANAP_RANAP_PDU_PR_initiatingMessage,
+	RANAP_RANAP_PDU_PR_successfulOutcome,
+	RANAP_RANAP_PDU_PR_unsuccessfulOutcome,
+	RANAP_RANAP_PDU_PR_outcome,
+	/* Extensions may appear below */
+	
+} RANAP_RANAP_PDU_PR;
+
+/* RANAP_RANAP-PDU */
+typedef struct RANAP_RANAP_PDU {
+	RANAP_RANAP_PDU_PR present;
+	union RANAP_RANAP_PDU_u {
+		RANAP_InitiatingMessage_t	 initiatingMessage;
+		RANAP_SuccessfulOutcome_t	 successfulOutcome;
+		RANAP_UnsuccessfulOutcome_t	 unsuccessfulOutcome;
+		RANAP_Outcome_t	 outcome;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RANAP_PDU_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_PDU;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RANAP_PDU_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RANAP-RelocationInformation.c b/src/ranap/RANAP_RANAP-RelocationInformation.c
new file mode 100644
index 0000000..fd7ec95
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-RelocationInformation.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RANAP-RelocationInformation.h"
+
+static int
+memb_rANAP_RelocationInformation_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_rANAP_RelocationInformation_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_rANAP_RelocationInformation_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_rANAP_RelocationInformation_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rANAP_RelocationInformation_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rANAP_RelocationInformation_ies_specs_2 = {
+	sizeof(struct rANAP_RelocationInformation_ies),
+	offsetof(struct rANAP_RelocationInformation_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rANAP_RelocationInformation_ies_2 = {
+	"rANAP-RelocationInformation-ies",
+	"rANAP-RelocationInformation-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_rANAP_RelocationInformation_ies_tags_2,
+	sizeof(asn_DEF_rANAP_RelocationInformation_ies_tags_2)
+		/sizeof(asn_DEF_rANAP_RelocationInformation_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rANAP_RelocationInformation_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rANAP_RelocationInformation_ies_tags_2)
+		/sizeof(asn_DEF_rANAP_RelocationInformation_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rANAP_RelocationInformation_ies_constr_2,
+	asn_MBR_rANAP_RelocationInformation_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rANAP_RelocationInformation_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RANAP_RelocationInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RANAP_RelocationInformation, rANAP_RelocationInformation_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rANAP_RelocationInformation_ies_2,
+		memb_rANAP_RelocationInformation_ies_constraint_1,
+		&asn_PER_memb_rANAP_RelocationInformation_ies_constr_2,
+		0,
+		"rANAP-RelocationInformation-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RANAP_RelocationInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RANAP_RelocationInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rANAP-RelocationInformation-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RANAP_RelocationInformation_specs_1 = {
+	sizeof(struct RANAP_RANAP_RelocationInformation),
+	offsetof(struct RANAP_RANAP_RelocationInformation, _asn_ctx),
+	asn_MAP_RANAP_RANAP_RelocationInformation_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_RelocationInformation = {
+	"RANAP_RANAP-RelocationInformation",
+	"RANAP_RANAP-RelocationInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RANAP_RelocationInformation_tags_1,
+	sizeof(asn_DEF_RANAP_RANAP_RelocationInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_RANAP_RelocationInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RANAP_RelocationInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RANAP_RelocationInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_RANAP_RelocationInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RANAP_RelocationInformation_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RANAP_RelocationInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RANAP-RelocationInformation.h b/src/ranap/RANAP_RANAP-RelocationInformation.h
new file mode 100644
index 0000000..199d85c
--- /dev/null
+++ b/src/ranap/RANAP_RANAP-RelocationInformation.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RANAP_RelocationInformation_H_
+#define	_RANAP_RANAP_RelocationInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RANAP-RelocationInformation */
+typedef struct RANAP_RANAP_RelocationInformation {
+	struct rANAP_RelocationInformation_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rANAP_RelocationInformation_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RANAP_RelocationInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RANAP_RelocationInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RANAP_RelocationInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAT-Type.c b/src/ranap/RANAP_RAT-Type.c
new file mode 100644
index 0000000..11b7336
--- /dev/null
+++ b/src/ranap/RANAP_RAT-Type.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAT-Type.h"
+
+int
+RANAP_RAT_Type_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RAT_Type_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RAT_Type_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RAT_Type_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAT_Type_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RAT_Type_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAT_Type_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RAT_Type_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RAT_Type_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RAT_Type_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RAT_Type_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RAT_Type_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RAT_Type_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAT_Type_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RAT_Type_value2enum_1[] = {
+	{ 0,	5,	"utran" },
+	{ 1,	5,	"geran" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RAT_Type_enum2value_1[] = {
+	1,	/* geran(1) */
+	0	/* utran(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RAT_Type_specs_1 = {
+	asn_MAP_RANAP_RAT_Type_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RAT_Type_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAT_Type_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAT_Type = {
+	"RANAP_RAT-Type",
+	"RANAP_RAT-Type",
+	RANAP_RAT_Type_free,
+	RANAP_RAT_Type_print,
+	RANAP_RAT_Type_constraint,
+	RANAP_RAT_Type_decode_ber,
+	RANAP_RAT_Type_encode_der,
+	RANAP_RAT_Type_decode_xer,
+	RANAP_RAT_Type_encode_xer,
+	RANAP_RAT_Type_decode_uper,
+	RANAP_RAT_Type_encode_uper,
+	RANAP_RAT_Type_decode_aper,
+	RANAP_RAT_Type_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAT_Type_tags_1,
+	sizeof(asn_DEF_RANAP_RAT_Type_tags_1)
+		/sizeof(asn_DEF_RANAP_RAT_Type_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAT_Type_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAT_Type_tags_1)
+		/sizeof(asn_DEF_RANAP_RAT_Type_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAT_Type_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RAT_Type_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAT-Type.h b/src/ranap/RANAP_RAT-Type.h
new file mode 100644
index 0000000..55c5467
--- /dev/null
+++ b/src/ranap/RANAP_RAT-Type.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAT_Type_H_
+#define	_RANAP_RAT_Type_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RAT_Type {
+	RANAP_RAT_Type_utran	= 0,
+	RANAP_RAT_Type_geran	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_RAT_Type;
+
+/* RANAP_RAT-Type */
+typedef long	 RANAP_RAT_Type_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAT_Type;
+asn_struct_free_f RANAP_RAT_Type_free;
+asn_struct_print_f RANAP_RAT_Type_print;
+asn_constr_check_f RANAP_RAT_Type_constraint;
+ber_type_decoder_f RANAP_RAT_Type_decode_ber;
+der_type_encoder_f RANAP_RAT_Type_encode_der;
+xer_type_decoder_f RANAP_RAT_Type_decode_xer;
+xer_type_encoder_f RANAP_RAT_Type_encode_xer;
+per_type_decoder_f RANAP_RAT_Type_decode_uper;
+per_type_encoder_f RANAP_RAT_Type_encode_uper;
+per_type_decoder_f RANAP_RAT_Type_decode_aper;
+per_type_encoder_f RANAP_RAT_Type_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAT_Type_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAofIdleModeUEs.c b/src/ranap/RANAP_RAofIdleModeUEs.c
new file mode 100644
index 0000000..2314d74
--- /dev/null
+++ b/src/ranap/RANAP_RAofIdleModeUEs.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RAofIdleModeUEs.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RAofIdleModeUEs_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16, -1,  1l,  65536l }	/* (SIZE(1..65536)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RAofIdleModeUEs_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_RAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAofIdleModeUEs_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RAofIdleModeUEs_specs_1 = {
+	sizeof(struct RANAP_RAofIdleModeUEs),
+	offsetof(struct RANAP_RAofIdleModeUEs, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RAofIdleModeUEs = {
+	"RANAP_RAofIdleModeUEs",
+	"RANAP_RAofIdleModeUEs",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RAofIdleModeUEs_tags_1,
+	sizeof(asn_DEF_RANAP_RAofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_RAofIdleModeUEs_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAofIdleModeUEs_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAofIdleModeUEs_tags_1)
+		/sizeof(asn_DEF_RANAP_RAofIdleModeUEs_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RAofIdleModeUEs_constr_1,
+	asn_MBR_RANAP_RAofIdleModeUEs_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RAofIdleModeUEs_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAofIdleModeUEs.h b/src/ranap/RANAP_RAofIdleModeUEs.h
new file mode 100644
index 0000000..2913678
--- /dev/null
+++ b/src/ranap/RANAP_RAofIdleModeUEs.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RAofIdleModeUEs_H_
+#define	_RANAP_RAofIdleModeUEs_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RAC.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAofIdleModeUEs */
+typedef struct RANAP_RAofIdleModeUEs {
+	A_SEQUENCE_OF(RANAP_RAC_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAofIdleModeUEs_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAofIdleModeUEs;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAofIdleModeUEs_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RIM-Transfer.c b/src/ranap/RANAP_RIM-Transfer.c
new file mode 100644
index 0000000..3bd8e51
--- /dev/null
+++ b/src/ranap/RANAP_RIM-Transfer.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RIM-Transfer.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RIM_Transfer_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RIM_Transfer, rIMInformation),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RIMInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rIMInformation"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_RIM_Transfer, rIMRoutingAddress),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_RIMRoutingAddress,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rIMRoutingAddress"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RIM_Transfer, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RIM_Transfer_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RIM_Transfer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RIM_Transfer_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rIMInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rIMRoutingAddress */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RIM_Transfer_specs_1 = {
+	sizeof(struct RANAP_RIM_Transfer),
+	offsetof(struct RANAP_RIM_Transfer, _asn_ctx),
+	asn_MAP_RANAP_RIM_Transfer_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_RIM_Transfer_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RIM_Transfer = {
+	"RANAP_RIM-Transfer",
+	"RANAP_RIM-Transfer",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RIM_Transfer_tags_1,
+	sizeof(asn_DEF_RANAP_RIM_Transfer_tags_1)
+		/sizeof(asn_DEF_RANAP_RIM_Transfer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RIM_Transfer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RIM_Transfer_tags_1)
+		/sizeof(asn_DEF_RANAP_RIM_Transfer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RIM_Transfer_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_RIM_Transfer_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RIM-Transfer.h b/src/ranap/RANAP_RIM-Transfer.h
new file mode 100644
index 0000000..7187ad6
--- /dev/null
+++ b/src/ranap/RANAP_RIM-Transfer.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RIM_Transfer_H_
+#define	_RANAP_RIM_Transfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RIMInformation.h"
+#include "RANAP_RIMRoutingAddress.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RIM-Transfer */
+typedef struct RANAP_RIM_Transfer {
+	RANAP_RIMInformation_t	 rIMInformation;
+	RANAP_RIMRoutingAddress_t	*rIMRoutingAddress	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RIM_Transfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RIM_Transfer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RIM_Transfer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RIMInformation.c b/src/ranap/RANAP_RIMInformation.c
new file mode 100644
index 0000000..fa073b6
--- /dev/null
+++ b/src/ranap/RANAP_RIMInformation.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RIMInformation.h"
+
+int
+RANAP_RIMInformation_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RIMInformation_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_RIMInformation_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RIMInformation_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RIMInformation_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RIMInformation_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RIMInformation_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RIMInformation_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RIMInformation_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RIMInformation_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RIMInformation_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RIMInformation_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RIMInformation_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_RIMInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RIMInformation = {
+	"RANAP_RIMInformation",
+	"RANAP_RIMInformation",
+	RANAP_RIMInformation_free,
+	RANAP_RIMInformation_print,
+	RANAP_RIMInformation_constraint,
+	RANAP_RIMInformation_decode_ber,
+	RANAP_RIMInformation_encode_der,
+	RANAP_RIMInformation_decode_xer,
+	RANAP_RIMInformation_encode_xer,
+	RANAP_RIMInformation_decode_uper,
+	RANAP_RIMInformation_encode_uper,
+	RANAP_RIMInformation_decode_aper,
+	RANAP_RIMInformation_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RIMInformation_tags_1,
+	sizeof(asn_DEF_RANAP_RIMInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_RIMInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RIMInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RIMInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_RIMInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RIMInformation.h b/src/ranap/RANAP_RIMInformation.h
new file mode 100644
index 0000000..47b60e9
--- /dev/null
+++ b/src/ranap/RANAP_RIMInformation.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RIMInformation_H_
+#define	_RANAP_RIMInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RIMInformation */
+typedef OCTET_STRING_t	 RANAP_RIMInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RIMInformation;
+asn_struct_free_f RANAP_RIMInformation_free;
+asn_struct_print_f RANAP_RIMInformation_print;
+asn_constr_check_f RANAP_RIMInformation_constraint;
+ber_type_decoder_f RANAP_RIMInformation_decode_ber;
+der_type_encoder_f RANAP_RIMInformation_encode_der;
+xer_type_decoder_f RANAP_RIMInformation_decode_xer;
+xer_type_encoder_f RANAP_RIMInformation_encode_xer;
+per_type_decoder_f RANAP_RIMInformation_decode_uper;
+per_type_encoder_f RANAP_RIMInformation_encode_uper;
+per_type_decoder_f RANAP_RIMInformation_decode_aper;
+per_type_encoder_f RANAP_RIMInformation_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RIMInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RIMRoutingAddress.c b/src/ranap/RANAP_RIMRoutingAddress.c
new file mode 100644
index 0000000..7ff3b5e
--- /dev/null
+++ b/src/ranap/RANAP_RIMRoutingAddress.c
@@ -0,0 +1,82 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RIMRoutingAddress.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RIMRoutingAddress_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RIMRoutingAddress_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RIMRoutingAddress, choice.targetRNC_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetRNC_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"targetRNC-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RIMRoutingAddress, choice.gERAN_Cell_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_GERAN_Cell_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"gERAN-Cell-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RIMRoutingAddress, choice.targeteNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetENB_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"targeteNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RIMRoutingAddress_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* targetRNC-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* gERAN-Cell-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* targeteNB-ID */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_RIMRoutingAddress_specs_1 = {
+	sizeof(struct RANAP_RIMRoutingAddress),
+	offsetof(struct RANAP_RIMRoutingAddress, _asn_ctx),
+	offsetof(struct RANAP_RIMRoutingAddress, present),
+	sizeof(((struct RANAP_RIMRoutingAddress *)0)->present),
+	asn_MAP_RANAP_RIMRoutingAddress_tag2el_1,
+	3,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RIMRoutingAddress = {
+	"RANAP_RIMRoutingAddress",
+	"RANAP_RIMRoutingAddress",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_RIMRoutingAddress_constr_1,
+	asn_MBR_RANAP_RIMRoutingAddress_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_RIMRoutingAddress_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RIMRoutingAddress.h b/src/ranap/RANAP_RIMRoutingAddress.h
new file mode 100644
index 0000000..3086b27
--- /dev/null
+++ b/src/ranap/RANAP_RIMRoutingAddress.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RIMRoutingAddress_H_
+#define	_RANAP_RIMRoutingAddress_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TargetRNC-ID.h"
+#include "RANAP_GERAN-Cell-ID.h"
+#include "RANAP_TargetENB-ID.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RIMRoutingAddress_PR {
+	RANAP_RIMRoutingAddress_PR_NOTHING,	/* No components present */
+	RANAP_RIMRoutingAddress_PR_targetRNC_ID,
+	RANAP_RIMRoutingAddress_PR_gERAN_Cell_ID,
+	/* Extensions may appear below */
+	RANAP_RIMRoutingAddress_PR_targeteNB_ID
+} RANAP_RIMRoutingAddress_PR;
+
+/* RANAP_RIMRoutingAddress */
+typedef struct RANAP_RIMRoutingAddress {
+	RANAP_RIMRoutingAddress_PR present;
+	union RANAP_RIMRoutingAddress_u {
+		RANAP_TargetRNC_ID_t	 targetRNC_ID;
+		RANAP_GERAN_Cell_ID_t	 gERAN_Cell_ID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		RANAP_TargetENB_ID_t	 targeteNB_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RIMRoutingAddress_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RIMRoutingAddress;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RIMRoutingAddress_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RNC-ID.c b/src/ranap/RANAP_RNC-ID.c
new file mode 100644
index 0000000..c6a12a3
--- /dev/null
+++ b/src/ranap/RANAP_RNC-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RNC-ID.h"
+
+int
+RANAP_RNC_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 4095l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RNC_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_RNC_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RNC_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RNC_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RNC_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RNC_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RNC_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RNC_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RNC_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RNC_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RNC_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RNC_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RNC_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  0l,  4095l }	/* (0..4095) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RNC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RNC_ID = {
+	"RANAP_RNC-ID",
+	"RANAP_RNC-ID",
+	RANAP_RNC_ID_free,
+	RANAP_RNC_ID_print,
+	RANAP_RNC_ID_constraint,
+	RANAP_RNC_ID_decode_ber,
+	RANAP_RNC_ID_encode_der,
+	RANAP_RNC_ID_decode_xer,
+	RANAP_RNC_ID_encode_xer,
+	RANAP_RNC_ID_decode_uper,
+	RANAP_RNC_ID_encode_uper,
+	RANAP_RNC_ID_decode_aper,
+	RANAP_RNC_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RNC_ID_tags_1,
+	sizeof(asn_DEF_RANAP_RNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_RNC_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RNC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_RNC_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RNC_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RNC-ID.h b/src/ranap/RANAP_RNC-ID.h
new file mode 100644
index 0000000..713b3f1
--- /dev/null
+++ b/src/ranap/RANAP_RNC-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RNC_ID_H_
+#define	_RANAP_RNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RNC-ID */
+typedef long	 RANAP_RNC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RNC_ID;
+asn_struct_free_f RANAP_RNC_ID_free;
+asn_struct_print_f RANAP_RNC_ID_print;
+asn_constr_check_f RANAP_RNC_ID_constraint;
+ber_type_decoder_f RANAP_RNC_ID_decode_ber;
+der_type_encoder_f RANAP_RNC_ID_encode_der;
+xer_type_decoder_f RANAP_RNC_ID_decode_xer;
+xer_type_encoder_f RANAP_RNC_ID_encode_xer;
+per_type_decoder_f RANAP_RNC_ID_decode_uper;
+per_type_encoder_f RANAP_RNC_ID_encode_uper;
+per_type_decoder_f RANAP_RNC_ID_decode_aper;
+per_type_encoder_f RANAP_RNC_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RNCTraceInformation.c b/src/ranap/RANAP_RNCTraceInformation.c
new file mode 100644
index 0000000..f72c4bd
--- /dev/null
+++ b/src/ranap/RANAP_RNCTraceInformation.c
@@ -0,0 +1,252 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RNCTraceInformation.h"
+
+static int
+traceActivationIndicato_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+traceActivationIndicato_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+static void
+traceActivationIndicato_3_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+static int
+traceActivationIndicato_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+static asn_dec_rval_t
+traceActivationIndicato_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+static asn_enc_rval_t
+traceActivationIndicato_3_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+static asn_dec_rval_t
+traceActivationIndicato_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+static asn_enc_rval_t
+traceActivationIndicato_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+static asn_dec_rval_t
+traceActivationIndicato_3_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_enc_rval_t
+traceActivationIndicato_3_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_enc_rval_t
+traceActivationIndicato_3_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+static asn_dec_rval_t
+traceActivationIndicato_3_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	traceActivationIndicato_3_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_traceActivationIndicato_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_traceActivationIndicato_value2enum_3[] = {
+	{ 0,	9,	"activated" },
+	{ 1,	11,	"deactivated" }
+};
+static const unsigned int asn_MAP_traceActivationIndicato_enum2value_3[] = {
+	0,	/* activated(0) */
+	1	/* deactivated(1) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_traceActivationIndicato_specs_3 = {
+	asn_MAP_traceActivationIndicato_value2enum_3,	/* "tag" => N; sorted by tag */
+	asn_MAP_traceActivationIndicato_enum2value_3,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_traceActivationIndicato_tags_3[] = {
+	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_traceActivationIndicato_3 = {
+	"traceActivationIndicato",
+	"traceActivationIndicato",
+	traceActivationIndicato_3_free,
+	traceActivationIndicato_3_print,
+	traceActivationIndicato_3_constraint,
+	traceActivationIndicato_3_decode_ber,
+	traceActivationIndicato_3_encode_der,
+	traceActivationIndicato_3_decode_xer,
+	traceActivationIndicato_3_encode_xer,
+	traceActivationIndicato_3_decode_uper,
+	traceActivationIndicato_3_encode_uper,
+	traceActivationIndicato_3_decode_aper,
+	traceActivationIndicato_3_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_traceActivationIndicato_tags_3,
+	sizeof(asn_DEF_traceActivationIndicato_tags_3)
+		/sizeof(asn_DEF_traceActivationIndicato_tags_3[0]) - 1, /* 1 */
+	asn_DEF_traceActivationIndicato_tags_3,	/* Same as above */
+	sizeof(asn_DEF_traceActivationIndicato_tags_3)
+		/sizeof(asn_DEF_traceActivationIndicato_tags_3[0]), /* 2 */
+	&asn_PER_type_traceActivationIndicato_constr_3,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_traceActivationIndicato_specs_3	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RNCTraceInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RNCTraceInformation, traceReference),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceReference,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceReference"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RNCTraceInformation, traceActivationIndicato),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_traceActivationIndicato_3,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceActivationIndicato"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_RNCTraceInformation, equipmentsToBeTraced),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_EquipmentsToBeTraced,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"equipmentsToBeTraced"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RNCTraceInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RNCTraceInformation_oms_1[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RNCTraceInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RNCTraceInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* traceReference */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* traceActivationIndicato */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* equipmentsToBeTraced */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RNCTraceInformation_specs_1 = {
+	sizeof(struct RANAP_RNCTraceInformation),
+	offsetof(struct RANAP_RNCTraceInformation, _asn_ctx),
+	asn_MAP_RANAP_RNCTraceInformation_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_RNCTraceInformation_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RNCTraceInformation = {
+	"RANAP_RNCTraceInformation",
+	"RANAP_RNCTraceInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RNCTraceInformation_tags_1,
+	sizeof(asn_DEF_RANAP_RNCTraceInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_RNCTraceInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RNCTraceInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RNCTraceInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_RNCTraceInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RNCTraceInformation_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_RNCTraceInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RNCTraceInformation.h b/src/ranap/RANAP_RNCTraceInformation.h
new file mode 100644
index 0000000..9674115
--- /dev/null
+++ b/src/ranap/RANAP_RNCTraceInformation.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RNCTraceInformation_H_
+#define	_RANAP_RNCTraceInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TraceReference.h"
+#include <NativeEnumerated.h>
+#include "RANAP_EquipmentsToBeTraced.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum traceActivationIndicato {
+	traceActivationIndicato_activated	= 0,
+	traceActivationIndicato_deactivated	= 1
+} e_traceActivationIndicato;
+
+/* RANAP_RNCTraceInformation */
+typedef struct RANAP_RNCTraceInformation {
+	RANAP_TraceReference_t	 traceReference;
+	long	 traceActivationIndicato;
+	RANAP_EquipmentsToBeTraced_t	*equipmentsToBeTraced	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RNCTraceInformation_t;
+
+/* Implementation */
+/* extern asn_TYPE_descriptor_t asn_DEF_traceActivationIndicato_3;	// (Use -fall-defs-global to expose) */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RNCTraceInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RNCTraceInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RNSAPRelocationParameters.c b/src/ranap/RANAP_RNSAPRelocationParameters.c
new file mode 100644
index 0000000..d279a01
--- /dev/null
+++ b/src/ranap/RANAP_RNSAPRelocationParameters.c
@@ -0,0 +1,103 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RNSAPRelocationParameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RNSAPRelocationParameters_1[] = {
+	{ ATF_POINTER, 5, offsetof(struct RANAP_RNSAPRelocationParameters, rabParmetersList),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RABParametersList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rabParmetersList"
+		},
+	{ ATF_POINTER, 4, offsetof(struct RANAP_RNSAPRelocationParameters, locationReporting),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LocationReportingTransferInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"locationReporting"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_RNSAPRelocationParameters, traceInformation),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceInformation,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceInformation"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_RNSAPRelocationParameters, sourceSAI),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sourceSAI"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RNSAPRelocationParameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RNSAPRelocationParameters_oms_1[] = { 0, 1, 2, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RNSAPRelocationParameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RNSAPRelocationParameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rabParmetersList */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* locationReporting */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* traceInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sourceSAI */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RNSAPRelocationParameters_specs_1 = {
+	sizeof(struct RANAP_RNSAPRelocationParameters),
+	offsetof(struct RANAP_RNSAPRelocationParameters, _asn_ctx),
+	asn_MAP_RANAP_RNSAPRelocationParameters_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_RANAP_RNSAPRelocationParameters_oms_1,	/* Optional members */
+	5, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RNSAPRelocationParameters = {
+	"RANAP_RNSAPRelocationParameters",
+	"RANAP_RNSAPRelocationParameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RNSAPRelocationParameters_tags_1,
+	sizeof(asn_DEF_RANAP_RNSAPRelocationParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_RNSAPRelocationParameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RNSAPRelocationParameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RNSAPRelocationParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_RNSAPRelocationParameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RNSAPRelocationParameters_1,
+	5,	/* Elements count */
+	&asn_SPC_RANAP_RNSAPRelocationParameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RNSAPRelocationParameters.h b/src/ranap/RANAP_RNSAPRelocationParameters.h
new file mode 100644
index 0000000..42c73da
--- /dev/null
+++ b/src/ranap/RANAP_RNSAPRelocationParameters.h
@@ -0,0 +1,49 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RNSAPRelocationParameters_H_
+#define	_RANAP_RNSAPRelocationParameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RABParametersList.h"
+#include "RANAP_LocationReportingTransferInformation.h"
+#include "RANAP_TraceInformation.h"
+#include "RANAP_SAI.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RNSAPRelocationParameters */
+typedef struct RANAP_RNSAPRelocationParameters {
+	RANAP_RABParametersList_t	*rabParmetersList	/* OPTIONAL */;
+	RANAP_LocationReportingTransferInformation_t	*locationReporting	/* OPTIONAL */;
+	RANAP_TraceInformation_t	*traceInformation	/* OPTIONAL */;
+	RANAP_SAI_t	*sourceSAI	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RNSAPRelocationParameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RNSAPRelocationParameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RNSAPRelocationParameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RRC-Container.c b/src/ranap/RANAP_RRC-Container.c
new file mode 100644
index 0000000..b021d81
--- /dev/null
+++ b/src/ranap/RANAP_RRC-Container.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RRC-Container.h"
+
+int
+RANAP_RRC_Container_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RRC_Container_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_RRC_Container_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RRC_Container_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RRC_Container_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RRC_Container_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RRC_Container_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RRC_Container_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RRC_Container_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RRC_Container_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RRC_Container_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RRC_Container_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RRC_Container_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_RRC_Container_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RRC_Container = {
+	"RANAP_RRC-Container",
+	"RANAP_RRC-Container",
+	RANAP_RRC_Container_free,
+	RANAP_RRC_Container_print,
+	RANAP_RRC_Container_constraint,
+	RANAP_RRC_Container_decode_ber,
+	RANAP_RRC_Container_encode_der,
+	RANAP_RRC_Container_decode_xer,
+	RANAP_RRC_Container_encode_xer,
+	RANAP_RRC_Container_decode_uper,
+	RANAP_RRC_Container_encode_uper,
+	RANAP_RRC_Container_decode_aper,
+	RANAP_RRC_Container_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RRC_Container_tags_1,
+	sizeof(asn_DEF_RANAP_RRC_Container_tags_1)
+		/sizeof(asn_DEF_RANAP_RRC_Container_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RRC_Container_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RRC_Container_tags_1)
+		/sizeof(asn_DEF_RANAP_RRC_Container_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RRC-Container.h b/src/ranap/RANAP_RRC-Container.h
new file mode 100644
index 0000000..5cda4b7
--- /dev/null
+++ b/src/ranap/RANAP_RRC-Container.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RRC_Container_H_
+#define	_RANAP_RRC_Container_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RRC-Container */
+typedef OCTET_STRING_t	 RANAP_RRC_Container_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RRC_Container;
+asn_struct_free_f RANAP_RRC_Container_free;
+asn_struct_print_f RANAP_RRC_Container_print;
+asn_constr_check_f RANAP_RRC_Container_constraint;
+ber_type_decoder_f RANAP_RRC_Container_decode_ber;
+der_type_encoder_f RANAP_RRC_Container_encode_der;
+xer_type_decoder_f RANAP_RRC_Container_decode_xer;
+xer_type_encoder_f RANAP_RRC_Container_encode_xer;
+per_type_decoder_f RANAP_RRC_Container_decode_uper;
+per_type_encoder_f RANAP_RRC_Container_encode_uper;
+per_type_decoder_f RANAP_RRC_Container_decode_aper;
+per_type_encoder_f RANAP_RRC_Container_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RRC_Container_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RSRQ-Extension.c b/src/ranap/RANAP_RSRQ-Extension.c
new file mode 100644
index 0000000..ef1c633
--- /dev/null
+++ b/src/ranap/RANAP_RSRQ-Extension.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RSRQ-Extension.h"
+
+int
+RANAP_RSRQ_Extension_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= -30ull && value <= 46l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_RSRQ_Extension_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RSRQ_Extension_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRQ_Extension_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RSRQ_Extension_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRQ_Extension_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RSRQ_Extension_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRQ_Extension_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RSRQ_Extension_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RSRQ_Extension_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RSRQ_Extension_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RSRQ_Extension_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RSRQ_Extension_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  7,  7, -30ull,  46l }	/* (-30..46,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RSRQ_Extension_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RSRQ_Extension = {
+	"RANAP_RSRQ-Extension",
+	"RANAP_RSRQ-Extension",
+	RANAP_RSRQ_Extension_free,
+	RANAP_RSRQ_Extension_print,
+	RANAP_RSRQ_Extension_constraint,
+	RANAP_RSRQ_Extension_decode_ber,
+	RANAP_RSRQ_Extension_encode_der,
+	RANAP_RSRQ_Extension_decode_xer,
+	RANAP_RSRQ_Extension_encode_xer,
+	RANAP_RSRQ_Extension_decode_uper,
+	RANAP_RSRQ_Extension_encode_uper,
+	RANAP_RSRQ_Extension_decode_aper,
+	RANAP_RSRQ_Extension_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RSRQ_Extension_tags_1,
+	sizeof(asn_DEF_RANAP_RSRQ_Extension_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRQ_Extension_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RSRQ_Extension_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RSRQ_Extension_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRQ_Extension_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RSRQ_Extension_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RSRQ-Extension.h b/src/ranap/RANAP_RSRQ-Extension.h
new file mode 100644
index 0000000..6fd0231
--- /dev/null
+++ b/src/ranap/RANAP_RSRQ-Extension.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RSRQ_Extension_H_
+#define	_RANAP_RSRQ_Extension_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RSRQ-Extension */
+typedef long	 RANAP_RSRQ_Extension_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RSRQ_Extension;
+asn_struct_free_f RANAP_RSRQ_Extension_free;
+asn_struct_print_f RANAP_RSRQ_Extension_print;
+asn_constr_check_f RANAP_RSRQ_Extension_constraint;
+ber_type_decoder_f RANAP_RSRQ_Extension_decode_ber;
+der_type_encoder_f RANAP_RSRQ_Extension_encode_der;
+xer_type_decoder_f RANAP_RSRQ_Extension_decode_xer;
+xer_type_encoder_f RANAP_RSRQ_Extension_encode_xer;
+per_type_decoder_f RANAP_RSRQ_Extension_decode_uper;
+per_type_encoder_f RANAP_RSRQ_Extension_encode_uper;
+per_type_decoder_f RANAP_RSRQ_Extension_decode_aper;
+per_type_encoder_f RANAP_RSRQ_Extension_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RSRQ_Extension_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RSRQ-Type.c b/src/ranap/RANAP_RSRQ-Type.c
new file mode 100644
index 0000000..067a2b6
--- /dev/null
+++ b/src/ranap/RANAP_RSRQ-Type.c
@@ -0,0 +1,71 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RSRQ-Type.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_RSRQ_Type_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RSRQ_Type, allSymbols),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BOOLEAN,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"allSymbols"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RSRQ_Type, wideBand),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BOOLEAN,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"wideBand"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RSRQ_Type_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RSRQ_Type_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* allSymbols */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* wideBand */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RSRQ_Type_specs_1 = {
+	sizeof(struct RANAP_RSRQ_Type),
+	offsetof(struct RANAP_RSRQ_Type, _asn_ctx),
+	asn_MAP_RANAP_RSRQ_Type_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RSRQ_Type = {
+	"RANAP_RSRQ-Type",
+	"RANAP_RSRQ-Type",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RSRQ_Type_tags_1,
+	sizeof(asn_DEF_RANAP_RSRQ_Type_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRQ_Type_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RSRQ_Type_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RSRQ_Type_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRQ_Type_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RSRQ_Type_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_RSRQ_Type_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RSRQ-Type.h b/src/ranap/RANAP_RSRQ-Type.h
new file mode 100644
index 0000000..5846b93
--- /dev/null
+++ b/src/ranap/RANAP_RSRQ-Type.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RSRQ_Type_H_
+#define	_RANAP_RSRQ_Type_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BOOLEAN.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RSRQ-Type */
+typedef struct RANAP_RSRQ_Type {
+	BOOLEAN_t	 allSymbols;
+	BOOLEAN_t	 wideBand;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RSRQ_Type_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RSRQ_Type;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RSRQ_Type_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RSRVCC-HO-Indication.c b/src/ranap/RANAP_RSRVCC-HO-Indication.c
new file mode 100644
index 0000000..23f2e0c
--- /dev/null
+++ b/src/ranap/RANAP_RSRVCC-HO-Indication.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RSRVCC-HO-Indication.h"
+
+int
+RANAP_RSRVCC_HO_Indication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RSRVCC_HO_Indication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RSRVCC_HO_Indication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_HO_Indication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_HO_Indication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_HO_Indication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_HO_Indication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_HO_Indication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_HO_Indication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_HO_Indication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_HO_Indication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RSRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RSRVCC_HO_Indication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RSRVCC_HO_Indication_value2enum_1[] = {
+	{ 0,	7,	"ps-only" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RSRVCC_HO_Indication_enum2value_1[] = {
+	0	/* ps-only(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RSRVCC_HO_Indication_specs_1 = {
+	asn_MAP_RANAP_RSRVCC_HO_Indication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RSRVCC_HO_Indication_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RSRVCC_HO_Indication = {
+	"RANAP_RSRVCC-HO-Indication",
+	"RANAP_RSRVCC-HO-Indication",
+	RANAP_RSRVCC_HO_Indication_free,
+	RANAP_RSRVCC_HO_Indication_print,
+	RANAP_RSRVCC_HO_Indication_constraint,
+	RANAP_RSRVCC_HO_Indication_decode_ber,
+	RANAP_RSRVCC_HO_Indication_encode_der,
+	RANAP_RSRVCC_HO_Indication_decode_xer,
+	RANAP_RSRVCC_HO_Indication_encode_xer,
+	RANAP_RSRVCC_HO_Indication_decode_uper,
+	RANAP_RSRVCC_HO_Indication_encode_uper,
+	RANAP_RSRVCC_HO_Indication_decode_aper,
+	RANAP_RSRVCC_HO_Indication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1,
+	sizeof(asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRVCC_HO_Indication_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RSRVCC_HO_Indication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RSRVCC_HO_Indication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RSRVCC-HO-Indication.h b/src/ranap/RANAP_RSRVCC-HO-Indication.h
new file mode 100644
index 0000000..b775efa
--- /dev/null
+++ b/src/ranap/RANAP_RSRVCC-HO-Indication.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RSRVCC_HO_Indication_H_
+#define	_RANAP_RSRVCC_HO_Indication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RSRVCC_HO_Indication {
+	RANAP_RSRVCC_HO_Indication_ps_only	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_RSRVCC_HO_Indication;
+
+/* RANAP_RSRVCC-HO-Indication */
+typedef long	 RANAP_RSRVCC_HO_Indication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RSRVCC_HO_Indication;
+asn_struct_free_f RANAP_RSRVCC_HO_Indication_free;
+asn_struct_print_f RANAP_RSRVCC_HO_Indication_print;
+asn_constr_check_f RANAP_RSRVCC_HO_Indication_constraint;
+ber_type_decoder_f RANAP_RSRVCC_HO_Indication_decode_ber;
+der_type_encoder_f RANAP_RSRVCC_HO_Indication_encode_der;
+xer_type_decoder_f RANAP_RSRVCC_HO_Indication_decode_xer;
+xer_type_encoder_f RANAP_RSRVCC_HO_Indication_encode_xer;
+per_type_decoder_f RANAP_RSRVCC_HO_Indication_decode_uper;
+per_type_encoder_f RANAP_RSRVCC_HO_Indication_encode_uper;
+per_type_decoder_f RANAP_RSRVCC_HO_Indication_decode_aper;
+per_type_encoder_f RANAP_RSRVCC_HO_Indication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RSRVCC_HO_Indication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RSRVCC-Information.c b/src/ranap/RANAP_RSRVCC-Information.c
new file mode 100644
index 0000000..24a84ac
--- /dev/null
+++ b/src/ranap/RANAP_RSRVCC-Information.c
@@ -0,0 +1,150 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RSRVCC-Information.h"
+
+static int
+memb_nonce_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_iMSInformation_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 1l && size <= 32l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_nonce_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  128l,  128l }	/* (SIZE(128..128)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_iMSInformation_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  1l,  32l }	/* (SIZE(1..32)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RSRVCC_Information_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RSRVCC_Information, nonce),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_nonce_constraint_1,
+		&asn_PER_memb_nonce_constr_2,
+		0,
+		"nonce"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RSRVCC_Information, iMSInformation),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		memb_iMSInformation_constraint_1,
+		&asn_PER_memb_iMSInformation_constr_3,
+		0,
+		"iMSInformation"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RSRVCC_Information, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_RSRVCC_Information_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RSRVCC_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RSRVCC_Information_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nonce */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iMSInformation */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RSRVCC_Information_specs_1 = {
+	sizeof(struct RANAP_RSRVCC_Information),
+	offsetof(struct RANAP_RSRVCC_Information, _asn_ctx),
+	asn_MAP_RANAP_RSRVCC_Information_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_RSRVCC_Information_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RSRVCC_Information = {
+	"RANAP_RSRVCC-Information",
+	"RANAP_RSRVCC-Information",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RSRVCC_Information_tags_1,
+	sizeof(asn_DEF_RANAP_RSRVCC_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRVCC_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RSRVCC_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RSRVCC_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRVCC_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RSRVCC_Information_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_RSRVCC_Information_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RSRVCC-Information.h b/src/ranap/RANAP_RSRVCC-Information.h
new file mode 100644
index 0000000..25f6c6c
--- /dev/null
+++ b/src/ranap/RANAP_RSRVCC-Information.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RSRVCC_Information_H_
+#define	_RANAP_RSRVCC_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+#include <OCTET_STRING.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RSRVCC-Information */
+typedef struct RANAP_RSRVCC_Information {
+	BIT_STRING_t	 nonce;
+	OCTET_STRING_t	 iMSInformation;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RSRVCC_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RSRVCC_Information;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RSRVCC_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RSRVCC-Operation-Possible.c b/src/ranap/RANAP_RSRVCC-Operation-Possible.c
new file mode 100644
index 0000000..c610cb8
--- /dev/null
+++ b/src/ranap/RANAP_RSRVCC-Operation-Possible.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RSRVCC-Operation-Possible.h"
+
+int
+RANAP_RSRVCC_Operation_Possible_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RSRVCC_Operation_Possible_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RSRVCC_Operation_Possible_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_Operation_Possible_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_Operation_Possible_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_Operation_Possible_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_Operation_Possible_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_Operation_Possible_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_Operation_Possible_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RSRVCC_Operation_Possible_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RSRVCC_Operation_Possible_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RSRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RSRVCC_Operation_Possible_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RSRVCC_Operation_Possible_value2enum_1[] = {
+	{ 0,	15,	"rsrvcc-possible" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RSRVCC_Operation_Possible_enum2value_1[] = {
+	0	/* rsrvcc-possible(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RSRVCC_Operation_Possible_specs_1 = {
+	asn_MAP_RANAP_RSRVCC_Operation_Possible_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RSRVCC_Operation_Possible_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RSRVCC_Operation_Possible = {
+	"RANAP_RSRVCC-Operation-Possible",
+	"RANAP_RSRVCC-Operation-Possible",
+	RANAP_RSRVCC_Operation_Possible_free,
+	RANAP_RSRVCC_Operation_Possible_print,
+	RANAP_RSRVCC_Operation_Possible_constraint,
+	RANAP_RSRVCC_Operation_Possible_decode_ber,
+	RANAP_RSRVCC_Operation_Possible_encode_der,
+	RANAP_RSRVCC_Operation_Possible_decode_xer,
+	RANAP_RSRVCC_Operation_Possible_encode_xer,
+	RANAP_RSRVCC_Operation_Possible_decode_uper,
+	RANAP_RSRVCC_Operation_Possible_encode_uper,
+	RANAP_RSRVCC_Operation_Possible_decode_aper,
+	RANAP_RSRVCC_Operation_Possible_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1,
+	sizeof(asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1)
+		/sizeof(asn_DEF_RANAP_RSRVCC_Operation_Possible_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RSRVCC_Operation_Possible_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RSRVCC_Operation_Possible_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RSRVCC-Operation-Possible.h b/src/ranap/RANAP_RSRVCC-Operation-Possible.h
new file mode 100644
index 0000000..0be569a
--- /dev/null
+++ b/src/ranap/RANAP_RSRVCC-Operation-Possible.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RSRVCC_Operation_Possible_H_
+#define	_RANAP_RSRVCC_Operation_Possible_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RSRVCC_Operation_Possible {
+	RANAP_RSRVCC_Operation_Possible_rsrvcc_possible	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_RSRVCC_Operation_Possible;
+
+/* RANAP_RSRVCC-Operation-Possible */
+typedef long	 RANAP_RSRVCC_Operation_Possible_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RSRVCC_Operation_Possible;
+asn_struct_free_f RANAP_RSRVCC_Operation_Possible_free;
+asn_struct_print_f RANAP_RSRVCC_Operation_Possible_print;
+asn_constr_check_f RANAP_RSRVCC_Operation_Possible_constraint;
+ber_type_decoder_f RANAP_RSRVCC_Operation_Possible_decode_ber;
+der_type_encoder_f RANAP_RSRVCC_Operation_Possible_encode_der;
+xer_type_decoder_f RANAP_RSRVCC_Operation_Possible_decode_xer;
+xer_type_encoder_f RANAP_RSRVCC_Operation_Possible_encode_xer;
+per_type_decoder_f RANAP_RSRVCC_Operation_Possible_decode_uper;
+per_type_encoder_f RANAP_RSRVCC_Operation_Possible_encode_uper;
+per_type_decoder_f RANAP_RSRVCC_Operation_Possible_decode_aper;
+per_type_encoder_f RANAP_RSRVCC_Operation_Possible_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RSRVCC_Operation_Possible_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RTLoadValue.c b/src/ranap/RANAP_RTLoadValue.c
new file mode 100644
index 0000000..2dd5f6d
--- /dev/null
+++ b/src/ranap/RANAP_RTLoadValue.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RTLoadValue.h"
+
+int
+RANAP_RTLoadValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 100l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RTLoadValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_RTLoadValue_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RTLoadValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RTLoadValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RTLoadValue_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RTLoadValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RTLoadValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RTLoadValue_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RTLoadValue_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RTLoadValue_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RTLoadValue_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RTLoadValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RTLoadValue_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  100l }	/* (0..100) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RTLoadValue_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RTLoadValue = {
+	"RANAP_RTLoadValue",
+	"RANAP_RTLoadValue",
+	RANAP_RTLoadValue_free,
+	RANAP_RTLoadValue_print,
+	RANAP_RTLoadValue_constraint,
+	RANAP_RTLoadValue_decode_ber,
+	RANAP_RTLoadValue_encode_der,
+	RANAP_RTLoadValue_decode_xer,
+	RANAP_RTLoadValue_encode_xer,
+	RANAP_RTLoadValue_decode_uper,
+	RANAP_RTLoadValue_encode_uper,
+	RANAP_RTLoadValue_decode_aper,
+	RANAP_RTLoadValue_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RTLoadValue_tags_1,
+	sizeof(asn_DEF_RANAP_RTLoadValue_tags_1)
+		/sizeof(asn_DEF_RANAP_RTLoadValue_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RTLoadValue_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RTLoadValue_tags_1)
+		/sizeof(asn_DEF_RANAP_RTLoadValue_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RTLoadValue_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RTLoadValue.h b/src/ranap/RANAP_RTLoadValue.h
new file mode 100644
index 0000000..4e5fb5c
--- /dev/null
+++ b/src/ranap/RANAP_RTLoadValue.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RTLoadValue_H_
+#define	_RANAP_RTLoadValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RTLoadValue */
+typedef long	 RANAP_RTLoadValue_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RTLoadValue;
+asn_struct_free_f RANAP_RTLoadValue_free;
+asn_struct_print_f RANAP_RTLoadValue_print;
+asn_constr_check_f RANAP_RTLoadValue_constraint;
+ber_type_decoder_f RANAP_RTLoadValue_decode_ber;
+der_type_encoder_f RANAP_RTLoadValue_encode_der;
+xer_type_decoder_f RANAP_RTLoadValue_decode_xer;
+xer_type_encoder_f RANAP_RTLoadValue_encode_xer;
+per_type_decoder_f RANAP_RTLoadValue_decode_uper;
+per_type_encoder_f RANAP_RTLoadValue_encode_uper;
+per_type_decoder_f RANAP_RTLoadValue_decode_aper;
+per_type_encoder_f RANAP_RTLoadValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RTLoadValue_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RateControlAllowed.c b/src/ranap/RANAP_RateControlAllowed.c
new file mode 100644
index 0000000..328a1d7
--- /dev/null
+++ b/src/ranap/RANAP_RateControlAllowed.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RateControlAllowed.h"
+
+int
+RANAP_RateControlAllowed_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RateControlAllowed_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RateControlAllowed_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RateControlAllowed_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RateControlAllowed_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RateControlAllowed_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RateControlAllowed_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RateControlAllowed_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RateControlAllowed_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RateControlAllowed_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RateControlAllowed_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RateControlAllowed_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RateControlAllowed_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RateControlAllowed_value2enum_1[] = {
+	{ 0,	11,	"not-allowed" },
+	{ 1,	7,	"allowed" }
+};
+static const unsigned int asn_MAP_RANAP_RateControlAllowed_enum2value_1[] = {
+	1,	/* allowed(1) */
+	0	/* not-allowed(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RateControlAllowed_specs_1 = {
+	asn_MAP_RANAP_RateControlAllowed_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RateControlAllowed_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RateControlAllowed_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RateControlAllowed = {
+	"RANAP_RateControlAllowed",
+	"RANAP_RateControlAllowed",
+	RANAP_RateControlAllowed_free,
+	RANAP_RateControlAllowed_print,
+	RANAP_RateControlAllowed_constraint,
+	RANAP_RateControlAllowed_decode_ber,
+	RANAP_RateControlAllowed_encode_der,
+	RANAP_RateControlAllowed_decode_xer,
+	RANAP_RateControlAllowed_encode_xer,
+	RANAP_RateControlAllowed_decode_uper,
+	RANAP_RateControlAllowed_encode_uper,
+	RANAP_RateControlAllowed_decode_aper,
+	RANAP_RateControlAllowed_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RateControlAllowed_tags_1,
+	sizeof(asn_DEF_RANAP_RateControlAllowed_tags_1)
+		/sizeof(asn_DEF_RANAP_RateControlAllowed_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RateControlAllowed_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RateControlAllowed_tags_1)
+		/sizeof(asn_DEF_RANAP_RateControlAllowed_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RateControlAllowed_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RateControlAllowed_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RateControlAllowed.h b/src/ranap/RANAP_RateControlAllowed.h
new file mode 100644
index 0000000..a465d17
--- /dev/null
+++ b/src/ranap/RANAP_RateControlAllowed.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RateControlAllowed_H_
+#define	_RANAP_RateControlAllowed_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RateControlAllowed {
+	RANAP_RateControlAllowed_not_allowed	= 0,
+	RANAP_RateControlAllowed_allowed	= 1
+} e_RANAP_RateControlAllowed;
+
+/* RANAP_RateControlAllowed */
+typedef long	 RANAP_RateControlAllowed_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RateControlAllowed;
+asn_struct_free_f RANAP_RateControlAllowed_free;
+asn_struct_print_f RANAP_RateControlAllowed_print;
+asn_constr_check_f RANAP_RateControlAllowed_constraint;
+ber_type_decoder_f RANAP_RateControlAllowed_decode_ber;
+der_type_encoder_f RANAP_RateControlAllowed_encode_der;
+xer_type_decoder_f RANAP_RateControlAllowed_decode_xer;
+xer_type_encoder_f RANAP_RateControlAllowed_encode_xer;
+per_type_decoder_f RANAP_RateControlAllowed_decode_uper;
+per_type_encoder_f RANAP_RateControlAllowed_encode_uper;
+per_type_decoder_f RANAP_RateControlAllowed_decode_aper;
+per_type_encoder_f RANAP_RateControlAllowed_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RateControlAllowed_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RedirectAttemptFlag.c b/src/ranap/RANAP_RedirectAttemptFlag.c
new file mode 100644
index 0000000..3011468
--- /dev/null
+++ b/src/ranap/RANAP_RedirectAttemptFlag.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RedirectAttemptFlag.h"
+
+int
+RANAP_RedirectAttemptFlag_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NULL.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NULL,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NULL.free_struct;
+	td->print_struct   = asn_DEF_NULL.print_struct;
+	td->check_constraints = asn_DEF_NULL.check_constraints;
+	td->ber_decoder    = asn_DEF_NULL.ber_decoder;
+	td->der_encoder    = asn_DEF_NULL.der_encoder;
+	td->xer_decoder    = asn_DEF_NULL.xer_decoder;
+	td->xer_encoder    = asn_DEF_NULL.xer_encoder;
+	td->uper_decoder   = asn_DEF_NULL.uper_decoder;
+	td->uper_encoder   = asn_DEF_NULL.uper_encoder;
+	td->aper_decoder   = asn_DEF_NULL.aper_decoder;
+	td->aper_encoder   = asn_DEF_NULL.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NULL.per_constraints;
+	td->elements       = asn_DEF_NULL.elements;
+	td->elements_count = asn_DEF_NULL.elements_count;
+	td->specifics      = asn_DEF_NULL.specifics;
+}
+
+void
+RANAP_RedirectAttemptFlag_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RedirectAttemptFlag_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RedirectAttemptFlag_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RedirectAttemptFlag_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RedirectAttemptFlag_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RedirectAttemptFlag_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RedirectAttemptFlag_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RedirectAttemptFlag_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RedirectAttemptFlag_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RedirectAttemptFlag_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RedirectAttemptFlag_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_RedirectAttemptFlag_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (5 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RedirectAttemptFlag = {
+	"RANAP_RedirectAttemptFlag",
+	"RANAP_RedirectAttemptFlag",
+	RANAP_RedirectAttemptFlag_free,
+	RANAP_RedirectAttemptFlag_print,
+	RANAP_RedirectAttemptFlag_constraint,
+	RANAP_RedirectAttemptFlag_decode_ber,
+	RANAP_RedirectAttemptFlag_encode_der,
+	RANAP_RedirectAttemptFlag_decode_xer,
+	RANAP_RedirectAttemptFlag_encode_xer,
+	RANAP_RedirectAttemptFlag_decode_uper,
+	RANAP_RedirectAttemptFlag_encode_uper,
+	RANAP_RedirectAttemptFlag_decode_aper,
+	RANAP_RedirectAttemptFlag_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RedirectAttemptFlag_tags_1,
+	sizeof(asn_DEF_RANAP_RedirectAttemptFlag_tags_1)
+		/sizeof(asn_DEF_RANAP_RedirectAttemptFlag_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RedirectAttemptFlag_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RedirectAttemptFlag_tags_1)
+		/sizeof(asn_DEF_RANAP_RedirectAttemptFlag_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RedirectAttemptFlag.h b/src/ranap/RANAP_RedirectAttemptFlag.h
new file mode 100644
index 0000000..df1be41
--- /dev/null
+++ b/src/ranap/RANAP_RedirectAttemptFlag.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RedirectAttemptFlag_H_
+#define	_RANAP_RedirectAttemptFlag_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NULL.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RedirectAttemptFlag */
+typedef NULL_t	 RANAP_RedirectAttemptFlag_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RedirectAttemptFlag;
+asn_struct_free_f RANAP_RedirectAttemptFlag_free;
+asn_struct_print_f RANAP_RedirectAttemptFlag_print;
+asn_constr_check_f RANAP_RedirectAttemptFlag_constraint;
+ber_type_decoder_f RANAP_RedirectAttemptFlag_decode_ber;
+der_type_encoder_f RANAP_RedirectAttemptFlag_encode_der;
+xer_type_decoder_f RANAP_RedirectAttemptFlag_decode_xer;
+xer_type_encoder_f RANAP_RedirectAttemptFlag_encode_xer;
+per_type_decoder_f RANAP_RedirectAttemptFlag_decode_uper;
+per_type_encoder_f RANAP_RedirectAttemptFlag_encode_uper;
+per_type_decoder_f RANAP_RedirectAttemptFlag_decode_aper;
+per_type_encoder_f RANAP_RedirectAttemptFlag_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RedirectAttemptFlag_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RedirectionCompleted.c b/src/ranap/RANAP_RedirectionCompleted.c
new file mode 100644
index 0000000..eb88015
--- /dev/null
+++ b/src/ranap/RANAP_RedirectionCompleted.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RedirectionCompleted.h"
+
+int
+RANAP_RedirectionCompleted_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RedirectionCompleted_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RedirectionCompleted_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RedirectionCompleted_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RedirectionCompleted_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RedirectionCompleted_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RedirectionCompleted_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RedirectionCompleted_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RedirectionCompleted_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RedirectionCompleted_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RedirectionCompleted_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RedirectionCompleted_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RedirectionCompleted_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RedirectionCompleted_value2enum_1[] = {
+	{ 0,	21,	"redirection-completed" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RedirectionCompleted_enum2value_1[] = {
+	0	/* redirection-completed(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RedirectionCompleted_specs_1 = {
+	asn_MAP_RANAP_RedirectionCompleted_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RedirectionCompleted_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RedirectionCompleted_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RedirectionCompleted = {
+	"RANAP_RedirectionCompleted",
+	"RANAP_RedirectionCompleted",
+	RANAP_RedirectionCompleted_free,
+	RANAP_RedirectionCompleted_print,
+	RANAP_RedirectionCompleted_constraint,
+	RANAP_RedirectionCompleted_decode_ber,
+	RANAP_RedirectionCompleted_encode_der,
+	RANAP_RedirectionCompleted_decode_xer,
+	RANAP_RedirectionCompleted_encode_xer,
+	RANAP_RedirectionCompleted_decode_uper,
+	RANAP_RedirectionCompleted_encode_uper,
+	RANAP_RedirectionCompleted_decode_aper,
+	RANAP_RedirectionCompleted_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RedirectionCompleted_tags_1,
+	sizeof(asn_DEF_RANAP_RedirectionCompleted_tags_1)
+		/sizeof(asn_DEF_RANAP_RedirectionCompleted_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RedirectionCompleted_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RedirectionCompleted_tags_1)
+		/sizeof(asn_DEF_RANAP_RedirectionCompleted_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RedirectionCompleted_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RedirectionCompleted_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RedirectionCompleted.h b/src/ranap/RANAP_RedirectionCompleted.h
new file mode 100644
index 0000000..21eabeb
--- /dev/null
+++ b/src/ranap/RANAP_RedirectionCompleted.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RedirectionCompleted_H_
+#define	_RANAP_RedirectionCompleted_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RedirectionCompleted {
+	RANAP_RedirectionCompleted_redirection_completed	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_RedirectionCompleted;
+
+/* RANAP_RedirectionCompleted */
+typedef long	 RANAP_RedirectionCompleted_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RedirectionCompleted;
+asn_struct_free_f RANAP_RedirectionCompleted_free;
+asn_struct_print_f RANAP_RedirectionCompleted_print;
+asn_constr_check_f RANAP_RedirectionCompleted_constraint;
+ber_type_decoder_f RANAP_RedirectionCompleted_decode_ber;
+der_type_encoder_f RANAP_RedirectionCompleted_encode_der;
+xer_type_decoder_f RANAP_RedirectionCompleted_decode_xer;
+xer_type_encoder_f RANAP_RedirectionCompleted_encode_xer;
+per_type_decoder_f RANAP_RedirectionCompleted_decode_uper;
+per_type_encoder_f RANAP_RedirectionCompleted_encode_uper;
+per_type_decoder_f RANAP_RedirectionCompleted_decode_aper;
+per_type_encoder_f RANAP_RedirectionCompleted_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RedirectionCompleted_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RejectCauseValue.c b/src/ranap/RANAP_RejectCauseValue.c
new file mode 100644
index 0000000..234964d
--- /dev/null
+++ b/src/ranap/RANAP_RejectCauseValue.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RejectCauseValue.h"
+
+int
+RANAP_RejectCauseValue_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RejectCauseValue_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RejectCauseValue_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RejectCauseValue_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RejectCauseValue_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RejectCauseValue_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RejectCauseValue_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RejectCauseValue_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RejectCauseValue_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RejectCauseValue_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RejectCauseValue_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RejectCauseValue_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RejectCauseValue_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  5l }	/* (0..5,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RejectCauseValue_value2enum_1[] = {
+	{ 0,	16,	"pLMN-Not-Allowed" },
+	{ 1,	25,	"location-Area-Not-Allowed" },
+	{ 2,	41,	"roaming-Not-Allowed-In-This-Location-Area" },
+	{ 3,	33,	"no-Suitable-Cell-In-Location-Area" },
+	{ 4,	38,	"gPRS-Services-Not-Allowed-In-This-PLMN" },
+	{ 5,	27,	"cS-PS-coordination-required" },
+	{ 6,	15,	"network-failure" },
+	{ 7,	27,	"not-authorized-for-this-CSG" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RejectCauseValue_enum2value_1[] = {
+	5,	/* cS-PS-coordination-required(5) */
+	4,	/* gPRS-Services-Not-Allowed-In-This-PLMN(4) */
+	1,	/* location-Area-Not-Allowed(1) */
+	6,	/* network-failure(6) */
+	3,	/* no-Suitable-Cell-In-Location-Area(3) */
+	7,	/* not-authorized-for-this-CSG(7) */
+	0,	/* pLMN-Not-Allowed(0) */
+	2	/* roaming-Not-Allowed-In-This-Location-Area(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RejectCauseValue_specs_1 = {
+	asn_MAP_RANAP_RejectCauseValue_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RejectCauseValue_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	7,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RejectCauseValue_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RejectCauseValue = {
+	"RANAP_RejectCauseValue",
+	"RANAP_RejectCauseValue",
+	RANAP_RejectCauseValue_free,
+	RANAP_RejectCauseValue_print,
+	RANAP_RejectCauseValue_constraint,
+	RANAP_RejectCauseValue_decode_ber,
+	RANAP_RejectCauseValue_encode_der,
+	RANAP_RejectCauseValue_decode_xer,
+	RANAP_RejectCauseValue_encode_xer,
+	RANAP_RejectCauseValue_decode_uper,
+	RANAP_RejectCauseValue_encode_uper,
+	RANAP_RejectCauseValue_decode_aper,
+	RANAP_RejectCauseValue_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RejectCauseValue_tags_1,
+	sizeof(asn_DEF_RANAP_RejectCauseValue_tags_1)
+		/sizeof(asn_DEF_RANAP_RejectCauseValue_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RejectCauseValue_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RejectCauseValue_tags_1)
+		/sizeof(asn_DEF_RANAP_RejectCauseValue_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RejectCauseValue_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RejectCauseValue_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RejectCauseValue.h b/src/ranap/RANAP_RejectCauseValue.h
new file mode 100644
index 0000000..0a5f26f
--- /dev/null
+++ b/src/ranap/RANAP_RejectCauseValue.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RejectCauseValue_H_
+#define	_RANAP_RejectCauseValue_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RejectCauseValue {
+	RANAP_RejectCauseValue_pLMN_Not_Allowed	= 0,
+	RANAP_RejectCauseValue_location_Area_Not_Allowed	= 1,
+	RANAP_RejectCauseValue_roaming_Not_Allowed_In_This_Location_Area	= 2,
+	RANAP_RejectCauseValue_no_Suitable_Cell_In_Location_Area	= 3,
+	RANAP_RejectCauseValue_gPRS_Services_Not_Allowed_In_This_PLMN	= 4,
+	RANAP_RejectCauseValue_cS_PS_coordination_required	= 5,
+	/*
+	 * Enumeration is extensible
+	 */
+	RANAP_RejectCauseValue_network_failure	= 6,
+	RANAP_RejectCauseValue_not_authorized_for_this_CSG	= 7
+} e_RANAP_RejectCauseValue;
+
+/* RANAP_RejectCauseValue */
+typedef long	 RANAP_RejectCauseValue_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RejectCauseValue;
+asn_struct_free_f RANAP_RejectCauseValue_free;
+asn_struct_print_f RANAP_RejectCauseValue_print;
+asn_constr_check_f RANAP_RejectCauseValue_constraint;
+ber_type_decoder_f RANAP_RejectCauseValue_decode_ber;
+der_type_encoder_f RANAP_RejectCauseValue_encode_der;
+xer_type_decoder_f RANAP_RejectCauseValue_decode_xer;
+xer_type_encoder_f RANAP_RejectCauseValue_encode_xer;
+per_type_decoder_f RANAP_RejectCauseValue_decode_uper;
+per_type_encoder_f RANAP_RejectCauseValue_encode_uper;
+per_type_decoder_f RANAP_RejectCauseValue_decode_aper;
+per_type_encoder_f RANAP_RejectCauseValue_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RejectCauseValue_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationCancel.c b/src/ranap/RANAP_RelocationCancel.c
new file mode 100644
index 0000000..9b13c13
--- /dev/null
+++ b/src/ranap/RANAP_RelocationCancel.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationCancel.h"
+
+static int
+memb_relocationCancel_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationCancel_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationCancel_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationCancel_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationCancel_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationCancel_ies_specs_2 = {
+	sizeof(struct relocationCancel_ies),
+	offsetof(struct relocationCancel_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationCancel_ies_2 = {
+	"relocationCancel-ies",
+	"relocationCancel-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationCancel_ies_tags_2,
+	sizeof(asn_DEF_relocationCancel_ies_tags_2)
+		/sizeof(asn_DEF_relocationCancel_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationCancel_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationCancel_ies_tags_2)
+		/sizeof(asn_DEF_relocationCancel_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationCancel_ies_constr_2,
+	asn_MBR_relocationCancel_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationCancel_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationCancel_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationCancel, relocationCancel_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationCancel_ies_2,
+		memb_relocationCancel_ies_constraint_1,
+		&asn_PER_memb_relocationCancel_ies_constr_2,
+		0,
+		"relocationCancel-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationCancel_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationCancel_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationCancel-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationCancel_specs_1 = {
+	sizeof(struct RANAP_RelocationCancel),
+	offsetof(struct RANAP_RelocationCancel, _asn_ctx),
+	asn_MAP_RANAP_RelocationCancel_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationCancel = {
+	"RANAP_RelocationCancel",
+	"RANAP_RelocationCancel",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationCancel_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationCancel_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationCancel_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationCancel_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationCancel_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationCancel_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationCancel_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationCancel_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationCancel.h b/src/ranap/RANAP_RelocationCancel.h
new file mode 100644
index 0000000..12e641c
--- /dev/null
+++ b/src/ranap/RANAP_RelocationCancel.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationCancel_H_
+#define	_RANAP_RelocationCancel_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationCancel */
+typedef struct RANAP_RelocationCancel {
+	struct relocationCancel_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationCancel_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationCancel_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationCancel;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationCancel_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationCancelAcknowledge.c b/src/ranap/RANAP_RelocationCancelAcknowledge.c
new file mode 100644
index 0000000..ba9d99b
--- /dev/null
+++ b/src/ranap/RANAP_RelocationCancelAcknowledge.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationCancelAcknowledge.h"
+
+static int
+memb_relocationCancelAcknowledge_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationCancelAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationCancelAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationCancelAcknowledge_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationCancelAcknowledge_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationCancelAcknowledge_ies_specs_2 = {
+	sizeof(struct relocationCancelAcknowledge_ies),
+	offsetof(struct relocationCancelAcknowledge_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationCancelAcknowledge_ies_2 = {
+	"relocationCancelAcknowledge-ies",
+	"relocationCancelAcknowledge-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationCancelAcknowledge_ies_tags_2,
+	sizeof(asn_DEF_relocationCancelAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_relocationCancelAcknowledge_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationCancelAcknowledge_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationCancelAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_relocationCancelAcknowledge_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationCancelAcknowledge_ies_constr_2,
+	asn_MBR_relocationCancelAcknowledge_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationCancelAcknowledge_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationCancelAcknowledge_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationCancelAcknowledge, relocationCancelAcknowledge_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationCancelAcknowledge_ies_2,
+		memb_relocationCancelAcknowledge_ies_constraint_1,
+		&asn_PER_memb_relocationCancelAcknowledge_ies_constr_2,
+		0,
+		"relocationCancelAcknowledge-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationCancelAcknowledge_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationCancelAcknowledge-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationCancelAcknowledge_specs_1 = {
+	sizeof(struct RANAP_RelocationCancelAcknowledge),
+	offsetof(struct RANAP_RelocationCancelAcknowledge, _asn_ctx),
+	asn_MAP_RANAP_RelocationCancelAcknowledge_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationCancelAcknowledge = {
+	"RANAP_RelocationCancelAcknowledge",
+	"RANAP_RelocationCancelAcknowledge",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationCancelAcknowledge_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationCancelAcknowledge_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationCancelAcknowledge_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationCancelAcknowledge.h b/src/ranap/RANAP_RelocationCancelAcknowledge.h
new file mode 100644
index 0000000..ef13259
--- /dev/null
+++ b/src/ranap/RANAP_RelocationCancelAcknowledge.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationCancelAcknowledge_H_
+#define	_RANAP_RelocationCancelAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationCancelAcknowledge */
+typedef struct RANAP_RelocationCancelAcknowledge {
+	struct relocationCancelAcknowledge_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationCancelAcknowledge_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationCancelAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationCancelAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationCancelAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationCommand.c b/src/ranap/RANAP_RelocationCommand.c
new file mode 100644
index 0000000..ca49adf
--- /dev/null
+++ b/src/ranap/RANAP_RelocationCommand.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationCommand.h"
+
+static int
+memb_relocationCommand_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationCommand_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationCommand_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationCommand_ies_specs_2 = {
+	sizeof(struct relocationCommand_ies),
+	offsetof(struct relocationCommand_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationCommand_ies_2 = {
+	"relocationCommand-ies",
+	"relocationCommand-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationCommand_ies_tags_2,
+	sizeof(asn_DEF_relocationCommand_ies_tags_2)
+		/sizeof(asn_DEF_relocationCommand_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationCommand_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationCommand_ies_tags_2)
+		/sizeof(asn_DEF_relocationCommand_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationCommand_ies_constr_2,
+	asn_MBR_relocationCommand_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationCommand_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationCommand_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationCommand, relocationCommand_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationCommand_ies_2,
+		memb_relocationCommand_ies_constraint_1,
+		&asn_PER_memb_relocationCommand_ies_constr_2,
+		0,
+		"relocationCommand-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationCommand_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationCommand_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationCommand-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationCommand_specs_1 = {
+	sizeof(struct RANAP_RelocationCommand),
+	offsetof(struct RANAP_RelocationCommand, _asn_ctx),
+	asn_MAP_RANAP_RelocationCommand_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationCommand = {
+	"RANAP_RelocationCommand",
+	"RANAP_RelocationCommand",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationCommand_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationCommand_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationCommand_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationCommand_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationCommand_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationCommand_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationCommand.h b/src/ranap/RANAP_RelocationCommand.h
new file mode 100644
index 0000000..12c9430
--- /dev/null
+++ b/src/ranap/RANAP_RelocationCommand.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationCommand_H_
+#define	_RANAP_RelocationCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationCommand */
+typedef struct RANAP_RelocationCommand {
+	struct relocationCommand_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationCommand_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationComplete.c b/src/ranap/RANAP_RelocationComplete.c
new file mode 100644
index 0000000..634188e
--- /dev/null
+++ b/src/ranap/RANAP_RelocationComplete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationComplete.h"
+
+static int
+memb_relocationComplete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationComplete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationComplete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationComplete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationComplete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationComplete_ies_specs_2 = {
+	sizeof(struct relocationComplete_ies),
+	offsetof(struct relocationComplete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationComplete_ies_2 = {
+	"relocationComplete-ies",
+	"relocationComplete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationComplete_ies_tags_2,
+	sizeof(asn_DEF_relocationComplete_ies_tags_2)
+		/sizeof(asn_DEF_relocationComplete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationComplete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationComplete_ies_tags_2)
+		/sizeof(asn_DEF_relocationComplete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationComplete_ies_constr_2,
+	asn_MBR_relocationComplete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationComplete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationComplete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationComplete, relocationComplete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationComplete_ies_2,
+		memb_relocationComplete_ies_constraint_1,
+		&asn_PER_memb_relocationComplete_ies_constr_2,
+		0,
+		"relocationComplete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationComplete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationComplete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationComplete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationComplete_specs_1 = {
+	sizeof(struct RANAP_RelocationComplete),
+	offsetof(struct RANAP_RelocationComplete, _asn_ctx),
+	asn_MAP_RANAP_RelocationComplete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationComplete = {
+	"RANAP_RelocationComplete",
+	"RANAP_RelocationComplete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationComplete_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationComplete_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationComplete_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationComplete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationComplete_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationComplete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationComplete_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationComplete_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationComplete.h b/src/ranap/RANAP_RelocationComplete.h
new file mode 100644
index 0000000..fc0fe17
--- /dev/null
+++ b/src/ranap/RANAP_RelocationComplete.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationComplete_H_
+#define	_RANAP_RelocationComplete_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationComplete */
+typedef struct RANAP_RelocationComplete {
+	struct relocationComplete_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationComplete_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationComplete_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationComplete;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationComplete_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationDetect.c b/src/ranap/RANAP_RelocationDetect.c
new file mode 100644
index 0000000..dfee820
--- /dev/null
+++ b/src/ranap/RANAP_RelocationDetect.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationDetect.h"
+
+static int
+memb_relocationDetect_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationDetect_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationDetect_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationDetect_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationDetect_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationDetect_ies_specs_2 = {
+	sizeof(struct relocationDetect_ies),
+	offsetof(struct relocationDetect_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationDetect_ies_2 = {
+	"relocationDetect-ies",
+	"relocationDetect-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationDetect_ies_tags_2,
+	sizeof(asn_DEF_relocationDetect_ies_tags_2)
+		/sizeof(asn_DEF_relocationDetect_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationDetect_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationDetect_ies_tags_2)
+		/sizeof(asn_DEF_relocationDetect_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationDetect_ies_constr_2,
+	asn_MBR_relocationDetect_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationDetect_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationDetect_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationDetect, relocationDetect_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationDetect_ies_2,
+		memb_relocationDetect_ies_constraint_1,
+		&asn_PER_memb_relocationDetect_ies_constr_2,
+		0,
+		"relocationDetect-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationDetect_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationDetect_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationDetect-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationDetect_specs_1 = {
+	sizeof(struct RANAP_RelocationDetect),
+	offsetof(struct RANAP_RelocationDetect, _asn_ctx),
+	asn_MAP_RANAP_RelocationDetect_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationDetect = {
+	"RANAP_RelocationDetect",
+	"RANAP_RelocationDetect",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationDetect_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationDetect_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationDetect_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationDetect_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationDetect_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationDetect_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationDetect_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationDetect_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationDetect.h b/src/ranap/RANAP_RelocationDetect.h
new file mode 100644
index 0000000..d425f65
--- /dev/null
+++ b/src/ranap/RANAP_RelocationDetect.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationDetect_H_
+#define	_RANAP_RelocationDetect_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationDetect */
+typedef struct RANAP_RelocationDetect {
+	struct relocationDetect_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationDetect_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationDetect_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationDetect;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationDetect_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationFailure.c b/src/ranap/RANAP_RelocationFailure.c
new file mode 100644
index 0000000..f9d343d
--- /dev/null
+++ b/src/ranap/RANAP_RelocationFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationFailure.h"
+
+static int
+memb_relocationFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationFailure_ies_specs_2 = {
+	sizeof(struct relocationFailure_ies),
+	offsetof(struct relocationFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationFailure_ies_2 = {
+	"relocationFailure-ies",
+	"relocationFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationFailure_ies_tags_2,
+	sizeof(asn_DEF_relocationFailure_ies_tags_2)
+		/sizeof(asn_DEF_relocationFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationFailure_ies_tags_2)
+		/sizeof(asn_DEF_relocationFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationFailure_ies_constr_2,
+	asn_MBR_relocationFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationFailure, relocationFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationFailure_ies_2,
+		memb_relocationFailure_ies_constraint_1,
+		&asn_PER_memb_relocationFailure_ies_constr_2,
+		0,
+		"relocationFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationFailure_specs_1 = {
+	sizeof(struct RANAP_RelocationFailure),
+	offsetof(struct RANAP_RelocationFailure, _asn_ctx),
+	asn_MAP_RANAP_RelocationFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationFailure = {
+	"RANAP_RelocationFailure",
+	"RANAP_RelocationFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationFailure_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationFailure.h b/src/ranap/RANAP_RelocationFailure.h
new file mode 100644
index 0000000..a629f60
--- /dev/null
+++ b/src/ranap/RANAP_RelocationFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationFailure_H_
+#define	_RANAP_RelocationFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationFailure */
+typedef struct RANAP_RelocationFailure {
+	struct relocationFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationPreparationFailure.c b/src/ranap/RANAP_RelocationPreparationFailure.c
new file mode 100644
index 0000000..b50877e
--- /dev/null
+++ b/src/ranap/RANAP_RelocationPreparationFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationPreparationFailure.h"
+
+static int
+memb_relocationPreparationFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationPreparationFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationPreparationFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationPreparationFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationPreparationFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationPreparationFailure_ies_specs_2 = {
+	sizeof(struct relocationPreparationFailure_ies),
+	offsetof(struct relocationPreparationFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationPreparationFailure_ies_2 = {
+	"relocationPreparationFailure-ies",
+	"relocationPreparationFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationPreparationFailure_ies_tags_2,
+	sizeof(asn_DEF_relocationPreparationFailure_ies_tags_2)
+		/sizeof(asn_DEF_relocationPreparationFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationPreparationFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationPreparationFailure_ies_tags_2)
+		/sizeof(asn_DEF_relocationPreparationFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationPreparationFailure_ies_constr_2,
+	asn_MBR_relocationPreparationFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationPreparationFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationPreparationFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationPreparationFailure, relocationPreparationFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationPreparationFailure_ies_2,
+		memb_relocationPreparationFailure_ies_constraint_1,
+		&asn_PER_memb_relocationPreparationFailure_ies_constr_2,
+		0,
+		"relocationPreparationFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationPreparationFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationPreparationFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationPreparationFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationPreparationFailure_specs_1 = {
+	sizeof(struct RANAP_RelocationPreparationFailure),
+	offsetof(struct RANAP_RelocationPreparationFailure, _asn_ctx),
+	asn_MAP_RANAP_RelocationPreparationFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationPreparationFailure = {
+	"RANAP_RelocationPreparationFailure",
+	"RANAP_RelocationPreparationFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationPreparationFailure_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationPreparationFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationPreparationFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationPreparationFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationPreparationFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationPreparationFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationPreparationFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationPreparationFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationPreparationFailure.h b/src/ranap/RANAP_RelocationPreparationFailure.h
new file mode 100644
index 0000000..d5f28de
--- /dev/null
+++ b/src/ranap/RANAP_RelocationPreparationFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationPreparationFailure_H_
+#define	_RANAP_RelocationPreparationFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationPreparationFailure */
+typedef struct RANAP_RelocationPreparationFailure {
+	struct relocationPreparationFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationPreparationFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationPreparationFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationPreparationFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationPreparationFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationRequest.c b/src/ranap/RANAP_RelocationRequest.c
new file mode 100644
index 0000000..87424c6
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationRequest.h"
+
+static int
+memb_relocationRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationRequest_ies_specs_2 = {
+	sizeof(struct relocationRequest_ies),
+	offsetof(struct relocationRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationRequest_ies_2 = {
+	"relocationRequest-ies",
+	"relocationRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationRequest_ies_tags_2,
+	sizeof(asn_DEF_relocationRequest_ies_tags_2)
+		/sizeof(asn_DEF_relocationRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationRequest_ies_tags_2)
+		/sizeof(asn_DEF_relocationRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationRequest_ies_constr_2,
+	asn_MBR_relocationRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationRequest, relocationRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationRequest_ies_2,
+		memb_relocationRequest_ies_constraint_1,
+		&asn_PER_memb_relocationRequest_ies_constr_2,
+		0,
+		"relocationRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationRequest_specs_1 = {
+	sizeof(struct RANAP_RelocationRequest),
+	offsetof(struct RANAP_RelocationRequest, _asn_ctx),
+	asn_MAP_RANAP_RelocationRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequest = {
+	"RANAP_RelocationRequest",
+	"RANAP_RelocationRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationRequest_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationRequest.h b/src/ranap/RANAP_RelocationRequest.h
new file mode 100644
index 0000000..00b6981
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationRequest_H_
+#define	_RANAP_RelocationRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationRequest */
+typedef struct RANAP_RelocationRequest {
+	struct relocationRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationRequestAcknowledge.c b/src/ranap/RANAP_RelocationRequestAcknowledge.c
new file mode 100644
index 0000000..49a70f0
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequestAcknowledge.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationRequestAcknowledge.h"
+
+static int
+memb_relocationRequestAcknowledge_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationRequestAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationRequestAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationRequestAcknowledge_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationRequestAcknowledge_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationRequestAcknowledge_ies_specs_2 = {
+	sizeof(struct relocationRequestAcknowledge_ies),
+	offsetof(struct relocationRequestAcknowledge_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationRequestAcknowledge_ies_2 = {
+	"relocationRequestAcknowledge-ies",
+	"relocationRequestAcknowledge-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationRequestAcknowledge_ies_tags_2,
+	sizeof(asn_DEF_relocationRequestAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_relocationRequestAcknowledge_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationRequestAcknowledge_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationRequestAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_relocationRequestAcknowledge_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationRequestAcknowledge_ies_constr_2,
+	asn_MBR_relocationRequestAcknowledge_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationRequestAcknowledge_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationRequestAcknowledge_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationRequestAcknowledge, relocationRequestAcknowledge_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationRequestAcknowledge_ies_2,
+		memb_relocationRequestAcknowledge_ies_constraint_1,
+		&asn_PER_memb_relocationRequestAcknowledge_ies_constr_2,
+		0,
+		"relocationRequestAcknowledge-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationRequestAcknowledge_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationRequestAcknowledge-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationRequestAcknowledge_specs_1 = {
+	sizeof(struct RANAP_RelocationRequestAcknowledge),
+	offsetof(struct RANAP_RelocationRequestAcknowledge, _asn_ctx),
+	asn_MAP_RANAP_RelocationRequestAcknowledge_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequestAcknowledge = {
+	"RANAP_RelocationRequestAcknowledge",
+	"RANAP_RelocationRequestAcknowledge",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequestAcknowledge_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationRequestAcknowledge_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationRequestAcknowledge_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationRequestAcknowledge.h b/src/ranap/RANAP_RelocationRequestAcknowledge.h
new file mode 100644
index 0000000..4044052
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequestAcknowledge.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationRequestAcknowledge_H_
+#define	_RANAP_RelocationRequestAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationRequestAcknowledge */
+typedef struct RANAP_RelocationRequestAcknowledge {
+	struct relocationRequestAcknowledge_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationRequestAcknowledge_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationRequestAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequestAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationRequestAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationRequired.c b/src/ranap/RANAP_RelocationRequired.c
new file mode 100644
index 0000000..8c81751
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequired.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RelocationRequired.h"
+
+static int
+memb_relocationRequired_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_relocationRequired_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_relocationRequired_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_relocationRequired_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_relocationRequired_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_relocationRequired_ies_specs_2 = {
+	sizeof(struct relocationRequired_ies),
+	offsetof(struct relocationRequired_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_relocationRequired_ies_2 = {
+	"relocationRequired-ies",
+	"relocationRequired-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_relocationRequired_ies_tags_2,
+	sizeof(asn_DEF_relocationRequired_ies_tags_2)
+		/sizeof(asn_DEF_relocationRequired_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_relocationRequired_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_relocationRequired_ies_tags_2)
+		/sizeof(asn_DEF_relocationRequired_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_relocationRequired_ies_constr_2,
+	asn_MBR_relocationRequired_ies_2,
+	1,	/* Single element */
+	&asn_SPC_relocationRequired_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RelocationRequired_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RelocationRequired, relocationRequired_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_relocationRequired_ies_2,
+		memb_relocationRequired_ies_constraint_1,
+		&asn_PER_memb_relocationRequired_ies_constr_2,
+		0,
+		"relocationRequired-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationRequired_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RelocationRequired_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* relocationRequired-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RelocationRequired_specs_1 = {
+	sizeof(struct RANAP_RelocationRequired),
+	offsetof(struct RANAP_RelocationRequired, _asn_ctx),
+	asn_MAP_RANAP_RelocationRequired_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequired = {
+	"RANAP_RelocationRequired",
+	"RANAP_RelocationRequired",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationRequired_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationRequired_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequired_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationRequired_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationRequired_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequired_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RelocationRequired_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RelocationRequired_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationRequired.h b/src/ranap/RANAP_RelocationRequired.h
new file mode 100644
index 0000000..2c8fce0
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequired.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RelocationRequired_H_
+#define	_RANAP_RelocationRequired_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RelocationRequired */
+typedef struct RANAP_RelocationRequired {
+	struct relocationRequired_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} relocationRequired_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RelocationRequired_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequired;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationRequired_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationRequirement.c b/src/ranap/RANAP_RelocationRequirement.c
new file mode 100644
index 0000000..9d7b424
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequirement.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RelocationRequirement.h"
+
+int
+RANAP_RelocationRequirement_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RelocationRequirement_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RelocationRequirement_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RelocationRequirement_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RelocationRequirement_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RelocationRequirement_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RelocationRequirement_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RelocationRequirement_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RelocationRequirement_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RelocationRequirement_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RelocationRequirement_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RelocationRequirement_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RelocationRequirement_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RelocationRequirement_value2enum_1[] = {
+	{ 0,	8,	"lossless" },
+	{ 1,	4,	"none" },
+	{ 2,	8,	"realtime" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RelocationRequirement_enum2value_1[] = {
+	0,	/* lossless(0) */
+	1,	/* none(1) */
+	2	/* realtime(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RelocationRequirement_specs_1 = {
+	asn_MAP_RANAP_RelocationRequirement_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RelocationRequirement_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationRequirement_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequirement = {
+	"RANAP_RelocationRequirement",
+	"RANAP_RelocationRequirement",
+	RANAP_RelocationRequirement_free,
+	RANAP_RelocationRequirement_print,
+	RANAP_RelocationRequirement_constraint,
+	RANAP_RelocationRequirement_decode_ber,
+	RANAP_RelocationRequirement_encode_der,
+	RANAP_RelocationRequirement_decode_xer,
+	RANAP_RelocationRequirement_encode_xer,
+	RANAP_RelocationRequirement_decode_uper,
+	RANAP_RelocationRequirement_encode_uper,
+	RANAP_RelocationRequirement_decode_aper,
+	RANAP_RelocationRequirement_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationRequirement_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationRequirement_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequirement_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationRequirement_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationRequirement_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationRequirement_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RelocationRequirement_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RelocationRequirement_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationRequirement.h b/src/ranap/RANAP_RelocationRequirement.h
new file mode 100644
index 0000000..56623ed
--- /dev/null
+++ b/src/ranap/RANAP_RelocationRequirement.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RelocationRequirement_H_
+#define	_RANAP_RelocationRequirement_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RelocationRequirement {
+	RANAP_RelocationRequirement_lossless	= 0,
+	RANAP_RelocationRequirement_none	= 1,
+	/*
+	 * Enumeration is extensible
+	 */
+	RANAP_RelocationRequirement_realtime	= 2
+} e_RANAP_RelocationRequirement;
+
+/* RANAP_RelocationRequirement */
+typedef long	 RANAP_RelocationRequirement_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationRequirement;
+asn_struct_free_f RANAP_RelocationRequirement_free;
+asn_struct_print_f RANAP_RelocationRequirement_print;
+asn_constr_check_f RANAP_RelocationRequirement_constraint;
+ber_type_decoder_f RANAP_RelocationRequirement_decode_ber;
+der_type_encoder_f RANAP_RelocationRequirement_encode_der;
+xer_type_decoder_f RANAP_RelocationRequirement_decode_xer;
+xer_type_encoder_f RANAP_RelocationRequirement_encode_xer;
+per_type_decoder_f RANAP_RelocationRequirement_decode_uper;
+per_type_encoder_f RANAP_RelocationRequirement_encode_uper;
+per_type_decoder_f RANAP_RelocationRequirement_decode_aper;
+per_type_encoder_f RANAP_RelocationRequirement_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationRequirement_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RelocationType.c b/src/ranap/RANAP_RelocationType.c
new file mode 100644
index 0000000..45ede47
--- /dev/null
+++ b/src/ranap/RANAP_RelocationType.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RelocationType.h"
+
+int
+RANAP_RelocationType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RelocationType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RelocationType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RelocationType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RelocationType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RelocationType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RelocationType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RelocationType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RelocationType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RelocationType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RelocationType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RelocationType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RelocationType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RelocationType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RelocationType_value2enum_1[] = {
+	{ 0,	15,	"ue-not-involved" },
+	{ 1,	11,	"ue-involved" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RelocationType_enum2value_1[] = {
+	1,	/* ue-involved(1) */
+	0	/* ue-not-involved(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RelocationType_specs_1 = {
+	asn_MAP_RANAP_RelocationType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RelocationType_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RelocationType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationType = {
+	"RANAP_RelocationType",
+	"RANAP_RelocationType",
+	RANAP_RelocationType_free,
+	RANAP_RelocationType_print,
+	RANAP_RelocationType_constraint,
+	RANAP_RelocationType_decode_ber,
+	RANAP_RelocationType_encode_der,
+	RANAP_RelocationType_decode_xer,
+	RANAP_RelocationType_encode_xer,
+	RANAP_RelocationType_decode_uper,
+	RANAP_RelocationType_encode_uper,
+	RANAP_RelocationType_decode_aper,
+	RANAP_RelocationType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RelocationType_tags_1,
+	sizeof(asn_DEF_RANAP_RelocationType_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RelocationType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RelocationType_tags_1)
+		/sizeof(asn_DEF_RANAP_RelocationType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RelocationType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RelocationType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RelocationType.h b/src/ranap/RANAP_RelocationType.h
new file mode 100644
index 0000000..4ad5f58
--- /dev/null
+++ b/src/ranap/RANAP_RelocationType.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RelocationType_H_
+#define	_RANAP_RelocationType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RelocationType {
+	RANAP_RelocationType_ue_not_involved	= 0,
+	RANAP_RelocationType_ue_involved	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_RelocationType;
+
+/* RANAP_RelocationType */
+typedef long	 RANAP_RelocationType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RelocationType;
+asn_struct_free_f RANAP_RelocationType_free;
+asn_struct_print_f RANAP_RelocationType_print;
+asn_constr_check_f RANAP_RelocationType_constraint;
+ber_type_decoder_f RANAP_RelocationType_decode_ber;
+der_type_encoder_f RANAP_RelocationType_encode_der;
+xer_type_decoder_f RANAP_RelocationType_decode_xer;
+xer_type_encoder_f RANAP_RelocationType_encode_xer;
+per_type_decoder_f RANAP_RelocationType_decode_uper;
+per_type_encoder_f RANAP_RelocationType_encode_uper;
+per_type_decoder_f RANAP_RelocationType_decode_aper;
+per_type_encoder_f RANAP_RelocationType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RelocationType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RepetitionNumber0.c b/src/ranap/RANAP_RepetitionNumber0.c
new file mode 100644
index 0000000..53f7e9f
--- /dev/null
+++ b/src/ranap/RANAP_RepetitionNumber0.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RepetitionNumber0.h"
+
+int
+RANAP_RepetitionNumber0_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_RepetitionNumber0_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RepetitionNumber0_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber0_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber0_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber0_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber0_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber0_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber0_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber0_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber0_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RepetitionNumber0_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RepetitionNumber0_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RepetitionNumber0 = {
+	"RANAP_RepetitionNumber0",
+	"RANAP_RepetitionNumber0",
+	RANAP_RepetitionNumber0_free,
+	RANAP_RepetitionNumber0_print,
+	RANAP_RepetitionNumber0_constraint,
+	RANAP_RepetitionNumber0_decode_ber,
+	RANAP_RepetitionNumber0_encode_der,
+	RANAP_RepetitionNumber0_decode_xer,
+	RANAP_RepetitionNumber0_encode_xer,
+	RANAP_RepetitionNumber0_decode_uper,
+	RANAP_RepetitionNumber0_encode_uper,
+	RANAP_RepetitionNumber0_decode_aper,
+	RANAP_RepetitionNumber0_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RepetitionNumber0_tags_1,
+	sizeof(asn_DEF_RANAP_RepetitionNumber0_tags_1)
+		/sizeof(asn_DEF_RANAP_RepetitionNumber0_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RepetitionNumber0_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RepetitionNumber0_tags_1)
+		/sizeof(asn_DEF_RANAP_RepetitionNumber0_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RepetitionNumber0_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RepetitionNumber0.h b/src/ranap/RANAP_RepetitionNumber0.h
new file mode 100644
index 0000000..41e8950
--- /dev/null
+++ b/src/ranap/RANAP_RepetitionNumber0.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RepetitionNumber0_H_
+#define	_RANAP_RepetitionNumber0_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RepetitionNumber0 */
+typedef long	 RANAP_RepetitionNumber0_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RepetitionNumber0;
+asn_struct_free_f RANAP_RepetitionNumber0_free;
+asn_struct_print_f RANAP_RepetitionNumber0_print;
+asn_constr_check_f RANAP_RepetitionNumber0_constraint;
+ber_type_decoder_f RANAP_RepetitionNumber0_decode_ber;
+der_type_encoder_f RANAP_RepetitionNumber0_encode_der;
+xer_type_decoder_f RANAP_RepetitionNumber0_decode_xer;
+xer_type_encoder_f RANAP_RepetitionNumber0_encode_xer;
+per_type_decoder_f RANAP_RepetitionNumber0_decode_uper;
+per_type_encoder_f RANAP_RepetitionNumber0_encode_uper;
+per_type_decoder_f RANAP_RepetitionNumber0_decode_aper;
+per_type_encoder_f RANAP_RepetitionNumber0_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RepetitionNumber0_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RepetitionNumber1.c b/src/ranap/RANAP_RepetitionNumber1.c
new file mode 100644
index 0000000..b4f2630
--- /dev/null
+++ b/src/ranap/RANAP_RepetitionNumber1.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RepetitionNumber1.h"
+
+int
+RANAP_RepetitionNumber1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 256l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_RepetitionNumber1_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RepetitionNumber1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber1_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber1_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber1_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RepetitionNumber1_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RepetitionNumber1_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RepetitionNumber1_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (1..256) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RepetitionNumber1_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RepetitionNumber1 = {
+	"RANAP_RepetitionNumber1",
+	"RANAP_RepetitionNumber1",
+	RANAP_RepetitionNumber1_free,
+	RANAP_RepetitionNumber1_print,
+	RANAP_RepetitionNumber1_constraint,
+	RANAP_RepetitionNumber1_decode_ber,
+	RANAP_RepetitionNumber1_encode_der,
+	RANAP_RepetitionNumber1_decode_xer,
+	RANAP_RepetitionNumber1_encode_xer,
+	RANAP_RepetitionNumber1_decode_uper,
+	RANAP_RepetitionNumber1_encode_uper,
+	RANAP_RepetitionNumber1_decode_aper,
+	RANAP_RepetitionNumber1_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RepetitionNumber1_tags_1,
+	sizeof(asn_DEF_RANAP_RepetitionNumber1_tags_1)
+		/sizeof(asn_DEF_RANAP_RepetitionNumber1_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RepetitionNumber1_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RepetitionNumber1_tags_1)
+		/sizeof(asn_DEF_RANAP_RepetitionNumber1_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RepetitionNumber1_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RepetitionNumber1.h b/src/ranap/RANAP_RepetitionNumber1.h
new file mode 100644
index 0000000..b151d87
--- /dev/null
+++ b/src/ranap/RANAP_RepetitionNumber1.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RepetitionNumber1_H_
+#define	_RANAP_RepetitionNumber1_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RepetitionNumber1 */
+typedef long	 RANAP_RepetitionNumber1_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RepetitionNumber1;
+asn_struct_free_f RANAP_RepetitionNumber1_free;
+asn_struct_print_f RANAP_RepetitionNumber1_print;
+asn_constr_check_f RANAP_RepetitionNumber1_constraint;
+ber_type_decoder_f RANAP_RepetitionNumber1_decode_ber;
+der_type_encoder_f RANAP_RepetitionNumber1_encode_der;
+xer_type_decoder_f RANAP_RepetitionNumber1_decode_xer;
+xer_type_encoder_f RANAP_RepetitionNumber1_encode_xer;
+per_type_decoder_f RANAP_RepetitionNumber1_decode_uper;
+per_type_encoder_f RANAP_RepetitionNumber1_encode_uper;
+per_type_decoder_f RANAP_RepetitionNumber1_decode_aper;
+per_type_encoder_f RANAP_RepetitionNumber1_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RepetitionNumber1_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ReportAmount.c b/src/ranap/RANAP_ReportAmount.c
new file mode 100644
index 0000000..1e2a190
--- /dev/null
+++ b/src/ranap/RANAP_ReportAmount.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ReportAmount.h"
+
+int
+RANAP_ReportAmount_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ReportAmount_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ReportAmount_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ReportAmount_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportAmount_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ReportAmount_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportAmount_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ReportAmount_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportAmount_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ReportAmount_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ReportAmount_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ReportAmount_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportAmount_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ReportAmount_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  3,  3,  0l,  7l }	/* (0..7,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ReportAmount_value2enum_1[] = {
+	{ 0,	2,	"n1" },
+	{ 1,	2,	"n2" },
+	{ 2,	2,	"n4" },
+	{ 3,	2,	"n8" },
+	{ 4,	3,	"n16" },
+	{ 5,	3,	"n32" },
+	{ 6,	3,	"n64" },
+	{ 7,	8,	"infinity" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ReportAmount_enum2value_1[] = {
+	7,	/* infinity(7) */
+	0,	/* n1(0) */
+	4,	/* n16(4) */
+	1,	/* n2(1) */
+	5,	/* n32(5) */
+	2,	/* n4(2) */
+	6,	/* n64(6) */
+	3	/* n8(3) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ReportAmount_specs_1 = {
+	asn_MAP_RANAP_ReportAmount_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ReportAmount_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	9,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ReportAmount_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ReportAmount = {
+	"RANAP_ReportAmount",
+	"RANAP_ReportAmount",
+	RANAP_ReportAmount_free,
+	RANAP_ReportAmount_print,
+	RANAP_ReportAmount_constraint,
+	RANAP_ReportAmount_decode_ber,
+	RANAP_ReportAmount_encode_der,
+	RANAP_ReportAmount_decode_xer,
+	RANAP_ReportAmount_encode_xer,
+	RANAP_ReportAmount_decode_uper,
+	RANAP_ReportAmount_encode_uper,
+	RANAP_ReportAmount_decode_aper,
+	RANAP_ReportAmount_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ReportAmount_tags_1,
+	sizeof(asn_DEF_RANAP_ReportAmount_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportAmount_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ReportAmount_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ReportAmount_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportAmount_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ReportAmount_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ReportAmount_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ReportAmount.h b/src/ranap/RANAP_ReportAmount.h
new file mode 100644
index 0000000..daf8dd6
--- /dev/null
+++ b/src/ranap/RANAP_ReportAmount.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ReportAmount_H_
+#define	_RANAP_ReportAmount_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ReportAmount {
+	RANAP_ReportAmount_n1	= 0,
+	RANAP_ReportAmount_n2	= 1,
+	RANAP_ReportAmount_n4	= 2,
+	RANAP_ReportAmount_n8	= 3,
+	RANAP_ReportAmount_n16	= 4,
+	RANAP_ReportAmount_n32	= 5,
+	RANAP_ReportAmount_n64	= 6,
+	RANAP_ReportAmount_infinity	= 7
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_ReportAmount;
+
+/* RANAP_ReportAmount */
+typedef long	 RANAP_ReportAmount_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ReportAmount;
+asn_struct_free_f RANAP_ReportAmount_free;
+asn_struct_print_f RANAP_ReportAmount_print;
+asn_constr_check_f RANAP_ReportAmount_constraint;
+ber_type_decoder_f RANAP_ReportAmount_decode_ber;
+der_type_encoder_f RANAP_ReportAmount_encode_der;
+xer_type_decoder_f RANAP_ReportAmount_decode_xer;
+xer_type_encoder_f RANAP_ReportAmount_encode_xer;
+per_type_decoder_f RANAP_ReportAmount_decode_uper;
+per_type_encoder_f RANAP_ReportAmount_encode_uper;
+per_type_decoder_f RANAP_ReportAmount_decode_aper;
+per_type_encoder_f RANAP_ReportAmount_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ReportAmount_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ReportArea.c b/src/ranap/RANAP_ReportArea.c
new file mode 100644
index 0000000..240a572
--- /dev/null
+++ b/src/ranap/RANAP_ReportArea.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ReportArea.h"
+
+int
+RANAP_ReportArea_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ReportArea_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ReportArea_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ReportArea_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportArea_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ReportArea_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportArea_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ReportArea_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportArea_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ReportArea_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ReportArea_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ReportArea_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportArea_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ReportArea_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ReportArea_value2enum_1[] = {
+	{ 0,	12,	"service-area" },
+	{ 1,	17,	"geographical-area" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ReportArea_enum2value_1[] = {
+	1,	/* geographical-area(1) */
+	0	/* service-area(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ReportArea_specs_1 = {
+	asn_MAP_RANAP_ReportArea_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ReportArea_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ReportArea_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ReportArea = {
+	"RANAP_ReportArea",
+	"RANAP_ReportArea",
+	RANAP_ReportArea_free,
+	RANAP_ReportArea_print,
+	RANAP_ReportArea_constraint,
+	RANAP_ReportArea_decode_ber,
+	RANAP_ReportArea_encode_der,
+	RANAP_ReportArea_decode_xer,
+	RANAP_ReportArea_encode_xer,
+	RANAP_ReportArea_decode_uper,
+	RANAP_ReportArea_encode_uper,
+	RANAP_ReportArea_decode_aper,
+	RANAP_ReportArea_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ReportArea_tags_1,
+	sizeof(asn_DEF_RANAP_ReportArea_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportArea_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ReportArea_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ReportArea_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportArea_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ReportArea_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ReportArea_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ReportArea.h b/src/ranap/RANAP_ReportArea.h
new file mode 100644
index 0000000..e5ea1c8
--- /dev/null
+++ b/src/ranap/RANAP_ReportArea.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ReportArea_H_
+#define	_RANAP_ReportArea_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ReportArea {
+	RANAP_ReportArea_service_area	= 0,
+	RANAP_ReportArea_geographical_area	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_ReportArea;
+
+/* RANAP_ReportArea */
+typedef long	 RANAP_ReportArea_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ReportArea;
+asn_struct_free_f RANAP_ReportArea_free;
+asn_struct_print_f RANAP_ReportArea_print;
+asn_constr_check_f RANAP_ReportArea_constraint;
+ber_type_decoder_f RANAP_ReportArea_decode_ber;
+der_type_encoder_f RANAP_ReportArea_encode_der;
+xer_type_decoder_f RANAP_ReportArea_decode_xer;
+xer_type_encoder_f RANAP_ReportArea_encode_xer;
+per_type_decoder_f RANAP_ReportArea_decode_uper;
+per_type_encoder_f RANAP_ReportArea_encode_uper;
+per_type_decoder_f RANAP_ReportArea_decode_aper;
+per_type_encoder_f RANAP_ReportArea_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ReportArea_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ReportChangeOfSAI.c b/src/ranap/RANAP_ReportChangeOfSAI.c
new file mode 100644
index 0000000..ec74c5c
--- /dev/null
+++ b/src/ranap/RANAP_ReportChangeOfSAI.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ReportChangeOfSAI.h"
+
+int
+RANAP_ReportChangeOfSAI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ReportChangeOfSAI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ReportChangeOfSAI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportChangeOfSAI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ReportChangeOfSAI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportChangeOfSAI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ReportChangeOfSAI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportChangeOfSAI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ReportChangeOfSAI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ReportChangeOfSAI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ReportChangeOfSAI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportChangeOfSAI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ReportChangeOfSAI_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ReportChangeOfSAI_value2enum_1[] = {
+	{ 0,	9,	"requested" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ReportChangeOfSAI_enum2value_1[] = {
+	0	/* requested(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ReportChangeOfSAI_specs_1 = {
+	asn_MAP_RANAP_ReportChangeOfSAI_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ReportChangeOfSAI_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ReportChangeOfSAI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ReportChangeOfSAI = {
+	"RANAP_ReportChangeOfSAI",
+	"RANAP_ReportChangeOfSAI",
+	RANAP_ReportChangeOfSAI_free,
+	RANAP_ReportChangeOfSAI_print,
+	RANAP_ReportChangeOfSAI_constraint,
+	RANAP_ReportChangeOfSAI_decode_ber,
+	RANAP_ReportChangeOfSAI_encode_der,
+	RANAP_ReportChangeOfSAI_decode_xer,
+	RANAP_ReportChangeOfSAI_encode_xer,
+	RANAP_ReportChangeOfSAI_decode_uper,
+	RANAP_ReportChangeOfSAI_encode_uper,
+	RANAP_ReportChangeOfSAI_decode_aper,
+	RANAP_ReportChangeOfSAI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ReportChangeOfSAI_tags_1,
+	sizeof(asn_DEF_RANAP_ReportChangeOfSAI_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportChangeOfSAI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ReportChangeOfSAI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ReportChangeOfSAI_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportChangeOfSAI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ReportChangeOfSAI_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ReportChangeOfSAI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ReportChangeOfSAI.h b/src/ranap/RANAP_ReportChangeOfSAI.h
new file mode 100644
index 0000000..b6e0a05
--- /dev/null
+++ b/src/ranap/RANAP_ReportChangeOfSAI.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ReportChangeOfSAI_H_
+#define	_RANAP_ReportChangeOfSAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ReportChangeOfSAI {
+	RANAP_ReportChangeOfSAI_requested	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_ReportChangeOfSAI;
+
+/* RANAP_ReportChangeOfSAI */
+typedef long	 RANAP_ReportChangeOfSAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ReportChangeOfSAI;
+asn_struct_free_f RANAP_ReportChangeOfSAI_free;
+asn_struct_print_f RANAP_ReportChangeOfSAI_print;
+asn_constr_check_f RANAP_ReportChangeOfSAI_constraint;
+ber_type_decoder_f RANAP_ReportChangeOfSAI_decode_ber;
+der_type_encoder_f RANAP_ReportChangeOfSAI_encode_der;
+xer_type_decoder_f RANAP_ReportChangeOfSAI_decode_xer;
+xer_type_encoder_f RANAP_ReportChangeOfSAI_encode_xer;
+per_type_decoder_f RANAP_ReportChangeOfSAI_decode_uper;
+per_type_encoder_f RANAP_ReportChangeOfSAI_encode_uper;
+per_type_decoder_f RANAP_ReportChangeOfSAI_decode_aper;
+per_type_encoder_f RANAP_ReportChangeOfSAI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ReportChangeOfSAI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ReportInterval.c b/src/ranap/RANAP_ReportInterval.c
new file mode 100644
index 0000000..58dd609
--- /dev/null
+++ b/src/ranap/RANAP_ReportInterval.c
@@ -0,0 +1,193 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ReportInterval.h"
+
+int
+RANAP_ReportInterval_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ReportInterval_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ReportInterval_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ReportInterval_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportInterval_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ReportInterval_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportInterval_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ReportInterval_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ReportInterval_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ReportInterval_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ReportInterval_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ReportInterval_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ReportInterval_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ReportInterval_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  4,  4,  0l,  12l }	/* (0..12,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ReportInterval_value2enum_1[] = {
+	{ 0,	5,	"ms250" },
+	{ 1,	5,	"ms500" },
+	{ 2,	6,	"ms1000" },
+	{ 3,	6,	"ms2000" },
+	{ 4,	6,	"ms3000" },
+	{ 5,	6,	"ms4000" },
+	{ 6,	6,	"ms6000" },
+	{ 7,	7,	"ms12000" },
+	{ 8,	7,	"ms16000" },
+	{ 9,	7,	"ms20000" },
+	{ 10,	7,	"ms24000" },
+	{ 11,	7,	"ms32000" },
+	{ 12,	7,	"ms64000" },
+	{ 13,	6,	"ms8000" },
+	{ 14,	7,	"ms28000" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ReportInterval_enum2value_1[] = {
+	2,	/* ms1000(2) */
+	7,	/* ms12000(7) */
+	8,	/* ms16000(8) */
+	3,	/* ms2000(3) */
+	9,	/* ms20000(9) */
+	10,	/* ms24000(10) */
+	0,	/* ms250(0) */
+	14,	/* ms28000(14) */
+	4,	/* ms3000(4) */
+	11,	/* ms32000(11) */
+	5,	/* ms4000(5) */
+	1,	/* ms500(1) */
+	6,	/* ms6000(6) */
+	12,	/* ms64000(12) */
+	13	/* ms8000(13) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ReportInterval_specs_1 = {
+	asn_MAP_RANAP_ReportInterval_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ReportInterval_enum2value_1,	/* N => "tag"; sorted by N */
+	15,	/* Number of elements in the maps */
+	14,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ReportInterval_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ReportInterval = {
+	"RANAP_ReportInterval",
+	"RANAP_ReportInterval",
+	RANAP_ReportInterval_free,
+	RANAP_ReportInterval_print,
+	RANAP_ReportInterval_constraint,
+	RANAP_ReportInterval_decode_ber,
+	RANAP_ReportInterval_encode_der,
+	RANAP_ReportInterval_decode_xer,
+	RANAP_ReportInterval_encode_xer,
+	RANAP_ReportInterval_decode_uper,
+	RANAP_ReportInterval_encode_uper,
+	RANAP_ReportInterval_decode_aper,
+	RANAP_ReportInterval_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ReportInterval_tags_1,
+	sizeof(asn_DEF_RANAP_ReportInterval_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportInterval_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ReportInterval_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ReportInterval_tags_1)
+		/sizeof(asn_DEF_RANAP_ReportInterval_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ReportInterval_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ReportInterval_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ReportInterval.h b/src/ranap/RANAP_ReportInterval.h
new file mode 100644
index 0000000..6efdb1a
--- /dev/null
+++ b/src/ranap/RANAP_ReportInterval.h
@@ -0,0 +1,64 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ReportInterval_H_
+#define	_RANAP_ReportInterval_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ReportInterval {
+	RANAP_ReportInterval_ms250	= 0,
+	RANAP_ReportInterval_ms500	= 1,
+	RANAP_ReportInterval_ms1000	= 2,
+	RANAP_ReportInterval_ms2000	= 3,
+	RANAP_ReportInterval_ms3000	= 4,
+	RANAP_ReportInterval_ms4000	= 5,
+	RANAP_ReportInterval_ms6000	= 6,
+	RANAP_ReportInterval_ms12000	= 7,
+	RANAP_ReportInterval_ms16000	= 8,
+	RANAP_ReportInterval_ms20000	= 9,
+	RANAP_ReportInterval_ms24000	= 10,
+	RANAP_ReportInterval_ms32000	= 11,
+	RANAP_ReportInterval_ms64000	= 12,
+	/*
+	 * Enumeration is extensible
+	 */
+	RANAP_ReportInterval_ms8000	= 13,
+	RANAP_ReportInterval_ms28000	= 14
+} e_RANAP_ReportInterval;
+
+/* RANAP_ReportInterval */
+typedef long	 RANAP_ReportInterval_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ReportInterval;
+asn_struct_free_f RANAP_ReportInterval_free;
+asn_struct_print_f RANAP_ReportInterval_print;
+asn_constr_check_f RANAP_ReportInterval_constraint;
+ber_type_decoder_f RANAP_ReportInterval_decode_ber;
+der_type_encoder_f RANAP_ReportInterval_encode_der;
+xer_type_decoder_f RANAP_ReportInterval_decode_xer;
+xer_type_encoder_f RANAP_ReportInterval_encode_xer;
+per_type_decoder_f RANAP_ReportInterval_decode_uper;
+per_type_encoder_f RANAP_ReportInterval_encode_uper;
+per_type_decoder_f RANAP_ReportInterval_decode_aper;
+per_type_encoder_f RANAP_ReportInterval_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ReportInterval_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RequestType.c b/src/ranap/RANAP_RequestType.c
new file mode 100644
index 0000000..c00dcba
--- /dev/null
+++ b/src/ranap/RANAP_RequestType.c
@@ -0,0 +1,113 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RequestType.h"
+
+static int
+memb_accuracyCode_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_accuracyCode_constr_4 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RequestType_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RequestType, event),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Event,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"event"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RequestType, reportArea),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ReportArea,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"reportArea"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_RequestType, accuracyCode),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_accuracyCode_constraint_1,
+		&asn_PER_memb_accuracyCode_constr_4,
+		0,
+		"accuracyCode"
+		},
+};
+static const int asn_MAP_RANAP_RequestType_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_RequestType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RequestType_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* event */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* reportArea */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* accuracyCode */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RequestType_specs_1 = {
+	sizeof(struct RANAP_RequestType),
+	offsetof(struct RANAP_RequestType, _asn_ctx),
+	asn_MAP_RANAP_RequestType_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_RequestType_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RequestType = {
+	"RANAP_RequestType",
+	"RANAP_RequestType",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RequestType_tags_1,
+	sizeof(asn_DEF_RANAP_RequestType_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RequestType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RequestType_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestType_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RequestType_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_RequestType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RequestType.h b/src/ranap/RANAP_RequestType.h
new file mode 100644
index 0000000..67ed455
--- /dev/null
+++ b/src/ranap/RANAP_RequestType.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RequestType_H_
+#define	_RANAP_RequestType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Event.h"
+#include "RANAP_ReportArea.h"
+#include <NativeInteger.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RequestType */
+typedef struct RANAP_RequestType {
+	RANAP_Event_t	 event;
+	RANAP_ReportArea_t	 reportArea;
+	long	*accuracyCode	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RequestType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RequestType;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RequestType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.c b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.c
new file mode 100644
index 0000000..259ef71
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedGuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList),
+	offsetof(struct RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList = {
+	"RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList",
+	"RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.h b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.h
new file mode 100644
index 0000000..e856b16
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+#define	_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedGuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Requested-RAB-Parameter-ExtendedGuaranteedBitrateList */
+typedef struct RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedGuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Requested_RAB_Parameter_ExtendedGuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.c b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.c
new file mode 100644
index 0000000..263bc3a
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_ExtendedMaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList),
+	offsetof(struct RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList = {
+	"RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList",
+	"RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_constr_1,
+	asn_MBR_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.h b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.h
new file mode 100644
index 0000000..33dc3ee
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_H_
+#define	_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ExtendedMaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Requested-RAB-Parameter-ExtendedMaxBitrateList */
+typedef struct RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList {
+	A_SEQUENCE_OF(RANAP_ExtendedMaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Requested_RAB_Parameter_ExtendedMaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.c b/src/ranap/RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.c
new file mode 100644
index 0000000..35fa89d
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_GuaranteedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_specs_1 = {
+	sizeof(struct RANAP_Requested_RAB_Parameter_GuaranteedBitrateList),
+	offsetof(struct RANAP_Requested_RAB_Parameter_GuaranteedBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList = {
+	"RANAP_Requested-RAB-Parameter-GuaranteedBitrateList",
+	"RANAP_Requested-RAB-Parameter-GuaranteedBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_constr_1,
+	asn_MBR_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.h b/src/ranap/RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.h
new file mode 100644
index 0000000..cfe9076
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_H_
+#define	_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_GuaranteedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Requested-RAB-Parameter-GuaranteedBitrateList */
+typedef struct RANAP_Requested_RAB_Parameter_GuaranteedBitrateList {
+	A_SEQUENCE_OF(RANAP_GuaranteedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-MaxBitrateList.c b/src/ranap/RANAP_Requested-RAB-Parameter-MaxBitrateList.c
new file mode 100644
index 0000000..d846ed0
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-MaxBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Requested-RAB-Parameter-MaxBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_Requested_RAB_Parameter_MaxBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_Requested_RAB_Parameter_MaxBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_MaxBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_Requested_RAB_Parameter_MaxBitrateList_specs_1 = {
+	sizeof(struct RANAP_Requested_RAB_Parameter_MaxBitrateList),
+	offsetof(struct RANAP_Requested_RAB_Parameter_MaxBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList = {
+	"RANAP_Requested-RAB-Parameter-MaxBitrateList",
+	"RANAP_Requested-RAB-Parameter-MaxBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Requested_RAB_Parameter_MaxBitrateList_constr_1,
+	asn_MBR_RANAP_Requested_RAB_Parameter_MaxBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_Requested_RAB_Parameter_MaxBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-MaxBitrateList.h b/src/ranap/RANAP_Requested-RAB-Parameter-MaxBitrateList.h
new file mode 100644
index 0000000..0b2956c
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-MaxBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Requested_RAB_Parameter_MaxBitrateList_H_
+#define	_RANAP_Requested_RAB_Parameter_MaxBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MaxBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Requested-RAB-Parameter-MaxBitrateList */
+typedef struct RANAP_Requested_RAB_Parameter_MaxBitrateList {
+	A_SEQUENCE_OF(RANAP_MaxBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Requested_RAB_Parameter_MaxBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Requested_RAB_Parameter_MaxBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-Values.c b/src/ranap/RANAP_Requested-RAB-Parameter-Values.c
new file mode 100644
index 0000000..887cbe4
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-Values.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Requested-RAB-Parameter-Values.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Requested_RAB_Parameter_Values_1[] = {
+	{ ATF_POINTER, 3, offsetof(struct RANAP_Requested_RAB_Parameter_Values, requestedMaxBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Requested_RAB_Parameter_MaxBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"requestedMaxBitrates"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_Requested_RAB_Parameter_Values, requestedGuaranteedBitrates),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Requested_RAB_Parameter_GuaranteedBitrateList,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"requestedGuaranteedBitrates"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Requested_RAB_Parameter_Values, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Requested_RAB_Parameter_Values_oms_1[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Requested_RAB_Parameter_Values_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* requestedMaxBitrates */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* requestedGuaranteedBitrates */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Requested_RAB_Parameter_Values_specs_1 = {
+	sizeof(struct RANAP_Requested_RAB_Parameter_Values),
+	offsetof(struct RANAP_Requested_RAB_Parameter_Values, _asn_ctx),
+	asn_MAP_RANAP_Requested_RAB_Parameter_Values_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_Requested_RAB_Parameter_Values_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_Values = {
+	"RANAP_Requested-RAB-Parameter-Values",
+	"RANAP_Requested-RAB-Parameter-Values",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1,
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1)
+		/sizeof(asn_DEF_RANAP_Requested_RAB_Parameter_Values_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Requested_RAB_Parameter_Values_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_Requested_RAB_Parameter_Values_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Requested-RAB-Parameter-Values.h b/src/ranap/RANAP_Requested-RAB-Parameter-Values.h
new file mode 100644
index 0000000..b5d11cb
--- /dev/null
+++ b/src/ranap/RANAP_Requested-RAB-Parameter-Values.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Requested_RAB_Parameter_Values_H_
+#define	_RANAP_Requested_RAB_Parameter_Values_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_Requested-RAB-Parameter-MaxBitrateList.h"
+#include "RANAP_Requested-RAB-Parameter-GuaranteedBitrateList.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Requested-RAB-Parameter-Values */
+typedef struct RANAP_Requested_RAB_Parameter_Values {
+	RANAP_Requested_RAB_Parameter_MaxBitrateList_t	*requestedMaxBitrates	/* OPTIONAL */;
+	RANAP_Requested_RAB_Parameter_GuaranteedBitrateList_t	*requestedGuaranteedBitrates	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Requested_RAB_Parameter_Values_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Requested_RAB_Parameter_Values;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Requested_RAB_Parameter_Values_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RequestedGANSSAssistanceData.c b/src/ranap/RANAP_RequestedGANSSAssistanceData.c
new file mode 100644
index 0000000..854b796
--- /dev/null
+++ b/src/ranap/RANAP_RequestedGANSSAssistanceData.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RequestedGANSSAssistanceData.h"
+
+int
+RANAP_RequestedGANSSAssistanceData_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 1l && size <= 201l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_RequestedGANSSAssistanceData_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RequestedGANSSAssistanceData_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGANSSAssistanceData_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGANSSAssistanceData_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGANSSAssistanceData_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGANSSAssistanceData_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGANSSAssistanceData_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGANSSAssistanceData_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGANSSAssistanceData_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGANSSAssistanceData_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RequestedGANSSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RequestedGANSSAssistanceData_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  201l }	/* (SIZE(1..201)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedGANSSAssistanceData = {
+	"RANAP_RequestedGANSSAssistanceData",
+	"RANAP_RequestedGANSSAssistanceData",
+	RANAP_RequestedGANSSAssistanceData_free,
+	RANAP_RequestedGANSSAssistanceData_print,
+	RANAP_RequestedGANSSAssistanceData_constraint,
+	RANAP_RequestedGANSSAssistanceData_decode_ber,
+	RANAP_RequestedGANSSAssistanceData_encode_der,
+	RANAP_RequestedGANSSAssistanceData_decode_xer,
+	RANAP_RequestedGANSSAssistanceData_encode_xer,
+	RANAP_RequestedGANSSAssistanceData_decode_uper,
+	RANAP_RequestedGANSSAssistanceData_encode_uper,
+	RANAP_RequestedGANSSAssistanceData_decode_aper,
+	RANAP_RequestedGANSSAssistanceData_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1,
+	sizeof(asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedGANSSAssistanceData_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RequestedGANSSAssistanceData_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RequestedGANSSAssistanceData.h b/src/ranap/RANAP_RequestedGANSSAssistanceData.h
new file mode 100644
index 0000000..86adfde
--- /dev/null
+++ b/src/ranap/RANAP_RequestedGANSSAssistanceData.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RequestedGANSSAssistanceData_H_
+#define	_RANAP_RequestedGANSSAssistanceData_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RequestedGANSSAssistanceData */
+typedef OCTET_STRING_t	 RANAP_RequestedGANSSAssistanceData_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedGANSSAssistanceData;
+asn_struct_free_f RANAP_RequestedGANSSAssistanceData_free;
+asn_struct_print_f RANAP_RequestedGANSSAssistanceData_print;
+asn_constr_check_f RANAP_RequestedGANSSAssistanceData_constraint;
+ber_type_decoder_f RANAP_RequestedGANSSAssistanceData_decode_ber;
+der_type_encoder_f RANAP_RequestedGANSSAssistanceData_encode_der;
+xer_type_decoder_f RANAP_RequestedGANSSAssistanceData_decode_xer;
+xer_type_encoder_f RANAP_RequestedGANSSAssistanceData_encode_xer;
+per_type_decoder_f RANAP_RequestedGANSSAssistanceData_decode_uper;
+per_type_encoder_f RANAP_RequestedGANSSAssistanceData_encode_uper;
+per_type_decoder_f RANAP_RequestedGANSSAssistanceData_decode_aper;
+per_type_encoder_f RANAP_RequestedGANSSAssistanceData_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RequestedGANSSAssistanceData_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RequestedGPSAssistanceData.c b/src/ranap/RANAP_RequestedGPSAssistanceData.c
new file mode 100644
index 0000000..85fcb1f
--- /dev/null
+++ b/src/ranap/RANAP_RequestedGPSAssistanceData.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RequestedGPSAssistanceData.h"
+
+int
+RANAP_RequestedGPSAssistanceData_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 1l && size <= 38l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_RequestedGPSAssistanceData_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RequestedGPSAssistanceData_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGPSAssistanceData_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGPSAssistanceData_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGPSAssistanceData_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGPSAssistanceData_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGPSAssistanceData_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGPSAssistanceData_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RequestedGPSAssistanceData_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RequestedGPSAssistanceData_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RequestedGPSAssistanceData_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RequestedGPSAssistanceData_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 6,  6,  1l,  38l }	/* (SIZE(1..38)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedGPSAssistanceData = {
+	"RANAP_RequestedGPSAssistanceData",
+	"RANAP_RequestedGPSAssistanceData",
+	RANAP_RequestedGPSAssistanceData_free,
+	RANAP_RequestedGPSAssistanceData_print,
+	RANAP_RequestedGPSAssistanceData_constraint,
+	RANAP_RequestedGPSAssistanceData_decode_ber,
+	RANAP_RequestedGPSAssistanceData_encode_der,
+	RANAP_RequestedGPSAssistanceData_decode_xer,
+	RANAP_RequestedGPSAssistanceData_encode_xer,
+	RANAP_RequestedGPSAssistanceData_decode_uper,
+	RANAP_RequestedGPSAssistanceData_encode_uper,
+	RANAP_RequestedGPSAssistanceData_decode_aper,
+	RANAP_RequestedGPSAssistanceData_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1,
+	sizeof(asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedGPSAssistanceData_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RequestedGPSAssistanceData_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_RequestedGPSAssistanceData.h b/src/ranap/RANAP_RequestedGPSAssistanceData.h
new file mode 100644
index 0000000..0ce5a5c
--- /dev/null
+++ b/src/ranap/RANAP_RequestedGPSAssistanceData.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RequestedGPSAssistanceData_H_
+#define	_RANAP_RequestedGPSAssistanceData_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RequestedGPSAssistanceData */
+typedef OCTET_STRING_t	 RANAP_RequestedGPSAssistanceData_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedGPSAssistanceData;
+asn_struct_free_f RANAP_RequestedGPSAssistanceData_free;
+asn_struct_print_f RANAP_RequestedGPSAssistanceData_print;
+asn_constr_check_f RANAP_RequestedGPSAssistanceData_constraint;
+ber_type_decoder_f RANAP_RequestedGPSAssistanceData_decode_ber;
+der_type_encoder_f RANAP_RequestedGPSAssistanceData_encode_der;
+xer_type_decoder_f RANAP_RequestedGPSAssistanceData_decode_xer;
+xer_type_encoder_f RANAP_RequestedGPSAssistanceData_encode_xer;
+per_type_decoder_f RANAP_RequestedGPSAssistanceData_decode_uper;
+per_type_encoder_f RANAP_RequestedGPSAssistanceData_encode_uper;
+per_type_decoder_f RANAP_RequestedGPSAssistanceData_decode_aper;
+per_type_encoder_f RANAP_RequestedGPSAssistanceData_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RequestedGPSAssistanceData_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RequestedLocationRelatedDataType.c b/src/ranap/RANAP_RequestedLocationRelatedDataType.c
new file mode 100644
index 0000000..38e95f1
--- /dev/null
+++ b/src/ranap/RANAP_RequestedLocationRelatedDataType.c
@@ -0,0 +1,179 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RequestedLocationRelatedDataType.h"
+
+int
+RANAP_RequestedLocationRelatedDataType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_RequestedLocationRelatedDataType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_RequestedLocationRelatedDataType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedLocationRelatedDataType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_RequestedLocationRelatedDataType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedLocationRelatedDataType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_RequestedLocationRelatedDataType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_RequestedLocationRelatedDataType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_RequestedLocationRelatedDataType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_RequestedLocationRelatedDataType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_RequestedLocationRelatedDataType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_RequestedLocationRelatedDataType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_RequestedLocationRelatedDataType_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_RequestedLocationRelatedDataType_value2enum_1[] = {
+	{ 0,	27,	"decipheringKeysUEBasedOTDOA" },
+	{ 1,	26,	"decipheringKeysAssistedGPS" },
+	{ 2,	35,	"dedicatedAssistanceDataUEBasedOTDOA" },
+	{ 3,	34,	"dedicatedAssistanceDataAssistedGPS" },
+	{ 4,	28,	"decipheringKeysAssistedGANSS" },
+	{ 5,	36,	"dedicatedAssistanceDataAssistedGANSS" },
+	{ 6,	34,	"decipheringKeysAssistedGPSandGANSS" },
+	{ 7,	42,	"dedicatedAssistanceDataAssistedGPSandGANSS" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_RequestedLocationRelatedDataType_enum2value_1[] = {
+	4,	/* decipheringKeysAssistedGANSS(4) */
+	1,	/* decipheringKeysAssistedGPS(1) */
+	6,	/* decipheringKeysAssistedGPSandGANSS(6) */
+	0,	/* decipheringKeysUEBasedOTDOA(0) */
+	5,	/* dedicatedAssistanceDataAssistedGANSS(5) */
+	3,	/* dedicatedAssistanceDataAssistedGPS(3) */
+	7,	/* dedicatedAssistanceDataAssistedGPSandGANSS(7) */
+	2	/* dedicatedAssistanceDataUEBasedOTDOA(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_RequestedLocationRelatedDataType_specs_1 = {
+	asn_MAP_RANAP_RequestedLocationRelatedDataType_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_RequestedLocationRelatedDataType_enum2value_1,	/* N => "tag"; sorted by N */
+	8,	/* Number of elements in the maps */
+	5,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedLocationRelatedDataType = {
+	"RANAP_RequestedLocationRelatedDataType",
+	"RANAP_RequestedLocationRelatedDataType",
+	RANAP_RequestedLocationRelatedDataType_free,
+	RANAP_RequestedLocationRelatedDataType_print,
+	RANAP_RequestedLocationRelatedDataType_constraint,
+	RANAP_RequestedLocationRelatedDataType_decode_ber,
+	RANAP_RequestedLocationRelatedDataType_encode_der,
+	RANAP_RequestedLocationRelatedDataType_decode_xer,
+	RANAP_RequestedLocationRelatedDataType_encode_xer,
+	RANAP_RequestedLocationRelatedDataType_decode_uper,
+	RANAP_RequestedLocationRelatedDataType_encode_uper,
+	RANAP_RequestedLocationRelatedDataType_decode_aper,
+	RANAP_RequestedLocationRelatedDataType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1,
+	sizeof(asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedLocationRelatedDataType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RequestedLocationRelatedDataType_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_RequestedLocationRelatedDataType_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RequestedLocationRelatedDataType.h b/src/ranap/RANAP_RequestedLocationRelatedDataType.h
new file mode 100644
index 0000000..786ea7c
--- /dev/null
+++ b/src/ranap/RANAP_RequestedLocationRelatedDataType.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RequestedLocationRelatedDataType_H_
+#define	_RANAP_RequestedLocationRelatedDataType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_RequestedLocationRelatedDataType {
+	RANAP_RequestedLocationRelatedDataType_decipheringKeysUEBasedOTDOA	= 0,
+	RANAP_RequestedLocationRelatedDataType_decipheringKeysAssistedGPS	= 1,
+	RANAP_RequestedLocationRelatedDataType_dedicatedAssistanceDataUEBasedOTDOA	= 2,
+	RANAP_RequestedLocationRelatedDataType_dedicatedAssistanceDataAssistedGPS	= 3,
+	/*
+	 * Enumeration is extensible
+	 */
+	RANAP_RequestedLocationRelatedDataType_decipheringKeysAssistedGANSS	= 4,
+	RANAP_RequestedLocationRelatedDataType_dedicatedAssistanceDataAssistedGANSS	= 5,
+	RANAP_RequestedLocationRelatedDataType_decipheringKeysAssistedGPSandGANSS	= 6,
+	RANAP_RequestedLocationRelatedDataType_dedicatedAssistanceDataAssistedGPSandGANSS	= 7
+} e_RANAP_RequestedLocationRelatedDataType;
+
+/* RANAP_RequestedLocationRelatedDataType */
+typedef long	 RANAP_RequestedLocationRelatedDataType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedLocationRelatedDataType;
+asn_struct_free_f RANAP_RequestedLocationRelatedDataType_free;
+asn_struct_print_f RANAP_RequestedLocationRelatedDataType_print;
+asn_constr_check_f RANAP_RequestedLocationRelatedDataType_constraint;
+ber_type_decoder_f RANAP_RequestedLocationRelatedDataType_decode_ber;
+der_type_encoder_f RANAP_RequestedLocationRelatedDataType_encode_der;
+xer_type_decoder_f RANAP_RequestedLocationRelatedDataType_decode_xer;
+xer_type_encoder_f RANAP_RequestedLocationRelatedDataType_encode_xer;
+per_type_decoder_f RANAP_RequestedLocationRelatedDataType_decode_uper;
+per_type_encoder_f RANAP_RequestedLocationRelatedDataType_encode_uper;
+per_type_decoder_f RANAP_RequestedLocationRelatedDataType_decode_aper;
+per_type_encoder_f RANAP_RequestedLocationRelatedDataType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RequestedLocationRelatedDataType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.c b/src/ranap/RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.c
new file mode 100644
index 0000000..87813a3
--- /dev/null
+++ b/src/ranap/RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 9,  9,  1l,  512l }	/* (SIZE(1..512)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_specs_1 = {
+	sizeof(struct RANAP_RequestedMBMSIPMulticastAddressandAPNRequest),
+	offsetof(struct RANAP_RequestedMBMSIPMulticastAddressandAPNRequest, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest = {
+	"RANAP_RequestedMBMSIPMulticastAddressandAPNRequest",
+	"RANAP_RequestedMBMSIPMulticastAddressandAPNRequest",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1,
+	sizeof(asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_constr_1,
+	asn_MBR_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.h b/src/ranap/RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.h
new file mode 100644
index 0000000..efec336
--- /dev/null
+++ b/src/ranap/RANAP_RequestedMBMSIPMulticastAddressandAPNRequest.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_H_
+#define	_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_MBMSIPMulticastAddressandAPNlist.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RequestedMBMSIPMulticastAddressandAPNRequest */
+typedef struct RANAP_RequestedMBMSIPMulticastAddressandAPNRequest {
+	A_SEQUENCE_OF(RANAP_MBMSIPMulticastAddressandAPNlist_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedMBMSIPMulticastAddressandAPNRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RequestedMBMSIPMulticastAddressandAPNRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RequestedMulticastServiceList.c b/src/ranap/RANAP_RequestedMulticastServiceList.c
new file mode 100644
index 0000000..ae6e1db
--- /dev/null
+++ b/src/ranap/RANAP_RequestedMulticastServiceList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_RequestedMulticastServiceList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_RequestedMulticastServiceList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 7,  7,  1l,  128l }	/* (SIZE(1..128)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_RequestedMulticastServiceList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_TMGI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RequestedMulticastServiceList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_RequestedMulticastServiceList_specs_1 = {
+	sizeof(struct RANAP_RequestedMulticastServiceList),
+	offsetof(struct RANAP_RequestedMulticastServiceList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedMulticastServiceList = {
+	"RANAP_RequestedMulticastServiceList",
+	"RANAP_RequestedMulticastServiceList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_RequestedMulticastServiceList_tags_1,
+	sizeof(asn_DEF_RANAP_RequestedMulticastServiceList_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedMulticastServiceList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RequestedMulticastServiceList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RequestedMulticastServiceList_tags_1)
+		/sizeof(asn_DEF_RANAP_RequestedMulticastServiceList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_RequestedMulticastServiceList_constr_1,
+	asn_MBR_RANAP_RequestedMulticastServiceList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_RequestedMulticastServiceList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RequestedMulticastServiceList.h b/src/ranap/RANAP_RequestedMulticastServiceList.h
new file mode 100644
index 0000000..859a692
--- /dev/null
+++ b/src/ranap/RANAP_RequestedMulticastServiceList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_RequestedMulticastServiceList_H_
+#define	_RANAP_RequestedMulticastServiceList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TMGI.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RequestedMulticastServiceList */
+typedef struct RANAP_RequestedMulticastServiceList {
+	A_SEQUENCE_OF(RANAP_TMGI_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RequestedMulticastServiceList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RequestedMulticastServiceList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RequestedMulticastServiceList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Reset.c b/src/ranap/RANAP_Reset.c
new file mode 100644
index 0000000..cc808ff
--- /dev/null
+++ b/src/ranap/RANAP_Reset.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_Reset.h"
+
+static int
+memb_reset_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_reset_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_reset_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_reset_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_reset_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_reset_ies_specs_2 = {
+	sizeof(struct reset_ies),
+	offsetof(struct reset_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_reset_ies_2 = {
+	"reset-ies",
+	"reset-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_reset_ies_tags_2,
+	sizeof(asn_DEF_reset_ies_tags_2)
+		/sizeof(asn_DEF_reset_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_reset_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_reset_ies_tags_2)
+		/sizeof(asn_DEF_reset_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_reset_ies_constr_2,
+	asn_MBR_reset_ies_2,
+	1,	/* Single element */
+	&asn_SPC_reset_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_Reset_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Reset, reset_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_reset_ies_2,
+		memb_reset_ies_constraint_1,
+		&asn_PER_memb_reset_ies_constr_2,
+		0,
+		"reset-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Reset_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Reset_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* reset-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Reset_specs_1 = {
+	sizeof(struct RANAP_Reset),
+	offsetof(struct RANAP_Reset, _asn_ctx),
+	asn_MAP_RANAP_Reset_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Reset = {
+	"RANAP_Reset",
+	"RANAP_Reset",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Reset_tags_1,
+	sizeof(asn_DEF_RANAP_Reset_tags_1)
+		/sizeof(asn_DEF_RANAP_Reset_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Reset_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Reset_tags_1)
+		/sizeof(asn_DEF_RANAP_Reset_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Reset_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_Reset_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Reset.h b/src/ranap/RANAP_Reset.h
new file mode 100644
index 0000000..2dc8cf1
--- /dev/null
+++ b/src/ranap/RANAP_Reset.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_Reset_H_
+#define	_RANAP_Reset_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Reset */
+typedef struct RANAP_Reset {
+	struct reset_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} reset_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Reset_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Reset;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Reset_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ResetAcknowledge.c b/src/ranap/RANAP_ResetAcknowledge.c
new file mode 100644
index 0000000..6d32764
--- /dev/null
+++ b/src/ranap/RANAP_ResetAcknowledge.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_ResetAcknowledge.h"
+
+static int
+memb_resetAcknowledge_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_resetAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_resetAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_resetAcknowledge_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_resetAcknowledge_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_resetAcknowledge_ies_specs_2 = {
+	sizeof(struct resetAcknowledge_ies),
+	offsetof(struct resetAcknowledge_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_resetAcknowledge_ies_2 = {
+	"resetAcknowledge-ies",
+	"resetAcknowledge-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_resetAcknowledge_ies_tags_2,
+	sizeof(asn_DEF_resetAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_resetAcknowledge_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_resetAcknowledge_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_resetAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_resetAcknowledge_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_resetAcknowledge_ies_constr_2,
+	asn_MBR_resetAcknowledge_ies_2,
+	1,	/* Single element */
+	&asn_SPC_resetAcknowledge_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_ResetAcknowledge_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ResetAcknowledge, resetAcknowledge_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_resetAcknowledge_ies_2,
+		memb_resetAcknowledge_ies_constraint_1,
+		&asn_PER_memb_resetAcknowledge_ies_constr_2,
+		0,
+		"resetAcknowledge-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ResetAcknowledge_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ResetAcknowledge_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* resetAcknowledge-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ResetAcknowledge_specs_1 = {
+	sizeof(struct RANAP_ResetAcknowledge),
+	offsetof(struct RANAP_ResetAcknowledge, _asn_ctx),
+	asn_MAP_RANAP_ResetAcknowledge_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ResetAcknowledge = {
+	"RANAP_ResetAcknowledge",
+	"RANAP_ResetAcknowledge",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ResetAcknowledge_tags_1,
+	sizeof(asn_DEF_RANAP_ResetAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_ResetAcknowledge_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ResetAcknowledge_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ResetAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_ResetAcknowledge_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ResetAcknowledge_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_ResetAcknowledge_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ResetAcknowledge.h b/src/ranap/RANAP_ResetAcknowledge.h
new file mode 100644
index 0000000..1c56846
--- /dev/null
+++ b/src/ranap/RANAP_ResetAcknowledge.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_ResetAcknowledge_H_
+#define	_RANAP_ResetAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ResetAcknowledge */
+typedef struct RANAP_ResetAcknowledge {
+	struct resetAcknowledge_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} resetAcknowledge_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ResetAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ResetAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ResetAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ResetResource.c b/src/ranap/RANAP_ResetResource.c
new file mode 100644
index 0000000..a3f216c
--- /dev/null
+++ b/src/ranap/RANAP_ResetResource.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_ResetResource.h"
+
+static int
+memb_resetResource_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_resetResource_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_resetResource_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_resetResource_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_resetResource_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_resetResource_ies_specs_2 = {
+	sizeof(struct resetResource_ies),
+	offsetof(struct resetResource_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_resetResource_ies_2 = {
+	"resetResource-ies",
+	"resetResource-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_resetResource_ies_tags_2,
+	sizeof(asn_DEF_resetResource_ies_tags_2)
+		/sizeof(asn_DEF_resetResource_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_resetResource_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_resetResource_ies_tags_2)
+		/sizeof(asn_DEF_resetResource_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_resetResource_ies_constr_2,
+	asn_MBR_resetResource_ies_2,
+	1,	/* Single element */
+	&asn_SPC_resetResource_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_ResetResource_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ResetResource, resetResource_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_resetResource_ies_2,
+		memb_resetResource_ies_constraint_1,
+		&asn_PER_memb_resetResource_ies_constr_2,
+		0,
+		"resetResource-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ResetResource_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ResetResource_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* resetResource-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ResetResource_specs_1 = {
+	sizeof(struct RANAP_ResetResource),
+	offsetof(struct RANAP_ResetResource, _asn_ctx),
+	asn_MAP_RANAP_ResetResource_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ResetResource = {
+	"RANAP_ResetResource",
+	"RANAP_ResetResource",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ResetResource_tags_1,
+	sizeof(asn_DEF_RANAP_ResetResource_tags_1)
+		/sizeof(asn_DEF_RANAP_ResetResource_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ResetResource_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ResetResource_tags_1)
+		/sizeof(asn_DEF_RANAP_ResetResource_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ResetResource_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_ResetResource_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ResetResource.h b/src/ranap/RANAP_ResetResource.h
new file mode 100644
index 0000000..9f22fba
--- /dev/null
+++ b/src/ranap/RANAP_ResetResource.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_ResetResource_H_
+#define	_RANAP_ResetResource_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ResetResource */
+typedef struct RANAP_ResetResource {
+	struct resetResource_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} resetResource_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ResetResource_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ResetResource;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ResetResource_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ResetResourceAcknowledge.c b/src/ranap/RANAP_ResetResourceAcknowledge.c
new file mode 100644
index 0000000..82d2063
--- /dev/null
+++ b/src/ranap/RANAP_ResetResourceAcknowledge.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_ResetResourceAcknowledge.h"
+
+static int
+memb_resetResourceAcknowledge_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_resetResourceAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_resetResourceAcknowledge_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_resetResourceAcknowledge_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_resetResourceAcknowledge_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_resetResourceAcknowledge_ies_specs_2 = {
+	sizeof(struct resetResourceAcknowledge_ies),
+	offsetof(struct resetResourceAcknowledge_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_resetResourceAcknowledge_ies_2 = {
+	"resetResourceAcknowledge-ies",
+	"resetResourceAcknowledge-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_resetResourceAcknowledge_ies_tags_2,
+	sizeof(asn_DEF_resetResourceAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_resetResourceAcknowledge_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_resetResourceAcknowledge_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_resetResourceAcknowledge_ies_tags_2)
+		/sizeof(asn_DEF_resetResourceAcknowledge_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_resetResourceAcknowledge_ies_constr_2,
+	asn_MBR_resetResourceAcknowledge_ies_2,
+	1,	/* Single element */
+	&asn_SPC_resetResourceAcknowledge_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_ResetResourceAcknowledge_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ResetResourceAcknowledge, resetResourceAcknowledge_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_resetResourceAcknowledge_ies_2,
+		memb_resetResourceAcknowledge_ies_constraint_1,
+		&asn_PER_memb_resetResourceAcknowledge_ies_constr_2,
+		0,
+		"resetResourceAcknowledge-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ResetResourceAcknowledge_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ResetResourceAcknowledge_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* resetResourceAcknowledge-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ResetResourceAcknowledge_specs_1 = {
+	sizeof(struct RANAP_ResetResourceAcknowledge),
+	offsetof(struct RANAP_ResetResourceAcknowledge, _asn_ctx),
+	asn_MAP_RANAP_ResetResourceAcknowledge_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ResetResourceAcknowledge = {
+	"RANAP_ResetResourceAcknowledge",
+	"RANAP_ResetResourceAcknowledge",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ResetResourceAcknowledge_tags_1,
+	sizeof(asn_DEF_RANAP_ResetResourceAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_ResetResourceAcknowledge_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ResetResourceAcknowledge_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ResetResourceAcknowledge_tags_1)
+		/sizeof(asn_DEF_RANAP_ResetResourceAcknowledge_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ResetResourceAcknowledge_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_ResetResourceAcknowledge_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ResetResourceAcknowledge.h b/src/ranap/RANAP_ResetResourceAcknowledge.h
new file mode 100644
index 0000000..33d460a
--- /dev/null
+++ b/src/ranap/RANAP_ResetResourceAcknowledge.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_ResetResourceAcknowledge_H_
+#define	_RANAP_ResetResourceAcknowledge_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ResetResourceAcknowledge */
+typedef struct RANAP_ResetResourceAcknowledge {
+	struct resetResourceAcknowledge_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} resetResourceAcknowledge_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ResetResourceAcknowledge_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ResetResourceAcknowledge;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ResetResourceAcknowledge_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ResidualBitErrorRatio.c b/src/ranap/RANAP_ResidualBitErrorRatio.c
new file mode 100644
index 0000000..c770f03
--- /dev/null
+++ b/src/ranap/RANAP_ResidualBitErrorRatio.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ResidualBitErrorRatio.h"
+
+static int
+memb_mantissa_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 9l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_exponent_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_mantissa_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  1l,  9l }	/* (1..9) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_exponent_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 3,  3,  1l,  8l }	/* (1..8) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_ResidualBitErrorRatio_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ResidualBitErrorRatio, mantissa),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_mantissa_constraint_1,
+		&asn_PER_memb_mantissa_constr_2,
+		0,
+		"mantissa"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_ResidualBitErrorRatio, exponent),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_exponent_constraint_1,
+		&asn_PER_memb_exponent_constr_3,
+		0,
+		"exponent"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_ResidualBitErrorRatio, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_ResidualBitErrorRatio_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_ResidualBitErrorRatio_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_ResidualBitErrorRatio_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* mantissa */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* exponent */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_ResidualBitErrorRatio_specs_1 = {
+	sizeof(struct RANAP_ResidualBitErrorRatio),
+	offsetof(struct RANAP_ResidualBitErrorRatio, _asn_ctx),
+	asn_MAP_RANAP_ResidualBitErrorRatio_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_ResidualBitErrorRatio_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ResidualBitErrorRatio = {
+	"RANAP_ResidualBitErrorRatio",
+	"RANAP_ResidualBitErrorRatio",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ResidualBitErrorRatio_tags_1,
+	sizeof(asn_DEF_RANAP_ResidualBitErrorRatio_tags_1)
+		/sizeof(asn_DEF_RANAP_ResidualBitErrorRatio_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ResidualBitErrorRatio_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ResidualBitErrorRatio_tags_1)
+		/sizeof(asn_DEF_RANAP_ResidualBitErrorRatio_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_ResidualBitErrorRatio_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_ResidualBitErrorRatio_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ResidualBitErrorRatio.h b/src/ranap/RANAP_ResidualBitErrorRatio.h
new file mode 100644
index 0000000..7baf04e
--- /dev/null
+++ b/src/ranap/RANAP_ResidualBitErrorRatio.h
@@ -0,0 +1,40 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ResidualBitErrorRatio_H_
+#define	_RANAP_ResidualBitErrorRatio_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_ResidualBitErrorRatio */
+typedef struct RANAP_ResidualBitErrorRatio {
+	long	 mantissa;
+	long	 exponent;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_ResidualBitErrorRatio_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ResidualBitErrorRatio;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ResidualBitErrorRatio_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_ResponseTime.c b/src/ranap/RANAP_ResponseTime.c
new file mode 100644
index 0000000..2f40f0c
--- /dev/null
+++ b/src/ranap/RANAP_ResponseTime.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_ResponseTime.h"
+
+int
+RANAP_ResponseTime_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_ResponseTime_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_ResponseTime_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_ResponseTime_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ResponseTime_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_ResponseTime_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ResponseTime_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_ResponseTime_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_ResponseTime_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_ResponseTime_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_ResponseTime_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_ResponseTime_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_ResponseTime_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_ResponseTime_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_ResponseTime_value2enum_1[] = {
+	{ 0,	8,	"lowdelay" },
+	{ 1,	13,	"delaytolerant" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_ResponseTime_enum2value_1[] = {
+	1,	/* delaytolerant(1) */
+	0	/* lowdelay(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_ResponseTime_specs_1 = {
+	asn_MAP_RANAP_ResponseTime_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_ResponseTime_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_ResponseTime_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_ResponseTime = {
+	"RANAP_ResponseTime",
+	"RANAP_ResponseTime",
+	RANAP_ResponseTime_free,
+	RANAP_ResponseTime_print,
+	RANAP_ResponseTime_constraint,
+	RANAP_ResponseTime_decode_ber,
+	RANAP_ResponseTime_encode_der,
+	RANAP_ResponseTime_decode_xer,
+	RANAP_ResponseTime_encode_xer,
+	RANAP_ResponseTime_decode_uper,
+	RANAP_ResponseTime_encode_uper,
+	RANAP_ResponseTime_decode_aper,
+	RANAP_ResponseTime_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_ResponseTime_tags_1,
+	sizeof(asn_DEF_RANAP_ResponseTime_tags_1)
+		/sizeof(asn_DEF_RANAP_ResponseTime_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_ResponseTime_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_ResponseTime_tags_1)
+		/sizeof(asn_DEF_RANAP_ResponseTime_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_ResponseTime_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_ResponseTime_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_ResponseTime.h b/src/ranap/RANAP_ResponseTime.h
new file mode 100644
index 0000000..daeda50
--- /dev/null
+++ b/src/ranap/RANAP_ResponseTime.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_ResponseTime_H_
+#define	_RANAP_ResponseTime_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_ResponseTime {
+	RANAP_ResponseTime_lowdelay	= 0,
+	RANAP_ResponseTime_delaytolerant	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_ResponseTime;
+
+/* RANAP_ResponseTime */
+typedef long	 RANAP_ResponseTime_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_ResponseTime;
+asn_struct_free_f RANAP_ResponseTime_free;
+asn_struct_print_f RANAP_ResponseTime_print;
+asn_constr_check_f RANAP_ResponseTime_constraint;
+ber_type_decoder_f RANAP_ResponseTime_decode_ber;
+der_type_encoder_f RANAP_ResponseTime_encode_der;
+xer_type_decoder_f RANAP_ResponseTime_decode_xer;
+xer_type_encoder_f RANAP_ResponseTime_encode_xer;
+per_type_decoder_f RANAP_ResponseTime_decode_uper;
+per_type_encoder_f RANAP_ResponseTime_encode_uper;
+per_type_decoder_f RANAP_ResponseTime_decode_aper;
+per_type_encoder_f RANAP_ResponseTime_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_ResponseTime_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SAC.c b/src/ranap/RANAP_SAC.c
new file mode 100644
index 0000000..5c62b39
--- /dev/null
+++ b/src/ranap/RANAP_SAC.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SAC.h"
+
+int
+RANAP_SAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_SAC_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SAC_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SAC_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SAC_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SAC_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SAC_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SAC_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SAC = {
+	"RANAP_SAC",
+	"RANAP_SAC",
+	RANAP_SAC_free,
+	RANAP_SAC_print,
+	RANAP_SAC_constraint,
+	RANAP_SAC_decode_ber,
+	RANAP_SAC_encode_der,
+	RANAP_SAC_decode_xer,
+	RANAP_SAC_encode_xer,
+	RANAP_SAC_decode_uper,
+	RANAP_SAC_encode_uper,
+	RANAP_SAC_decode_aper,
+	RANAP_SAC_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SAC_tags_1,
+	sizeof(asn_DEF_RANAP_SAC_tags_1)
+		/sizeof(asn_DEF_RANAP_SAC_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SAC_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SAC_tags_1)
+		/sizeof(asn_DEF_RANAP_SAC_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SAC_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SAC.h b/src/ranap/RANAP_SAC.h
new file mode 100644
index 0000000..f7d7e80
--- /dev/null
+++ b/src/ranap/RANAP_SAC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SAC_H_
+#define	_RANAP_SAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SAC */
+typedef OCTET_STRING_t	 RANAP_SAC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SAC;
+asn_struct_free_f RANAP_SAC_free;
+asn_struct_print_f RANAP_SAC_print;
+asn_constr_check_f RANAP_SAC_constraint;
+ber_type_decoder_f RANAP_SAC_decode_ber;
+der_type_encoder_f RANAP_SAC_encode_der;
+xer_type_decoder_f RANAP_SAC_decode_xer;
+xer_type_encoder_f RANAP_SAC_encode_xer;
+per_type_decoder_f RANAP_SAC_decode_uper;
+per_type_encoder_f RANAP_SAC_encode_uper;
+per_type_decoder_f RANAP_SAC_decode_aper;
+per_type_encoder_f RANAP_SAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SAC_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SAI.c b/src/ranap/RANAP_SAI.c
new file mode 100644
index 0000000..8a81d4a
--- /dev/null
+++ b/src/ranap/RANAP_SAI.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SAI.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SAI_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SAI, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SAI, lAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAC"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SAI, sAC),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sAC"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SAI, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SAI_oms_1[] = { 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SAI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SAI_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* lAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* sAC */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SAI_specs_1 = {
+	sizeof(struct RANAP_SAI),
+	offsetof(struct RANAP_SAI, _asn_ctx),
+	asn_MAP_RANAP_SAI_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_SAI_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SAI = {
+	"RANAP_SAI",
+	"RANAP_SAI",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SAI_tags_1,
+	sizeof(asn_DEF_RANAP_SAI_tags_1)
+		/sizeof(asn_DEF_RANAP_SAI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SAI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SAI_tags_1)
+		/sizeof(asn_DEF_RANAP_SAI_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SAI_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_SAI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SAI.h b/src/ranap/RANAP_SAI.h
new file mode 100644
index 0000000..a540975
--- /dev/null
+++ b/src/ranap/RANAP_SAI.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SAI_H_
+#define	_RANAP_SAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_LAC.h"
+#include "RANAP_SAC.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SAI */
+typedef struct RANAP_SAI {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_LAC_t	 lAC;
+	RANAP_SAC_t	 sAC;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SAI;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SAI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SAPI.c b/src/ranap/RANAP_SAPI.c
new file mode 100644
index 0000000..f93ef22
--- /dev/null
+++ b/src/ranap/RANAP_SAPI.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SAPI.h"
+
+int
+RANAP_SAPI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SAPI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_SAPI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SAPI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SAPI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SAPI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SAPI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SAPI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SAPI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SAPI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SAPI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SAPI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SAPI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SAPI_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_SAPI_value2enum_1[] = {
+	{ 0,	6,	"sapi-0" },
+	{ 1,	6,	"sapi-3" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_SAPI_enum2value_1[] = {
+	0,	/* sapi-0(0) */
+	1	/* sapi-3(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_SAPI_specs_1 = {
+	asn_MAP_RANAP_SAPI_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_SAPI_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SAPI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SAPI = {
+	"RANAP_SAPI",
+	"RANAP_SAPI",
+	RANAP_SAPI_free,
+	RANAP_SAPI_print,
+	RANAP_SAPI_constraint,
+	RANAP_SAPI_decode_ber,
+	RANAP_SAPI_encode_der,
+	RANAP_SAPI_decode_xer,
+	RANAP_SAPI_encode_xer,
+	RANAP_SAPI_decode_uper,
+	RANAP_SAPI_encode_uper,
+	RANAP_SAPI_decode_aper,
+	RANAP_SAPI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SAPI_tags_1,
+	sizeof(asn_DEF_RANAP_SAPI_tags_1)
+		/sizeof(asn_DEF_RANAP_SAPI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SAPI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SAPI_tags_1)
+		/sizeof(asn_DEF_RANAP_SAPI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SAPI_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_SAPI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SAPI.h b/src/ranap/RANAP_SAPI.h
new file mode 100644
index 0000000..51a4996
--- /dev/null
+++ b/src/ranap/RANAP_SAPI.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SAPI_H_
+#define	_RANAP_SAPI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SAPI {
+	RANAP_SAPI_sapi_0	= 0,
+	RANAP_SAPI_sapi_3	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_SAPI;
+
+/* RANAP_SAPI */
+typedef long	 RANAP_SAPI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SAPI;
+asn_struct_free_f RANAP_SAPI_free;
+asn_struct_print_f RANAP_SAPI_print;
+asn_constr_check_f RANAP_SAPI_constraint;
+ber_type_decoder_f RANAP_SAPI_decode_ber;
+der_type_encoder_f RANAP_SAPI_encode_der;
+xer_type_decoder_f RANAP_SAPI_decode_xer;
+xer_type_encoder_f RANAP_SAPI_encode_xer;
+per_type_decoder_f RANAP_SAPI_decode_uper;
+per_type_encoder_f RANAP_SAPI_encode_uper;
+per_type_decoder_f RANAP_SAPI_decode_aper;
+per_type_encoder_f RANAP_SAPI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SAPI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SDU-ErrorRatio.c b/src/ranap/RANAP_SDU-ErrorRatio.c
new file mode 100644
index 0000000..dc9f744
--- /dev/null
+++ b/src/ranap/RANAP_SDU-ErrorRatio.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SDU-ErrorRatio.h"
+
+static int
+memb_mantissa_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 9l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_exponent_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 6l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_mantissa_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  1l,  9l }	/* (1..9) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_exponent_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 3,  3,  1l,  6l }	/* (1..6) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_SDU_ErrorRatio_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SDU_ErrorRatio, mantissa),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_mantissa_constraint_1,
+		&asn_PER_memb_mantissa_constr_2,
+		0,
+		"mantissa"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SDU_ErrorRatio, exponent),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_exponent_constraint_1,
+		&asn_PER_memb_exponent_constr_3,
+		0,
+		"exponent"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SDU_ErrorRatio, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SDU_ErrorRatio_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SDU_ErrorRatio_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SDU_ErrorRatio_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* mantissa */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* exponent */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SDU_ErrorRatio_specs_1 = {
+	sizeof(struct RANAP_SDU_ErrorRatio),
+	offsetof(struct RANAP_SDU_ErrorRatio, _asn_ctx),
+	asn_MAP_RANAP_SDU_ErrorRatio_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_SDU_ErrorRatio_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SDU_ErrorRatio = {
+	"RANAP_SDU-ErrorRatio",
+	"RANAP_SDU-ErrorRatio",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SDU_ErrorRatio_tags_1,
+	sizeof(asn_DEF_RANAP_SDU_ErrorRatio_tags_1)
+		/sizeof(asn_DEF_RANAP_SDU_ErrorRatio_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SDU_ErrorRatio_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SDU_ErrorRatio_tags_1)
+		/sizeof(asn_DEF_RANAP_SDU_ErrorRatio_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SDU_ErrorRatio_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_SDU_ErrorRatio_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SDU-ErrorRatio.h b/src/ranap/RANAP_SDU-ErrorRatio.h
new file mode 100644
index 0000000..752f350
--- /dev/null
+++ b/src/ranap/RANAP_SDU-ErrorRatio.h
@@ -0,0 +1,40 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SDU_ErrorRatio_H_
+#define	_RANAP_SDU_ErrorRatio_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SDU-ErrorRatio */
+typedef struct RANAP_SDU_ErrorRatio {
+	long	 mantissa;
+	long	 exponent;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SDU_ErrorRatio_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SDU_ErrorRatio;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SDU_ErrorRatio_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SDU-FormatInformationParameters.c b/src/ranap/RANAP_SDU-FormatInformationParameters.c
new file mode 100644
index 0000000..181566a
--- /dev/null
+++ b/src/ranap/RANAP_SDU-FormatInformationParameters.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SDU-FormatInformationParameters.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_SDU_FormatInformationParameters_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 6,  6,  1l,  64l }	/* (SIZE(1..64)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_POINTER, 3, offsetof(struct Member, subflowSDU_Size),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SubflowSDU_Size,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"subflowSDU-Size"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, rAB_SubflowCombinationBitRate),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_SubflowCombinationBitRate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAB-SubflowCombinationBitRate"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* subflowSDU-Size */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rAB-SubflowCombinationBitRate */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	3,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SDU_FormatInformationParameters_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_SDU_FormatInformationParameters_specs_1 = {
+	sizeof(struct RANAP_SDU_FormatInformationParameters),
+	offsetof(struct RANAP_SDU_FormatInformationParameters, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SDU_FormatInformationParameters = {
+	"RANAP_SDU-FormatInformationParameters",
+	"RANAP_SDU-FormatInformationParameters",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1,
+	sizeof(asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_SDU_FormatInformationParameters_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SDU_FormatInformationParameters_constr_1,
+	asn_MBR_RANAP_SDU_FormatInformationParameters_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_SDU_FormatInformationParameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SDU-FormatInformationParameters.h b/src/ranap/RANAP_SDU-FormatInformationParameters.h
new file mode 100644
index 0000000..fb49c40
--- /dev/null
+++ b/src/ranap/RANAP_SDU-FormatInformationParameters.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SDU_FormatInformationParameters_H_
+#define	_RANAP_SDU_FormatInformationParameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_SubflowSDU-Size.h"
+#include "RANAP_RAB-SubflowCombinationBitRate.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SDU-FormatInformationParameters */
+typedef struct RANAP_SDU_FormatInformationParameters {
+	A_SEQUENCE_OF(struct Member {
+		RANAP_SubflowSDU_Size_t	*subflowSDU_Size	/* OPTIONAL */;
+		RANAP_RAB_SubflowCombinationBitRate_t	*rAB_SubflowCombinationBitRate	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SDU_FormatInformationParameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SDU_FormatInformationParameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SDU_FormatInformationParameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SDU-Parameters.c b/src/ranap/RANAP_SDU-Parameters.c
new file mode 100644
index 0000000..df97d4b
--- /dev/null
+++ b/src/ranap/RANAP_SDU-Parameters.c
@@ -0,0 +1,155 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SDU-Parameters.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_SDU_Parameters_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 3,  3,  1l,  7l }	/* (SIZE(1..7)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_MemberA_2[] = {
+	{ ATF_POINTER, 1, offsetof(struct MemberA, sDU_ErrorRatio),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SDU_ErrorRatio,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sDU-ErrorRatio"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, residualBitErrorRatio),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ResidualBitErrorRatio,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"residualBitErrorRatio"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, deliveryOfErroneousSDU),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DeliveryOfErroneousSDU,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"deliveryOfErroneousSDU"
+		},
+	{ ATF_POINTER, 2, offsetof(struct MemberA, sDU_FormatInformationParameters),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SDU_FormatInformationParameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sDU-FormatInformationParameters"
+		},
+	{ ATF_POINTER, 1, offsetof(struct MemberA, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_MemberA_oms_2[] = { 0, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_MemberA_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_MemberA_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sDU-ErrorRatio */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* residualBitErrorRatio */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* deliveryOfErroneousSDU */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sDU-FormatInformationParameters */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_MemberA_specs_2 = {
+	sizeof(struct MemberA),
+	offsetof(struct MemberA, _asn_ctx),
+	asn_MAP_MemberA_tag2el_2,
+	5,	/* Count of tags in the map */
+	asn_MAP_MemberA_oms_2,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_MemberA_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_MemberA_tags_2,
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	asn_DEF_MemberA_tags_2,	/* Same as above */
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_MemberA_2,
+	5,	/* Elements count */
+	&asn_SPC_MemberA_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SDU_Parameters_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_MemberA_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SDU_Parameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_SDU_Parameters_specs_1 = {
+	sizeof(struct RANAP_SDU_Parameters),
+	offsetof(struct RANAP_SDU_Parameters, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SDU_Parameters = {
+	"RANAP_SDU-Parameters",
+	"RANAP_SDU-Parameters",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SDU_Parameters_tags_1,
+	sizeof(asn_DEF_RANAP_SDU_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_SDU_Parameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SDU_Parameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SDU_Parameters_tags_1)
+		/sizeof(asn_DEF_RANAP_SDU_Parameters_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SDU_Parameters_constr_1,
+	asn_MBR_RANAP_SDU_Parameters_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_SDU_Parameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SDU-Parameters.h b/src/ranap/RANAP_SDU-Parameters.h
new file mode 100644
index 0000000..0e6d158
--- /dev/null
+++ b/src/ranap/RANAP_SDU-Parameters.h
@@ -0,0 +1,56 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SDU_Parameters_H_
+#define	_RANAP_SDU_Parameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <asn_SEQUENCE_OF.h>
+#include "RANAP_SDU-ErrorRatio.h"
+#include "RANAP_ResidualBitErrorRatio.h"
+#include "RANAP_DeliveryOfErroneousSDU.h"
+#include "RANAP_SDU-FormatInformationParameters.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SDU-Parameters */
+typedef struct RANAP_SDU_Parameters {
+	A_SEQUENCE_OF(struct MemberA {
+		RANAP_SDU_ErrorRatio_t	*sDU_ErrorRatio	/* OPTIONAL */;
+		RANAP_ResidualBitErrorRatio_t	 residualBitErrorRatio;
+		RANAP_DeliveryOfErroneousSDU_t	 deliveryOfErroneousSDU;
+		RANAP_SDU_FormatInformationParameters_t	*sDU_FormatInformationParameters	/* OPTIONAL */;
+		RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SDU_Parameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SDU_Parameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SDU_Parameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SNA-Access-Information.c b/src/ranap/RANAP_SNA-Access-Information.c
new file mode 100644
index 0000000..5ef4f1d
--- /dev/null
+++ b/src/ranap/RANAP_SNA-Access-Information.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SNA-Access-Information.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SNA_Access_Information_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SNA_Access_Information, authorisedPLMNs),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_AuthorisedPLMNs,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"authorisedPLMNs"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SNA_Access_Information, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SNA_Access_Information_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SNA_Access_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SNA_Access_Information_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* authorisedPLMNs */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SNA_Access_Information_specs_1 = {
+	sizeof(struct RANAP_SNA_Access_Information),
+	offsetof(struct RANAP_SNA_Access_Information, _asn_ctx),
+	asn_MAP_RANAP_SNA_Access_Information_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_SNA_Access_Information_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SNA_Access_Information = {
+	"RANAP_SNA-Access-Information",
+	"RANAP_SNA-Access-Information",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SNA_Access_Information_tags_1,
+	sizeof(asn_DEF_RANAP_SNA_Access_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_SNA_Access_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SNA_Access_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SNA_Access_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_SNA_Access_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SNA_Access_Information_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_SNA_Access_Information_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SNA-Access-Information.h b/src/ranap/RANAP_SNA-Access-Information.h
new file mode 100644
index 0000000..3b5d32e
--- /dev/null
+++ b/src/ranap/RANAP_SNA-Access-Information.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SNA_Access_Information_H_
+#define	_RANAP_SNA_Access_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_AuthorisedPLMNs.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SNA-Access-Information */
+typedef struct RANAP_SNA_Access_Information {
+	RANAP_AuthorisedPLMNs_t	 authorisedPLMNs;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SNA_Access_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SNA_Access_Information;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SNA_Access_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SNAC.c b/src/ranap/RANAP_SNAC.c
new file mode 100644
index 0000000..d8003ef
--- /dev/null
+++ b/src/ranap/RANAP_SNAC.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SNAC.h"
+
+int
+RANAP_SNAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SNAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_SNAC_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SNAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SNAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SNAC_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SNAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SNAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SNAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SNAC_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SNAC_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SNAC_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SNAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SNAC_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SNAC_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SNAC = {
+	"RANAP_SNAC",
+	"RANAP_SNAC",
+	RANAP_SNAC_free,
+	RANAP_SNAC_print,
+	RANAP_SNAC_constraint,
+	RANAP_SNAC_decode_ber,
+	RANAP_SNAC_encode_der,
+	RANAP_SNAC_decode_xer,
+	RANAP_SNAC_encode_xer,
+	RANAP_SNAC_decode_uper,
+	RANAP_SNAC_encode_uper,
+	RANAP_SNAC_decode_aper,
+	RANAP_SNAC_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SNAC_tags_1,
+	sizeof(asn_DEF_RANAP_SNAC_tags_1)
+		/sizeof(asn_DEF_RANAP_SNAC_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SNAC_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SNAC_tags_1)
+		/sizeof(asn_DEF_RANAP_SNAC_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SNAC_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SNAC.h b/src/ranap/RANAP_SNAC.h
new file mode 100644
index 0000000..e6e06f9
--- /dev/null
+++ b/src/ranap/RANAP_SNAC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SNAC_H_
+#define	_RANAP_SNAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SNAC */
+typedef long	 RANAP_SNAC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SNAC;
+asn_struct_free_f RANAP_SNAC_free;
+asn_struct_print_f RANAP_SNAC_print;
+asn_constr_check_f RANAP_SNAC_constraint;
+ber_type_decoder_f RANAP_SNAC_decode_ber;
+der_type_encoder_f RANAP_SNAC_encode_der;
+xer_type_decoder_f RANAP_SNAC_decode_xer;
+xer_type_encoder_f RANAP_SNAC_encode_xer;
+per_type_decoder_f RANAP_SNAC_decode_uper;
+per_type_encoder_f RANAP_SNAC_encode_uper;
+per_type_decoder_f RANAP_SNAC_decode_aper;
+per_type_encoder_f RANAP_SNAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SNAC_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRB-ID.c b/src/ranap/RANAP_SRB-ID.c
new file mode 100644
index 0000000..3ea4c37
--- /dev/null
+++ b/src/ranap/RANAP_SRB-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SRB-ID.h"
+
+int
+RANAP_SRB_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 32l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SRB_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_SRB_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SRB_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRB_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SRB_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRB_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SRB_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRB_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SRB_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SRB_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SRB_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SRB_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SRB_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 5,  5,  1l,  32l }	/* (1..32) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRB_ID = {
+	"RANAP_SRB-ID",
+	"RANAP_SRB-ID",
+	RANAP_SRB_ID_free,
+	RANAP_SRB_ID_print,
+	RANAP_SRB_ID_constraint,
+	RANAP_SRB_ID_decode_ber,
+	RANAP_SRB_ID_encode_der,
+	RANAP_SRB_ID_decode_xer,
+	RANAP_SRB_ID_encode_xer,
+	RANAP_SRB_ID_decode_uper,
+	RANAP_SRB_ID_encode_uper,
+	RANAP_SRB_ID_decode_aper,
+	RANAP_SRB_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRB_ID_tags_1,
+	sizeof(asn_DEF_RANAP_SRB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_SRB_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_SRB_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SRB_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SRB-ID.h b/src/ranap/RANAP_SRB-ID.h
new file mode 100644
index 0000000..1b86a32
--- /dev/null
+++ b/src/ranap/RANAP_SRB-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SRB_ID_H_
+#define	_RANAP_SRB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRB-ID */
+typedef long	 RANAP_SRB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRB_ID;
+asn_struct_free_f RANAP_SRB_ID_free;
+asn_struct_print_f RANAP_SRB_ID_print;
+asn_constr_check_f RANAP_SRB_ID_constraint;
+ber_type_decoder_f RANAP_SRB_ID_decode_ber;
+der_type_encoder_f RANAP_SRB_ID_encode_der;
+xer_type_decoder_f RANAP_SRB_ID_decode_xer;
+xer_type_encoder_f RANAP_SRB_ID_encode_xer;
+per_type_decoder_f RANAP_SRB_ID_decode_uper;
+per_type_encoder_f RANAP_SRB_ID_encode_uper;
+per_type_decoder_f RANAP_SRB_ID_decode_aper;
+per_type_encoder_f RANAP_SRB_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRB-TrCH-Mapping.c b/src/ranap/RANAP_SRB-TrCH-Mapping.c
new file mode 100644
index 0000000..0c9319d
--- /dev/null
+++ b/src/ranap/RANAP_SRB-TrCH-Mapping.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SRB-TrCH-Mapping.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_SRB_TrCH_Mapping_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 3,  3,  1l,  8l }	/* (SIZE(1..8)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_SRB_TrCH_Mapping_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_SRB_TrCH_MappingItem,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_SRB_TrCH_Mapping_specs_1 = {
+	sizeof(struct RANAP_SRB_TrCH_Mapping),
+	offsetof(struct RANAP_SRB_TrCH_Mapping, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRB_TrCH_Mapping = {
+	"RANAP_SRB-TrCH-Mapping",
+	"RANAP_SRB-TrCH-Mapping",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1,
+	sizeof(asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1)
+		/sizeof(asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1)
+		/sizeof(asn_DEF_RANAP_SRB_TrCH_Mapping_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SRB_TrCH_Mapping_constr_1,
+	asn_MBR_RANAP_SRB_TrCH_Mapping_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_SRB_TrCH_Mapping_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRB-TrCH-Mapping.h b/src/ranap/RANAP_SRB-TrCH-Mapping.h
new file mode 100644
index 0000000..52ce11b
--- /dev/null
+++ b/src/ranap/RANAP_SRB-TrCH-Mapping.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SRB_TrCH_Mapping_H_
+#define	_RANAP_SRB_TrCH_Mapping_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SRB-TrCH-MappingItem.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRB-TrCH-Mapping */
+typedef struct RANAP_SRB_TrCH_Mapping {
+	A_SEQUENCE_OF(RANAP_SRB_TrCH_MappingItem_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRB_TrCH_Mapping_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRB_TrCH_Mapping;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRB_TrCH_Mapping_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRB-TrCH-MappingItem.c b/src/ranap/RANAP_SRB-TrCH-MappingItem.c
new file mode 100644
index 0000000..80d6994
--- /dev/null
+++ b/src/ranap/RANAP_SRB-TrCH-MappingItem.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SRB-TrCH-MappingItem.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SRB_TrCH_MappingItem_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRB_TrCH_MappingItem, sRB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SRB_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sRB-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRB_TrCH_MappingItem, trCH_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TrCH_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"trCH-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SRB_TrCH_MappingItem, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SRB_TrCH_MappingItem_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRB_TrCH_MappingItem_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sRB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* trCH-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRB_TrCH_MappingItem_specs_1 = {
+	sizeof(struct RANAP_SRB_TrCH_MappingItem),
+	offsetof(struct RANAP_SRB_TrCH_MappingItem, _asn_ctx),
+	asn_MAP_RANAP_SRB_TrCH_MappingItem_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_SRB_TrCH_MappingItem_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRB_TrCH_MappingItem = {
+	"RANAP_SRB-TrCH-MappingItem",
+	"RANAP_SRB-TrCH-MappingItem",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1,
+	sizeof(asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1)
+		/sizeof(asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1)
+		/sizeof(asn_DEF_RANAP_SRB_TrCH_MappingItem_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRB_TrCH_MappingItem_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_SRB_TrCH_MappingItem_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRB-TrCH-MappingItem.h b/src/ranap/RANAP_SRB-TrCH-MappingItem.h
new file mode 100644
index 0000000..48f43e3
--- /dev/null
+++ b/src/ranap/RANAP_SRB-TrCH-MappingItem.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SRB_TrCH_MappingItem_H_
+#define	_RANAP_SRB_TrCH_MappingItem_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SRB-ID.h"
+#include "RANAP_TrCH-ID.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRB-TrCH-MappingItem */
+typedef struct RANAP_SRB_TrCH_MappingItem {
+	RANAP_SRB_ID_t	 sRB_ID;
+	RANAP_TrCH_ID_t	 trCH_ID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRB_TrCH_MappingItem_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRB_TrCH_MappingItem;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRB_TrCH_MappingItem_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRNS-ContextRequest.c b/src/ranap/RANAP_SRNS-ContextRequest.c
new file mode 100644
index 0000000..9531323
--- /dev/null
+++ b/src/ranap/RANAP_SRNS-ContextRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SRNS-ContextRequest.h"
+
+static int
+memb_sRNS_ContextRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_sRNS_ContextRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_sRNS_ContextRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_sRNS_ContextRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_sRNS_ContextRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_sRNS_ContextRequest_ies_specs_2 = {
+	sizeof(struct sRNS_ContextRequest_ies),
+	offsetof(struct sRNS_ContextRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_sRNS_ContextRequest_ies_2 = {
+	"sRNS-ContextRequest-ies",
+	"sRNS-ContextRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_sRNS_ContextRequest_ies_tags_2,
+	sizeof(asn_DEF_sRNS_ContextRequest_ies_tags_2)
+		/sizeof(asn_DEF_sRNS_ContextRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_sRNS_ContextRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_sRNS_ContextRequest_ies_tags_2)
+		/sizeof(asn_DEF_sRNS_ContextRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_sRNS_ContextRequest_ies_constr_2,
+	asn_MBR_sRNS_ContextRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_sRNS_ContextRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SRNS_ContextRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRNS_ContextRequest, sRNS_ContextRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_sRNS_ContextRequest_ies_2,
+		memb_sRNS_ContextRequest_ies_constraint_1,
+		&asn_PER_memb_sRNS_ContextRequest_ies_constr_2,
+		0,
+		"sRNS-ContextRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRNS_ContextRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRNS_ContextRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* sRNS-ContextRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRNS_ContextRequest_specs_1 = {
+	sizeof(struct RANAP_SRNS_ContextRequest),
+	offsetof(struct RANAP_SRNS_ContextRequest, _asn_ctx),
+	asn_MAP_RANAP_SRNS_ContextRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRNS_ContextRequest = {
+	"RANAP_SRNS-ContextRequest",
+	"RANAP_SRNS-ContextRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRNS_ContextRequest_tags_1,
+	sizeof(asn_DEF_RANAP_SRNS_ContextRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_SRNS_ContextRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRNS_ContextRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRNS_ContextRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_SRNS_ContextRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRNS_ContextRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SRNS_ContextRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRNS-ContextRequest.h b/src/ranap/RANAP_SRNS-ContextRequest.h
new file mode 100644
index 0000000..a9e57ca
--- /dev/null
+++ b/src/ranap/RANAP_SRNS-ContextRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SRNS_ContextRequest_H_
+#define	_RANAP_SRNS_ContextRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRNS-ContextRequest */
+typedef struct RANAP_SRNS_ContextRequest {
+	struct sRNS_ContextRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} sRNS_ContextRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRNS_ContextRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRNS_ContextRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRNS_ContextRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRNS-ContextResponse.c b/src/ranap/RANAP_SRNS-ContextResponse.c
new file mode 100644
index 0000000..601b5ad
--- /dev/null
+++ b/src/ranap/RANAP_SRNS-ContextResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SRNS-ContextResponse.h"
+
+static int
+memb_sRNS_ContextResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_sRNS_ContextResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_sRNS_ContextResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_sRNS_ContextResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_sRNS_ContextResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_sRNS_ContextResponse_ies_specs_2 = {
+	sizeof(struct sRNS_ContextResponse_ies),
+	offsetof(struct sRNS_ContextResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_sRNS_ContextResponse_ies_2 = {
+	"sRNS-ContextResponse-ies",
+	"sRNS-ContextResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_sRNS_ContextResponse_ies_tags_2,
+	sizeof(asn_DEF_sRNS_ContextResponse_ies_tags_2)
+		/sizeof(asn_DEF_sRNS_ContextResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_sRNS_ContextResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_sRNS_ContextResponse_ies_tags_2)
+		/sizeof(asn_DEF_sRNS_ContextResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_sRNS_ContextResponse_ies_constr_2,
+	asn_MBR_sRNS_ContextResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_sRNS_ContextResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SRNS_ContextResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRNS_ContextResponse, sRNS_ContextResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_sRNS_ContextResponse_ies_2,
+		memb_sRNS_ContextResponse_ies_constraint_1,
+		&asn_PER_memb_sRNS_ContextResponse_ies_constr_2,
+		0,
+		"sRNS-ContextResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRNS_ContextResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRNS_ContextResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* sRNS-ContextResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRNS_ContextResponse_specs_1 = {
+	sizeof(struct RANAP_SRNS_ContextResponse),
+	offsetof(struct RANAP_SRNS_ContextResponse, _asn_ctx),
+	asn_MAP_RANAP_SRNS_ContextResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRNS_ContextResponse = {
+	"RANAP_SRNS-ContextResponse",
+	"RANAP_SRNS-ContextResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRNS_ContextResponse_tags_1,
+	sizeof(asn_DEF_RANAP_SRNS_ContextResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_SRNS_ContextResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRNS_ContextResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRNS_ContextResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_SRNS_ContextResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRNS_ContextResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SRNS_ContextResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRNS-ContextResponse.h b/src/ranap/RANAP_SRNS-ContextResponse.h
new file mode 100644
index 0000000..53e210a
--- /dev/null
+++ b/src/ranap/RANAP_SRNS-ContextResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SRNS_ContextResponse_H_
+#define	_RANAP_SRNS_ContextResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRNS-ContextResponse */
+typedef struct RANAP_SRNS_ContextResponse {
+	struct sRNS_ContextResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} sRNS_ContextResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRNS_ContextResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRNS_ContextResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRNS_ContextResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRNS-DataForwardCommand.c b/src/ranap/RANAP_SRNS-DataForwardCommand.c
new file mode 100644
index 0000000..4b3800d
--- /dev/null
+++ b/src/ranap/RANAP_SRNS-DataForwardCommand.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SRNS-DataForwardCommand.h"
+
+static int
+memb_sRNS_DataForwardCommand_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_sRNS_DataForwardCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_sRNS_DataForwardCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_sRNS_DataForwardCommand_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_sRNS_DataForwardCommand_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_sRNS_DataForwardCommand_ies_specs_2 = {
+	sizeof(struct sRNS_DataForwardCommand_ies),
+	offsetof(struct sRNS_DataForwardCommand_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_sRNS_DataForwardCommand_ies_2 = {
+	"sRNS-DataForwardCommand-ies",
+	"sRNS-DataForwardCommand-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_sRNS_DataForwardCommand_ies_tags_2,
+	sizeof(asn_DEF_sRNS_DataForwardCommand_ies_tags_2)
+		/sizeof(asn_DEF_sRNS_DataForwardCommand_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_sRNS_DataForwardCommand_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_sRNS_DataForwardCommand_ies_tags_2)
+		/sizeof(asn_DEF_sRNS_DataForwardCommand_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_sRNS_DataForwardCommand_ies_constr_2,
+	asn_MBR_sRNS_DataForwardCommand_ies_2,
+	1,	/* Single element */
+	&asn_SPC_sRNS_DataForwardCommand_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SRNS_DataForwardCommand_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRNS_DataForwardCommand, sRNS_DataForwardCommand_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_sRNS_DataForwardCommand_ies_2,
+		memb_sRNS_DataForwardCommand_ies_constraint_1,
+		&asn_PER_memb_sRNS_DataForwardCommand_ies_constr_2,
+		0,
+		"sRNS-DataForwardCommand-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRNS_DataForwardCommand_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* sRNS-DataForwardCommand-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRNS_DataForwardCommand_specs_1 = {
+	sizeof(struct RANAP_SRNS_DataForwardCommand),
+	offsetof(struct RANAP_SRNS_DataForwardCommand, _asn_ctx),
+	asn_MAP_RANAP_SRNS_DataForwardCommand_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRNS_DataForwardCommand = {
+	"RANAP_SRNS-DataForwardCommand",
+	"RANAP_SRNS-DataForwardCommand",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1,
+	sizeof(asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_SRNS_DataForwardCommand_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRNS_DataForwardCommand_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SRNS_DataForwardCommand_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRNS-DataForwardCommand.h b/src/ranap/RANAP_SRNS-DataForwardCommand.h
new file mode 100644
index 0000000..14a9f49
--- /dev/null
+++ b/src/ranap/RANAP_SRNS-DataForwardCommand.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SRNS_DataForwardCommand_H_
+#define	_RANAP_SRNS_DataForwardCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRNS-DataForwardCommand */
+typedef struct RANAP_SRNS_DataForwardCommand {
+	struct sRNS_DataForwardCommand_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} sRNS_DataForwardCommand_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRNS_DataForwardCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRNS_DataForwardCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRNS_DataForwardCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRVCC-CSKeysRequest.c b/src/ranap/RANAP_SRVCC-CSKeysRequest.c
new file mode 100644
index 0000000..28361bb
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-CSKeysRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SRVCC-CSKeysRequest.h"
+
+static int
+memb_sRVCC_CSKeysRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_sRVCC_CSKeysRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_sRVCC_CSKeysRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_sRVCC_CSKeysRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_sRVCC_CSKeysRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_sRVCC_CSKeysRequest_ies_specs_2 = {
+	sizeof(struct sRVCC_CSKeysRequest_ies),
+	offsetof(struct sRVCC_CSKeysRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_sRVCC_CSKeysRequest_ies_2 = {
+	"sRVCC-CSKeysRequest-ies",
+	"sRVCC-CSKeysRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_sRVCC_CSKeysRequest_ies_tags_2,
+	sizeof(asn_DEF_sRVCC_CSKeysRequest_ies_tags_2)
+		/sizeof(asn_DEF_sRVCC_CSKeysRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_sRVCC_CSKeysRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_sRVCC_CSKeysRequest_ies_tags_2)
+		/sizeof(asn_DEF_sRVCC_CSKeysRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_sRVCC_CSKeysRequest_ies_constr_2,
+	asn_MBR_sRVCC_CSKeysRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_sRVCC_CSKeysRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SRVCC_CSKeysRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRVCC_CSKeysRequest, sRVCC_CSKeysRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_sRVCC_CSKeysRequest_ies_2,
+		memb_sRVCC_CSKeysRequest_ies_constraint_1,
+		&asn_PER_memb_sRVCC_CSKeysRequest_ies_constr_2,
+		0,
+		"sRVCC-CSKeysRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRVCC_CSKeysRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* sRVCC-CSKeysRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRVCC_CSKeysRequest_specs_1 = {
+	sizeof(struct RANAP_SRVCC_CSKeysRequest),
+	offsetof(struct RANAP_SRVCC_CSKeysRequest, _asn_ctx),
+	asn_MAP_RANAP_SRVCC_CSKeysRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_CSKeysRequest = {
+	"RANAP_SRVCC-CSKeysRequest",
+	"RANAP_SRVCC-CSKeysRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1,
+	sizeof(asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_CSKeysRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRVCC_CSKeysRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SRVCC_CSKeysRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRVCC-CSKeysRequest.h b/src/ranap/RANAP_SRVCC-CSKeysRequest.h
new file mode 100644
index 0000000..aa64d72
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-CSKeysRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SRVCC_CSKeysRequest_H_
+#define	_RANAP_SRVCC_CSKeysRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRVCC-CSKeysRequest */
+typedef struct RANAP_SRVCC_CSKeysRequest {
+	struct sRVCC_CSKeysRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} sRVCC_CSKeysRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRVCC_CSKeysRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_CSKeysRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRVCC_CSKeysRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRVCC-CSKeysResponse.c b/src/ranap/RANAP_SRVCC-CSKeysResponse.c
new file mode 100644
index 0000000..89ec1b3
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-CSKeysResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SRVCC-CSKeysResponse.h"
+
+static int
+memb_sRVCC_CSKeysResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_sRVCC_CSKeysResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_sRVCC_CSKeysResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_sRVCC_CSKeysResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_sRVCC_CSKeysResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_sRVCC_CSKeysResponse_ies_specs_2 = {
+	sizeof(struct sRVCC_CSKeysResponse_ies),
+	offsetof(struct sRVCC_CSKeysResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_sRVCC_CSKeysResponse_ies_2 = {
+	"sRVCC-CSKeysResponse-ies",
+	"sRVCC-CSKeysResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_sRVCC_CSKeysResponse_ies_tags_2,
+	sizeof(asn_DEF_sRVCC_CSKeysResponse_ies_tags_2)
+		/sizeof(asn_DEF_sRVCC_CSKeysResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_sRVCC_CSKeysResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_sRVCC_CSKeysResponse_ies_tags_2)
+		/sizeof(asn_DEF_sRVCC_CSKeysResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_sRVCC_CSKeysResponse_ies_constr_2,
+	asn_MBR_sRVCC_CSKeysResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_sRVCC_CSKeysResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SRVCC_CSKeysResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRVCC_CSKeysResponse, sRVCC_CSKeysResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_sRVCC_CSKeysResponse_ies_2,
+		memb_sRVCC_CSKeysResponse_ies_constraint_1,
+		&asn_PER_memb_sRVCC_CSKeysResponse_ies_constr_2,
+		0,
+		"sRVCC-CSKeysResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRVCC_CSKeysResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* sRVCC-CSKeysResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRVCC_CSKeysResponse_specs_1 = {
+	sizeof(struct RANAP_SRVCC_CSKeysResponse),
+	offsetof(struct RANAP_SRVCC_CSKeysResponse, _asn_ctx),
+	asn_MAP_RANAP_SRVCC_CSKeysResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_CSKeysResponse = {
+	"RANAP_SRVCC-CSKeysResponse",
+	"RANAP_SRVCC-CSKeysResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1,
+	sizeof(asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_CSKeysResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRVCC_CSKeysResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SRVCC_CSKeysResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRVCC-CSKeysResponse.h b/src/ranap/RANAP_SRVCC-CSKeysResponse.h
new file mode 100644
index 0000000..b782866
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-CSKeysResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SRVCC_CSKeysResponse_H_
+#define	_RANAP_SRVCC_CSKeysResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRVCC-CSKeysResponse */
+typedef struct RANAP_SRVCC_CSKeysResponse {
+	struct sRVCC_CSKeysResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} sRVCC_CSKeysResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRVCC_CSKeysResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_CSKeysResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRVCC_CSKeysResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRVCC-HO-Indication.c b/src/ranap/RANAP_SRVCC-HO-Indication.c
new file mode 100644
index 0000000..7a515c9
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-HO-Indication.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SRVCC-HO-Indication.h"
+
+int
+RANAP_SRVCC_HO_Indication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_SRVCC_HO_Indication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SRVCC_HO_Indication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_HO_Indication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_HO_Indication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_HO_Indication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_HO_Indication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_HO_Indication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_HO_Indication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_HO_Indication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_HO_Indication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SRVCC_HO_Indication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SRVCC_HO_Indication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_SRVCC_HO_Indication_value2enum_1[] = {
+	{ 0,	9,	"ps-and-cs" },
+	{ 1,	7,	"cs-only" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_SRVCC_HO_Indication_enum2value_1[] = {
+	1,	/* cs-only(1) */
+	0	/* ps-and-cs(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_SRVCC_HO_Indication_specs_1 = {
+	asn_MAP_RANAP_SRVCC_HO_Indication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_SRVCC_HO_Indication_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRVCC_HO_Indication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_HO_Indication = {
+	"RANAP_SRVCC-HO-Indication",
+	"RANAP_SRVCC-HO-Indication",
+	RANAP_SRVCC_HO_Indication_free,
+	RANAP_SRVCC_HO_Indication_print,
+	RANAP_SRVCC_HO_Indication_constraint,
+	RANAP_SRVCC_HO_Indication_decode_ber,
+	RANAP_SRVCC_HO_Indication_encode_der,
+	RANAP_SRVCC_HO_Indication_decode_xer,
+	RANAP_SRVCC_HO_Indication_encode_xer,
+	RANAP_SRVCC_HO_Indication_decode_uper,
+	RANAP_SRVCC_HO_Indication_encode_uper,
+	RANAP_SRVCC_HO_Indication_decode_aper,
+	RANAP_SRVCC_HO_Indication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRVCC_HO_Indication_tags_1,
+	sizeof(asn_DEF_RANAP_SRVCC_HO_Indication_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_HO_Indication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRVCC_HO_Indication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRVCC_HO_Indication_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_HO_Indication_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SRVCC_HO_Indication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_SRVCC_HO_Indication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRVCC-HO-Indication.h b/src/ranap/RANAP_SRVCC-HO-Indication.h
new file mode 100644
index 0000000..36caa2d
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-HO-Indication.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SRVCC_HO_Indication_H_
+#define	_RANAP_SRVCC_HO_Indication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SRVCC_HO_Indication {
+	RANAP_SRVCC_HO_Indication_ps_and_cs	= 0,
+	RANAP_SRVCC_HO_Indication_cs_only	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_SRVCC_HO_Indication;
+
+/* RANAP_SRVCC-HO-Indication */
+typedef long	 RANAP_SRVCC_HO_Indication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_HO_Indication;
+asn_struct_free_f RANAP_SRVCC_HO_Indication_free;
+asn_struct_print_f RANAP_SRVCC_HO_Indication_print;
+asn_constr_check_f RANAP_SRVCC_HO_Indication_constraint;
+ber_type_decoder_f RANAP_SRVCC_HO_Indication_decode_ber;
+der_type_encoder_f RANAP_SRVCC_HO_Indication_encode_der;
+xer_type_decoder_f RANAP_SRVCC_HO_Indication_decode_xer;
+xer_type_encoder_f RANAP_SRVCC_HO_Indication_encode_xer;
+per_type_decoder_f RANAP_SRVCC_HO_Indication_decode_uper;
+per_type_encoder_f RANAP_SRVCC_HO_Indication_encode_uper;
+per_type_decoder_f RANAP_SRVCC_HO_Indication_decode_aper;
+per_type_encoder_f RANAP_SRVCC_HO_Indication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRVCC_HO_Indication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRVCC-Information.c b/src/ranap/RANAP_SRVCC-Information.c
new file mode 100644
index 0000000..c84ac5a
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-Information.c
@@ -0,0 +1,109 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SRVCC-Information.h"
+
+static int
+memb_nonce_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_nonce_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  128l,  128l }	/* (SIZE(128..128)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_SRVCC_Information_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SRVCC_Information, nonce),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_BIT_STRING,
+		memb_nonce_constraint_1,
+		&asn_PER_memb_nonce_constr_2,
+		0,
+		"nonce"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SRVCC_Information, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SRVCC_Information_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SRVCC_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SRVCC_Information_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* nonce */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SRVCC_Information_specs_1 = {
+	sizeof(struct RANAP_SRVCC_Information),
+	offsetof(struct RANAP_SRVCC_Information, _asn_ctx),
+	asn_MAP_RANAP_SRVCC_Information_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_SRVCC_Information_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_Information = {
+	"RANAP_SRVCC-Information",
+	"RANAP_SRVCC-Information",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRVCC_Information_tags_1,
+	sizeof(asn_DEF_RANAP_SRVCC_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRVCC_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRVCC_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SRVCC_Information_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_SRVCC_Information_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRVCC-Information.h b/src/ranap/RANAP_SRVCC-Information.h
new file mode 100644
index 0000000..c5022b7
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-Information.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SRVCC_Information_H_
+#define	_RANAP_SRVCC_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SRVCC-Information */
+typedef struct RANAP_SRVCC_Information {
+	BIT_STRING_t	 nonce;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SRVCC_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_Information;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRVCC_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SRVCC-Operation-Possible.c b/src/ranap/RANAP_SRVCC-Operation-Possible.c
new file mode 100644
index 0000000..cf46149
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-Operation-Possible.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SRVCC-Operation-Possible.h"
+
+int
+RANAP_SRVCC_Operation_Possible_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_SRVCC_Operation_Possible_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SRVCC_Operation_Possible_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_Operation_Possible_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_Operation_Possible_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_Operation_Possible_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_Operation_Possible_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_Operation_Possible_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_Operation_Possible_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SRVCC_Operation_Possible_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SRVCC_Operation_Possible_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SRVCC_Operation_Possible_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SRVCC_Operation_Possible_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_SRVCC_Operation_Possible_value2enum_1[] = {
+	{ 0,	14,	"srvcc-possible" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_SRVCC_Operation_Possible_enum2value_1[] = {
+	0	/* srvcc-possible(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_SRVCC_Operation_Possible_specs_1 = {
+	asn_MAP_RANAP_SRVCC_Operation_Possible_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_SRVCC_Operation_Possible_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_Operation_Possible = {
+	"RANAP_SRVCC-Operation-Possible",
+	"RANAP_SRVCC-Operation-Possible",
+	RANAP_SRVCC_Operation_Possible_free,
+	RANAP_SRVCC_Operation_Possible_print,
+	RANAP_SRVCC_Operation_Possible_constraint,
+	RANAP_SRVCC_Operation_Possible_decode_ber,
+	RANAP_SRVCC_Operation_Possible_encode_der,
+	RANAP_SRVCC_Operation_Possible_decode_xer,
+	RANAP_SRVCC_Operation_Possible_encode_xer,
+	RANAP_SRVCC_Operation_Possible_decode_uper,
+	RANAP_SRVCC_Operation_Possible_encode_uper,
+	RANAP_SRVCC_Operation_Possible_decode_aper,
+	RANAP_SRVCC_Operation_Possible_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1,
+	sizeof(asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1)
+		/sizeof(asn_DEF_RANAP_SRVCC_Operation_Possible_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SRVCC_Operation_Possible_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_SRVCC_Operation_Possible_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SRVCC-Operation-Possible.h b/src/ranap/RANAP_SRVCC-Operation-Possible.h
new file mode 100644
index 0000000..c839c8b
--- /dev/null
+++ b/src/ranap/RANAP_SRVCC-Operation-Possible.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SRVCC_Operation_Possible_H_
+#define	_RANAP_SRVCC_Operation_Possible_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SRVCC_Operation_Possible {
+	RANAP_SRVCC_Operation_Possible_srvcc_possible	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_SRVCC_Operation_Possible;
+
+/* RANAP_SRVCC-Operation-Possible */
+typedef long	 RANAP_SRVCC_Operation_Possible_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SRVCC_Operation_Possible;
+asn_struct_free_f RANAP_SRVCC_Operation_Possible_free;
+asn_struct_print_f RANAP_SRVCC_Operation_Possible_print;
+asn_constr_check_f RANAP_SRVCC_Operation_Possible_constraint;
+ber_type_decoder_f RANAP_SRVCC_Operation_Possible_decode_ber;
+der_type_encoder_f RANAP_SRVCC_Operation_Possible_encode_der;
+xer_type_decoder_f RANAP_SRVCC_Operation_Possible_decode_xer;
+xer_type_encoder_f RANAP_SRVCC_Operation_Possible_encode_xer;
+per_type_decoder_f RANAP_SRVCC_Operation_Possible_decode_uper;
+per_type_encoder_f RANAP_SRVCC_Operation_Possible_encode_uper;
+per_type_decoder_f RANAP_SRVCC_Operation_Possible_decode_aper;
+per_type_encoder_f RANAP_SRVCC_Operation_Possible_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SRVCC_Operation_Possible_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SecurityModeCommand.c b/src/ranap/RANAP_SecurityModeCommand.c
new file mode 100644
index 0000000..858ad7e
--- /dev/null
+++ b/src/ranap/RANAP_SecurityModeCommand.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SecurityModeCommand.h"
+
+static int
+memb_securityModeCommand_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_securityModeCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_securityModeCommand_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_securityModeCommand_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_securityModeCommand_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_securityModeCommand_ies_specs_2 = {
+	sizeof(struct securityModeCommand_ies),
+	offsetof(struct securityModeCommand_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_securityModeCommand_ies_2 = {
+	"securityModeCommand-ies",
+	"securityModeCommand-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_securityModeCommand_ies_tags_2,
+	sizeof(asn_DEF_securityModeCommand_ies_tags_2)
+		/sizeof(asn_DEF_securityModeCommand_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_securityModeCommand_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_securityModeCommand_ies_tags_2)
+		/sizeof(asn_DEF_securityModeCommand_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_securityModeCommand_ies_constr_2,
+	asn_MBR_securityModeCommand_ies_2,
+	1,	/* Single element */
+	&asn_SPC_securityModeCommand_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SecurityModeCommand_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SecurityModeCommand, securityModeCommand_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_securityModeCommand_ies_2,
+		memb_securityModeCommand_ies_constraint_1,
+		&asn_PER_memb_securityModeCommand_ies_constr_2,
+		0,
+		"securityModeCommand-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SecurityModeCommand_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SecurityModeCommand_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* securityModeCommand-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SecurityModeCommand_specs_1 = {
+	sizeof(struct RANAP_SecurityModeCommand),
+	offsetof(struct RANAP_SecurityModeCommand, _asn_ctx),
+	asn_MAP_RANAP_SecurityModeCommand_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SecurityModeCommand = {
+	"RANAP_SecurityModeCommand",
+	"RANAP_SecurityModeCommand",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SecurityModeCommand_tags_1,
+	sizeof(asn_DEF_RANAP_SecurityModeCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_SecurityModeCommand_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SecurityModeCommand_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SecurityModeCommand_tags_1)
+		/sizeof(asn_DEF_RANAP_SecurityModeCommand_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SecurityModeCommand_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SecurityModeCommand_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SecurityModeCommand.h b/src/ranap/RANAP_SecurityModeCommand.h
new file mode 100644
index 0000000..2784c19
--- /dev/null
+++ b/src/ranap/RANAP_SecurityModeCommand.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SecurityModeCommand_H_
+#define	_RANAP_SecurityModeCommand_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SecurityModeCommand */
+typedef struct RANAP_SecurityModeCommand {
+	struct securityModeCommand_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} securityModeCommand_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SecurityModeCommand_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SecurityModeCommand;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SecurityModeCommand_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SecurityModeComplete.c b/src/ranap/RANAP_SecurityModeComplete.c
new file mode 100644
index 0000000..1fab6c5
--- /dev/null
+++ b/src/ranap/RANAP_SecurityModeComplete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SecurityModeComplete.h"
+
+static int
+memb_securityModeComplete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_securityModeComplete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_securityModeComplete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_securityModeComplete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_securityModeComplete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_securityModeComplete_ies_specs_2 = {
+	sizeof(struct securityModeComplete_ies),
+	offsetof(struct securityModeComplete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_securityModeComplete_ies_2 = {
+	"securityModeComplete-ies",
+	"securityModeComplete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_securityModeComplete_ies_tags_2,
+	sizeof(asn_DEF_securityModeComplete_ies_tags_2)
+		/sizeof(asn_DEF_securityModeComplete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_securityModeComplete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_securityModeComplete_ies_tags_2)
+		/sizeof(asn_DEF_securityModeComplete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_securityModeComplete_ies_constr_2,
+	asn_MBR_securityModeComplete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_securityModeComplete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SecurityModeComplete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SecurityModeComplete, securityModeComplete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_securityModeComplete_ies_2,
+		memb_securityModeComplete_ies_constraint_1,
+		&asn_PER_memb_securityModeComplete_ies_constr_2,
+		0,
+		"securityModeComplete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SecurityModeComplete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SecurityModeComplete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* securityModeComplete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SecurityModeComplete_specs_1 = {
+	sizeof(struct RANAP_SecurityModeComplete),
+	offsetof(struct RANAP_SecurityModeComplete, _asn_ctx),
+	asn_MAP_RANAP_SecurityModeComplete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SecurityModeComplete = {
+	"RANAP_SecurityModeComplete",
+	"RANAP_SecurityModeComplete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SecurityModeComplete_tags_1,
+	sizeof(asn_DEF_RANAP_SecurityModeComplete_tags_1)
+		/sizeof(asn_DEF_RANAP_SecurityModeComplete_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SecurityModeComplete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SecurityModeComplete_tags_1)
+		/sizeof(asn_DEF_RANAP_SecurityModeComplete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SecurityModeComplete_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SecurityModeComplete_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SecurityModeComplete.h b/src/ranap/RANAP_SecurityModeComplete.h
new file mode 100644
index 0000000..6ce0962
--- /dev/null
+++ b/src/ranap/RANAP_SecurityModeComplete.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SecurityModeComplete_H_
+#define	_RANAP_SecurityModeComplete_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SecurityModeComplete */
+typedef struct RANAP_SecurityModeComplete {
+	struct securityModeComplete_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} securityModeComplete_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SecurityModeComplete_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SecurityModeComplete;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SecurityModeComplete_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SecurityModeReject.c b/src/ranap/RANAP_SecurityModeReject.c
new file mode 100644
index 0000000..ca8de7a
--- /dev/null
+++ b/src/ranap/RANAP_SecurityModeReject.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SecurityModeReject.h"
+
+static int
+memb_securityModeReject_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_securityModeReject_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_securityModeReject_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_securityModeReject_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_securityModeReject_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_securityModeReject_ies_specs_2 = {
+	sizeof(struct securityModeReject_ies),
+	offsetof(struct securityModeReject_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_securityModeReject_ies_2 = {
+	"securityModeReject-ies",
+	"securityModeReject-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_securityModeReject_ies_tags_2,
+	sizeof(asn_DEF_securityModeReject_ies_tags_2)
+		/sizeof(asn_DEF_securityModeReject_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_securityModeReject_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_securityModeReject_ies_tags_2)
+		/sizeof(asn_DEF_securityModeReject_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_securityModeReject_ies_constr_2,
+	asn_MBR_securityModeReject_ies_2,
+	1,	/* Single element */
+	&asn_SPC_securityModeReject_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_SecurityModeReject_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SecurityModeReject, securityModeReject_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_securityModeReject_ies_2,
+		memb_securityModeReject_ies_constraint_1,
+		&asn_PER_memb_securityModeReject_ies_constr_2,
+		0,
+		"securityModeReject-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SecurityModeReject_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SecurityModeReject_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* securityModeReject-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SecurityModeReject_specs_1 = {
+	sizeof(struct RANAP_SecurityModeReject),
+	offsetof(struct RANAP_SecurityModeReject, _asn_ctx),
+	asn_MAP_RANAP_SecurityModeReject_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SecurityModeReject = {
+	"RANAP_SecurityModeReject",
+	"RANAP_SecurityModeReject",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SecurityModeReject_tags_1,
+	sizeof(asn_DEF_RANAP_SecurityModeReject_tags_1)
+		/sizeof(asn_DEF_RANAP_SecurityModeReject_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SecurityModeReject_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SecurityModeReject_tags_1)
+		/sizeof(asn_DEF_RANAP_SecurityModeReject_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SecurityModeReject_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_SecurityModeReject_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SecurityModeReject.h b/src/ranap/RANAP_SecurityModeReject.h
new file mode 100644
index 0000000..0c7105d
--- /dev/null
+++ b/src/ranap/RANAP_SecurityModeReject.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SecurityModeReject_H_
+#define	_RANAP_SecurityModeReject_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SecurityModeReject */
+typedef struct RANAP_SecurityModeReject {
+	struct securityModeReject_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} securityModeReject_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SecurityModeReject_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SecurityModeReject;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SecurityModeReject_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Service-Handover.c b/src/ranap/RANAP_Service-Handover.c
new file mode 100644
index 0000000..4ab9c4d
--- /dev/null
+++ b/src/ranap/RANAP_Service-Handover.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Service-Handover.h"
+
+int
+RANAP_Service_Handover_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Service_Handover_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Service_Handover_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Service_Handover_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Service_Handover_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Service_Handover_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Service_Handover_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Service_Handover_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Service_Handover_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Service_Handover_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Service_Handover_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Service_Handover_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Service_Handover_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Service_Handover_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Service_Handover_value2enum_1[] = {
+	{ 0,	35,	"handover-to-GSM-should-be-performed" },
+	{ 1,	39,	"handover-to-GSM-should-not-be-performed" },
+	{ 2,	38,	"handover-to-GSM-shall-not-be-performed" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Service_Handover_enum2value_1[] = {
+	2,	/* handover-to-GSM-shall-not-be-performed(2) */
+	0,	/* handover-to-GSM-should-be-performed(0) */
+	1	/* handover-to-GSM-should-not-be-performed(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Service_Handover_specs_1 = {
+	asn_MAP_RANAP_Service_Handover_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Service_Handover_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Service_Handover_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Service_Handover = {
+	"RANAP_Service-Handover",
+	"RANAP_Service-Handover",
+	RANAP_Service_Handover_free,
+	RANAP_Service_Handover_print,
+	RANAP_Service_Handover_constraint,
+	RANAP_Service_Handover_decode_ber,
+	RANAP_Service_Handover_encode_der,
+	RANAP_Service_Handover_decode_xer,
+	RANAP_Service_Handover_encode_xer,
+	RANAP_Service_Handover_decode_uper,
+	RANAP_Service_Handover_encode_uper,
+	RANAP_Service_Handover_decode_aper,
+	RANAP_Service_Handover_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Service_Handover_tags_1,
+	sizeof(asn_DEF_RANAP_Service_Handover_tags_1)
+		/sizeof(asn_DEF_RANAP_Service_Handover_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Service_Handover_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Service_Handover_tags_1)
+		/sizeof(asn_DEF_RANAP_Service_Handover_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Service_Handover_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Service_Handover_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Service-Handover.h b/src/ranap/RANAP_Service-Handover.h
new file mode 100644
index 0000000..1d54b1b
--- /dev/null
+++ b/src/ranap/RANAP_Service-Handover.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Service_Handover_H_
+#define	_RANAP_Service_Handover_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Service_Handover {
+	RANAP_Service_Handover_handover_to_GSM_should_be_performed	= 0,
+	RANAP_Service_Handover_handover_to_GSM_should_not_be_performed	= 1,
+	RANAP_Service_Handover_handover_to_GSM_shall_not_be_performed	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Service_Handover;
+
+/* RANAP_Service-Handover */
+typedef long	 RANAP_Service_Handover_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Service_Handover;
+asn_struct_free_f RANAP_Service_Handover_free;
+asn_struct_print_f RANAP_Service_Handover_print;
+asn_constr_check_f RANAP_Service_Handover_constraint;
+ber_type_decoder_f RANAP_Service_Handover_decode_ber;
+der_type_encoder_f RANAP_Service_Handover_encode_der;
+xer_type_decoder_f RANAP_Service_Handover_decode_xer;
+xer_type_encoder_f RANAP_Service_Handover_encode_xer;
+per_type_decoder_f RANAP_Service_Handover_decode_uper;
+per_type_encoder_f RANAP_Service_Handover_encode_uper;
+per_type_decoder_f RANAP_Service_Handover_decode_aper;
+per_type_encoder_f RANAP_Service_Handover_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Service_Handover_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Session-Re-establishment-Indicator.c b/src/ranap/RANAP_Session-Re-establishment-Indicator.c
new file mode 100644
index 0000000..c2cdb10
--- /dev/null
+++ b/src/ranap/RANAP_Session-Re-establishment-Indicator.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Session-Re-establishment-Indicator.h"
+
+int
+RANAP_Session_Re_establishment_Indicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_Session_Re_establishment_Indicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Session_Re_establishment_Indicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Session_Re_establishment_Indicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Session_Re_establishment_Indicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Session_Re_establishment_Indicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Session_Re_establishment_Indicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Session_Re_establishment_Indicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Session_Re_establishment_Indicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Session_Re_establishment_Indicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Session_Re_establishment_Indicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Session_Re_establishment_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Session_Re_establishment_Indicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_Session_Re_establishment_Indicator_value2enum_1[] = {
+	{ 0,	4,	"true" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_Session_Re_establishment_Indicator_enum2value_1[] = {
+	0	/* true(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_Session_Re_establishment_Indicator_specs_1 = {
+	asn_MAP_RANAP_Session_Re_establishment_Indicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_Session_Re_establishment_Indicator_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Session_Re_establishment_Indicator = {
+	"RANAP_Session-Re-establishment-Indicator",
+	"RANAP_Session-Re-establishment-Indicator",
+	RANAP_Session_Re_establishment_Indicator_free,
+	RANAP_Session_Re_establishment_Indicator_print,
+	RANAP_Session_Re_establishment_Indicator_constraint,
+	RANAP_Session_Re_establishment_Indicator_decode_ber,
+	RANAP_Session_Re_establishment_Indicator_encode_der,
+	RANAP_Session_Re_establishment_Indicator_decode_xer,
+	RANAP_Session_Re_establishment_Indicator_encode_xer,
+	RANAP_Session_Re_establishment_Indicator_decode_uper,
+	RANAP_Session_Re_establishment_Indicator_encode_uper,
+	RANAP_Session_Re_establishment_Indicator_decode_aper,
+	RANAP_Session_Re_establishment_Indicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1,
+	sizeof(asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1)
+		/sizeof(asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1)
+		/sizeof(asn_DEF_RANAP_Session_Re_establishment_Indicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Session_Re_establishment_Indicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_Session_Re_establishment_Indicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Session-Re-establishment-Indicator.h b/src/ranap/RANAP_Session-Re-establishment-Indicator.h
new file mode 100644
index 0000000..ea9b931
--- /dev/null
+++ b/src/ranap/RANAP_Session-Re-establishment-Indicator.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Session_Re_establishment_Indicator_H_
+#define	_RANAP_Session_Re_establishment_Indicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_Session_Re_establishment_Indicator {
+	RANAP_Session_Re_establishment_Indicator_true	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_Session_Re_establishment_Indicator;
+
+/* RANAP_Session-Re-establishment-Indicator */
+typedef long	 RANAP_Session_Re_establishment_Indicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Session_Re_establishment_Indicator;
+asn_struct_free_f RANAP_Session_Re_establishment_Indicator_free;
+asn_struct_print_f RANAP_Session_Re_establishment_Indicator_print;
+asn_constr_check_f RANAP_Session_Re_establishment_Indicator_constraint;
+ber_type_decoder_f RANAP_Session_Re_establishment_Indicator_decode_ber;
+der_type_encoder_f RANAP_Session_Re_establishment_Indicator_encode_der;
+xer_type_decoder_f RANAP_Session_Re_establishment_Indicator_decode_xer;
+xer_type_encoder_f RANAP_Session_Re_establishment_Indicator_encode_xer;
+per_type_decoder_f RANAP_Session_Re_establishment_Indicator_decode_uper;
+per_type_encoder_f RANAP_Session_Re_establishment_Indicator_encode_uper;
+per_type_decoder_f RANAP_Session_Re_establishment_Indicator_decode_aper;
+per_type_encoder_f RANAP_Session_Re_establishment_Indicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Session_Re_establishment_Indicator_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SessionUpdateID.c b/src/ranap/RANAP_SessionUpdateID.c
new file mode 100644
index 0000000..ad77058
--- /dev/null
+++ b/src/ranap/RANAP_SessionUpdateID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SessionUpdateID.h"
+
+int
+RANAP_SessionUpdateID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 1048575l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_SessionUpdateID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SessionUpdateID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SessionUpdateID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SessionUpdateID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SessionUpdateID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SessionUpdateID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SessionUpdateID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SessionUpdateID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SessionUpdateID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SessionUpdateID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SessionUpdateID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SessionUpdateID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 20, -1,  0l,  1048575l }	/* (0..1048575) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SessionUpdateID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SessionUpdateID = {
+	"RANAP_SessionUpdateID",
+	"RANAP_SessionUpdateID",
+	RANAP_SessionUpdateID_free,
+	RANAP_SessionUpdateID_print,
+	RANAP_SessionUpdateID_constraint,
+	RANAP_SessionUpdateID_decode_ber,
+	RANAP_SessionUpdateID_encode_der,
+	RANAP_SessionUpdateID_decode_xer,
+	RANAP_SessionUpdateID_encode_xer,
+	RANAP_SessionUpdateID_decode_uper,
+	RANAP_SessionUpdateID_encode_uper,
+	RANAP_SessionUpdateID_decode_aper,
+	RANAP_SessionUpdateID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SessionUpdateID_tags_1,
+	sizeof(asn_DEF_RANAP_SessionUpdateID_tags_1)
+		/sizeof(asn_DEF_RANAP_SessionUpdateID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SessionUpdateID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SessionUpdateID_tags_1)
+		/sizeof(asn_DEF_RANAP_SessionUpdateID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SessionUpdateID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SessionUpdateID.h b/src/ranap/RANAP_SessionUpdateID.h
new file mode 100644
index 0000000..3d9f9aa
--- /dev/null
+++ b/src/ranap/RANAP_SessionUpdateID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SessionUpdateID_H_
+#define	_RANAP_SessionUpdateID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SessionUpdateID */
+typedef long	 RANAP_SessionUpdateID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SessionUpdateID;
+asn_struct_free_f RANAP_SessionUpdateID_free;
+asn_struct_print_f RANAP_SessionUpdateID_print;
+asn_constr_check_f RANAP_SessionUpdateID_constraint;
+ber_type_decoder_f RANAP_SessionUpdateID_decode_ber;
+der_type_encoder_f RANAP_SessionUpdateID_encode_der;
+xer_type_decoder_f RANAP_SessionUpdateID_decode_xer;
+xer_type_encoder_f RANAP_SessionUpdateID_encode_xer;
+per_type_decoder_f RANAP_SessionUpdateID_decode_uper;
+per_type_encoder_f RANAP_SessionUpdateID_encode_uper;
+per_type_decoder_f RANAP_SessionUpdateID_decode_aper;
+per_type_encoder_f RANAP_SessionUpdateID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SessionUpdateID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Shared-Network-Information.c b/src/ranap/RANAP_Shared-Network-Information.c
new file mode 100644
index 0000000..5f4d9c0
--- /dev/null
+++ b/src/ranap/RANAP_Shared-Network-Information.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Shared-Network-Information.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_Shared_Network_Information_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_Shared_Network_Information, pLMNs_in_shared_network),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNs_in_shared_network,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNs-in-shared-network"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_Shared_Network_Information, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_Shared_Network_Information_oms_1[] = { 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_Shared_Network_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_Shared_Network_Information_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNs-in-shared-network */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_Shared_Network_Information_specs_1 = {
+	sizeof(struct RANAP_Shared_Network_Information),
+	offsetof(struct RANAP_Shared_Network_Information, _asn_ctx),
+	asn_MAP_RANAP_Shared_Network_Information_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_Shared_Network_Information_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Shared_Network_Information = {
+	"RANAP_Shared-Network-Information",
+	"RANAP_Shared-Network-Information",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Shared_Network_Information_tags_1,
+	sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Shared_Network_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_Shared_Network_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_Shared_Network_Information_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_Shared_Network_Information_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_Shared-Network-Information.h b/src/ranap/RANAP_Shared-Network-Information.h
new file mode 100644
index 0000000..20ed702
--- /dev/null
+++ b/src/ranap/RANAP_Shared-Network-Information.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Shared_Network_Information_H_
+#define	_RANAP_Shared_Network_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNs-in-shared-network.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Shared-Network-Information */
+typedef struct RANAP_Shared_Network_Information {
+	RANAP_PLMNs_in_shared_network_t	 pLMNs_in_shared_network;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_Shared_Network_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Shared_Network_Information;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Shared_Network_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SignallingIndication.c b/src/ranap/RANAP_SignallingIndication.c
new file mode 100644
index 0000000..2a01023
--- /dev/null
+++ b/src/ranap/RANAP_SignallingIndication.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SignallingIndication.h"
+
+int
+RANAP_SignallingIndication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SignallingIndication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_SignallingIndication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SignallingIndication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SignallingIndication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SignallingIndication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SignallingIndication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SignallingIndication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SignallingIndication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SignallingIndication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SignallingIndication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SignallingIndication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SignallingIndication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SignallingIndication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_SignallingIndication_value2enum_1[] = {
+	{ 0,	10,	"signalling" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_SignallingIndication_enum2value_1[] = {
+	0	/* signalling(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_SignallingIndication_specs_1 = {
+	asn_MAP_RANAP_SignallingIndication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_SignallingIndication_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SignallingIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SignallingIndication = {
+	"RANAP_SignallingIndication",
+	"RANAP_SignallingIndication",
+	RANAP_SignallingIndication_free,
+	RANAP_SignallingIndication_print,
+	RANAP_SignallingIndication_constraint,
+	RANAP_SignallingIndication_decode_ber,
+	RANAP_SignallingIndication_encode_der,
+	RANAP_SignallingIndication_decode_xer,
+	RANAP_SignallingIndication_encode_xer,
+	RANAP_SignallingIndication_decode_uper,
+	RANAP_SignallingIndication_encode_uper,
+	RANAP_SignallingIndication_decode_aper,
+	RANAP_SignallingIndication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SignallingIndication_tags_1,
+	sizeof(asn_DEF_RANAP_SignallingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_SignallingIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SignallingIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SignallingIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_SignallingIndication_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SignallingIndication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_SignallingIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SignallingIndication.h b/src/ranap/RANAP_SignallingIndication.h
new file mode 100644
index 0000000..4c95a32
--- /dev/null
+++ b/src/ranap/RANAP_SignallingIndication.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SignallingIndication_H_
+#define	_RANAP_SignallingIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SignallingIndication {
+	RANAP_SignallingIndication_signalling	= 0
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_SignallingIndication;
+
+/* RANAP_SignallingIndication */
+typedef long	 RANAP_SignallingIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SignallingIndication;
+asn_struct_free_f RANAP_SignallingIndication_free;
+asn_struct_print_f RANAP_SignallingIndication_print;
+asn_constr_check_f RANAP_SignallingIndication_constraint;
+ber_type_decoder_f RANAP_SignallingIndication_decode_ber;
+der_type_encoder_f RANAP_SignallingIndication_encode_der;
+xer_type_decoder_f RANAP_SignallingIndication_decode_xer;
+xer_type_encoder_f RANAP_SignallingIndication_encode_xer;
+per_type_decoder_f RANAP_SignallingIndication_decode_uper;
+per_type_encoder_f RANAP_SignallingIndication_encode_uper;
+per_type_decoder_f RANAP_SignallingIndication_decode_aper;
+per_type_encoder_f RANAP_SignallingIndication_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SignallingIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Source-ToTarget-TransparentContainer.c b/src/ranap/RANAP_Source-ToTarget-TransparentContainer.c
new file mode 100644
index 0000000..1874cda
--- /dev/null
+++ b/src/ranap/RANAP_Source-ToTarget-TransparentContainer.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Source-ToTarget-TransparentContainer.h"
+
+int
+RANAP_Source_ToTarget_TransparentContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_Source_ToTarget_TransparentContainer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Source_ToTarget_TransparentContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Source_ToTarget_TransparentContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Source_ToTarget_TransparentContainer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Source_ToTarget_TransparentContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Source_ToTarget_TransparentContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Source_ToTarget_TransparentContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Source_ToTarget_TransparentContainer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Source_ToTarget_TransparentContainer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Source_ToTarget_TransparentContainer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Source_ToTarget_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Source_ToTarget_TransparentContainer = {
+	"RANAP_Source-ToTarget-TransparentContainer",
+	"RANAP_Source-ToTarget-TransparentContainer",
+	RANAP_Source_ToTarget_TransparentContainer_free,
+	RANAP_Source_ToTarget_TransparentContainer_print,
+	RANAP_Source_ToTarget_TransparentContainer_constraint,
+	RANAP_Source_ToTarget_TransparentContainer_decode_ber,
+	RANAP_Source_ToTarget_TransparentContainer_encode_der,
+	RANAP_Source_ToTarget_TransparentContainer_decode_xer,
+	RANAP_Source_ToTarget_TransparentContainer_encode_xer,
+	RANAP_Source_ToTarget_TransparentContainer_decode_uper,
+	RANAP_Source_ToTarget_TransparentContainer_encode_uper,
+	RANAP_Source_ToTarget_TransparentContainer_decode_aper,
+	RANAP_Source_ToTarget_TransparentContainer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_Source_ToTarget_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Source-ToTarget-TransparentContainer.h b/src/ranap/RANAP_Source-ToTarget-TransparentContainer.h
new file mode 100644
index 0000000..84b1571
--- /dev/null
+++ b/src/ranap/RANAP_Source-ToTarget-TransparentContainer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Source_ToTarget_TransparentContainer_H_
+#define	_RANAP_Source_ToTarget_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Source-ToTarget-TransparentContainer */
+typedef OCTET_STRING_t	 RANAP_Source_ToTarget_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Source_ToTarget_TransparentContainer;
+asn_struct_free_f RANAP_Source_ToTarget_TransparentContainer_free;
+asn_struct_print_f RANAP_Source_ToTarget_TransparentContainer_print;
+asn_constr_check_f RANAP_Source_ToTarget_TransparentContainer_constraint;
+ber_type_decoder_f RANAP_Source_ToTarget_TransparentContainer_decode_ber;
+der_type_encoder_f RANAP_Source_ToTarget_TransparentContainer_encode_der;
+xer_type_decoder_f RANAP_Source_ToTarget_TransparentContainer_decode_xer;
+xer_type_encoder_f RANAP_Source_ToTarget_TransparentContainer_encode_xer;
+per_type_decoder_f RANAP_Source_ToTarget_TransparentContainer_decode_uper;
+per_type_encoder_f RANAP_Source_ToTarget_TransparentContainer_encode_uper;
+per_type_decoder_f RANAP_Source_ToTarget_TransparentContainer_decode_aper;
+per_type_encoder_f RANAP_Source_ToTarget_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Source_ToTarget_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceBSS-ToTargetBSS-TransparentContainer.c b/src/ranap/RANAP_SourceBSS-ToTargetBSS-TransparentContainer.c
new file mode 100644
index 0000000..78ef6f9
--- /dev/null
+++ b/src/ranap/RANAP_SourceBSS-ToTargetBSS-TransparentContainer.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceBSS-ToTargetBSS-TransparentContainer.h"
+
+int
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer = {
+	"RANAP_SourceBSS-ToTargetBSS-TransparentContainer",
+	"RANAP_SourceBSS-ToTargetBSS-TransparentContainer",
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_free,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_print,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_constraint,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_ber,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_der,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_xer,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_xer,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_uper,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_uper,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_aper,
+	RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SourceBSS-ToTargetBSS-TransparentContainer.h b/src/ranap/RANAP_SourceBSS-ToTargetBSS-TransparentContainer.h
new file mode 100644
index 0000000..e86c070
--- /dev/null
+++ b/src/ranap/RANAP_SourceBSS-ToTargetBSS-TransparentContainer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_H_
+#define	_RANAP_SourceBSS_ToTargetBSS_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SourceBSS-ToTargetBSS-TransparentContainer */
+typedef OCTET_STRING_t	 RANAP_SourceBSS_ToTargetBSS_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceBSS_ToTargetBSS_TransparentContainer;
+asn_struct_free_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_free;
+asn_struct_print_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_print;
+asn_constr_check_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_constraint;
+ber_type_decoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_ber;
+der_type_encoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_der;
+xer_type_decoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_xer;
+xer_type_encoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_xer;
+per_type_decoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_uper;
+per_type_encoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_uper;
+per_type_decoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_decode_aper;
+per_type_encoder_f RANAP_SourceBSS_ToTargetBSS_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceBSS_ToTargetBSS_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceCellID.c b/src/ranap/RANAP_SourceCellID.c
new file mode 100644
index 0000000..c00a108
--- /dev/null
+++ b/src/ranap/RANAP_SourceCellID.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceCellID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_SourceCellID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_SourceCellID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceCellID, choice.sourceUTRANCellID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SourceUTRANCellID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sourceUTRANCellID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceCellID, choice.sourceGERANCellID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CGI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sourceGERANCellID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SourceCellID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sourceUTRANCellID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* sourceGERANCellID */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_SourceCellID_specs_1 = {
+	sizeof(struct RANAP_SourceCellID),
+	offsetof(struct RANAP_SourceCellID, _asn_ctx),
+	offsetof(struct RANAP_SourceCellID, present),
+	sizeof(((struct RANAP_SourceCellID *)0)->present),
+	asn_MAP_RANAP_SourceCellID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceCellID = {
+	"RANAP_SourceCellID",
+	"RANAP_SourceCellID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_SourceCellID_constr_1,
+	asn_MBR_RANAP_SourceCellID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_SourceCellID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SourceCellID.h b/src/ranap/RANAP_SourceCellID.h
new file mode 100644
index 0000000..d002552
--- /dev/null
+++ b/src/ranap/RANAP_SourceCellID.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceCellID_H_
+#define	_RANAP_SourceCellID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SourceUTRANCellID.h"
+#include "RANAP_CGI.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SourceCellID_PR {
+	RANAP_SourceCellID_PR_NOTHING,	/* No components present */
+	RANAP_SourceCellID_PR_sourceUTRANCellID,
+	RANAP_SourceCellID_PR_sourceGERANCellID,
+	/* Extensions may appear below */
+	
+} RANAP_SourceCellID_PR;
+
+/* RANAP_SourceCellID */
+typedef struct RANAP_SourceCellID {
+	RANAP_SourceCellID_PR present;
+	union RANAP_SourceCellID_u {
+		RANAP_SourceUTRANCellID_t	 sourceUTRANCellID;
+		RANAP_CGI_t	 sourceGERANCellID;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SourceCellID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceCellID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceCellID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceID.c b/src/ranap/RANAP_SourceID.c
new file mode 100644
index 0000000..347e9c4
--- /dev/null
+++ b/src/ranap/RANAP_SourceID.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_SourceID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_SourceID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceID, choice.sourceRNC_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SourceRNC_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sourceRNC-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceID, choice.sAI),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_SAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"sAI"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SourceID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sourceRNC-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* sAI */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_SourceID_specs_1 = {
+	sizeof(struct RANAP_SourceID),
+	offsetof(struct RANAP_SourceID, _asn_ctx),
+	offsetof(struct RANAP_SourceID, present),
+	sizeof(((struct RANAP_SourceID *)0)->present),
+	asn_MAP_RANAP_SourceID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceID = {
+	"RANAP_SourceID",
+	"RANAP_SourceID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_SourceID_constr_1,
+	asn_MBR_RANAP_SourceID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_SourceID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SourceID.h b/src/ranap/RANAP_SourceID.h
new file mode 100644
index 0000000..cb390f5
--- /dev/null
+++ b/src/ranap/RANAP_SourceID.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceID_H_
+#define	_RANAP_SourceID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SourceRNC-ID.h"
+#include "RANAP_SAI.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SourceID_PR {
+	RANAP_SourceID_PR_NOTHING,	/* No components present */
+	RANAP_SourceID_PR_sourceRNC_ID,
+	RANAP_SourceID_PR_sAI,
+	/* Extensions may appear below */
+	
+} RANAP_SourceID_PR;
+
+/* RANAP_SourceID */
+typedef struct RANAP_SourceID {
+	RANAP_SourceID_PR present;
+	union RANAP_SourceID_u {
+		RANAP_SourceRNC_ID_t	 sourceRNC_ID;
+		RANAP_SAI_t	 sAI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SourceID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceRNC-ID.c b/src/ranap/RANAP_SourceRNC-ID.c
new file mode 100644
index 0000000..a5850da
--- /dev/null
+++ b/src/ranap/RANAP_SourceRNC-ID.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceRNC-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SourceRNC_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ID, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ID, rNC_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RNC_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rNC-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SourceRNC_ID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SourceRNC_ID_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SourceRNC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SourceRNC_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rNC-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SourceRNC_ID_specs_1 = {
+	sizeof(struct RANAP_SourceRNC_ID),
+	offsetof(struct RANAP_SourceRNC_ID, _asn_ctx),
+	asn_MAP_RANAP_SourceRNC_ID_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_SourceRNC_ID_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceRNC_ID = {
+	"RANAP_SourceRNC-ID",
+	"RANAP_SourceRNC-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SourceRNC_ID_tags_1,
+	sizeof(asn_DEF_RANAP_SourceRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceRNC_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SourceRNC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SourceRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceRNC_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SourceRNC_ID_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_SourceRNC_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SourceRNC-ID.h b/src/ranap/RANAP_SourceRNC-ID.h
new file mode 100644
index 0000000..34ce4a1
--- /dev/null
+++ b/src/ranap/RANAP_SourceRNC-ID.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceRNC_ID_H_
+#define	_RANAP_SourceRNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_RNC-ID.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SourceRNC-ID */
+typedef struct RANAP_SourceRNC_ID {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_RNC_ID_t	 rNC_ID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SourceRNC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceRNC_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceRNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.c b/src/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.c
new file mode 100644
index 0000000..f546dc2
--- /dev/null
+++ b/src/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.c
@@ -0,0 +1,183 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceRNC-ToTargetRNC-TransparentContainer.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, rRC_Container),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RRC_Container,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rRC-Container"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, numberOfIuInstances),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_NumberOfIuInstances,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"numberOfIuInstances"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, relocationType),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RelocationType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"relocationType"
+		},
+	{ ATF_POINTER, 10, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenIntegrityProtectionAlgorithm),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ChosenIntegrityProtectionAlgorithm,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"chosenIntegrityProtectionAlgorithm"
+		},
+	{ ATF_POINTER, 9, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, integrityProtectionKey),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IntegrityProtectionKey,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"integrityProtectionKey"
+		},
+	{ ATF_POINTER, 8, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenEncryptionAlgorithForSignalling),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ChosenEncryptionAlgorithm,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"chosenEncryptionAlgorithForSignalling"
+		},
+	{ ATF_POINTER, 7, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, cipheringKey),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_EncryptionKey,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cipheringKey"
+		},
+	{ ATF_POINTER, 6, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenEncryptionAlgorithForCS),
+		(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ChosenEncryptionAlgorithm,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"chosenEncryptionAlgorithForCS"
+		},
+	{ ATF_POINTER, 5, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenEncryptionAlgorithForPS),
+		(ASN_TAG_CLASS_CONTEXT | (8 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ChosenEncryptionAlgorithm,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"chosenEncryptionAlgorithForPS"
+		},
+	{ ATF_POINTER, 4, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, d_RNTI),
+		(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_D_RNTI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"d-RNTI"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, targetCellId),
+		(ASN_TAG_CLASS_CONTEXT | (10 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetCellId,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"targetCellId"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, rAB_TrCH_Mapping),
+		(ASN_TAG_CLASS_CONTEXT | (11 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAB_TrCH_Mapping,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAB-TrCH-Mapping"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (12 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_oms_1[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rRC-Container */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* numberOfIuInstances */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* relocationType */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* chosenIntegrityProtectionAlgorithm */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* integrityProtectionKey */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* chosenEncryptionAlgorithForSignalling */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* cipheringKey */
+    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* chosenEncryptionAlgorithForCS */
+    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* chosenEncryptionAlgorithForPS */
+    { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* d-RNTI */
+    { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* targetCellId */
+    { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* rAB-TrCH-Mapping */
+    { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_specs_1 = {
+	sizeof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer),
+	offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, _asn_ctx),
+	asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tag2el_1,
+	13,	/* Count of tags in the map */
+	asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_oms_1,	/* Optional members */
+	10, 0,	/* Root/Additions */
+	12,	/* Start extensions */
+	14	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer = {
+	"RANAP_SourceRNC-ToTargetRNC-TransparentContainer",
+	"RANAP_SourceRNC-ToTargetRNC-TransparentContainer",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_1,
+	13,	/* Elements count */
+	&asn_SPC_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.h b/src/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.h
new file mode 100644
index 0000000..b7252f2
--- /dev/null
+++ b/src/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.h
@@ -0,0 +1,63 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_H_
+#define	_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RRC-Container.h"
+#include "RANAP_NumberOfIuInstances.h"
+#include "RANAP_RelocationType.h"
+#include "RANAP_ChosenIntegrityProtectionAlgorithm.h"
+#include "RANAP_IntegrityProtectionKey.h"
+#include "RANAP_ChosenEncryptionAlgorithm.h"
+#include "RANAP_EncryptionKey.h"
+#include "RANAP_D-RNTI.h"
+#include "RANAP_TargetCellId.h"
+#include "RANAP_RAB-TrCH-Mapping.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SourceRNC-ToTargetRNC-TransparentContainer */
+typedef struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer {
+	RANAP_RRC_Container_t	 rRC_Container;
+	RANAP_NumberOfIuInstances_t	 numberOfIuInstances;
+	RANAP_RelocationType_t	 relocationType;
+	RANAP_ChosenIntegrityProtectionAlgorithm_t	*chosenIntegrityProtectionAlgorithm	/* OPTIONAL */;
+	RANAP_IntegrityProtectionKey_t	*integrityProtectionKey	/* OPTIONAL */;
+	RANAP_ChosenEncryptionAlgorithm_t	*chosenEncryptionAlgorithForSignalling	/* OPTIONAL */;
+	RANAP_EncryptionKey_t	*cipheringKey	/* OPTIONAL */;
+	RANAP_ChosenEncryptionAlgorithm_t	*chosenEncryptionAlgorithForCS	/* OPTIONAL */;
+	RANAP_ChosenEncryptionAlgorithm_t	*chosenEncryptionAlgorithForPS	/* OPTIONAL */;
+	RANAP_D_RNTI_t	*d_RNTI	/* OPTIONAL */;
+	RANAP_TargetCellId_t	*targetCellId	/* OPTIONAL */;
+	RANAP_RAB_TrCH_Mapping_t	*rAB_TrCH_Mapping	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SourceRNC_ToTargetRNC_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceRNC_ToTargetRNC_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceStatisticsDescriptor.c b/src/ranap/RANAP_SourceStatisticsDescriptor.c
new file mode 100644
index 0000000..d07b8cf
--- /dev/null
+++ b/src/ranap/RANAP_SourceStatisticsDescriptor.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceStatisticsDescriptor.h"
+
+int
+RANAP_SourceStatisticsDescriptor_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_SourceStatisticsDescriptor_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SourceStatisticsDescriptor_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceStatisticsDescriptor_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SourceStatisticsDescriptor_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceStatisticsDescriptor_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SourceStatisticsDescriptor_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceStatisticsDescriptor_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SourceStatisticsDescriptor_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SourceStatisticsDescriptor_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SourceStatisticsDescriptor_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SourceStatisticsDescriptor_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SourceStatisticsDescriptor_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_SourceStatisticsDescriptor_value2enum_1[] = {
+	{ 0,	6,	"speech" },
+	{ 1,	7,	"unknown" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_SourceStatisticsDescriptor_enum2value_1[] = {
+	0,	/* speech(0) */
+	1	/* unknown(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_SourceStatisticsDescriptor_specs_1 = {
+	asn_MAP_RANAP_SourceStatisticsDescriptor_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_SourceStatisticsDescriptor_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceStatisticsDescriptor = {
+	"RANAP_SourceStatisticsDescriptor",
+	"RANAP_SourceStatisticsDescriptor",
+	RANAP_SourceStatisticsDescriptor_free,
+	RANAP_SourceStatisticsDescriptor_print,
+	RANAP_SourceStatisticsDescriptor_constraint,
+	RANAP_SourceStatisticsDescriptor_decode_ber,
+	RANAP_SourceStatisticsDescriptor_encode_der,
+	RANAP_SourceStatisticsDescriptor_decode_xer,
+	RANAP_SourceStatisticsDescriptor_encode_xer,
+	RANAP_SourceStatisticsDescriptor_decode_uper,
+	RANAP_SourceStatisticsDescriptor_encode_uper,
+	RANAP_SourceStatisticsDescriptor_decode_aper,
+	RANAP_SourceStatisticsDescriptor_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1,
+	sizeof(asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceStatisticsDescriptor_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SourceStatisticsDescriptor_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_SourceStatisticsDescriptor_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SourceStatisticsDescriptor.h b/src/ranap/RANAP_SourceStatisticsDescriptor.h
new file mode 100644
index 0000000..5f459eb
--- /dev/null
+++ b/src/ranap/RANAP_SourceStatisticsDescriptor.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceStatisticsDescriptor_H_
+#define	_RANAP_SourceStatisticsDescriptor_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_SourceStatisticsDescriptor {
+	RANAP_SourceStatisticsDescriptor_speech	= 0,
+	RANAP_SourceStatisticsDescriptor_unknown	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_SourceStatisticsDescriptor;
+
+/* RANAP_SourceStatisticsDescriptor */
+typedef long	 RANAP_SourceStatisticsDescriptor_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceStatisticsDescriptor;
+asn_struct_free_f RANAP_SourceStatisticsDescriptor_free;
+asn_struct_print_f RANAP_SourceStatisticsDescriptor_print;
+asn_constr_check_f RANAP_SourceStatisticsDescriptor_constraint;
+ber_type_decoder_f RANAP_SourceStatisticsDescriptor_decode_ber;
+der_type_encoder_f RANAP_SourceStatisticsDescriptor_encode_der;
+xer_type_decoder_f RANAP_SourceStatisticsDescriptor_decode_xer;
+xer_type_encoder_f RANAP_SourceStatisticsDescriptor_encode_xer;
+per_type_decoder_f RANAP_SourceStatisticsDescriptor_decode_uper;
+per_type_encoder_f RANAP_SourceStatisticsDescriptor_encode_uper;
+per_type_decoder_f RANAP_SourceStatisticsDescriptor_decode_aper;
+per_type_encoder_f RANAP_SourceStatisticsDescriptor_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceStatisticsDescriptor_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceUTRANCellID.c b/src/ranap/RANAP_SourceUTRANCellID.c
new file mode 100644
index 0000000..9695d86
--- /dev/null
+++ b/src/ranap/RANAP_SourceUTRANCellID.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceUTRANCellID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SourceUTRANCellID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceUTRANCellID, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceUTRANCellID, uTRANcellID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetCellId,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uTRANcellID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_SourceUTRANCellID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_SourceUTRANCellID_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_SourceUTRANCellID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SourceUTRANCellID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uTRANcellID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SourceUTRANCellID_specs_1 = {
+	sizeof(struct RANAP_SourceUTRANCellID),
+	offsetof(struct RANAP_SourceUTRANCellID, _asn_ctx),
+	asn_MAP_RANAP_SourceUTRANCellID_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_SourceUTRANCellID_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceUTRANCellID = {
+	"RANAP_SourceUTRANCellID",
+	"RANAP_SourceUTRANCellID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SourceUTRANCellID_tags_1,
+	sizeof(asn_DEF_RANAP_SourceUTRANCellID_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceUTRANCellID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SourceUTRANCellID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SourceUTRANCellID_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceUTRANCellID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SourceUTRANCellID_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_SourceUTRANCellID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SourceUTRANCellID.h b/src/ranap/RANAP_SourceUTRANCellID.h
new file mode 100644
index 0000000..70977ef
--- /dev/null
+++ b/src/ranap/RANAP_SourceUTRANCellID.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceUTRANCellID_H_
+#define	_RANAP_SourceUTRANCellID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_TargetCellId.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SourceUTRANCellID */
+typedef struct RANAP_SourceUTRANCellID {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_TargetCellId_t	 uTRANcellID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SourceUTRANCellID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceUTRANCellID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceUTRANCellID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.c b/src/ranap/RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.c
new file mode 100644
index 0000000..f8e3037
--- /dev/null
+++ b/src/ranap/RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.h"
+
+int
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer = {
+	"RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer",
+	"RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer",
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_free,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_print,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_constraint,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_ber,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_der,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_xer,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_xer,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_uper,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_uper,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_aper,
+	RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.h b/src/ranap/RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.h
new file mode 100644
index 0000000..347fb40
--- /dev/null
+++ b/src/ranap/RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_H_
+#define	_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SourceeNodeB-ToTargeteNodeB-TransparentContainer */
+typedef OCTET_STRING_t	 RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer;
+asn_struct_free_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_free;
+asn_struct_print_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_print;
+asn_constr_check_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_constraint;
+ber_type_decoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_ber;
+der_type_encoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_der;
+xer_type_decoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_xer;
+xer_type_encoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_xer;
+per_type_decoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_uper;
+per_type_encoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_uper;
+per_type_decoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_decode_aper;
+per_type_encoder_f RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SourceeNodeB_ToTargeteNodeB_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SubflowSDU-Size.c b/src/ranap/RANAP_SubflowSDU-Size.c
new file mode 100644
index 0000000..1a39238
--- /dev/null
+++ b/src/ranap/RANAP_SubflowSDU-Size.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SubflowSDU-Size.h"
+
+int
+RANAP_SubflowSDU_Size_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 4095l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_SubflowSDU_Size_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SubflowSDU_Size_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SubflowSDU_Size_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SubflowSDU_Size_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SubflowSDU_Size_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SubflowSDU_Size_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SubflowSDU_Size_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SubflowSDU_Size_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SubflowSDU_Size_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SubflowSDU_Size_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SubflowSDU_Size_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SubflowSDU_Size_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  0l,  4095l }	/* (0..4095) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SubflowSDU_Size_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SubflowSDU_Size = {
+	"RANAP_SubflowSDU-Size",
+	"RANAP_SubflowSDU-Size",
+	RANAP_SubflowSDU_Size_free,
+	RANAP_SubflowSDU_Size_print,
+	RANAP_SubflowSDU_Size_constraint,
+	RANAP_SubflowSDU_Size_decode_ber,
+	RANAP_SubflowSDU_Size_encode_der,
+	RANAP_SubflowSDU_Size_decode_xer,
+	RANAP_SubflowSDU_Size_encode_xer,
+	RANAP_SubflowSDU_Size_decode_uper,
+	RANAP_SubflowSDU_Size_encode_uper,
+	RANAP_SubflowSDU_Size_decode_aper,
+	RANAP_SubflowSDU_Size_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SubflowSDU_Size_tags_1,
+	sizeof(asn_DEF_RANAP_SubflowSDU_Size_tags_1)
+		/sizeof(asn_DEF_RANAP_SubflowSDU_Size_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SubflowSDU_Size_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SubflowSDU_Size_tags_1)
+		/sizeof(asn_DEF_RANAP_SubflowSDU_Size_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SubflowSDU_Size_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SubflowSDU-Size.h b/src/ranap/RANAP_SubflowSDU-Size.h
new file mode 100644
index 0000000..daaf20b
--- /dev/null
+++ b/src/ranap/RANAP_SubflowSDU-Size.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SubflowSDU_Size_H_
+#define	_RANAP_SubflowSDU_Size_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SubflowSDU-Size */
+typedef long	 RANAP_SubflowSDU_Size_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SubflowSDU_Size;
+asn_struct_free_f RANAP_SubflowSDU_Size_free;
+asn_struct_print_f RANAP_SubflowSDU_Size_print;
+asn_constr_check_f RANAP_SubflowSDU_Size_constraint;
+ber_type_decoder_f RANAP_SubflowSDU_Size_decode_ber;
+der_type_encoder_f RANAP_SubflowSDU_Size_encode_der;
+xer_type_decoder_f RANAP_SubflowSDU_Size_decode_xer;
+xer_type_encoder_f RANAP_SubflowSDU_Size_encode_xer;
+per_type_decoder_f RANAP_SubflowSDU_Size_decode_uper;
+per_type_encoder_f RANAP_SubflowSDU_Size_encode_uper;
+per_type_decoder_f RANAP_SubflowSDU_Size_decode_aper;
+per_type_encoder_f RANAP_SubflowSDU_Size_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SubflowSDU_Size_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SubscriberProfileIDforRFP.c b/src/ranap/RANAP_SubscriberProfileIDforRFP.c
new file mode 100644
index 0000000..c428153
--- /dev/null
+++ b/src/ranap/RANAP_SubscriberProfileIDforRFP.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SubscriberProfileIDforRFP.h"
+
+int
+RANAP_SubscriberProfileIDforRFP_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 256l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_SubscriberProfileIDforRFP_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SubscriberProfileIDforRFP_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SubscriberProfileIDforRFP_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SubscriberProfileIDforRFP_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SubscriberProfileIDforRFP_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SubscriberProfileIDforRFP_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SubscriberProfileIDforRFP_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SubscriberProfileIDforRFP_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SubscriberProfileIDforRFP_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SubscriberProfileIDforRFP_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SubscriberProfileIDforRFP_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SubscriberProfileIDforRFP_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (1..256) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SubscriberProfileIDforRFP = {
+	"RANAP_SubscriberProfileIDforRFP",
+	"RANAP_SubscriberProfileIDforRFP",
+	RANAP_SubscriberProfileIDforRFP_free,
+	RANAP_SubscriberProfileIDforRFP_print,
+	RANAP_SubscriberProfileIDforRFP_constraint,
+	RANAP_SubscriberProfileIDforRFP_decode_ber,
+	RANAP_SubscriberProfileIDforRFP_encode_der,
+	RANAP_SubscriberProfileIDforRFP_decode_xer,
+	RANAP_SubscriberProfileIDforRFP_encode_xer,
+	RANAP_SubscriberProfileIDforRFP_decode_uper,
+	RANAP_SubscriberProfileIDforRFP_encode_uper,
+	RANAP_SubscriberProfileIDforRFP_decode_aper,
+	RANAP_SubscriberProfileIDforRFP_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1,
+	sizeof(asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1)
+		/sizeof(asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1)
+		/sizeof(asn_DEF_RANAP_SubscriberProfileIDforRFP_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SubscriberProfileIDforRFP_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SubscriberProfileIDforRFP.h b/src/ranap/RANAP_SubscriberProfileIDforRFP.h
new file mode 100644
index 0000000..984957b
--- /dev/null
+++ b/src/ranap/RANAP_SubscriberProfileIDforRFP.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SubscriberProfileIDforRFP_H_
+#define	_RANAP_SubscriberProfileIDforRFP_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SubscriberProfileIDforRFP */
+typedef long	 RANAP_SubscriberProfileIDforRFP_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SubscriberProfileIDforRFP;
+asn_struct_free_f RANAP_SubscriberProfileIDforRFP_free;
+asn_struct_print_f RANAP_SubscriberProfileIDforRFP_print;
+asn_constr_check_f RANAP_SubscriberProfileIDforRFP_constraint;
+ber_type_decoder_f RANAP_SubscriberProfileIDforRFP_decode_ber;
+der_type_encoder_f RANAP_SubscriberProfileIDforRFP_encode_der;
+xer_type_decoder_f RANAP_SubscriberProfileIDforRFP_decode_xer;
+xer_type_encoder_f RANAP_SubscriberProfileIDforRFP_encode_xer;
+per_type_decoder_f RANAP_SubscriberProfileIDforRFP_decode_uper;
+per_type_encoder_f RANAP_SubscriberProfileIDforRFP_encode_uper;
+per_type_decoder_f RANAP_SubscriberProfileIDforRFP_decode_aper;
+per_type_encoder_f RANAP_SubscriberProfileIDforRFP_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SubscriberProfileIDforRFP_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SuccessfulOutcome.c b/src/ranap/RANAP_SuccessfulOutcome.c
new file mode 100644
index 0000000..bf11f31
--- /dev/null
+++ b/src/ranap/RANAP_SuccessfulOutcome.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_SuccessfulOutcome.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_SuccessfulOutcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SuccessfulOutcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SuccessfulOutcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SuccessfulOutcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SuccessfulOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_SuccessfulOutcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SuccessfulOutcome_specs_1 = {
+	sizeof(struct RANAP_SuccessfulOutcome),
+	offsetof(struct RANAP_SuccessfulOutcome, _asn_ctx),
+	asn_MAP_RANAP_SuccessfulOutcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SuccessfulOutcome = {
+	"RANAP_SuccessfulOutcome",
+	"RANAP_SuccessfulOutcome",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SuccessfulOutcome_tags_1,
+	sizeof(asn_DEF_RANAP_SuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_RANAP_SuccessfulOutcome_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SuccessfulOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_RANAP_SuccessfulOutcome_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_SuccessfulOutcome_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_SuccessfulOutcome_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SuccessfulOutcome.h b/src/ranap/RANAP_SuccessfulOutcome.h
new file mode 100644
index 0000000..d772a0f
--- /dev/null
+++ b/src/ranap/RANAP_SuccessfulOutcome.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_SuccessfulOutcome_H_
+#define	_RANAP_SuccessfulOutcome_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ProcedureCode.h"
+#include "RANAP_Criticality.h"
+#include <ANY.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SuccessfulOutcome */
+typedef struct RANAP_SuccessfulOutcome {
+	RANAP_ProcedureCode_t	 procedureCode;
+	RANAP_Criticality_t	 criticality;
+	ANY_t	 value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SuccessfulOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SuccessfulOutcome;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SuccessfulOutcome_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SupportedBitrate.c b/src/ranap/RANAP_SupportedBitrate.c
new file mode 100644
index 0000000..61b95fc
--- /dev/null
+++ b/src/ranap/RANAP_SupportedBitrate.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SupportedBitrate.h"
+
+int
+RANAP_SupportedBitrate_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 1000000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_SupportedBitrate_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_SupportedBitrate_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SupportedBitrate_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_SupportedBitrate_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SupportedBitrate_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_SupportedBitrate_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_SupportedBitrate_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_SupportedBitrate_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_SupportedBitrate_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_SupportedBitrate_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_SupportedBitrate_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_SupportedBitrate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  30, -1,  1l,  1000000000l }	/* (1..1000000000,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SupportedBitrate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SupportedBitrate = {
+	"RANAP_SupportedBitrate",
+	"RANAP_SupportedBitrate",
+	RANAP_SupportedBitrate_free,
+	RANAP_SupportedBitrate_print,
+	RANAP_SupportedBitrate_constraint,
+	RANAP_SupportedBitrate_decode_ber,
+	RANAP_SupportedBitrate_encode_der,
+	RANAP_SupportedBitrate_decode_xer,
+	RANAP_SupportedBitrate_encode_xer,
+	RANAP_SupportedBitrate_decode_uper,
+	RANAP_SupportedBitrate_encode_uper,
+	RANAP_SupportedBitrate_decode_aper,
+	RANAP_SupportedBitrate_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SupportedBitrate_tags_1,
+	sizeof(asn_DEF_RANAP_SupportedBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_SupportedBitrate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SupportedBitrate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SupportedBitrate_tags_1)
+		/sizeof(asn_DEF_RANAP_SupportedBitrate_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SupportedBitrate_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_SupportedBitrate.h b/src/ranap/RANAP_SupportedBitrate.h
new file mode 100644
index 0000000..a65f694
--- /dev/null
+++ b/src/ranap/RANAP_SupportedBitrate.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SupportedBitrate_H_
+#define	_RANAP_SupportedBitrate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SupportedBitrate */
+typedef long	 RANAP_SupportedBitrate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SupportedBitrate;
+asn_struct_free_f RANAP_SupportedBitrate_free;
+asn_struct_print_f RANAP_SupportedBitrate_print;
+asn_constr_check_f RANAP_SupportedBitrate_constraint;
+ber_type_decoder_f RANAP_SupportedBitrate_decode_ber;
+der_type_encoder_f RANAP_SupportedBitrate_encode_der;
+xer_type_decoder_f RANAP_SupportedBitrate_decode_xer;
+xer_type_encoder_f RANAP_SupportedBitrate_encode_xer;
+per_type_decoder_f RANAP_SupportedBitrate_decode_uper;
+per_type_encoder_f RANAP_SupportedBitrate_encode_uper;
+per_type_decoder_f RANAP_SupportedBitrate_decode_aper;
+per_type_encoder_f RANAP_SupportedBitrate_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SupportedBitrate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_SupportedRAB-ParameterBitrateList.c b/src/ranap/RANAP_SupportedRAB-ParameterBitrateList.c
new file mode 100644
index 0000000..7d32eca
--- /dev/null
+++ b/src/ranap/RANAP_SupportedRAB-ParameterBitrateList.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_SupportedRAB-ParameterBitrateList.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_SupportedRAB_ParameterBitrateList_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  1l,  2l }	/* (SIZE(1..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_SupportedRAB_ParameterBitrateList_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_SupportedBitrate,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_SupportedRAB_ParameterBitrateList_specs_1 = {
+	sizeof(struct RANAP_SupportedRAB_ParameterBitrateList),
+	offsetof(struct RANAP_SupportedRAB_ParameterBitrateList, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_SupportedRAB_ParameterBitrateList = {
+	"RANAP_SupportedRAB-ParameterBitrateList",
+	"RANAP_SupportedRAB-ParameterBitrateList",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1,
+	sizeof(asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1)
+		/sizeof(asn_DEF_RANAP_SupportedRAB_ParameterBitrateList_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_SupportedRAB_ParameterBitrateList_constr_1,
+	asn_MBR_RANAP_SupportedRAB_ParameterBitrateList_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_SupportedRAB_ParameterBitrateList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_SupportedRAB-ParameterBitrateList.h b/src/ranap/RANAP_SupportedRAB-ParameterBitrateList.h
new file mode 100644
index 0000000..17278b8
--- /dev/null
+++ b/src/ranap/RANAP_SupportedRAB-ParameterBitrateList.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_SupportedRAB_ParameterBitrateList_H_
+#define	_RANAP_SupportedRAB_ParameterBitrateList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_SupportedBitrate.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_SupportedRAB-ParameterBitrateList */
+typedef struct RANAP_SupportedRAB_ParameterBitrateList {
+	A_SEQUENCE_OF(RANAP_SupportedBitrate_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_SupportedRAB_ParameterBitrateList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_SupportedRAB_ParameterBitrateList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_SupportedRAB_ParameterBitrateList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TAC.c b/src/ranap/RANAP_TAC.c
new file mode 100644
index 0000000..d1dde67
--- /dev/null
+++ b/src/ranap/RANAP_TAC.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TAC.h"
+
+int
+RANAP_TAC_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TAC_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TAC_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TAC_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TAC_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TAC_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TAC_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TAC_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TAC_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TAC_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TAC_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TAC_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TAC_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TAC_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TAC_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TAC = {
+	"RANAP_TAC",
+	"RANAP_TAC",
+	RANAP_TAC_free,
+	RANAP_TAC_print,
+	RANAP_TAC_constraint,
+	RANAP_TAC_decode_ber,
+	RANAP_TAC_encode_der,
+	RANAP_TAC_decode_xer,
+	RANAP_TAC_encode_xer,
+	RANAP_TAC_decode_uper,
+	RANAP_TAC_encode_uper,
+	RANAP_TAC_decode_aper,
+	RANAP_TAC_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TAC_tags_1,
+	sizeof(asn_DEF_RANAP_TAC_tags_1)
+		/sizeof(asn_DEF_RANAP_TAC_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TAC_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TAC_tags_1)
+		/sizeof(asn_DEF_RANAP_TAC_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TAC_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TAC.h b/src/ranap/RANAP_TAC.h
new file mode 100644
index 0000000..7b3e47b
--- /dev/null
+++ b/src/ranap/RANAP_TAC.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TAC_H_
+#define	_RANAP_TAC_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TAC */
+typedef OCTET_STRING_t	 RANAP_TAC_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TAC;
+asn_struct_free_f RANAP_TAC_free;
+asn_struct_print_f RANAP_TAC_print;
+asn_constr_check_f RANAP_TAC_constraint;
+ber_type_decoder_f RANAP_TAC_decode_ber;
+der_type_encoder_f RANAP_TAC_encode_der;
+xer_type_decoder_f RANAP_TAC_decode_xer;
+xer_type_encoder_f RANAP_TAC_encode_xer;
+per_type_decoder_f RANAP_TAC_decode_uper;
+per_type_encoder_f RANAP_TAC_encode_uper;
+per_type_decoder_f RANAP_TAC_decode_aper;
+per_type_encoder_f RANAP_TAC_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TAC_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TAI.c b/src/ranap/RANAP_TAI.c
new file mode 100644
index 0000000..bbecc2c
--- /dev/null
+++ b/src/ranap/RANAP_TAI.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TAI.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TAI_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TAI, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TAI, tAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"tAC"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TAI, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TAI_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TAI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TAI_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* tAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TAI_specs_1 = {
+	sizeof(struct RANAP_TAI),
+	offsetof(struct RANAP_TAI, _asn_ctx),
+	asn_MAP_RANAP_TAI_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_TAI_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TAI = {
+	"RANAP_TAI",
+	"RANAP_TAI",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TAI_tags_1,
+	sizeof(asn_DEF_RANAP_TAI_tags_1)
+		/sizeof(asn_DEF_RANAP_TAI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TAI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TAI_tags_1)
+		/sizeof(asn_DEF_RANAP_TAI_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TAI_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_TAI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TAI.h b/src/ranap/RANAP_TAI.h
new file mode 100644
index 0000000..106e5b9
--- /dev/null
+++ b/src/ranap/RANAP_TAI.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TAI_H_
+#define	_RANAP_TAI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_TAC.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TAI */
+typedef struct RANAP_TAI {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_TAC_t	 tAC;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TAI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TAI;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TAI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TBCD-STRING.c b/src/ranap/RANAP_TBCD-STRING.c
new file mode 100644
index 0000000..b577160
--- /dev/null
+++ b/src/ranap/RANAP_TBCD-STRING.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TBCD-STRING.h"
+
+int
+RANAP_TBCD_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TBCD_STRING_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TBCD_STRING_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TBCD_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TBCD_STRING_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TBCD_STRING_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TBCD_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TBCD_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TBCD_STRING_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TBCD_STRING_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TBCD_STRING_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TBCD_STRING_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_TBCD_STRING_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TBCD_STRING = {
+	"RANAP_TBCD-STRING",
+	"RANAP_TBCD-STRING",
+	RANAP_TBCD_STRING_free,
+	RANAP_TBCD_STRING_print,
+	RANAP_TBCD_STRING_constraint,
+	RANAP_TBCD_STRING_decode_ber,
+	RANAP_TBCD_STRING_encode_der,
+	RANAP_TBCD_STRING_decode_xer,
+	RANAP_TBCD_STRING_encode_xer,
+	RANAP_TBCD_STRING_decode_uper,
+	RANAP_TBCD_STRING_encode_uper,
+	RANAP_TBCD_STRING_decode_aper,
+	RANAP_TBCD_STRING_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TBCD_STRING_tags_1,
+	sizeof(asn_DEF_RANAP_TBCD_STRING_tags_1)
+		/sizeof(asn_DEF_RANAP_TBCD_STRING_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TBCD_STRING_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TBCD_STRING_tags_1)
+		/sizeof(asn_DEF_RANAP_TBCD_STRING_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TBCD-STRING.h b/src/ranap/RANAP_TBCD-STRING.h
new file mode 100644
index 0000000..b3787aa
--- /dev/null
+++ b/src/ranap/RANAP_TBCD-STRING.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TBCD_STRING_H_
+#define	_RANAP_TBCD_STRING_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TBCD-STRING */
+typedef OCTET_STRING_t	 RANAP_TBCD_STRING_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TBCD_STRING;
+asn_struct_free_f RANAP_TBCD_STRING_free;
+asn_struct_print_f RANAP_TBCD_STRING_print;
+asn_constr_check_f RANAP_TBCD_STRING_constraint;
+ber_type_decoder_f RANAP_TBCD_STRING_decode_ber;
+der_type_encoder_f RANAP_TBCD_STRING_encode_der;
+xer_type_decoder_f RANAP_TBCD_STRING_decode_xer;
+xer_type_encoder_f RANAP_TBCD_STRING_encode_xer;
+per_type_decoder_f RANAP_TBCD_STRING_decode_uper;
+per_type_encoder_f RANAP_TBCD_STRING_encode_uper;
+per_type_decoder_f RANAP_TBCD_STRING_decode_aper;
+per_type_encoder_f RANAP_TBCD_STRING_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TBCD_STRING_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TMGI.c b/src/ranap/RANAP_TMGI.c
new file mode 100644
index 0000000..b76e777
--- /dev/null
+++ b/src/ranap/RANAP_TMGI.c
@@ -0,0 +1,114 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TMGI.h"
+
+static int
+memb_serviceID_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 3l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_serviceID_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  3l,  3l }	/* (SIZE(3..3)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_TMGI_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TMGI, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TMGI, serviceID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		memb_serviceID_constraint_1,
+		&asn_PER_memb_serviceID_constr_3,
+		0,
+		"serviceID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TMGI, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TMGI_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TMGI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TMGI_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* serviceID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TMGI_specs_1 = {
+	sizeof(struct RANAP_TMGI),
+	offsetof(struct RANAP_TMGI, _asn_ctx),
+	asn_MAP_RANAP_TMGI_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_TMGI_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TMGI = {
+	"RANAP_TMGI",
+	"RANAP_TMGI",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TMGI_tags_1,
+	sizeof(asn_DEF_RANAP_TMGI_tags_1)
+		/sizeof(asn_DEF_RANAP_TMGI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TMGI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TMGI_tags_1)
+		/sizeof(asn_DEF_RANAP_TMGI_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TMGI_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_TMGI_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TMGI.h b/src/ranap/RANAP_TMGI.h
new file mode 100644
index 0000000..e09dd16
--- /dev/null
+++ b/src/ranap/RANAP_TMGI.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TMGI_H_
+#define	_RANAP_TMGI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include <OCTET_STRING.h>
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TMGI */
+typedef struct RANAP_TMGI {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	OCTET_STRING_t	 serviceID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TMGI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TMGI;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TMGI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TMSI.c b/src/ranap/RANAP_TMSI.c
new file mode 100644
index 0000000..d7b3212
--- /dev/null
+++ b/src/ranap/RANAP_TMSI.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TMSI.h"
+
+int
+RANAP_TMSI_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 4l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TMSI_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TMSI_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TMSI_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TMSI_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TMSI_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TMSI_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TMSI_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TMSI_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TMSI_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TMSI_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TMSI_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TMSI_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TMSI_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  4l,  4l }	/* (SIZE(4..4)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TMSI_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TMSI = {
+	"RANAP_TMSI",
+	"RANAP_TMSI",
+	RANAP_TMSI_free,
+	RANAP_TMSI_print,
+	RANAP_TMSI_constraint,
+	RANAP_TMSI_decode_ber,
+	RANAP_TMSI_encode_der,
+	RANAP_TMSI_decode_xer,
+	RANAP_TMSI_encode_xer,
+	RANAP_TMSI_decode_uper,
+	RANAP_TMSI_encode_uper,
+	RANAP_TMSI_decode_aper,
+	RANAP_TMSI_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TMSI_tags_1,
+	sizeof(asn_DEF_RANAP_TMSI_tags_1)
+		/sizeof(asn_DEF_RANAP_TMSI_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TMSI_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TMSI_tags_1)
+		/sizeof(asn_DEF_RANAP_TMSI_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TMSI_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TMSI.h b/src/ranap/RANAP_TMSI.h
new file mode 100644
index 0000000..f4d4c4d
--- /dev/null
+++ b/src/ranap/RANAP_TMSI.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TMSI_H_
+#define	_RANAP_TMSI_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TMSI */
+typedef OCTET_STRING_t	 RANAP_TMSI_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TMSI;
+asn_struct_free_f RANAP_TMSI_free;
+asn_struct_print_f RANAP_TMSI_print;
+asn_constr_check_f RANAP_TMSI_constraint;
+ber_type_decoder_f RANAP_TMSI_decode_ber;
+der_type_encoder_f RANAP_TMSI_encode_der;
+xer_type_decoder_f RANAP_TMSI_decode_xer;
+xer_type_encoder_f RANAP_TMSI_encode_xer;
+per_type_decoder_f RANAP_TMSI_decode_uper;
+per_type_encoder_f RANAP_TMSI_encode_uper;
+per_type_decoder_f RANAP_TMSI_decode_aper;
+per_type_encoder_f RANAP_TMSI_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TMSI_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Target-ToSource-TransparentContainer.c b/src/ranap/RANAP_Target-ToSource-TransparentContainer.c
new file mode 100644
index 0000000..68fe629
--- /dev/null
+++ b/src/ranap/RANAP_Target-ToSource-TransparentContainer.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Target-ToSource-TransparentContainer.h"
+
+int
+RANAP_Target_ToSource_TransparentContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_Target_ToSource_TransparentContainer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Target_ToSource_TransparentContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Target_ToSource_TransparentContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Target_ToSource_TransparentContainer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Target_ToSource_TransparentContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Target_ToSource_TransparentContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Target_ToSource_TransparentContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Target_ToSource_TransparentContainer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Target_ToSource_TransparentContainer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Target_ToSource_TransparentContainer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Target_ToSource_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Target_ToSource_TransparentContainer = {
+	"RANAP_Target-ToSource-TransparentContainer",
+	"RANAP_Target-ToSource-TransparentContainer",
+	RANAP_Target_ToSource_TransparentContainer_free,
+	RANAP_Target_ToSource_TransparentContainer_print,
+	RANAP_Target_ToSource_TransparentContainer_constraint,
+	RANAP_Target_ToSource_TransparentContainer_decode_ber,
+	RANAP_Target_ToSource_TransparentContainer_encode_der,
+	RANAP_Target_ToSource_TransparentContainer_decode_xer,
+	RANAP_Target_ToSource_TransparentContainer_encode_xer,
+	RANAP_Target_ToSource_TransparentContainer_decode_uper,
+	RANAP_Target_ToSource_TransparentContainer_encode_uper,
+	RANAP_Target_ToSource_TransparentContainer_decode_aper,
+	RANAP_Target_ToSource_TransparentContainer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_Target_ToSource_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Target-ToSource-TransparentContainer.h b/src/ranap/RANAP_Target-ToSource-TransparentContainer.h
new file mode 100644
index 0000000..0b82065
--- /dev/null
+++ b/src/ranap/RANAP_Target-ToSource-TransparentContainer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Target_ToSource_TransparentContainer_H_
+#define	_RANAP_Target_ToSource_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Target-ToSource-TransparentContainer */
+typedef OCTET_STRING_t	 RANAP_Target_ToSource_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Target_ToSource_TransparentContainer;
+asn_struct_free_f RANAP_Target_ToSource_TransparentContainer_free;
+asn_struct_print_f RANAP_Target_ToSource_TransparentContainer_print;
+asn_constr_check_f RANAP_Target_ToSource_TransparentContainer_constraint;
+ber_type_decoder_f RANAP_Target_ToSource_TransparentContainer_decode_ber;
+der_type_encoder_f RANAP_Target_ToSource_TransparentContainer_encode_der;
+xer_type_decoder_f RANAP_Target_ToSource_TransparentContainer_decode_xer;
+xer_type_encoder_f RANAP_Target_ToSource_TransparentContainer_encode_xer;
+per_type_decoder_f RANAP_Target_ToSource_TransparentContainer_decode_uper;
+per_type_encoder_f RANAP_Target_ToSource_TransparentContainer_encode_uper;
+per_type_decoder_f RANAP_Target_ToSource_TransparentContainer_decode_aper;
+per_type_encoder_f RANAP_Target_ToSource_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Target_ToSource_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargetBSS-ToSourceBSS-TransparentContainer.c b/src/ranap/RANAP_TargetBSS-ToSourceBSS-TransparentContainer.c
new file mode 100644
index 0000000..903f329
--- /dev/null
+++ b/src/ranap/RANAP_TargetBSS-ToSourceBSS-TransparentContainer.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargetBSS-ToSourceBSS-TransparentContainer.h"
+
+int
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer = {
+	"RANAP_TargetBSS-ToSourceBSS-TransparentContainer",
+	"RANAP_TargetBSS-ToSourceBSS-TransparentContainer",
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_free,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_print,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_constraint,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_ber,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_der,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_xer,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_xer,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_uper,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_uper,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_aper,
+	RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TargetBSS-ToSourceBSS-TransparentContainer.h b/src/ranap/RANAP_TargetBSS-ToSourceBSS-TransparentContainer.h
new file mode 100644
index 0000000..9ee065e
--- /dev/null
+++ b/src/ranap/RANAP_TargetBSS-ToSourceBSS-TransparentContainer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_H_
+#define	_RANAP_TargetBSS_ToSourceBSS_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TargetBSS-ToSourceBSS-TransparentContainer */
+typedef OCTET_STRING_t	 RANAP_TargetBSS_ToSourceBSS_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargetBSS_ToSourceBSS_TransparentContainer;
+asn_struct_free_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_free;
+asn_struct_print_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_print;
+asn_constr_check_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_constraint;
+ber_type_decoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_ber;
+der_type_encoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_der;
+xer_type_decoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_xer;
+xer_type_encoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_xer;
+per_type_decoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_uper;
+per_type_encoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_uper;
+per_type_decoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_decode_aper;
+per_type_encoder_f RANAP_TargetBSS_ToSourceBSS_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargetBSS_ToSourceBSS_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargetCellId.c b/src/ranap/RANAP_TargetCellId.c
new file mode 100644
index 0000000..3dcc855
--- /dev/null
+++ b/src/ranap/RANAP_TargetCellId.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargetCellId.h"
+
+int
+RANAP_TargetCellId_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 268435455l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TargetCellId_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_TargetCellId_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TargetCellId_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargetCellId_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TargetCellId_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargetCellId_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TargetCellId_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargetCellId_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TargetCellId_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TargetCellId_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TargetCellId_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TargetCellId_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TargetCellId_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 28, -1,  0l,  268435455l }	/* (0..268435455) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TargetCellId_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargetCellId = {
+	"RANAP_TargetCellId",
+	"RANAP_TargetCellId",
+	RANAP_TargetCellId_free,
+	RANAP_TargetCellId_print,
+	RANAP_TargetCellId_constraint,
+	RANAP_TargetCellId_decode_ber,
+	RANAP_TargetCellId_encode_der,
+	RANAP_TargetCellId_decode_xer,
+	RANAP_TargetCellId_encode_xer,
+	RANAP_TargetCellId_decode_uper,
+	RANAP_TargetCellId_encode_uper,
+	RANAP_TargetCellId_decode_aper,
+	RANAP_TargetCellId_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TargetCellId_tags_1,
+	sizeof(asn_DEF_RANAP_TargetCellId_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetCellId_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TargetCellId_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TargetCellId_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetCellId_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TargetCellId_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TargetCellId.h b/src/ranap/RANAP_TargetCellId.h
new file mode 100644
index 0000000..06dcb01
--- /dev/null
+++ b/src/ranap/RANAP_TargetCellId.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargetCellId_H_
+#define	_RANAP_TargetCellId_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TargetCellId */
+typedef long	 RANAP_TargetCellId_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargetCellId;
+asn_struct_free_f RANAP_TargetCellId_free;
+asn_struct_print_f RANAP_TargetCellId_print;
+asn_constr_check_f RANAP_TargetCellId_constraint;
+ber_type_decoder_f RANAP_TargetCellId_decode_ber;
+der_type_encoder_f RANAP_TargetCellId_encode_der;
+xer_type_decoder_f RANAP_TargetCellId_decode_xer;
+xer_type_encoder_f RANAP_TargetCellId_encode_xer;
+per_type_decoder_f RANAP_TargetCellId_decode_uper;
+per_type_encoder_f RANAP_TargetCellId_encode_uper;
+per_type_decoder_f RANAP_TargetCellId_decode_aper;
+per_type_encoder_f RANAP_TargetCellId_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargetCellId_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargetENB-ID.c b/src/ranap/RANAP_TargetENB-ID.c
new file mode 100644
index 0000000..5b83983
--- /dev/null
+++ b/src/ranap/RANAP_TargetENB-ID.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargetENB-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TargetENB_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetENB_ID, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetENB_ID, eNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_ENB_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"eNB-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TargetENB_ID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetENB_ID, selectedTAI),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"selectedTAI"
+		},
+};
+static const int asn_MAP_RANAP_TargetENB_ID_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TargetENB_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TargetENB_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* eNB-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* iE-Extensions */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* selectedTAI */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TargetENB_ID_specs_1 = {
+	sizeof(struct RANAP_TargetENB_ID),
+	offsetof(struct RANAP_TargetENB_ID, _asn_ctx),
+	asn_MAP_RANAP_TargetENB_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_TargetENB_ID_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargetENB_ID = {
+	"RANAP_TargetENB-ID",
+	"RANAP_TargetENB-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TargetENB_ID_tags_1,
+	sizeof(asn_DEF_RANAP_TargetENB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetENB_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TargetENB_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TargetENB_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetENB_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TargetENB_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_TargetENB_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TargetENB-ID.h b/src/ranap/RANAP_TargetENB-ID.h
new file mode 100644
index 0000000..aa0dc0f
--- /dev/null
+++ b/src/ranap/RANAP_TargetENB-ID.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargetENB_ID_H_
+#define	_RANAP_TargetENB_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_ENB-ID.h"
+#include "RANAP_IE-Extensions.h"
+#include "RANAP_TAI.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TargetENB-ID */
+typedef struct RANAP_TargetENB_ID {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_ENB_ID_t	 eNB_ID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	RANAP_TAI_t	 selectedTAI;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TargetENB_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargetENB_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargetENB_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargetID.c b/src/ranap/RANAP_TargetID.c
new file mode 100644
index 0000000..34572e8
--- /dev/null
+++ b/src/ranap/RANAP_TargetID.c
@@ -0,0 +1,82 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargetID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_TargetID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_TargetID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetID, choice.targetRNC_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetRNC_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"targetRNC-ID"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetID, choice.cGI),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_CGI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cGI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetID, choice.targeteNB_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetENB_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"targeteNB-ID"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TargetID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* targetRNC-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cGI */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* targeteNB-ID */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_TargetID_specs_1 = {
+	sizeof(struct RANAP_TargetID),
+	offsetof(struct RANAP_TargetID, _asn_ctx),
+	offsetof(struct RANAP_TargetID, present),
+	sizeof(((struct RANAP_TargetID *)0)->present),
+	asn_MAP_RANAP_TargetID_tag2el_1,
+	3,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargetID = {
+	"RANAP_TargetID",
+	"RANAP_TargetID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_TargetID_constr_1,
+	asn_MBR_RANAP_TargetID_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_TargetID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TargetID.h b/src/ranap/RANAP_TargetID.h
new file mode 100644
index 0000000..9f767a7
--- /dev/null
+++ b/src/ranap/RANAP_TargetID.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargetID_H_
+#define	_RANAP_TargetID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TargetRNC-ID.h"
+#include "RANAP_CGI.h"
+#include "RANAP_TargetENB-ID.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TargetID_PR {
+	RANAP_TargetID_PR_NOTHING,	/* No components present */
+	RANAP_TargetID_PR_targetRNC_ID,
+	RANAP_TargetID_PR_cGI,
+	/* Extensions may appear below */
+	RANAP_TargetID_PR_targeteNB_ID
+} RANAP_TargetID_PR;
+
+/* RANAP_TargetID */
+typedef struct RANAP_TargetID {
+	RANAP_TargetID_PR present;
+	union RANAP_TargetID_u {
+		RANAP_TargetRNC_ID_t	 targetRNC_ID;
+		RANAP_CGI_t	 cGI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		RANAP_TargetENB_ID_t	 targeteNB_ID;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TargetID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargetID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargetID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargetRNC-ID.c b/src/ranap/RANAP_TargetRNC-ID.c
new file mode 100644
index 0000000..b8cfe12
--- /dev/null
+++ b/src/ranap/RANAP_TargetRNC-ID.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargetRNC-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TargetRNC_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetRNC_ID, lAI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_LAI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"lAI"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TargetRNC_ID, rAC),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RAC,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rAC"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetRNC_ID, rNC_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RNC_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rNC-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TargetRNC_ID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TargetRNC_ID_oms_1[] = { 1, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TargetRNC_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TargetRNC_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* lAI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* rAC */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* rNC-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TargetRNC_ID_specs_1 = {
+	sizeof(struct RANAP_TargetRNC_ID),
+	offsetof(struct RANAP_TargetRNC_ID, _asn_ctx),
+	asn_MAP_RANAP_TargetRNC_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_TargetRNC_ID_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargetRNC_ID = {
+	"RANAP_TargetRNC-ID",
+	"RANAP_TargetRNC-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TargetRNC_ID_tags_1,
+	sizeof(asn_DEF_RANAP_TargetRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetRNC_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TargetRNC_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TargetRNC_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetRNC_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TargetRNC_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_TargetRNC_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TargetRNC-ID.h b/src/ranap/RANAP_TargetRNC-ID.h
new file mode 100644
index 0000000..e4bce7e
--- /dev/null
+++ b/src/ranap/RANAP_TargetRNC-ID.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargetRNC_ID_H_
+#define	_RANAP_TargetRNC_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_LAI.h"
+#include "RANAP_RAC.h"
+#include "RANAP_RNC-ID.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TargetRNC-ID */
+typedef struct RANAP_TargetRNC_ID {
+	RANAP_LAI_t	 lAI;
+	RANAP_RAC_t	*rAC	/* OPTIONAL */;
+	RANAP_RNC_ID_t	 rNC_ID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TargetRNC_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargetRNC_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargetRNC_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargetRNC-ToSourceRNC-TransparentContainer.c b/src/ranap/RANAP_TargetRNC-ToSourceRNC-TransparentContainer.c
new file mode 100644
index 0000000..c7aec3a
--- /dev/null
+++ b/src/ranap/RANAP_TargetRNC-ToSourceRNC-TransparentContainer.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargetRNC-ToSourceRNC-TransparentContainer.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TargetRNC_ToSourceRNC_TransparentContainer, rRC_Container),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_RRC_Container,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"rRC-Container"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_TargetRNC_ToSourceRNC_TransparentContainer, d_RNTI),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_D_RNTI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"d-RNTI"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TargetRNC_ToSourceRNC_TransparentContainer, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rRC-Container */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* d-RNTI */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_specs_1 = {
+	sizeof(struct RANAP_TargetRNC_ToSourceRNC_TransparentContainer),
+	offsetof(struct RANAP_TargetRNC_ToSourceRNC_TransparentContainer, _asn_ctx),
+	asn_MAP_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer = {
+	"RANAP_TargetRNC-ToSourceRNC-TransparentContainer",
+	"RANAP_TargetRNC-ToSourceRNC-TransparentContainer",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TargetRNC-ToSourceRNC-TransparentContainer.h b/src/ranap/RANAP_TargetRNC-ToSourceRNC-TransparentContainer.h
new file mode 100644
index 0000000..11b4ac0
--- /dev/null
+++ b/src/ranap/RANAP_TargetRNC-ToSourceRNC-TransparentContainer.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_H_
+#define	_RANAP_TargetRNC_ToSourceRNC_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_RRC-Container.h"
+#include "RANAP_D-RNTI.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TargetRNC-ToSourceRNC-TransparentContainer */
+typedef struct RANAP_TargetRNC_ToSourceRNC_TransparentContainer {
+	RANAP_RRC_Container_t	 rRC_Container;
+	RANAP_D_RNTI_t	*d_RNTI	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TargetRNC_ToSourceRNC_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargetRNC_ToSourceRNC_TransparentContainer;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargetRNC_ToSourceRNC_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.c b/src/ranap/RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.c
new file mode 100644
index 0000000..40ec851
--- /dev/null
+++ b/src/ranap/RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.h"
+
+int
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer = {
+	"RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer",
+	"RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer",
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_free,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_print,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_constraint,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_ber,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_der,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_xer,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_xer,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_uper,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_uper,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_aper,
+	RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1,
+	sizeof(asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1)
+		/sizeof(asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.h b/src/ranap/RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.h
new file mode 100644
index 0000000..82f02cd
--- /dev/null
+++ b/src/ranap/RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_H_
+#define	_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TargeteNodeB-ToSourceeNodeB-TransparentContainer */
+typedef OCTET_STRING_t	 RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer;
+asn_struct_free_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_free;
+asn_struct_print_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_print;
+asn_constr_check_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_constraint;
+ber_type_decoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_ber;
+der_type_encoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_der;
+xer_type_decoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_xer;
+xer_type_encoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_xer;
+per_type_decoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_uper;
+per_type_encoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_uper;
+per_type_decoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_decode_aper;
+per_type_encoder_f RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TargeteNodeB_ToSourceeNodeB_TransparentContainer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TemporaryUE-ID.c b/src/ranap/RANAP_TemporaryUE-ID.c
new file mode 100644
index 0000000..4d2fa89
--- /dev/null
+++ b/src/ranap/RANAP_TemporaryUE-ID.c
@@ -0,0 +1,72 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TemporaryUE-ID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_TemporaryUE_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_TemporaryUE_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TemporaryUE_ID, choice.tMSI),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TMSI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"tMSI"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TemporaryUE_ID, choice.p_TMSI),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_P_TMSI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"p-TMSI"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TemporaryUE_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tMSI */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* p-TMSI */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_TemporaryUE_ID_specs_1 = {
+	sizeof(struct RANAP_TemporaryUE_ID),
+	offsetof(struct RANAP_TemporaryUE_ID, _asn_ctx),
+	offsetof(struct RANAP_TemporaryUE_ID, present),
+	sizeof(((struct RANAP_TemporaryUE_ID *)0)->present),
+	asn_MAP_RANAP_TemporaryUE_ID_tag2el_1,
+	2,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TemporaryUE_ID = {
+	"RANAP_TemporaryUE-ID",
+	"RANAP_TemporaryUE-ID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_TemporaryUE_ID_constr_1,
+	asn_MBR_RANAP_TemporaryUE_ID_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_TemporaryUE_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TemporaryUE-ID.h b/src/ranap/RANAP_TemporaryUE-ID.h
new file mode 100644
index 0000000..37face9
--- /dev/null
+++ b/src/ranap/RANAP_TemporaryUE-ID.h
@@ -0,0 +1,55 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TemporaryUE_ID_H_
+#define	_RANAP_TemporaryUE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TMSI.h"
+#include "RANAP_P-TMSI.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TemporaryUE_ID_PR {
+	RANAP_TemporaryUE_ID_PR_NOTHING,	/* No components present */
+	RANAP_TemporaryUE_ID_PR_tMSI,
+	RANAP_TemporaryUE_ID_PR_p_TMSI,
+	/* Extensions may appear below */
+	
+} RANAP_TemporaryUE_ID_PR;
+
+/* RANAP_TemporaryUE-ID */
+typedef struct RANAP_TemporaryUE_ID {
+	RANAP_TemporaryUE_ID_PR present;
+	union RANAP_TemporaryUE_ID_u {
+		RANAP_TMSI_t	 tMSI;
+		RANAP_P_TMSI_t	 p_TMSI;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TemporaryUE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TemporaryUE_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TemporaryUE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Time-UE-StayedInCell-EnhancedGranularity.c b/src/ranap/RANAP_Time-UE-StayedInCell-EnhancedGranularity.c
new file mode 100644
index 0000000..25c7953
--- /dev/null
+++ b/src/ranap/RANAP_Time-UE-StayedInCell-EnhancedGranularity.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Time-UE-StayedInCell-EnhancedGranularity.h"
+
+int
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 40950l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Time_UE_StayedInCell_EnhancedGranularity_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  40950l }	/* (0..40950) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity = {
+	"RANAP_Time-UE-StayedInCell-EnhancedGranularity",
+	"RANAP_Time-UE-StayedInCell-EnhancedGranularity",
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_free,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_print,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_constraint,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_ber,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_der,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_xer,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_xer,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_uper,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_uper,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_aper,
+	RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1,
+	sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1)
+		/sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1)
+		/sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Time_UE_StayedInCell_EnhancedGranularity_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Time-UE-StayedInCell-EnhancedGranularity.h b/src/ranap/RANAP_Time-UE-StayedInCell-EnhancedGranularity.h
new file mode 100644
index 0000000..f525d6a
--- /dev/null
+++ b/src/ranap/RANAP_Time-UE-StayedInCell-EnhancedGranularity.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Time_UE_StayedInCell_EnhancedGranularity_H_
+#define	_RANAP_Time_UE_StayedInCell_EnhancedGranularity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Time-UE-StayedInCell-EnhancedGranularity */
+typedef long	 RANAP_Time_UE_StayedInCell_EnhancedGranularity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Time_UE_StayedInCell_EnhancedGranularity;
+asn_struct_free_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_free;
+asn_struct_print_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_print;
+asn_constr_check_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_constraint;
+ber_type_decoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_ber;
+der_type_encoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_der;
+xer_type_decoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_xer;
+xer_type_encoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_xer;
+per_type_decoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_uper;
+per_type_encoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_uper;
+per_type_decoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_decode_aper;
+per_type_encoder_f RANAP_Time_UE_StayedInCell_EnhancedGranularity_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Time_UE_StayedInCell_EnhancedGranularity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_Time-UE-StayedInCell.c b/src/ranap/RANAP_Time-UE-StayedInCell.c
new file mode 100644
index 0000000..a869a7d
--- /dev/null
+++ b/src/ranap/RANAP_Time-UE-StayedInCell.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_Time-UE-StayedInCell.h"
+
+int
+RANAP_Time_UE_StayedInCell_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 4095l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_Time_UE_StayedInCell_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_Time_UE_StayedInCell_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_Time_UE_StayedInCell_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_Time_UE_StayedInCell_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_Time_UE_StayedInCell_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_Time_UE_StayedInCell_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  0l,  4095l }	/* (0..4095) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_Time_UE_StayedInCell_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_Time_UE_StayedInCell = {
+	"RANAP_Time-UE-StayedInCell",
+	"RANAP_Time-UE-StayedInCell",
+	RANAP_Time_UE_StayedInCell_free,
+	RANAP_Time_UE_StayedInCell_print,
+	RANAP_Time_UE_StayedInCell_constraint,
+	RANAP_Time_UE_StayedInCell_decode_ber,
+	RANAP_Time_UE_StayedInCell_encode_der,
+	RANAP_Time_UE_StayedInCell_decode_xer,
+	RANAP_Time_UE_StayedInCell_encode_xer,
+	RANAP_Time_UE_StayedInCell_decode_uper,
+	RANAP_Time_UE_StayedInCell_encode_uper,
+	RANAP_Time_UE_StayedInCell_decode_aper,
+	RANAP_Time_UE_StayedInCell_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_Time_UE_StayedInCell_tags_1,
+	sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_tags_1)
+		/sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_Time_UE_StayedInCell_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_tags_1)
+		/sizeof(asn_DEF_RANAP_Time_UE_StayedInCell_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_Time_UE_StayedInCell_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_Time-UE-StayedInCell.h b/src/ranap/RANAP_Time-UE-StayedInCell.h
new file mode 100644
index 0000000..d87a899
--- /dev/null
+++ b/src/ranap/RANAP_Time-UE-StayedInCell.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_Time_UE_StayedInCell_H_
+#define	_RANAP_Time_UE_StayedInCell_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_Time-UE-StayedInCell */
+typedef long	 RANAP_Time_UE_StayedInCell_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_Time_UE_StayedInCell;
+asn_struct_free_f RANAP_Time_UE_StayedInCell_free;
+asn_struct_print_f RANAP_Time_UE_StayedInCell_print;
+asn_constr_check_f RANAP_Time_UE_StayedInCell_constraint;
+ber_type_decoder_f RANAP_Time_UE_StayedInCell_decode_ber;
+der_type_encoder_f RANAP_Time_UE_StayedInCell_encode_der;
+xer_type_decoder_f RANAP_Time_UE_StayedInCell_decode_xer;
+xer_type_encoder_f RANAP_Time_UE_StayedInCell_encode_xer;
+per_type_decoder_f RANAP_Time_UE_StayedInCell_decode_uper;
+per_type_encoder_f RANAP_Time_UE_StayedInCell_encode_uper;
+per_type_decoder_f RANAP_Time_UE_StayedInCell_decode_aper;
+per_type_encoder_f RANAP_Time_UE_StayedInCell_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_Time_UE_StayedInCell_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TimeToMBMSDataTransfer.c b/src/ranap/RANAP_TimeToMBMSDataTransfer.c
new file mode 100644
index 0000000..c6e7c4d
--- /dev/null
+++ b/src/ranap/RANAP_TimeToMBMSDataTransfer.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TimeToMBMSDataTransfer.h"
+
+int
+RANAP_TimeToMBMSDataTransfer_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TimeToMBMSDataTransfer_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TimeToMBMSDataTransfer_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TimeToMBMSDataTransfer_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TimeToMBMSDataTransfer_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TimeToMBMSDataTransfer_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TimeToMBMSDataTransfer_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TimeToMBMSDataTransfer_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TimeToMBMSDataTransfer_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TimeToMBMSDataTransfer_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TimeToMBMSDataTransfer_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TimeToMBMSDataTransfer_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TimeToMBMSDataTransfer_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TimeToMBMSDataTransfer = {
+	"RANAP_TimeToMBMSDataTransfer",
+	"RANAP_TimeToMBMSDataTransfer",
+	RANAP_TimeToMBMSDataTransfer_free,
+	RANAP_TimeToMBMSDataTransfer_print,
+	RANAP_TimeToMBMSDataTransfer_constraint,
+	RANAP_TimeToMBMSDataTransfer_decode_ber,
+	RANAP_TimeToMBMSDataTransfer_encode_der,
+	RANAP_TimeToMBMSDataTransfer_decode_xer,
+	RANAP_TimeToMBMSDataTransfer_encode_xer,
+	RANAP_TimeToMBMSDataTransfer_decode_uper,
+	RANAP_TimeToMBMSDataTransfer_encode_uper,
+	RANAP_TimeToMBMSDataTransfer_decode_aper,
+	RANAP_TimeToMBMSDataTransfer_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1,
+	sizeof(asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1)
+		/sizeof(asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1)
+		/sizeof(asn_DEF_RANAP_TimeToMBMSDataTransfer_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TimeToMBMSDataTransfer_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TimeToMBMSDataTransfer.h b/src/ranap/RANAP_TimeToMBMSDataTransfer.h
new file mode 100644
index 0000000..31ede6e
--- /dev/null
+++ b/src/ranap/RANAP_TimeToMBMSDataTransfer.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TimeToMBMSDataTransfer_H_
+#define	_RANAP_TimeToMBMSDataTransfer_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TimeToMBMSDataTransfer */
+typedef OCTET_STRING_t	 RANAP_TimeToMBMSDataTransfer_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TimeToMBMSDataTransfer;
+asn_struct_free_f RANAP_TimeToMBMSDataTransfer_free;
+asn_struct_print_f RANAP_TimeToMBMSDataTransfer_print;
+asn_constr_check_f RANAP_TimeToMBMSDataTransfer_constraint;
+ber_type_decoder_f RANAP_TimeToMBMSDataTransfer_decode_ber;
+der_type_encoder_f RANAP_TimeToMBMSDataTransfer_encode_der;
+xer_type_decoder_f RANAP_TimeToMBMSDataTransfer_decode_xer;
+xer_type_encoder_f RANAP_TimeToMBMSDataTransfer_encode_xer;
+per_type_decoder_f RANAP_TimeToMBMSDataTransfer_decode_uper;
+per_type_encoder_f RANAP_TimeToMBMSDataTransfer_encode_uper;
+per_type_decoder_f RANAP_TimeToMBMSDataTransfer_decode_aper;
+per_type_encoder_f RANAP_TimeToMBMSDataTransfer_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TimeToMBMSDataTransfer_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TimingDifferenceULDL.c b/src/ranap/RANAP_TimingDifferenceULDL.c
new file mode 100644
index 0000000..3845e82
--- /dev/null
+++ b/src/ranap/RANAP_TimingDifferenceULDL.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TimingDifferenceULDL.h"
+
+int
+RANAP_TimingDifferenceULDL_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TimingDifferenceULDL_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TimingDifferenceULDL_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TimingDifferenceULDL_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TimingDifferenceULDL_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TimingDifferenceULDL_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TimingDifferenceULDL_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TimingDifferenceULDL_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TimingDifferenceULDL_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TimingDifferenceULDL_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TimingDifferenceULDL_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TimingDifferenceULDL_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TimingDifferenceULDL_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TimingDifferenceULDL_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TimingDifferenceULDL = {
+	"RANAP_TimingDifferenceULDL",
+	"RANAP_TimingDifferenceULDL",
+	RANAP_TimingDifferenceULDL_free,
+	RANAP_TimingDifferenceULDL_print,
+	RANAP_TimingDifferenceULDL_constraint,
+	RANAP_TimingDifferenceULDL_decode_ber,
+	RANAP_TimingDifferenceULDL_encode_der,
+	RANAP_TimingDifferenceULDL_decode_xer,
+	RANAP_TimingDifferenceULDL_encode_xer,
+	RANAP_TimingDifferenceULDL_decode_uper,
+	RANAP_TimingDifferenceULDL_encode_uper,
+	RANAP_TimingDifferenceULDL_decode_aper,
+	RANAP_TimingDifferenceULDL_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TimingDifferenceULDL_tags_1,
+	sizeof(asn_DEF_RANAP_TimingDifferenceULDL_tags_1)
+		/sizeof(asn_DEF_RANAP_TimingDifferenceULDL_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TimingDifferenceULDL_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TimingDifferenceULDL_tags_1)
+		/sizeof(asn_DEF_RANAP_TimingDifferenceULDL_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TimingDifferenceULDL_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TimingDifferenceULDL.h b/src/ranap/RANAP_TimingDifferenceULDL.h
new file mode 100644
index 0000000..7497493
--- /dev/null
+++ b/src/ranap/RANAP_TimingDifferenceULDL.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TimingDifferenceULDL_H_
+#define	_RANAP_TimingDifferenceULDL_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TimingDifferenceULDL */
+typedef OCTET_STRING_t	 RANAP_TimingDifferenceULDL_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TimingDifferenceULDL;
+asn_struct_free_f RANAP_TimingDifferenceULDL_free;
+asn_struct_print_f RANAP_TimingDifferenceULDL_print;
+asn_constr_check_f RANAP_TimingDifferenceULDL_constraint;
+ber_type_decoder_f RANAP_TimingDifferenceULDL_decode_ber;
+der_type_encoder_f RANAP_TimingDifferenceULDL_encode_der;
+xer_type_decoder_f RANAP_TimingDifferenceULDL_decode_xer;
+xer_type_encoder_f RANAP_TimingDifferenceULDL_encode_xer;
+per_type_decoder_f RANAP_TimingDifferenceULDL_decode_uper;
+per_type_encoder_f RANAP_TimingDifferenceULDL_encode_uper;
+per_type_decoder_f RANAP_TimingDifferenceULDL_decode_aper;
+per_type_encoder_f RANAP_TimingDifferenceULDL_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TimingDifferenceULDL_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TrCH-ID-List.c b/src/ranap/RANAP_TrCH-ID-List.c
new file mode 100644
index 0000000..1509605
--- /dev/null
+++ b/src/ranap/RANAP_TrCH-ID-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TrCH-ID-List.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_TrCH_ID_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 3,  3,  1l,  7l }	/* (SIZE(1..7)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_TrCH_ID_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_TrCH_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TrCH_ID_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_RANAP_TrCH_ID_List_specs_1 = {
+	sizeof(struct RANAP_TrCH_ID_List),
+	offsetof(struct RANAP_TrCH_ID_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TrCH_ID_List = {
+	"RANAP_TrCH-ID-List",
+	"RANAP_TrCH-ID-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TrCH_ID_List_tags_1,
+	sizeof(asn_DEF_RANAP_TrCH_ID_List_tags_1)
+		/sizeof(asn_DEF_RANAP_TrCH_ID_List_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TrCH_ID_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TrCH_ID_List_tags_1)
+		/sizeof(asn_DEF_RANAP_TrCH_ID_List_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TrCH_ID_List_constr_1,
+	asn_MBR_RANAP_TrCH_ID_List_1,
+	1,	/* Single element */
+	&asn_SPC_RANAP_TrCH_ID_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TrCH-ID-List.h b/src/ranap/RANAP_TrCH-ID-List.h
new file mode 100644
index 0000000..b474910
--- /dev/null
+++ b/src/ranap/RANAP_TrCH-ID-List.h
@@ -0,0 +1,38 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TrCH_ID_List_H_
+#define	_RANAP_TrCH_ID_List_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TrCH-ID.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TrCH-ID-List */
+typedef struct RANAP_TrCH_ID_List {
+	A_SEQUENCE_OF(RANAP_TrCH_ID_t) list;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TrCH_ID_List_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TrCH_ID_List;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TrCH_ID_List_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TrCH-ID.c b/src/ranap/RANAP_TrCH-ID.c
new file mode 100644
index 0000000..b4d7ce6
--- /dev/null
+++ b/src/ranap/RANAP_TrCH-ID.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TrCH-ID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TrCH_ID_1[] = {
+	{ ATF_POINTER, 4, offsetof(struct RANAP_TrCH_ID, dCH_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DCH_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"dCH-ID"
+		},
+	{ ATF_POINTER, 3, offsetof(struct RANAP_TrCH_ID, dSCH_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DSCH_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"dSCH-ID"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_TrCH_ID, uSCH_ID),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_USCH_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uSCH-ID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TrCH_ID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TrCH_ID_oms_1[] = { 0, 1, 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TrCH_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TrCH_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* dCH-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dSCH-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* uSCH-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TrCH_ID_specs_1 = {
+	sizeof(struct RANAP_TrCH_ID),
+	offsetof(struct RANAP_TrCH_ID, _asn_ctx),
+	asn_MAP_RANAP_TrCH_ID_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_TrCH_ID_oms_1,	/* Optional members */
+	4, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TrCH_ID = {
+	"RANAP_TrCH-ID",
+	"RANAP_TrCH-ID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TrCH_ID_tags_1,
+	sizeof(asn_DEF_RANAP_TrCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_TrCH_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TrCH_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TrCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_TrCH_ID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TrCH_ID_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_TrCH_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TrCH-ID.h b/src/ranap/RANAP_TrCH-ID.h
new file mode 100644
index 0000000..09501b8
--- /dev/null
+++ b/src/ranap/RANAP_TrCH-ID.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TrCH_ID_H_
+#define	_RANAP_TrCH_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_DCH-ID.h"
+#include "RANAP_DSCH-ID.h"
+#include "RANAP_USCH-ID.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TrCH-ID */
+typedef struct RANAP_TrCH_ID {
+	RANAP_DCH_ID_t	*dCH_ID	/* OPTIONAL */;
+	RANAP_DSCH_ID_t	*dSCH_ID	/* OPTIONAL */;
+	RANAP_USCH_ID_t	*uSCH_ID	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TrCH_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TrCH_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TrCH_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TraceDepth.c b/src/ranap/RANAP_TraceDepth.c
new file mode 100644
index 0000000..9d4e35e
--- /dev/null
+++ b/src/ranap/RANAP_TraceDepth.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TraceDepth.h"
+
+int
+RANAP_TraceDepth_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TraceDepth_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_TraceDepth_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TraceDepth_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceDepth_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TraceDepth_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceDepth_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TraceDepth_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceDepth_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TraceDepth_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TraceDepth_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TraceDepth_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceDepth_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TraceDepth_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_TraceDepth_value2enum_1[] = {
+	{ 0,	7,	"minimum" },
+	{ 1,	6,	"medium" },
+	{ 2,	7,	"maximum" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_TraceDepth_enum2value_1[] = {
+	2,	/* maximum(2) */
+	1,	/* medium(1) */
+	0	/* minimum(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_TraceDepth_specs_1 = {
+	asn_MAP_RANAP_TraceDepth_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_TraceDepth_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	4,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TraceDepth_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TraceDepth = {
+	"RANAP_TraceDepth",
+	"RANAP_TraceDepth",
+	RANAP_TraceDepth_free,
+	RANAP_TraceDepth_print,
+	RANAP_TraceDepth_constraint,
+	RANAP_TraceDepth_decode_ber,
+	RANAP_TraceDepth_encode_der,
+	RANAP_TraceDepth_decode_xer,
+	RANAP_TraceDepth_encode_xer,
+	RANAP_TraceDepth_decode_uper,
+	RANAP_TraceDepth_encode_uper,
+	RANAP_TraceDepth_decode_aper,
+	RANAP_TraceDepth_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TraceDepth_tags_1,
+	sizeof(asn_DEF_RANAP_TraceDepth_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceDepth_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TraceDepth_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TraceDepth_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceDepth_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TraceDepth_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_TraceDepth_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TraceDepth.h b/src/ranap/RANAP_TraceDepth.h
new file mode 100644
index 0000000..4bad74d
--- /dev/null
+++ b/src/ranap/RANAP_TraceDepth.h
@@ -0,0 +1,52 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TraceDepth_H_
+#define	_RANAP_TraceDepth_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TraceDepth {
+	RANAP_TraceDepth_minimum	= 0,
+	RANAP_TraceDepth_medium	= 1,
+	RANAP_TraceDepth_maximum	= 2
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_TraceDepth;
+
+/* RANAP_TraceDepth */
+typedef long	 RANAP_TraceDepth_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TraceDepth;
+asn_struct_free_f RANAP_TraceDepth_free;
+asn_struct_print_f RANAP_TraceDepth_print;
+asn_constr_check_f RANAP_TraceDepth_constraint;
+ber_type_decoder_f RANAP_TraceDepth_decode_ber;
+der_type_encoder_f RANAP_TraceDepth_encode_der;
+xer_type_decoder_f RANAP_TraceDepth_decode_xer;
+xer_type_encoder_f RANAP_TraceDepth_encode_xer;
+per_type_decoder_f RANAP_TraceDepth_decode_uper;
+per_type_encoder_f RANAP_TraceDepth_encode_uper;
+per_type_decoder_f RANAP_TraceDepth_decode_aper;
+per_type_encoder_f RANAP_TraceDepth_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TraceDepth_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TraceInformation.c b/src/ranap/RANAP_TraceInformation.c
new file mode 100644
index 0000000..dd3a1e6
--- /dev/null
+++ b/src/ranap/RANAP_TraceInformation.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TraceInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TraceInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TraceInformation, traceReference),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceReference,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceReference"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TraceInformation, ue_identity),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_RANAP_UE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"ue-identity"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_TraceInformation, tracePropagationParameters),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TracePropagationParameters,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"tracePropagationParameters"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TraceInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TraceInformation_oms_1[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TraceInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TraceInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* traceReference */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* ue-identity */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* tracePropagationParameters */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TraceInformation_specs_1 = {
+	sizeof(struct RANAP_TraceInformation),
+	offsetof(struct RANAP_TraceInformation, _asn_ctx),
+	asn_MAP_RANAP_TraceInformation_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_TraceInformation_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TraceInformation = {
+	"RANAP_TraceInformation",
+	"RANAP_TraceInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TraceInformation_tags_1,
+	sizeof(asn_DEF_RANAP_TraceInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TraceInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TraceInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TraceInformation_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_TraceInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TraceInformation.h b/src/ranap/RANAP_TraceInformation.h
new file mode 100644
index 0000000..dcb2fc0
--- /dev/null
+++ b/src/ranap/RANAP_TraceInformation.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TraceInformation_H_
+#define	_RANAP_TraceInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TraceReference.h"
+#include "RANAP_UE-ID.h"
+#include "RANAP_TracePropagationParameters.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TraceInformation */
+typedef struct RANAP_TraceInformation {
+	RANAP_TraceReference_t	 traceReference;
+	RANAP_UE_ID_t	 ue_identity;
+	RANAP_TracePropagationParameters_t	*tracePropagationParameters	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TraceInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TraceInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TraceInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TracePropagationParameters.c b/src/ranap/RANAP_TracePropagationParameters.c
new file mode 100644
index 0000000..a09f7d0
--- /dev/null
+++ b/src/ranap/RANAP_TracePropagationParameters.c
@@ -0,0 +1,93 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TracePropagationParameters.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TracePropagationParameters_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TracePropagationParameters, traceRecordingSessionReference),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceRecordingSessionReference,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceRecordingSessionReference"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TracePropagationParameters, traceDepth),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceDepth,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceDepth"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_TracePropagationParameters, listOfInterfacesToTrace),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ListOfInterfacesToTrace,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"listOfInterfacesToTrace"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TracePropagationParameters, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TracePropagationParameters_oms_1[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TracePropagationParameters_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TracePropagationParameters_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* traceRecordingSessionReference */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* traceDepth */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* listOfInterfacesToTrace */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TracePropagationParameters_specs_1 = {
+	sizeof(struct RANAP_TracePropagationParameters),
+	offsetof(struct RANAP_TracePropagationParameters, _asn_ctx),
+	asn_MAP_RANAP_TracePropagationParameters_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_RANAP_TracePropagationParameters_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TracePropagationParameters = {
+	"RANAP_TracePropagationParameters",
+	"RANAP_TracePropagationParameters",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TracePropagationParameters_tags_1,
+	sizeof(asn_DEF_RANAP_TracePropagationParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_TracePropagationParameters_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TracePropagationParameters_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TracePropagationParameters_tags_1)
+		/sizeof(asn_DEF_RANAP_TracePropagationParameters_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TracePropagationParameters_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_TracePropagationParameters_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TracePropagationParameters.h b/src/ranap/RANAP_TracePropagationParameters.h
new file mode 100644
index 0000000..2ff5640
--- /dev/null
+++ b/src/ranap/RANAP_TracePropagationParameters.h
@@ -0,0 +1,47 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TracePropagationParameters_H_
+#define	_RANAP_TracePropagationParameters_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TraceRecordingSessionReference.h"
+#include "RANAP_TraceDepth.h"
+#include "RANAP_ListOfInterfacesToTrace.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TracePropagationParameters */
+typedef struct RANAP_TracePropagationParameters {
+	RANAP_TraceRecordingSessionReference_t	 traceRecordingSessionReference;
+	RANAP_TraceDepth_t	 traceDepth;
+	RANAP_ListOfInterfacesToTrace_t	*listOfInterfacesToTrace	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TracePropagationParameters_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TracePropagationParameters;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TracePropagationParameters_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TraceRecordingSessionInformation.c b/src/ranap/RANAP_TraceRecordingSessionInformation.c
new file mode 100644
index 0000000..1fd2e4c
--- /dev/null
+++ b/src/ranap/RANAP_TraceRecordingSessionInformation.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TraceRecordingSessionInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TraceRecordingSessionInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TraceRecordingSessionInformation, traceReference),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceReference,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceReference"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TraceRecordingSessionInformation, traceRecordingSessionReference),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TraceRecordingSessionReference,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"traceRecordingSessionReference"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TraceRecordingSessionInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TraceRecordingSessionInformation_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TraceRecordingSessionInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* traceReference */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* traceRecordingSessionReference */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TraceRecordingSessionInformation_specs_1 = {
+	sizeof(struct RANAP_TraceRecordingSessionInformation),
+	offsetof(struct RANAP_TraceRecordingSessionInformation, _asn_ctx),
+	asn_MAP_RANAP_TraceRecordingSessionInformation_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_TraceRecordingSessionInformation_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TraceRecordingSessionInformation = {
+	"RANAP_TraceRecordingSessionInformation",
+	"RANAP_TraceRecordingSessionInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1,
+	sizeof(asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceRecordingSessionInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TraceRecordingSessionInformation_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_TraceRecordingSessionInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TraceRecordingSessionInformation.h b/src/ranap/RANAP_TraceRecordingSessionInformation.h
new file mode 100644
index 0000000..76c4d8e
--- /dev/null
+++ b/src/ranap/RANAP_TraceRecordingSessionInformation.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TraceRecordingSessionInformation_H_
+#define	_RANAP_TraceRecordingSessionInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TraceReference.h"
+#include "RANAP_TraceRecordingSessionReference.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TraceRecordingSessionInformation */
+typedef struct RANAP_TraceRecordingSessionInformation {
+	RANAP_TraceReference_t	 traceReference;
+	RANAP_TraceRecordingSessionReference_t	 traceRecordingSessionReference;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TraceRecordingSessionInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TraceRecordingSessionInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TraceRecordingSessionInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TraceRecordingSessionReference.c b/src/ranap/RANAP_TraceRecordingSessionReference.c
new file mode 100644
index 0000000..0c02124
--- /dev/null
+++ b/src/ranap/RANAP_TraceRecordingSessionReference.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TraceRecordingSessionReference.h"
+
+int
+RANAP_TraceRecordingSessionReference_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_TraceRecordingSessionReference_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TraceRecordingSessionReference_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceRecordingSessionReference_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TraceRecordingSessionReference_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceRecordingSessionReference_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TraceRecordingSessionReference_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceRecordingSessionReference_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TraceRecordingSessionReference_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TraceRecordingSessionReference_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TraceRecordingSessionReference_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceRecordingSessionReference_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TraceRecordingSessionReference_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TraceRecordingSessionReference_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TraceRecordingSessionReference = {
+	"RANAP_TraceRecordingSessionReference",
+	"RANAP_TraceRecordingSessionReference",
+	RANAP_TraceRecordingSessionReference_free,
+	RANAP_TraceRecordingSessionReference_print,
+	RANAP_TraceRecordingSessionReference_constraint,
+	RANAP_TraceRecordingSessionReference_decode_ber,
+	RANAP_TraceRecordingSessionReference_encode_der,
+	RANAP_TraceRecordingSessionReference_decode_xer,
+	RANAP_TraceRecordingSessionReference_encode_xer,
+	RANAP_TraceRecordingSessionReference_decode_uper,
+	RANAP_TraceRecordingSessionReference_encode_uper,
+	RANAP_TraceRecordingSessionReference_decode_aper,
+	RANAP_TraceRecordingSessionReference_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TraceRecordingSessionReference_tags_1,
+	sizeof(asn_DEF_RANAP_TraceRecordingSessionReference_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceRecordingSessionReference_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TraceRecordingSessionReference_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TraceRecordingSessionReference_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceRecordingSessionReference_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TraceRecordingSessionReference_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TraceRecordingSessionReference.h b/src/ranap/RANAP_TraceRecordingSessionReference.h
new file mode 100644
index 0000000..7545987
--- /dev/null
+++ b/src/ranap/RANAP_TraceRecordingSessionReference.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TraceRecordingSessionReference_H_
+#define	_RANAP_TraceRecordingSessionReference_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TraceRecordingSessionReference */
+typedef long	 RANAP_TraceRecordingSessionReference_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TraceRecordingSessionReference;
+asn_struct_free_f RANAP_TraceRecordingSessionReference_free;
+asn_struct_print_f RANAP_TraceRecordingSessionReference_print;
+asn_constr_check_f RANAP_TraceRecordingSessionReference_constraint;
+ber_type_decoder_f RANAP_TraceRecordingSessionReference_decode_ber;
+der_type_encoder_f RANAP_TraceRecordingSessionReference_encode_der;
+xer_type_decoder_f RANAP_TraceRecordingSessionReference_decode_xer;
+xer_type_encoder_f RANAP_TraceRecordingSessionReference_encode_xer;
+per_type_decoder_f RANAP_TraceRecordingSessionReference_decode_uper;
+per_type_encoder_f RANAP_TraceRecordingSessionReference_encode_uper;
+per_type_decoder_f RANAP_TraceRecordingSessionReference_decode_aper;
+per_type_encoder_f RANAP_TraceRecordingSessionReference_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TraceRecordingSessionReference_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TraceReference.c b/src/ranap/RANAP_TraceReference.c
new file mode 100644
index 0000000..7dcac60
--- /dev/null
+++ b/src/ranap/RANAP_TraceReference.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TraceReference.h"
+
+int
+RANAP_TraceReference_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 2l && size <= 3l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TraceReference_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TraceReference_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TraceReference_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceReference_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TraceReference_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceReference_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TraceReference_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceReference_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TraceReference_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TraceReference_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TraceReference_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceReference_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TraceReference_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 1,  1,  2l,  3l }	/* (SIZE(2..3)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TraceReference_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TraceReference = {
+	"RANAP_TraceReference",
+	"RANAP_TraceReference",
+	RANAP_TraceReference_free,
+	RANAP_TraceReference_print,
+	RANAP_TraceReference_constraint,
+	RANAP_TraceReference_decode_ber,
+	RANAP_TraceReference_encode_der,
+	RANAP_TraceReference_decode_xer,
+	RANAP_TraceReference_encode_xer,
+	RANAP_TraceReference_decode_uper,
+	RANAP_TraceReference_encode_uper,
+	RANAP_TraceReference_decode_aper,
+	RANAP_TraceReference_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TraceReference_tags_1,
+	sizeof(asn_DEF_RANAP_TraceReference_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceReference_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TraceReference_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TraceReference_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceReference_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TraceReference_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TraceReference.h b/src/ranap/RANAP_TraceReference.h
new file mode 100644
index 0000000..ab3069d
--- /dev/null
+++ b/src/ranap/RANAP_TraceReference.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TraceReference_H_
+#define	_RANAP_TraceReference_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TraceReference */
+typedef OCTET_STRING_t	 RANAP_TraceReference_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TraceReference;
+asn_struct_free_f RANAP_TraceReference_free;
+asn_struct_print_f RANAP_TraceReference_print;
+asn_constr_check_f RANAP_TraceReference_constraint;
+ber_type_decoder_f RANAP_TraceReference_decode_ber;
+der_type_encoder_f RANAP_TraceReference_encode_der;
+xer_type_decoder_f RANAP_TraceReference_decode_xer;
+xer_type_encoder_f RANAP_TraceReference_encode_xer;
+per_type_decoder_f RANAP_TraceReference_decode_uper;
+per_type_encoder_f RANAP_TraceReference_encode_uper;
+per_type_decoder_f RANAP_TraceReference_decode_aper;
+per_type_encoder_f RANAP_TraceReference_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TraceReference_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TraceType.c b/src/ranap/RANAP_TraceType.c
new file mode 100644
index 0000000..536ee16
--- /dev/null
+++ b/src/ranap/RANAP_TraceType.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TraceType.h"
+
+int
+RANAP_TraceType_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 1l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TraceType_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TraceType_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TraceType_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceType_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TraceType_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceType_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TraceType_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TraceType_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TraceType_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TraceType_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TraceType_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TraceType_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TraceType_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  1l,  1l }	/* (SIZE(1..1)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TraceType_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TraceType = {
+	"RANAP_TraceType",
+	"RANAP_TraceType",
+	RANAP_TraceType_free,
+	RANAP_TraceType_print,
+	RANAP_TraceType_constraint,
+	RANAP_TraceType_decode_ber,
+	RANAP_TraceType_encode_der,
+	RANAP_TraceType_decode_xer,
+	RANAP_TraceType_encode_xer,
+	RANAP_TraceType_decode_uper,
+	RANAP_TraceType_encode_uper,
+	RANAP_TraceType_decode_aper,
+	RANAP_TraceType_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TraceType_tags_1,
+	sizeof(asn_DEF_RANAP_TraceType_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceType_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TraceType_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TraceType_tags_1)
+		/sizeof(asn_DEF_RANAP_TraceType_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TraceType_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TraceType.h b/src/ranap/RANAP_TraceType.h
new file mode 100644
index 0000000..1f1edb4
--- /dev/null
+++ b/src/ranap/RANAP_TraceType.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TraceType_H_
+#define	_RANAP_TraceType_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TraceType */
+typedef OCTET_STRING_t	 RANAP_TraceType_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TraceType;
+asn_struct_free_f RANAP_TraceType_free;
+asn_struct_print_f RANAP_TraceType_print;
+asn_constr_check_f RANAP_TraceType_constraint;
+ber_type_decoder_f RANAP_TraceType_decode_ber;
+der_type_encoder_f RANAP_TraceType_encode_der;
+xer_type_decoder_f RANAP_TraceType_decode_xer;
+xer_type_encoder_f RANAP_TraceType_encode_xer;
+per_type_decoder_f RANAP_TraceType_decode_uper;
+per_type_encoder_f RANAP_TraceType_encode_uper;
+per_type_decoder_f RANAP_TraceType_decode_aper;
+per_type_encoder_f RANAP_TraceType_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TraceType_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TrafficClass.c b/src/ranap/RANAP_TrafficClass.c
new file mode 100644
index 0000000..f15e550
--- /dev/null
+++ b/src/ranap/RANAP_TrafficClass.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TrafficClass.h"
+
+int
+RANAP_TrafficClass_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TrafficClass_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_TrafficClass_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TrafficClass_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TrafficClass_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TrafficClass_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TrafficClass_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TrafficClass_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TrafficClass_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TrafficClass_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TrafficClass_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TrafficClass_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TrafficClass_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TrafficClass_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_TrafficClass_value2enum_1[] = {
+	{ 0,	14,	"conversational" },
+	{ 1,	9,	"streaming" },
+	{ 2,	11,	"interactive" },
+	{ 3,	10,	"background" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_TrafficClass_enum2value_1[] = {
+	3,	/* background(3) */
+	0,	/* conversational(0) */
+	2,	/* interactive(2) */
+	1	/* streaming(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_TrafficClass_specs_1 = {
+	asn_MAP_RANAP_TrafficClass_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_TrafficClass_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	5,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TrafficClass_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TrafficClass = {
+	"RANAP_TrafficClass",
+	"RANAP_TrafficClass",
+	RANAP_TrafficClass_free,
+	RANAP_TrafficClass_print,
+	RANAP_TrafficClass_constraint,
+	RANAP_TrafficClass_decode_ber,
+	RANAP_TrafficClass_encode_der,
+	RANAP_TrafficClass_decode_xer,
+	RANAP_TrafficClass_encode_xer,
+	RANAP_TrafficClass_decode_uper,
+	RANAP_TrafficClass_encode_uper,
+	RANAP_TrafficClass_decode_aper,
+	RANAP_TrafficClass_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TrafficClass_tags_1,
+	sizeof(asn_DEF_RANAP_TrafficClass_tags_1)
+		/sizeof(asn_DEF_RANAP_TrafficClass_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TrafficClass_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TrafficClass_tags_1)
+		/sizeof(asn_DEF_RANAP_TrafficClass_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TrafficClass_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_TrafficClass_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TrafficClass.h b/src/ranap/RANAP_TrafficClass.h
new file mode 100644
index 0000000..5d3eb28
--- /dev/null
+++ b/src/ranap/RANAP_TrafficClass.h
@@ -0,0 +1,53 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TrafficClass_H_
+#define	_RANAP_TrafficClass_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TrafficClass {
+	RANAP_TrafficClass_conversational	= 0,
+	RANAP_TrafficClass_streaming	= 1,
+	RANAP_TrafficClass_interactive	= 2,
+	RANAP_TrafficClass_background	= 3
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_TrafficClass;
+
+/* RANAP_TrafficClass */
+typedef long	 RANAP_TrafficClass_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TrafficClass;
+asn_struct_free_f RANAP_TrafficClass_free;
+asn_struct_print_f RANAP_TrafficClass_print;
+asn_constr_check_f RANAP_TrafficClass_constraint;
+ber_type_decoder_f RANAP_TrafficClass_decode_ber;
+der_type_encoder_f RANAP_TrafficClass_encode_der;
+xer_type_decoder_f RANAP_TrafficClass_decode_xer;
+xer_type_encoder_f RANAP_TrafficClass_encode_xer;
+per_type_decoder_f RANAP_TrafficClass_decode_uper;
+per_type_encoder_f RANAP_TrafficClass_encode_uper;
+per_type_decoder_f RANAP_TrafficClass_decode_aper;
+per_type_encoder_f RANAP_TrafficClass_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TrafficClass_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TrafficHandlingPriority.c b/src/ranap/RANAP_TrafficHandlingPriority.c
new file mode 100644
index 0000000..ebc833e
--- /dev/null
+++ b/src/ranap/RANAP_TrafficHandlingPriority.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TrafficHandlingPriority.h"
+
+int
+RANAP_TrafficHandlingPriority_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 15l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_TrafficHandlingPriority_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TrafficHandlingPriority_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TrafficHandlingPriority_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TrafficHandlingPriority_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TrafficHandlingPriority_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TrafficHandlingPriority_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TrafficHandlingPriority_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TrafficHandlingPriority_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TrafficHandlingPriority_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TrafficHandlingPriority_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TrafficHandlingPriority_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TrafficHandlingPriority_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 4,  4,  0l,  15l }	/* (0..15) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TrafficHandlingPriority_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TrafficHandlingPriority = {
+	"RANAP_TrafficHandlingPriority",
+	"RANAP_TrafficHandlingPriority",
+	RANAP_TrafficHandlingPriority_free,
+	RANAP_TrafficHandlingPriority_print,
+	RANAP_TrafficHandlingPriority_constraint,
+	RANAP_TrafficHandlingPriority_decode_ber,
+	RANAP_TrafficHandlingPriority_encode_der,
+	RANAP_TrafficHandlingPriority_decode_xer,
+	RANAP_TrafficHandlingPriority_encode_xer,
+	RANAP_TrafficHandlingPriority_decode_uper,
+	RANAP_TrafficHandlingPriority_encode_uper,
+	RANAP_TrafficHandlingPriority_decode_aper,
+	RANAP_TrafficHandlingPriority_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TrafficHandlingPriority_tags_1,
+	sizeof(asn_DEF_RANAP_TrafficHandlingPriority_tags_1)
+		/sizeof(asn_DEF_RANAP_TrafficHandlingPriority_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TrafficHandlingPriority_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TrafficHandlingPriority_tags_1)
+		/sizeof(asn_DEF_RANAP_TrafficHandlingPriority_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TrafficHandlingPriority_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TrafficHandlingPriority.h b/src/ranap/RANAP_TrafficHandlingPriority.h
new file mode 100644
index 0000000..2067c21
--- /dev/null
+++ b/src/ranap/RANAP_TrafficHandlingPriority.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TrafficHandlingPriority_H_
+#define	_RANAP_TrafficHandlingPriority_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TrafficHandlingPriority {
+	RANAP_TrafficHandlingPriority_spare	= 0,
+	RANAP_TrafficHandlingPriority_highest	= 1,
+	RANAP_TrafficHandlingPriority_lowest	= 14,
+	RANAP_TrafficHandlingPriority_no_priority_used	= 15
+} e_RANAP_TrafficHandlingPriority;
+
+/* RANAP_TrafficHandlingPriority */
+typedef long	 RANAP_TrafficHandlingPriority_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TrafficHandlingPriority;
+asn_struct_free_f RANAP_TrafficHandlingPriority_free;
+asn_struct_print_f RANAP_TrafficHandlingPriority_print;
+asn_constr_check_f RANAP_TrafficHandlingPriority_constraint;
+ber_type_decoder_f RANAP_TrafficHandlingPriority_decode_ber;
+der_type_encoder_f RANAP_TrafficHandlingPriority_encode_der;
+xer_type_decoder_f RANAP_TrafficHandlingPriority_decode_xer;
+xer_type_encoder_f RANAP_TrafficHandlingPriority_encode_xer;
+per_type_decoder_f RANAP_TrafficHandlingPriority_decode_uper;
+per_type_encoder_f RANAP_TrafficHandlingPriority_encode_uper;
+per_type_decoder_f RANAP_TrafficHandlingPriority_decode_aper;
+per_type_encoder_f RANAP_TrafficHandlingPriority_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TrafficHandlingPriority_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TransferDelay.c b/src/ranap/RANAP_TransferDelay.c
new file mode 100644
index 0000000..bb81d52
--- /dev/null
+++ b/src/ranap/RANAP_TransferDelay.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TransferDelay.h"
+
+int
+RANAP_TransferDelay_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TransferDelay_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_TransferDelay_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TransferDelay_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TransferDelay_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TransferDelay_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TransferDelay_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TransferDelay_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TransferDelay_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TransferDelay_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TransferDelay_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TransferDelay_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TransferDelay_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TransferDelay_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TransferDelay_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TransferDelay = {
+	"RANAP_TransferDelay",
+	"RANAP_TransferDelay",
+	RANAP_TransferDelay_free,
+	RANAP_TransferDelay_print,
+	RANAP_TransferDelay_constraint,
+	RANAP_TransferDelay_decode_ber,
+	RANAP_TransferDelay_encode_der,
+	RANAP_TransferDelay_decode_xer,
+	RANAP_TransferDelay_encode_xer,
+	RANAP_TransferDelay_decode_uper,
+	RANAP_TransferDelay_encode_uper,
+	RANAP_TransferDelay_decode_aper,
+	RANAP_TransferDelay_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TransferDelay_tags_1,
+	sizeof(asn_DEF_RANAP_TransferDelay_tags_1)
+		/sizeof(asn_DEF_RANAP_TransferDelay_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TransferDelay_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TransferDelay_tags_1)
+		/sizeof(asn_DEF_RANAP_TransferDelay_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TransferDelay_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TransferDelay.h b/src/ranap/RANAP_TransferDelay.h
new file mode 100644
index 0000000..7339967
--- /dev/null
+++ b/src/ranap/RANAP_TransferDelay.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TransferDelay_H_
+#define	_RANAP_TransferDelay_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TransferDelay */
+typedef long	 RANAP_TransferDelay_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TransferDelay;
+asn_struct_free_f RANAP_TransferDelay_free;
+asn_struct_print_f RANAP_TransferDelay_print;
+asn_constr_check_f RANAP_TransferDelay_constraint;
+ber_type_decoder_f RANAP_TransferDelay_decode_ber;
+der_type_encoder_f RANAP_TransferDelay_encode_der;
+xer_type_decoder_f RANAP_TransferDelay_decode_xer;
+xer_type_encoder_f RANAP_TransferDelay_encode_xer;
+per_type_decoder_f RANAP_TransferDelay_decode_uper;
+per_type_encoder_f RANAP_TransferDelay_encode_uper;
+per_type_decoder_f RANAP_TransferDelay_decode_aper;
+per_type_encoder_f RANAP_TransferDelay_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TransferDelay_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TransportLayerAddress.c b/src/ranap/RANAP_TransportLayerAddress.c
new file mode 100644
index 0000000..4451afa
--- /dev/null
+++ b/src/ranap/RANAP_TransportLayerAddress.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TransportLayerAddress.h"
+
+int
+RANAP_TransportLayerAddress_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 1l && size <= 160l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_TransportLayerAddress_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TransportLayerAddress_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TransportLayerAddress_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TransportLayerAddress_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TransportLayerAddress_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TransportLayerAddress_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TransportLayerAddress_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TransportLayerAddress_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TransportLayerAddress_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TransportLayerAddress_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TransportLayerAddress_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TransportLayerAddress_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  8,  8,  1l,  160l }	/* (SIZE(1..160,...)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TransportLayerAddress_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TransportLayerAddress = {
+	"RANAP_TransportLayerAddress",
+	"RANAP_TransportLayerAddress",
+	RANAP_TransportLayerAddress_free,
+	RANAP_TransportLayerAddress_print,
+	RANAP_TransportLayerAddress_constraint,
+	RANAP_TransportLayerAddress_decode_ber,
+	RANAP_TransportLayerAddress_encode_der,
+	RANAP_TransportLayerAddress_decode_xer,
+	RANAP_TransportLayerAddress_encode_xer,
+	RANAP_TransportLayerAddress_decode_uper,
+	RANAP_TransportLayerAddress_encode_uper,
+	RANAP_TransportLayerAddress_decode_aper,
+	RANAP_TransportLayerAddress_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TransportLayerAddress_tags_1,
+	sizeof(asn_DEF_RANAP_TransportLayerAddress_tags_1)
+		/sizeof(asn_DEF_RANAP_TransportLayerAddress_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TransportLayerAddress_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TransportLayerAddress_tags_1)
+		/sizeof(asn_DEF_RANAP_TransportLayerAddress_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TransportLayerAddress_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TransportLayerAddress.h b/src/ranap/RANAP_TransportLayerAddress.h
new file mode 100644
index 0000000..fb99bac
--- /dev/null
+++ b/src/ranap/RANAP_TransportLayerAddress.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TransportLayerAddress_H_
+#define	_RANAP_TransportLayerAddress_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TransportLayerAddress */
+typedef BIT_STRING_t	 RANAP_TransportLayerAddress_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TransportLayerAddress;
+asn_struct_free_f RANAP_TransportLayerAddress_free;
+asn_struct_print_f RANAP_TransportLayerAddress_print;
+asn_constr_check_f RANAP_TransportLayerAddress_constraint;
+ber_type_decoder_f RANAP_TransportLayerAddress_decode_ber;
+der_type_encoder_f RANAP_TransportLayerAddress_encode_der;
+xer_type_decoder_f RANAP_TransportLayerAddress_decode_xer;
+xer_type_encoder_f RANAP_TransportLayerAddress_encode_xer;
+per_type_decoder_f RANAP_TransportLayerAddress_decode_uper;
+per_type_encoder_f RANAP_TransportLayerAddress_encode_uper;
+per_type_decoder_f RANAP_TransportLayerAddress_decode_aper;
+per_type_encoder_f RANAP_TransportLayerAddress_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TransportLayerAddress_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TriggerID.c b/src/ranap/RANAP_TriggerID.c
new file mode 100644
index 0000000..be02669
--- /dev/null
+++ b/src/ranap/RANAP_TriggerID.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TriggerID.h"
+
+int
+RANAP_TriggerID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size >= 3l && size <= 22l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TriggerID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_TriggerID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TriggerID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TriggerID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TriggerID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TriggerID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TriggerID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TriggerID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TriggerID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TriggerID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TriggerID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TriggerID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TriggerID_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 5,  5,  3l,  22l }	/* (SIZE(3..22)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TriggerID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TriggerID = {
+	"RANAP_TriggerID",
+	"RANAP_TriggerID",
+	RANAP_TriggerID_free,
+	RANAP_TriggerID_print,
+	RANAP_TriggerID_constraint,
+	RANAP_TriggerID_decode_ber,
+	RANAP_TriggerID_encode_der,
+	RANAP_TriggerID_decode_xer,
+	RANAP_TriggerID_encode_xer,
+	RANAP_TriggerID_decode_uper,
+	RANAP_TriggerID_encode_uper,
+	RANAP_TriggerID_decode_aper,
+	RANAP_TriggerID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TriggerID_tags_1,
+	sizeof(asn_DEF_RANAP_TriggerID_tags_1)
+		/sizeof(asn_DEF_RANAP_TriggerID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TriggerID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TriggerID_tags_1)
+		/sizeof(asn_DEF_RANAP_TriggerID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TriggerID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_TriggerID.h b/src/ranap/RANAP_TriggerID.h
new file mode 100644
index 0000000..eba5820
--- /dev/null
+++ b/src/ranap/RANAP_TriggerID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TriggerID_H_
+#define	_RANAP_TriggerID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TriggerID */
+typedef OCTET_STRING_t	 RANAP_TriggerID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TriggerID;
+asn_struct_free_f RANAP_TriggerID_free;
+asn_struct_print_f RANAP_TriggerID_print;
+asn_constr_check_f RANAP_TriggerID_constraint;
+ber_type_decoder_f RANAP_TriggerID_decode_ber;
+der_type_encoder_f RANAP_TriggerID_encode_der;
+xer_type_decoder_f RANAP_TriggerID_decode_xer;
+xer_type_encoder_f RANAP_TriggerID_encode_xer;
+per_type_decoder_f RANAP_TriggerID_decode_uper;
+per_type_encoder_f RANAP_TriggerID_encode_uper;
+per_type_decoder_f RANAP_TriggerID_decode_aper;
+per_type_encoder_f RANAP_TriggerID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TriggerID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TriggeringMessage.c b/src/ranap/RANAP_TriggeringMessage.c
new file mode 100644
index 0000000..7b1cf75
--- /dev/null
+++ b/src/ranap/RANAP_TriggeringMessage.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#include "RANAP_TriggeringMessage.h"
+
+int
+RANAP_TriggeringMessage_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_TriggeringMessage_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TriggeringMessage_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TriggeringMessage_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TriggeringMessage_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TriggeringMessage_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TriggeringMessage_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TriggeringMessage_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TriggeringMessage_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TriggeringMessage_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TriggeringMessage_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TriggeringMessage_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  3l }	/* (0..3) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_TriggeringMessage_value2enum_1[] = {
+	{ 0,	18,	"initiating-message" },
+	{ 1,	18,	"successful-outcome" },
+	{ 2,	21,	"unsuccessfull-outcome" },
+	{ 3,	7,	"outcome" }
+};
+static const unsigned int asn_MAP_RANAP_TriggeringMessage_enum2value_1[] = {
+	0,	/* initiating-message(0) */
+	3,	/* outcome(3) */
+	1,	/* successful-outcome(1) */
+	2	/* unsuccessfull-outcome(2) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_TriggeringMessage_specs_1 = {
+	asn_MAP_RANAP_TriggeringMessage_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_TriggeringMessage_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TriggeringMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TriggeringMessage = {
+	"RANAP_TriggeringMessage",
+	"RANAP_TriggeringMessage",
+	RANAP_TriggeringMessage_free,
+	RANAP_TriggeringMessage_print,
+	RANAP_TriggeringMessage_constraint,
+	RANAP_TriggeringMessage_decode_ber,
+	RANAP_TriggeringMessage_encode_der,
+	RANAP_TriggeringMessage_decode_xer,
+	RANAP_TriggeringMessage_encode_xer,
+	RANAP_TriggeringMessage_decode_uper,
+	RANAP_TriggeringMessage_encode_uper,
+	RANAP_TriggeringMessage_decode_aper,
+	RANAP_TriggeringMessage_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TriggeringMessage_tags_1,
+	sizeof(asn_DEF_RANAP_TriggeringMessage_tags_1)
+		/sizeof(asn_DEF_RANAP_TriggeringMessage_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TriggeringMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TriggeringMessage_tags_1)
+		/sizeof(asn_DEF_RANAP_TriggeringMessage_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TriggeringMessage_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_TriggeringMessage_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TriggeringMessage.h b/src/ranap/RANAP_TriggeringMessage.h
new file mode 100644
index 0000000..f43f734
--- /dev/null
+++ b/src/ranap/RANAP_TriggeringMessage.h
@@ -0,0 +1,50 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-CommonDataTypes"
+ * 	found in "../../asn1/ranap/RANAP-CommonDataTypes.asn"
+ */
+
+#ifndef	_RANAP_TriggeringMessage_H_
+#define	_RANAP_TriggeringMessage_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TriggeringMessage {
+	RANAP_TriggeringMessage_initiating_message	= 0,
+	RANAP_TriggeringMessage_successful_outcome	= 1,
+	RANAP_TriggeringMessage_unsuccessfull_outcome	= 2,
+	RANAP_TriggeringMessage_outcome	= 3
+} e_RANAP_TriggeringMessage;
+
+/* RANAP_TriggeringMessage */
+typedef long	 RANAP_TriggeringMessage_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TriggeringMessage;
+asn_struct_free_f RANAP_TriggeringMessage_free;
+asn_struct_print_f RANAP_TriggeringMessage_print;
+asn_constr_check_f RANAP_TriggeringMessage_constraint;
+ber_type_decoder_f RANAP_TriggeringMessage_decode_ber;
+der_type_encoder_f RANAP_TriggeringMessage_encode_der;
+xer_type_decoder_f RANAP_TriggeringMessage_decode_xer;
+xer_type_encoder_f RANAP_TriggeringMessage_encode_xer;
+per_type_decoder_f RANAP_TriggeringMessage_decode_uper;
+per_type_encoder_f RANAP_TriggeringMessage_encode_uper;
+per_type_decoder_f RANAP_TriggeringMessage_decode_aper;
+per_type_encoder_f RANAP_TriggeringMessage_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TriggeringMessage_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TunnelInformation.c b/src/ranap/RANAP_TunnelInformation.c
new file mode 100644
index 0000000..e35c03c
--- /dev/null
+++ b/src/ranap/RANAP_TunnelInformation.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TunnelInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_TunnelInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TunnelInformation, transportLayerAddress),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TransportLayerAddress,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"transportLayerAddress"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_TunnelInformation, uDP_Port_Number),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Port_Number,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uDP-Port-Number"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_TunnelInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_TunnelInformation_oms_1[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_TunnelInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_TunnelInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* transportLayerAddress */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uDP-Port-Number */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TunnelInformation_specs_1 = {
+	sizeof(struct RANAP_TunnelInformation),
+	offsetof(struct RANAP_TunnelInformation, _asn_ctx),
+	asn_MAP_RANAP_TunnelInformation_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_TunnelInformation_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TunnelInformation = {
+	"RANAP_TunnelInformation",
+	"RANAP_TunnelInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TunnelInformation_tags_1,
+	sizeof(asn_DEF_RANAP_TunnelInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_TunnelInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TunnelInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TunnelInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_TunnelInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_TunnelInformation_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_TunnelInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TunnelInformation.h b/src/ranap/RANAP_TunnelInformation.h
new file mode 100644
index 0000000..c66e3a3
--- /dev/null
+++ b/src/ranap/RANAP_TunnelInformation.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TunnelInformation_H_
+#define	_RANAP_TunnelInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_TransportLayerAddress.h"
+#include "RANAP_Port-Number.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_TunnelInformation */
+typedef struct RANAP_TunnelInformation {
+	RANAP_TransportLayerAddress_t	 transportLayerAddress;
+	RANAP_Port_Number_t	*uDP_Port_Number	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_TunnelInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TunnelInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TunnelInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_TypeOfError.c b/src/ranap/RANAP_TypeOfError.c
new file mode 100644
index 0000000..607d3fc
--- /dev/null
+++ b/src/ranap/RANAP_TypeOfError.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_TypeOfError.h"
+
+int
+RANAP_TypeOfError_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_TypeOfError_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_TypeOfError_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_TypeOfError_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TypeOfError_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_TypeOfError_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TypeOfError_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_TypeOfError_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_TypeOfError_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_TypeOfError_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_TypeOfError_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_TypeOfError_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_TypeOfError_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_TypeOfError_value2enum_1[] = {
+	{ 0,	14,	"not-understood" },
+	{ 1,	7,	"missing" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_TypeOfError_enum2value_1[] = {
+	1,	/* missing(1) */
+	0	/* not-understood(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_TypeOfError_specs_1 = {
+	asn_MAP_RANAP_TypeOfError_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_TypeOfError_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_TypeOfError_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_TypeOfError = {
+	"RANAP_TypeOfError",
+	"RANAP_TypeOfError",
+	RANAP_TypeOfError_free,
+	RANAP_TypeOfError_print,
+	RANAP_TypeOfError_constraint,
+	RANAP_TypeOfError_decode_ber,
+	RANAP_TypeOfError_encode_der,
+	RANAP_TypeOfError_decode_xer,
+	RANAP_TypeOfError_encode_xer,
+	RANAP_TypeOfError_decode_uper,
+	RANAP_TypeOfError_encode_uper,
+	RANAP_TypeOfError_decode_aper,
+	RANAP_TypeOfError_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_TypeOfError_tags_1,
+	sizeof(asn_DEF_RANAP_TypeOfError_tags_1)
+		/sizeof(asn_DEF_RANAP_TypeOfError_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_TypeOfError_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_TypeOfError_tags_1)
+		/sizeof(asn_DEF_RANAP_TypeOfError_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_TypeOfError_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_TypeOfError_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_TypeOfError.h b/src/ranap/RANAP_TypeOfError.h
new file mode 100644
index 0000000..12b0528
--- /dev/null
+++ b/src/ranap/RANAP_TypeOfError.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_TypeOfError_H_
+#define	_RANAP_TypeOfError_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_TypeOfError {
+	RANAP_TypeOfError_not_understood	= 0,
+	RANAP_TypeOfError_missing	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_TypeOfError;
+
+/* RANAP_TypeOfError */
+typedef long	 RANAP_TypeOfError_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_TypeOfError;
+asn_struct_free_f RANAP_TypeOfError_free;
+asn_struct_print_f RANAP_TypeOfError_print;
+asn_constr_check_f RANAP_TypeOfError_constraint;
+ber_type_decoder_f RANAP_TypeOfError_decode_ber;
+der_type_encoder_f RANAP_TypeOfError_encode_der;
+xer_type_decoder_f RANAP_TypeOfError_decode_xer;
+xer_type_encoder_f RANAP_TypeOfError_encode_xer;
+per_type_decoder_f RANAP_TypeOfError_decode_uper;
+per_type_encoder_f RANAP_TypeOfError_encode_uper;
+per_type_decoder_f RANAP_TypeOfError_decode_aper;
+per_type_encoder_f RANAP_TypeOfError_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_TypeOfError_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UE-AggregateMaximumBitRate.c b/src/ranap/RANAP_UE-AggregateMaximumBitRate.c
new file mode 100644
index 0000000..8c41b8f
--- /dev/null
+++ b/src/ranap/RANAP_UE-AggregateMaximumBitRate.c
@@ -0,0 +1,73 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UE-AggregateMaximumBitRate.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_UE_AggregateMaximumBitRate_1[] = {
+	{ ATF_POINTER, 2, offsetof(struct RANAP_UE_AggregateMaximumBitRate, uE_AggregateMaximumBitRateDownlink),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uE-AggregateMaximumBitRateDownlink"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_UE_AggregateMaximumBitRate, uE_AggregateMaximumBitRateUplink),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uE-AggregateMaximumBitRateUplink"
+		},
+};
+static const int asn_MAP_RANAP_UE_AggregateMaximumBitRate_oms_1[] = { 0, 1 };
+static const ber_tlv_tag_t asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UE_AggregateMaximumBitRate_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uE-AggregateMaximumBitRateDownlink */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* uE-AggregateMaximumBitRateUplink */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UE_AggregateMaximumBitRate_specs_1 = {
+	sizeof(struct RANAP_UE_AggregateMaximumBitRate),
+	offsetof(struct RANAP_UE_AggregateMaximumBitRate, _asn_ctx),
+	asn_MAP_RANAP_UE_AggregateMaximumBitRate_tag2el_1,
+	2,	/* Count of tags in the map */
+	asn_MAP_RANAP_UE_AggregateMaximumBitRate_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	1,	/* Start extensions */
+	3	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRate = {
+	"RANAP_UE-AggregateMaximumBitRate",
+	"RANAP_UE-AggregateMaximumBitRate",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1,
+	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UE_AggregateMaximumBitRate_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_UE_AggregateMaximumBitRate_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UE-AggregateMaximumBitRate.h b/src/ranap/RANAP_UE-AggregateMaximumBitRate.h
new file mode 100644
index 0000000..79fc5ee
--- /dev/null
+++ b/src/ranap/RANAP_UE-AggregateMaximumBitRate.h
@@ -0,0 +1,43 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UE_AggregateMaximumBitRate_H_
+#define	_RANAP_UE_AggregateMaximumBitRate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_UE-AggregateMaximumBitRateDownlink.h"
+#include "RANAP_UE-AggregateMaximumBitRateUplink.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UE-AggregateMaximumBitRate */
+typedef struct RANAP_UE_AggregateMaximumBitRate {
+	RANAP_UE_AggregateMaximumBitRateDownlink_t	*uE_AggregateMaximumBitRateDownlink	/* OPTIONAL */;
+	RANAP_UE_AggregateMaximumBitRateUplink_t	*uE_AggregateMaximumBitRateUplink	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UE_AggregateMaximumBitRate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRate;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UE_AggregateMaximumBitRate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UE-AggregateMaximumBitRateDownlink.c b/src/ranap/RANAP_UE-AggregateMaximumBitRateDownlink.c
new file mode 100644
index 0000000..1936ee1
--- /dev/null
+++ b/src/ranap/RANAP_UE-AggregateMaximumBitRateDownlink.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UE-AggregateMaximumBitRateDownlink.h"
+
+int
+RANAP_UE_AggregateMaximumBitRateDownlink_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 1000000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_UE_AggregateMaximumBitRateDownlink_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UE_AggregateMaximumBitRateDownlink_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateDownlink_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UE_AggregateMaximumBitRateDownlink_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UE_AggregateMaximumBitRateDownlink_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 30, -1,  1l,  1000000000l }	/* (1..1000000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink = {
+	"RANAP_UE-AggregateMaximumBitRateDownlink",
+	"RANAP_UE-AggregateMaximumBitRateDownlink",
+	RANAP_UE_AggregateMaximumBitRateDownlink_free,
+	RANAP_UE_AggregateMaximumBitRateDownlink_print,
+	RANAP_UE_AggregateMaximumBitRateDownlink_constraint,
+	RANAP_UE_AggregateMaximumBitRateDownlink_decode_ber,
+	RANAP_UE_AggregateMaximumBitRateDownlink_encode_der,
+	RANAP_UE_AggregateMaximumBitRateDownlink_decode_xer,
+	RANAP_UE_AggregateMaximumBitRateDownlink_encode_xer,
+	RANAP_UE_AggregateMaximumBitRateDownlink_decode_uper,
+	RANAP_UE_AggregateMaximumBitRateDownlink_encode_uper,
+	RANAP_UE_AggregateMaximumBitRateDownlink_decode_aper,
+	RANAP_UE_AggregateMaximumBitRateDownlink_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1,
+	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UE_AggregateMaximumBitRateDownlink_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UE-AggregateMaximumBitRateDownlink.h b/src/ranap/RANAP_UE-AggregateMaximumBitRateDownlink.h
new file mode 100644
index 0000000..0e6c196
--- /dev/null
+++ b/src/ranap/RANAP_UE-AggregateMaximumBitRateDownlink.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UE_AggregateMaximumBitRateDownlink_H_
+#define	_RANAP_UE_AggregateMaximumBitRateDownlink_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UE-AggregateMaximumBitRateDownlink */
+typedef long	 RANAP_UE_AggregateMaximumBitRateDownlink_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink;
+asn_struct_free_f RANAP_UE_AggregateMaximumBitRateDownlink_free;
+asn_struct_print_f RANAP_UE_AggregateMaximumBitRateDownlink_print;
+asn_constr_check_f RANAP_UE_AggregateMaximumBitRateDownlink_constraint;
+ber_type_decoder_f RANAP_UE_AggregateMaximumBitRateDownlink_decode_ber;
+der_type_encoder_f RANAP_UE_AggregateMaximumBitRateDownlink_encode_der;
+xer_type_decoder_f RANAP_UE_AggregateMaximumBitRateDownlink_decode_xer;
+xer_type_encoder_f RANAP_UE_AggregateMaximumBitRateDownlink_encode_xer;
+per_type_decoder_f RANAP_UE_AggregateMaximumBitRateDownlink_decode_uper;
+per_type_encoder_f RANAP_UE_AggregateMaximumBitRateDownlink_encode_uper;
+per_type_decoder_f RANAP_UE_AggregateMaximumBitRateDownlink_decode_aper;
+per_type_encoder_f RANAP_UE_AggregateMaximumBitRateDownlink_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UE_AggregateMaximumBitRateDownlink_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UE-AggregateMaximumBitRateUplink.c b/src/ranap/RANAP_UE-AggregateMaximumBitRateUplink.c
new file mode 100644
index 0000000..9d0074e
--- /dev/null
+++ b/src/ranap/RANAP_UE-AggregateMaximumBitRateUplink.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UE-AggregateMaximumBitRateUplink.h"
+
+int
+RANAP_UE_AggregateMaximumBitRateUplink_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 1000000000l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_UE_AggregateMaximumBitRateUplink_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UE_AggregateMaximumBitRateUplink_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UE_AggregateMaximumBitRateUplink_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UE_AggregateMaximumBitRateUplink_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UE_AggregateMaximumBitRateUplink_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 30, -1,  1l,  1000000000l }	/* (1..1000000000) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink = {
+	"RANAP_UE-AggregateMaximumBitRateUplink",
+	"RANAP_UE-AggregateMaximumBitRateUplink",
+	RANAP_UE_AggregateMaximumBitRateUplink_free,
+	RANAP_UE_AggregateMaximumBitRateUplink_print,
+	RANAP_UE_AggregateMaximumBitRateUplink_constraint,
+	RANAP_UE_AggregateMaximumBitRateUplink_decode_ber,
+	RANAP_UE_AggregateMaximumBitRateUplink_encode_der,
+	RANAP_UE_AggregateMaximumBitRateUplink_decode_xer,
+	RANAP_UE_AggregateMaximumBitRateUplink_encode_xer,
+	RANAP_UE_AggregateMaximumBitRateUplink_decode_uper,
+	RANAP_UE_AggregateMaximumBitRateUplink_encode_uper,
+	RANAP_UE_AggregateMaximumBitRateUplink_decode_aper,
+	RANAP_UE_AggregateMaximumBitRateUplink_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1,
+	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UE_AggregateMaximumBitRateUplink_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UE-AggregateMaximumBitRateUplink.h b/src/ranap/RANAP_UE-AggregateMaximumBitRateUplink.h
new file mode 100644
index 0000000..fca65bf
--- /dev/null
+++ b/src/ranap/RANAP_UE-AggregateMaximumBitRateUplink.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UE_AggregateMaximumBitRateUplink_H_
+#define	_RANAP_UE_AggregateMaximumBitRateUplink_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UE-AggregateMaximumBitRateUplink */
+typedef long	 RANAP_UE_AggregateMaximumBitRateUplink_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink;
+asn_struct_free_f RANAP_UE_AggregateMaximumBitRateUplink_free;
+asn_struct_print_f RANAP_UE_AggregateMaximumBitRateUplink_print;
+asn_constr_check_f RANAP_UE_AggregateMaximumBitRateUplink_constraint;
+ber_type_decoder_f RANAP_UE_AggregateMaximumBitRateUplink_decode_ber;
+der_type_encoder_f RANAP_UE_AggregateMaximumBitRateUplink_encode_der;
+xer_type_decoder_f RANAP_UE_AggregateMaximumBitRateUplink_decode_xer;
+xer_type_encoder_f RANAP_UE_AggregateMaximumBitRateUplink_encode_xer;
+per_type_decoder_f RANAP_UE_AggregateMaximumBitRateUplink_decode_uper;
+per_type_encoder_f RANAP_UE_AggregateMaximumBitRateUplink_encode_uper;
+per_type_decoder_f RANAP_UE_AggregateMaximumBitRateUplink_decode_aper;
+per_type_encoder_f RANAP_UE_AggregateMaximumBitRateUplink_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UE_AggregateMaximumBitRateUplink_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UE-History-Information.c b/src/ranap/RANAP_UE-History-Information.c
new file mode 100644
index 0000000..11a02bf
--- /dev/null
+++ b/src/ranap/RANAP_UE-History-Information.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UE-History-Information.h"
+
+int
+RANAP_UE_History_Information_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UE_History_Information_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_UE_History_Information_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UE_History_Information_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_History_Information_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UE_History_Information_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_History_Information_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UE_History_Information_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UE_History_Information_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UE_History_Information_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UE_History_Information_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UE_History_Information_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UE_History_Information_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_UE_History_Information_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UE_History_Information = {
+	"RANAP_UE-History-Information",
+	"RANAP_UE-History-Information",
+	RANAP_UE_History_Information_free,
+	RANAP_UE_History_Information_print,
+	RANAP_UE_History_Information_constraint,
+	RANAP_UE_History_Information_decode_ber,
+	RANAP_UE_History_Information_encode_der,
+	RANAP_UE_History_Information_decode_xer,
+	RANAP_UE_History_Information_encode_xer,
+	RANAP_UE_History_Information_decode_uper,
+	RANAP_UE_History_Information_encode_uper,
+	RANAP_UE_History_Information_decode_aper,
+	RANAP_UE_History_Information_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UE_History_Information_tags_1,
+	sizeof(asn_DEF_RANAP_UE_History_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_History_Information_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UE_History_Information_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UE_History_Information_tags_1)
+		/sizeof(asn_DEF_RANAP_UE_History_Information_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UE-History-Information.h b/src/ranap/RANAP_UE-History-Information.h
new file mode 100644
index 0000000..92df8b9
--- /dev/null
+++ b/src/ranap/RANAP_UE-History-Information.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UE_History_Information_H_
+#define	_RANAP_UE_History_Information_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UE-History-Information */
+typedef OCTET_STRING_t	 RANAP_UE_History_Information_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UE_History_Information;
+asn_struct_free_f RANAP_UE_History_Information_free;
+asn_struct_print_f RANAP_UE_History_Information_print;
+asn_constr_check_f RANAP_UE_History_Information_constraint;
+ber_type_decoder_f RANAP_UE_History_Information_decode_ber;
+der_type_encoder_f RANAP_UE_History_Information_encode_der;
+xer_type_decoder_f RANAP_UE_History_Information_decode_xer;
+xer_type_encoder_f RANAP_UE_History_Information_encode_xer;
+per_type_decoder_f RANAP_UE_History_Information_decode_uper;
+per_type_encoder_f RANAP_UE_History_Information_encode_uper;
+per_type_decoder_f RANAP_UE_History_Information_decode_aper;
+per_type_encoder_f RANAP_UE_History_Information_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UE_History_Information_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UE-ID.c b/src/ranap/RANAP_UE-ID.c
new file mode 100644
index 0000000..7523f2d
--- /dev/null
+++ b/src/ranap/RANAP_UE-ID.c
@@ -0,0 +1,82 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UE-ID.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_UE_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_UE_ID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UE_ID, choice.imsi),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMSI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"imsi"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UE_ID, choice.imei),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEI,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"imei"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UE_ID, choice.imeisv),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IMEISV,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"imeisv"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UE_ID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* imsi */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* imei */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* imeisv */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_UE_ID_specs_1 = {
+	sizeof(struct RANAP_UE_ID),
+	offsetof(struct RANAP_UE_ID, _asn_ctx),
+	offsetof(struct RANAP_UE_ID, present),
+	sizeof(((struct RANAP_UE_ID *)0)->present),
+	asn_MAP_RANAP_UE_ID_tag2el_1,
+	3,	/* Count of tags in the map */
+	0,
+	2	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UE_ID = {
+	"RANAP_UE-ID",
+	"RANAP_UE-ID",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_UE_ID_constr_1,
+	asn_MBR_RANAP_UE_ID_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_UE_ID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UE-ID.h b/src/ranap/RANAP_UE-ID.h
new file mode 100644
index 0000000..9d94030
--- /dev/null
+++ b/src/ranap/RANAP_UE-ID.h
@@ -0,0 +1,57 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UE_ID_H_
+#define	_RANAP_UE_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IMSI.h"
+#include "RANAP_IMEI.h"
+#include "RANAP_IMEISV.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_UE_ID_PR {
+	RANAP_UE_ID_PR_NOTHING,	/* No components present */
+	RANAP_UE_ID_PR_imsi,
+	RANAP_UE_ID_PR_imei,
+	/* Extensions may appear below */
+	RANAP_UE_ID_PR_imeisv
+} RANAP_UE_ID_PR;
+
+/* RANAP_UE-ID */
+typedef struct RANAP_UE_ID {
+	RANAP_UE_ID_PR present;
+	union RANAP_UE_ID_u {
+		RANAP_IMSI_t	 imsi;
+		RANAP_IMEI_t	 imei;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+		RANAP_IMEISV_t	 imeisv;
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UE_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UE_ID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UE_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UESBI-Iu.c b/src/ranap/RANAP_UESBI-Iu.c
new file mode 100644
index 0000000..25cac18
--- /dev/null
+++ b/src/ranap/RANAP_UESBI-Iu.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UESBI-Iu.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_UESBI_Iu_1[] = {
+	{ ATF_POINTER, 3, offsetof(struct RANAP_UESBI_Iu, uESBI_IuA),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UESBI_IuA,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uESBI-IuA"
+		},
+	{ ATF_POINTER, 2, offsetof(struct RANAP_UESBI_Iu, uESBI_IuB),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UESBI_IuB,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"uESBI-IuB"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_UESBI_Iu, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_UESBI_Iu_oms_1[] = { 0, 1, 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_UESBI_Iu_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UESBI_Iu_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uESBI-IuA */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* uESBI-IuB */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UESBI_Iu_specs_1 = {
+	sizeof(struct RANAP_UESBI_Iu),
+	offsetof(struct RANAP_UESBI_Iu, _asn_ctx),
+	asn_MAP_RANAP_UESBI_Iu_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_UESBI_Iu_oms_1,	/* Optional members */
+	3, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UESBI_Iu = {
+	"RANAP_UESBI-Iu",
+	"RANAP_UESBI-Iu",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UESBI_Iu_tags_1,
+	sizeof(asn_DEF_RANAP_UESBI_Iu_tags_1)
+		/sizeof(asn_DEF_RANAP_UESBI_Iu_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UESBI_Iu_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UESBI_Iu_tags_1)
+		/sizeof(asn_DEF_RANAP_UESBI_Iu_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UESBI_Iu_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_UESBI_Iu_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UESBI-Iu.h b/src/ranap/RANAP_UESBI-Iu.h
new file mode 100644
index 0000000..6dd504c
--- /dev/null
+++ b/src/ranap/RANAP_UESBI-Iu.h
@@ -0,0 +1,45 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UESBI_Iu_H_
+#define	_RANAP_UESBI_Iu_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_UESBI-IuA.h"
+#include "RANAP_UESBI-IuB.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UESBI-Iu */
+typedef struct RANAP_UESBI_Iu {
+	RANAP_UESBI_IuA_t	*uESBI_IuA	/* OPTIONAL */;
+	RANAP_UESBI_IuB_t	*uESBI_IuB	/* OPTIONAL */;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UESBI_Iu_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UESBI_Iu;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UESBI_Iu_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UESBI-IuA.c b/src/ranap/RANAP_UESBI-IuA.c
new file mode 100644
index 0000000..fc3863a
--- /dev/null
+++ b/src/ranap/RANAP_UESBI-IuA.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UESBI-IuA.h"
+
+int
+RANAP_UESBI_IuA_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 1l && size <= 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_UESBI_IuA_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UESBI_IuA_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuA_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuA_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuA_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuA_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuA_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuA_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuA_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuA_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UESBI_IuA_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UESBI_IuA_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 7,  7,  1l,  128l }	/* (SIZE(1..128)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UESBI_IuA_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UESBI_IuA = {
+	"RANAP_UESBI-IuA",
+	"RANAP_UESBI-IuA",
+	RANAP_UESBI_IuA_free,
+	RANAP_UESBI_IuA_print,
+	RANAP_UESBI_IuA_constraint,
+	RANAP_UESBI_IuA_decode_ber,
+	RANAP_UESBI_IuA_encode_der,
+	RANAP_UESBI_IuA_decode_xer,
+	RANAP_UESBI_IuA_encode_xer,
+	RANAP_UESBI_IuA_decode_uper,
+	RANAP_UESBI_IuA_encode_uper,
+	RANAP_UESBI_IuA_decode_aper,
+	RANAP_UESBI_IuA_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UESBI_IuA_tags_1,
+	sizeof(asn_DEF_RANAP_UESBI_IuA_tags_1)
+		/sizeof(asn_DEF_RANAP_UESBI_IuA_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UESBI_IuA_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UESBI_IuA_tags_1)
+		/sizeof(asn_DEF_RANAP_UESBI_IuA_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UESBI_IuA_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UESBI-IuA.h b/src/ranap/RANAP_UESBI-IuA.h
new file mode 100644
index 0000000..c4c51bb
--- /dev/null
+++ b/src/ranap/RANAP_UESBI-IuA.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UESBI_IuA_H_
+#define	_RANAP_UESBI_IuA_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UESBI-IuA */
+typedef BIT_STRING_t	 RANAP_UESBI_IuA_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UESBI_IuA;
+asn_struct_free_f RANAP_UESBI_IuA_free;
+asn_struct_print_f RANAP_UESBI_IuA_print;
+asn_constr_check_f RANAP_UESBI_IuA_constraint;
+ber_type_decoder_f RANAP_UESBI_IuA_decode_ber;
+der_type_encoder_f RANAP_UESBI_IuA_encode_der;
+xer_type_decoder_f RANAP_UESBI_IuA_decode_xer;
+xer_type_encoder_f RANAP_UESBI_IuA_encode_xer;
+per_type_decoder_f RANAP_UESBI_IuA_decode_uper;
+per_type_encoder_f RANAP_UESBI_IuA_encode_uper;
+per_type_decoder_f RANAP_UESBI_IuA_decode_aper;
+per_type_encoder_f RANAP_UESBI_IuA_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UESBI_IuA_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UESBI-IuB.c b/src/ranap/RANAP_UESBI-IuB.c
new file mode 100644
index 0000000..da37f44
--- /dev/null
+++ b/src/ranap/RANAP_UESBI-IuB.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UESBI-IuB.h"
+
+int
+RANAP_UESBI_IuB_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 1l && size <= 128l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_UESBI_IuB_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UESBI_IuB_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuB_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuB_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuB_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuB_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuB_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuB_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UESBI_IuB_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UESBI_IuB_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UESBI_IuB_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UESBI_IuB_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 7,  7,  1l,  128l }	/* (SIZE(1..128)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UESBI_IuB_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UESBI_IuB = {
+	"RANAP_UESBI-IuB",
+	"RANAP_UESBI-IuB",
+	RANAP_UESBI_IuB_free,
+	RANAP_UESBI_IuB_print,
+	RANAP_UESBI_IuB_constraint,
+	RANAP_UESBI_IuB_decode_ber,
+	RANAP_UESBI_IuB_encode_der,
+	RANAP_UESBI_IuB_decode_xer,
+	RANAP_UESBI_IuB_encode_xer,
+	RANAP_UESBI_IuB_decode_uper,
+	RANAP_UESBI_IuB_encode_uper,
+	RANAP_UESBI_IuB_decode_aper,
+	RANAP_UESBI_IuB_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UESBI_IuB_tags_1,
+	sizeof(asn_DEF_RANAP_UESBI_IuB_tags_1)
+		/sizeof(asn_DEF_RANAP_UESBI_IuB_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UESBI_IuB_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UESBI_IuB_tags_1)
+		/sizeof(asn_DEF_RANAP_UESBI_IuB_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UESBI_IuB_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UESBI-IuB.h b/src/ranap/RANAP_UESBI-IuB.h
new file mode 100644
index 0000000..4e8648b
--- /dev/null
+++ b/src/ranap/RANAP_UESBI-IuB.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UESBI_IuB_H_
+#define	_RANAP_UESBI_IuB_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UESBI-IuB */
+typedef BIT_STRING_t	 RANAP_UESBI_IuB_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UESBI_IuB;
+asn_struct_free_f RANAP_UESBI_IuB_free;
+asn_struct_print_f RANAP_UESBI_IuB_print;
+asn_constr_check_f RANAP_UESBI_IuB_constraint;
+ber_type_decoder_f RANAP_UESBI_IuB_decode_ber;
+der_type_encoder_f RANAP_UESBI_IuB_encode_der;
+xer_type_decoder_f RANAP_UESBI_IuB_decode_xer;
+xer_type_encoder_f RANAP_UESBI_IuB_encode_xer;
+per_type_decoder_f RANAP_UESBI_IuB_decode_uper;
+per_type_encoder_f RANAP_UESBI_IuB_encode_uper;
+per_type_decoder_f RANAP_UESBI_IuB_decode_aper;
+per_type_encoder_f RANAP_UESBI_IuB_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UESBI_IuB_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UESpecificInformationIndication.c b/src/ranap/RANAP_UESpecificInformationIndication.c
new file mode 100644
index 0000000..89d1e16
--- /dev/null
+++ b/src/ranap/RANAP_UESpecificInformationIndication.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UESpecificInformationIndication.h"
+
+static int
+memb_uESpecificInformationIndication_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_uESpecificInformationIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_uESpecificInformationIndication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_uESpecificInformationIndication_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_uESpecificInformationIndication_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_uESpecificInformationIndication_ies_specs_2 = {
+	sizeof(struct uESpecificInformationIndication_ies),
+	offsetof(struct uESpecificInformationIndication_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_uESpecificInformationIndication_ies_2 = {
+	"uESpecificInformationIndication-ies",
+	"uESpecificInformationIndication-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_uESpecificInformationIndication_ies_tags_2,
+	sizeof(asn_DEF_uESpecificInformationIndication_ies_tags_2)
+		/sizeof(asn_DEF_uESpecificInformationIndication_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_uESpecificInformationIndication_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_uESpecificInformationIndication_ies_tags_2)
+		/sizeof(asn_DEF_uESpecificInformationIndication_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_uESpecificInformationIndication_ies_constr_2,
+	asn_MBR_uESpecificInformationIndication_ies_2,
+	1,	/* Single element */
+	&asn_SPC_uESpecificInformationIndication_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_UESpecificInformationIndication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UESpecificInformationIndication, uESpecificInformationIndication_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_uESpecificInformationIndication_ies_2,
+		memb_uESpecificInformationIndication_ies_constraint_1,
+		&asn_PER_memb_uESpecificInformationIndication_ies_constr_2,
+		0,
+		"uESpecificInformationIndication-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UESpecificInformationIndication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UESpecificInformationIndication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* uESpecificInformationIndication-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UESpecificInformationIndication_specs_1 = {
+	sizeof(struct RANAP_UESpecificInformationIndication),
+	offsetof(struct RANAP_UESpecificInformationIndication, _asn_ctx),
+	asn_MAP_RANAP_UESpecificInformationIndication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UESpecificInformationIndication = {
+	"RANAP_UESpecificInformationIndication",
+	"RANAP_UESpecificInformationIndication",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UESpecificInformationIndication_tags_1,
+	sizeof(asn_DEF_RANAP_UESpecificInformationIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_UESpecificInformationIndication_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UESpecificInformationIndication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UESpecificInformationIndication_tags_1)
+		/sizeof(asn_DEF_RANAP_UESpecificInformationIndication_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UESpecificInformationIndication_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_UESpecificInformationIndication_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UESpecificInformationIndication.h b/src/ranap/RANAP_UESpecificInformationIndication.h
new file mode 100644
index 0000000..b2a4782
--- /dev/null
+++ b/src/ranap/RANAP_UESpecificInformationIndication.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UESpecificInformationIndication_H_
+#define	_RANAP_UESpecificInformationIndication_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UESpecificInformationIndication */
+typedef struct RANAP_UESpecificInformationIndication {
+	struct uESpecificInformationIndication_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} uESpecificInformationIndication_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UESpecificInformationIndication_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UESpecificInformationIndication;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UESpecificInformationIndication_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UL-GTP-PDU-SequenceNumber.c b/src/ranap/RANAP_UL-GTP-PDU-SequenceNumber.c
new file mode 100644
index 0000000..a12bc8c
--- /dev/null
+++ b/src/ranap/RANAP_UL-GTP-PDU-SequenceNumber.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UL-GTP-PDU-SequenceNumber.h"
+
+int
+RANAP_UL_GTP_PDU_SequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_UL_GTP_PDU_SequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UL_GTP_PDU_SequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UL_GTP_PDU_SequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UL_GTP_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UL_GTP_PDU_SequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber = {
+	"RANAP_UL-GTP-PDU-SequenceNumber",
+	"RANAP_UL-GTP-PDU-SequenceNumber",
+	RANAP_UL_GTP_PDU_SequenceNumber_free,
+	RANAP_UL_GTP_PDU_SequenceNumber_print,
+	RANAP_UL_GTP_PDU_SequenceNumber_constraint,
+	RANAP_UL_GTP_PDU_SequenceNumber_decode_ber,
+	RANAP_UL_GTP_PDU_SequenceNumber_encode_der,
+	RANAP_UL_GTP_PDU_SequenceNumber_decode_xer,
+	RANAP_UL_GTP_PDU_SequenceNumber_encode_xer,
+	RANAP_UL_GTP_PDU_SequenceNumber_decode_uper,
+	RANAP_UL_GTP_PDU_SequenceNumber_encode_uper,
+	RANAP_UL_GTP_PDU_SequenceNumber_decode_aper,
+	RANAP_UL_GTP_PDU_SequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UL_GTP_PDU_SequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UL-GTP-PDU-SequenceNumber.h b/src/ranap/RANAP_UL-GTP-PDU-SequenceNumber.h
new file mode 100644
index 0000000..3a969ae
--- /dev/null
+++ b/src/ranap/RANAP_UL-GTP-PDU-SequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UL_GTP_PDU_SequenceNumber_H_
+#define	_RANAP_UL_GTP_PDU_SequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UL-GTP-PDU-SequenceNumber */
+typedef long	 RANAP_UL_GTP_PDU_SequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber;
+asn_struct_free_f RANAP_UL_GTP_PDU_SequenceNumber_free;
+asn_struct_print_f RANAP_UL_GTP_PDU_SequenceNumber_print;
+asn_constr_check_f RANAP_UL_GTP_PDU_SequenceNumber_constraint;
+ber_type_decoder_f RANAP_UL_GTP_PDU_SequenceNumber_decode_ber;
+der_type_encoder_f RANAP_UL_GTP_PDU_SequenceNumber_encode_der;
+xer_type_decoder_f RANAP_UL_GTP_PDU_SequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_UL_GTP_PDU_SequenceNumber_encode_xer;
+per_type_decoder_f RANAP_UL_GTP_PDU_SequenceNumber_decode_uper;
+per_type_encoder_f RANAP_UL_GTP_PDU_SequenceNumber_encode_uper;
+per_type_decoder_f RANAP_UL_GTP_PDU_SequenceNumber_decode_aper;
+per_type_encoder_f RANAP_UL_GTP_PDU_SequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UL_GTP_PDU_SequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UL-N-PDU-SequenceNumber.c b/src/ranap/RANAP_UL-N-PDU-SequenceNumber.c
new file mode 100644
index 0000000..6641d9a
--- /dev/null
+++ b/src/ranap/RANAP_UL-N-PDU-SequenceNumber.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UL-N-PDU-SequenceNumber.h"
+
+int
+RANAP_UL_N_PDU_SequenceNumber_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_UL_N_PDU_SequenceNumber_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UL_N_PDU_SequenceNumber_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UL_N_PDU_SequenceNumber_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UL_N_PDU_SequenceNumber_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UL_N_PDU_SequenceNumber_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UL_N_PDU_SequenceNumber_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UL_N_PDU_SequenceNumber_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UL_N_PDU_SequenceNumber_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UL_N_PDU_SequenceNumber_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UL_N_PDU_SequenceNumber_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UL_N_PDU_SequenceNumber_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UL_N_PDU_SequenceNumber_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UL_N_PDU_SequenceNumber = {
+	"RANAP_UL-N-PDU-SequenceNumber",
+	"RANAP_UL-N-PDU-SequenceNumber",
+	RANAP_UL_N_PDU_SequenceNumber_free,
+	RANAP_UL_N_PDU_SequenceNumber_print,
+	RANAP_UL_N_PDU_SequenceNumber_constraint,
+	RANAP_UL_N_PDU_SequenceNumber_decode_ber,
+	RANAP_UL_N_PDU_SequenceNumber_encode_der,
+	RANAP_UL_N_PDU_SequenceNumber_decode_xer,
+	RANAP_UL_N_PDU_SequenceNumber_encode_xer,
+	RANAP_UL_N_PDU_SequenceNumber_decode_uper,
+	RANAP_UL_N_PDU_SequenceNumber_encode_uper,
+	RANAP_UL_N_PDU_SequenceNumber_decode_aper,
+	RANAP_UL_N_PDU_SequenceNumber_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1,
+	sizeof(asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1)
+		/sizeof(asn_DEF_RANAP_UL_N_PDU_SequenceNumber_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UL_N_PDU_SequenceNumber_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UL-N-PDU-SequenceNumber.h b/src/ranap/RANAP_UL-N-PDU-SequenceNumber.h
new file mode 100644
index 0000000..b7304c7
--- /dev/null
+++ b/src/ranap/RANAP_UL-N-PDU-SequenceNumber.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UL_N_PDU_SequenceNumber_H_
+#define	_RANAP_UL_N_PDU_SequenceNumber_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UL-N-PDU-SequenceNumber */
+typedef long	 RANAP_UL_N_PDU_SequenceNumber_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UL_N_PDU_SequenceNumber;
+asn_struct_free_f RANAP_UL_N_PDU_SequenceNumber_free;
+asn_struct_print_f RANAP_UL_N_PDU_SequenceNumber_print;
+asn_constr_check_f RANAP_UL_N_PDU_SequenceNumber_constraint;
+ber_type_decoder_f RANAP_UL_N_PDU_SequenceNumber_decode_ber;
+der_type_encoder_f RANAP_UL_N_PDU_SequenceNumber_encode_der;
+xer_type_decoder_f RANAP_UL_N_PDU_SequenceNumber_decode_xer;
+xer_type_encoder_f RANAP_UL_N_PDU_SequenceNumber_encode_xer;
+per_type_decoder_f RANAP_UL_N_PDU_SequenceNumber_decode_uper;
+per_type_encoder_f RANAP_UL_N_PDU_SequenceNumber_encode_uper;
+per_type_decoder_f RANAP_UL_N_PDU_SequenceNumber_decode_aper;
+per_type_encoder_f RANAP_UL_N_PDU_SequenceNumber_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UL_N_PDU_SequenceNumber_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UP-ModeVersions.c b/src/ranap/RANAP_UP-ModeVersions.c
new file mode 100644
index 0000000..7d70d1e
--- /dev/null
+++ b/src/ranap/RANAP_UP-ModeVersions.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UP-ModeVersions.h"
+
+int
+RANAP_UP_ModeVersions_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 16l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+RANAP_UP_ModeVersions_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UP_ModeVersions_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UP_ModeVersions_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UP_ModeVersions_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UP_ModeVersions_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UP_ModeVersions_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UP_ModeVersions_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UP_ModeVersions_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UP_ModeVersions_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UP_ModeVersions_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UP_ModeVersions_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UP_ModeVersions_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  16l,  16l }	/* (SIZE(16..16)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UP_ModeVersions_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UP_ModeVersions = {
+	"RANAP_UP-ModeVersions",
+	"RANAP_UP-ModeVersions",
+	RANAP_UP_ModeVersions_free,
+	RANAP_UP_ModeVersions_print,
+	RANAP_UP_ModeVersions_constraint,
+	RANAP_UP_ModeVersions_decode_ber,
+	RANAP_UP_ModeVersions_encode_der,
+	RANAP_UP_ModeVersions_decode_xer,
+	RANAP_UP_ModeVersions_encode_xer,
+	RANAP_UP_ModeVersions_decode_uper,
+	RANAP_UP_ModeVersions_encode_uper,
+	RANAP_UP_ModeVersions_decode_aper,
+	RANAP_UP_ModeVersions_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UP_ModeVersions_tags_1,
+	sizeof(asn_DEF_RANAP_UP_ModeVersions_tags_1)
+		/sizeof(asn_DEF_RANAP_UP_ModeVersions_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UP_ModeVersions_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UP_ModeVersions_tags_1)
+		/sizeof(asn_DEF_RANAP_UP_ModeVersions_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UP_ModeVersions_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UP-ModeVersions.h b/src/ranap/RANAP_UP-ModeVersions.h
new file mode 100644
index 0000000..209bb28
--- /dev/null
+++ b/src/ranap/RANAP_UP-ModeVersions.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UP_ModeVersions_H_
+#define	_RANAP_UP_ModeVersions_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <BIT_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UP-ModeVersions */
+typedef BIT_STRING_t	 RANAP_UP_ModeVersions_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UP_ModeVersions;
+asn_struct_free_f RANAP_UP_ModeVersions_free;
+asn_struct_print_f RANAP_UP_ModeVersions_print;
+asn_constr_check_f RANAP_UP_ModeVersions_constraint;
+ber_type_decoder_f RANAP_UP_ModeVersions_decode_ber;
+der_type_encoder_f RANAP_UP_ModeVersions_encode_der;
+xer_type_decoder_f RANAP_UP_ModeVersions_decode_xer;
+xer_type_encoder_f RANAP_UP_ModeVersions_encode_xer;
+per_type_decoder_f RANAP_UP_ModeVersions_decode_uper;
+per_type_encoder_f RANAP_UP_ModeVersions_encode_uper;
+per_type_decoder_f RANAP_UP_ModeVersions_decode_aper;
+per_type_encoder_f RANAP_UP_ModeVersions_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UP_ModeVersions_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UPInformation.c b/src/ranap/RANAP_UPInformation.c
new file mode 100644
index 0000000..3c46dbf
--- /dev/null
+++ b/src/ranap/RANAP_UPInformation.c
@@ -0,0 +1,123 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UPInformation.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_UPInformation_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UPInformation, frameSeqNoUL),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_FrameSequenceNumber,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"frameSeqNoUL"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UPInformation, frameSeqNoDL),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_FrameSequenceNumber,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"frameSeqNoDL"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UPInformation, pdu14FrameSeqNoUL),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PDUType14FrameSequenceNumber,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pdu14FrameSeqNoUL"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UPInformation, pdu14FrameSeqNoDL),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PDUType14FrameSequenceNumber,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pdu14FrameSeqNoDL"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UPInformation, dataPDUType),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_DataPDUType,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"dataPDUType"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UPInformation, upinitialisationFrame),
+		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_UPInitialisationFrame,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"upinitialisationFrame"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_UPInformation, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_UPInformation_oms_1[] = { 6 };
+static const ber_tlv_tag_t asn_DEF_RANAP_UPInformation_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UPInformation_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* frameSeqNoUL */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* frameSeqNoDL */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* pdu14FrameSeqNoUL */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* pdu14FrameSeqNoDL */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* dataPDUType */
+    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* upinitialisationFrame */
+    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UPInformation_specs_1 = {
+	sizeof(struct RANAP_UPInformation),
+	offsetof(struct RANAP_UPInformation, _asn_ctx),
+	asn_MAP_RANAP_UPInformation_tag2el_1,
+	7,	/* Count of tags in the map */
+	asn_MAP_RANAP_UPInformation_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	6,	/* Start extensions */
+	8	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UPInformation = {
+	"RANAP_UPInformation",
+	"RANAP_UPInformation",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UPInformation_tags_1,
+	sizeof(asn_DEF_RANAP_UPInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_UPInformation_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UPInformation_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UPInformation_tags_1)
+		/sizeof(asn_DEF_RANAP_UPInformation_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UPInformation_1,
+	7,	/* Elements count */
+	&asn_SPC_RANAP_UPInformation_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UPInformation.h b/src/ranap/RANAP_UPInformation.h
new file mode 100644
index 0000000..23e7e70
--- /dev/null
+++ b/src/ranap/RANAP_UPInformation.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UPInformation_H_
+#define	_RANAP_UPInformation_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_FrameSequenceNumber.h"
+#include "RANAP_PDUType14FrameSequenceNumber.h"
+#include "RANAP_DataPDUType.h"
+#include "RANAP_UPInitialisationFrame.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UPInformation */
+typedef struct RANAP_UPInformation {
+	RANAP_FrameSequenceNumber_t	 frameSeqNoUL;
+	RANAP_FrameSequenceNumber_t	 frameSeqNoDL;
+	RANAP_PDUType14FrameSequenceNumber_t	 pdu14FrameSeqNoUL;
+	RANAP_PDUType14FrameSequenceNumber_t	 pdu14FrameSeqNoDL;
+	RANAP_DataPDUType_t	 dataPDUType;
+	RANAP_UPInitialisationFrame_t	 upinitialisationFrame;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UPInformation_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UPInformation;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UPInformation_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UPInitialisationFrame.c b/src/ranap/RANAP_UPInitialisationFrame.c
new file mode 100644
index 0000000..a892d93
--- /dev/null
+++ b/src/ranap/RANAP_UPInitialisationFrame.c
@@ -0,0 +1,143 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UPInitialisationFrame.h"
+
+int
+RANAP_UPInitialisationFrame_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+RANAP_UPInitialisationFrame_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UPInitialisationFrame_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UPInitialisationFrame_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UPInitialisationFrame_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UPInitialisationFrame_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UPInitialisationFrame_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UPInitialisationFrame_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UPInitialisationFrame_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UPInitialisationFrame_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UPInitialisationFrame_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UPInitialisationFrame_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static const ber_tlv_tag_t asn_DEF_RANAP_UPInitialisationFrame_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UPInitialisationFrame = {
+	"RANAP_UPInitialisationFrame",
+	"RANAP_UPInitialisationFrame",
+	RANAP_UPInitialisationFrame_free,
+	RANAP_UPInitialisationFrame_print,
+	RANAP_UPInitialisationFrame_constraint,
+	RANAP_UPInitialisationFrame_decode_ber,
+	RANAP_UPInitialisationFrame_encode_der,
+	RANAP_UPInitialisationFrame_decode_xer,
+	RANAP_UPInitialisationFrame_encode_xer,
+	RANAP_UPInitialisationFrame_decode_uper,
+	RANAP_UPInitialisationFrame_encode_uper,
+	RANAP_UPInitialisationFrame_decode_aper,
+	RANAP_UPInitialisationFrame_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UPInitialisationFrame_tags_1,
+	sizeof(asn_DEF_RANAP_UPInitialisationFrame_tags_1)
+		/sizeof(asn_DEF_RANAP_UPInitialisationFrame_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UPInitialisationFrame_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UPInitialisationFrame_tags_1)
+		/sizeof(asn_DEF_RANAP_UPInitialisationFrame_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_UPInitialisationFrame.h b/src/ranap/RANAP_UPInitialisationFrame.h
new file mode 100644
index 0000000..1118f14
--- /dev/null
+++ b/src/ranap/RANAP_UPInitialisationFrame.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UPInitialisationFrame_H_
+#define	_RANAP_UPInitialisationFrame_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <OCTET_STRING.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UPInitialisationFrame */
+typedef OCTET_STRING_t	 RANAP_UPInitialisationFrame_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UPInitialisationFrame;
+asn_struct_free_f RANAP_UPInitialisationFrame_free;
+asn_struct_print_f RANAP_UPInitialisationFrame_print;
+asn_constr_check_f RANAP_UPInitialisationFrame_constraint;
+ber_type_decoder_f RANAP_UPInitialisationFrame_decode_ber;
+der_type_encoder_f RANAP_UPInitialisationFrame_encode_der;
+xer_type_decoder_f RANAP_UPInitialisationFrame_decode_xer;
+xer_type_encoder_f RANAP_UPInitialisationFrame_encode_xer;
+per_type_decoder_f RANAP_UPInitialisationFrame_decode_uper;
+per_type_encoder_f RANAP_UPInitialisationFrame_encode_uper;
+per_type_decoder_f RANAP_UPInitialisationFrame_decode_aper;
+per_type_encoder_f RANAP_UPInitialisationFrame_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UPInitialisationFrame_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_USCH-ID.c b/src/ranap/RANAP_USCH-ID.c
new file mode 100644
index 0000000..4585a23
--- /dev/null
+++ b/src/ranap/RANAP_USCH-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_USCH-ID.h"
+
+int
+RANAP_USCH_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_USCH_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_USCH_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_USCH_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_USCH_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_USCH_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_USCH_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_USCH_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_USCH_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_USCH_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_USCH_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_USCH_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_USCH_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_USCH_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_USCH_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_USCH_ID = {
+	"RANAP_USCH-ID",
+	"RANAP_USCH-ID",
+	RANAP_USCH_ID_free,
+	RANAP_USCH_ID_print,
+	RANAP_USCH_ID_constraint,
+	RANAP_USCH_ID_decode_ber,
+	RANAP_USCH_ID_encode_der,
+	RANAP_USCH_ID_decode_xer,
+	RANAP_USCH_ID_encode_xer,
+	RANAP_USCH_ID_decode_uper,
+	RANAP_USCH_ID_encode_uper,
+	RANAP_USCH_ID_decode_aper,
+	RANAP_USCH_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_USCH_ID_tags_1,
+	sizeof(asn_DEF_RANAP_USCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_USCH_ID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_USCH_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_USCH_ID_tags_1)
+		/sizeof(asn_DEF_RANAP_USCH_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_USCH_ID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_USCH-ID.h b/src/ranap/RANAP_USCH-ID.h
new file mode 100644
index 0000000..2462e8e
--- /dev/null
+++ b/src/ranap/RANAP_USCH-ID.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_USCH_ID_H_
+#define	_RANAP_USCH_ID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_USCH-ID */
+typedef long	 RANAP_USCH_ID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_USCH_ID;
+asn_struct_free_f RANAP_USCH_ID_free;
+asn_struct_print_f RANAP_USCH_ID_print;
+asn_constr_check_f RANAP_USCH_ID_constraint;
+ber_type_decoder_f RANAP_USCH_ID_decode_ber;
+der_type_encoder_f RANAP_USCH_ID_encode_der;
+xer_type_decoder_f RANAP_USCH_ID_decode_xer;
+xer_type_encoder_f RANAP_USCH_ID_encode_xer;
+per_type_decoder_f RANAP_USCH_ID_decode_uper;
+per_type_encoder_f RANAP_USCH_ID_encode_uper;
+per_type_decoder_f RANAP_USCH_ID_decode_aper;
+per_type_encoder_f RANAP_USCH_ID_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_USCH_ID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UTRAN-CellID.c b/src/ranap/RANAP_UTRAN-CellID.c
new file mode 100644
index 0000000..9005bee
--- /dev/null
+++ b/src/ranap/RANAP_UTRAN-CellID.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UTRAN-CellID.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_UTRAN_CellID_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UTRAN_CellID, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_PLMNidentity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UTRAN_CellID, cellID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_TargetCellId,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cellID"
+		},
+	{ ATF_POINTER, 1, offsetof(struct RANAP_UTRAN_CellID, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_RANAP_UTRAN_CellID_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_RANAP_UTRAN_CellID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UTRAN_CellID_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cellID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UTRAN_CellID_specs_1 = {
+	sizeof(struct RANAP_UTRAN_CellID),
+	offsetof(struct RANAP_UTRAN_CellID, _asn_ctx),
+	asn_MAP_RANAP_UTRAN_CellID_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_RANAP_UTRAN_CellID_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UTRAN_CellID = {
+	"RANAP_UTRAN-CellID",
+	"RANAP_UTRAN-CellID",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UTRAN_CellID_tags_1,
+	sizeof(asn_DEF_RANAP_UTRAN_CellID_tags_1)
+		/sizeof(asn_DEF_RANAP_UTRAN_CellID_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UTRAN_CellID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UTRAN_CellID_tags_1)
+		/sizeof(asn_DEF_RANAP_UTRAN_CellID_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UTRAN_CellID_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_UTRAN_CellID_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UTRAN-CellID.h b/src/ranap/RANAP_UTRAN-CellID.h
new file mode 100644
index 0000000..de66d45
--- /dev/null
+++ b/src/ranap/RANAP_UTRAN-CellID.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UTRAN_CellID_H_
+#define	_RANAP_UTRAN_CellID_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_PLMNidentity.h"
+#include "RANAP_TargetCellId.h"
+#include "RANAP_IE-Extensions.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UTRAN-CellID */
+typedef struct RANAP_UTRAN_CellID {
+	RANAP_PLMNidentity_t	 pLMNidentity;
+	RANAP_TargetCellId_t	 cellID;
+	RANAP_IE_Extensions_t	*iE_Extensions	/* OPTIONAL */;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UTRAN_CellID_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UTRAN_CellID;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UTRAN_CellID_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UeRadioCapabilityMatchRequest.c b/src/ranap/RANAP_UeRadioCapabilityMatchRequest.c
new file mode 100644
index 0000000..30a1a65
--- /dev/null
+++ b/src/ranap/RANAP_UeRadioCapabilityMatchRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UeRadioCapabilityMatchRequest.h"
+
+static int
+memb_ueRadioCapabilityMatchRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_ueRadioCapabilityMatchRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_ueRadioCapabilityMatchRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_ueRadioCapabilityMatchRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_ueRadioCapabilityMatchRequest_ies_specs_2 = {
+	sizeof(struct ueRadioCapabilityMatchRequest_ies),
+	offsetof(struct ueRadioCapabilityMatchRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_ueRadioCapabilityMatchRequest_ies_2 = {
+	"ueRadioCapabilityMatchRequest-ies",
+	"ueRadioCapabilityMatchRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2,
+	sizeof(asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2)
+		/sizeof(asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2)
+		/sizeof(asn_DEF_ueRadioCapabilityMatchRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_ueRadioCapabilityMatchRequest_ies_constr_2,
+	asn_MBR_ueRadioCapabilityMatchRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_ueRadioCapabilityMatchRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_UeRadioCapabilityMatchRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UeRadioCapabilityMatchRequest, ueRadioCapabilityMatchRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_ueRadioCapabilityMatchRequest_ies_2,
+		memb_ueRadioCapabilityMatchRequest_ies_constraint_1,
+		&asn_PER_memb_ueRadioCapabilityMatchRequest_ies_constr_2,
+		0,
+		"ueRadioCapabilityMatchRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UeRadioCapabilityMatchRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ueRadioCapabilityMatchRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UeRadioCapabilityMatchRequest_specs_1 = {
+	sizeof(struct RANAP_UeRadioCapabilityMatchRequest),
+	offsetof(struct RANAP_UeRadioCapabilityMatchRequest, _asn_ctx),
+	asn_MAP_RANAP_UeRadioCapabilityMatchRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UeRadioCapabilityMatchRequest = {
+	"RANAP_UeRadioCapabilityMatchRequest",
+	"RANAP_UeRadioCapabilityMatchRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1,
+	sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UeRadioCapabilityMatchRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_UeRadioCapabilityMatchRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UeRadioCapabilityMatchRequest.h b/src/ranap/RANAP_UeRadioCapabilityMatchRequest.h
new file mode 100644
index 0000000..5c8c01b
--- /dev/null
+++ b/src/ranap/RANAP_UeRadioCapabilityMatchRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UeRadioCapabilityMatchRequest_H_
+#define	_RANAP_UeRadioCapabilityMatchRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UeRadioCapabilityMatchRequest */
+typedef struct RANAP_UeRadioCapabilityMatchRequest {
+	struct ueRadioCapabilityMatchRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ueRadioCapabilityMatchRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UeRadioCapabilityMatchRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UeRadioCapabilityMatchRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UeRadioCapabilityMatchRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UeRadioCapabilityMatchResponse.c b/src/ranap/RANAP_UeRadioCapabilityMatchResponse.c
new file mode 100644
index 0000000..4f56f8d
--- /dev/null
+++ b/src/ranap/RANAP_UeRadioCapabilityMatchResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UeRadioCapabilityMatchResponse.h"
+
+static int
+memb_ueRadioCapabilityMatchResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_ueRadioCapabilityMatchResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_ueRadioCapabilityMatchResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_ueRadioCapabilityMatchResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_ueRadioCapabilityMatchResponse_ies_specs_2 = {
+	sizeof(struct ueRadioCapabilityMatchResponse_ies),
+	offsetof(struct ueRadioCapabilityMatchResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_ueRadioCapabilityMatchResponse_ies_2 = {
+	"ueRadioCapabilityMatchResponse-ies",
+	"ueRadioCapabilityMatchResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2,
+	sizeof(asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2)
+		/sizeof(asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2)
+		/sizeof(asn_DEF_ueRadioCapabilityMatchResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_ueRadioCapabilityMatchResponse_ies_constr_2,
+	asn_MBR_ueRadioCapabilityMatchResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_ueRadioCapabilityMatchResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_UeRadioCapabilityMatchResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UeRadioCapabilityMatchResponse, ueRadioCapabilityMatchResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_ueRadioCapabilityMatchResponse_ies_2,
+		memb_ueRadioCapabilityMatchResponse_ies_constraint_1,
+		&asn_PER_memb_ueRadioCapabilityMatchResponse_ies_constr_2,
+		0,
+		"ueRadioCapabilityMatchResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UeRadioCapabilityMatchResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* ueRadioCapabilityMatchResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UeRadioCapabilityMatchResponse_specs_1 = {
+	sizeof(struct RANAP_UeRadioCapabilityMatchResponse),
+	offsetof(struct RANAP_UeRadioCapabilityMatchResponse, _asn_ctx),
+	asn_MAP_RANAP_UeRadioCapabilityMatchResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UeRadioCapabilityMatchResponse = {
+	"RANAP_UeRadioCapabilityMatchResponse",
+	"RANAP_UeRadioCapabilityMatchResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1,
+	sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_UeRadioCapabilityMatchResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UeRadioCapabilityMatchResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_UeRadioCapabilityMatchResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UeRadioCapabilityMatchResponse.h b/src/ranap/RANAP_UeRadioCapabilityMatchResponse.h
new file mode 100644
index 0000000..8142c63
--- /dev/null
+++ b/src/ranap/RANAP_UeRadioCapabilityMatchResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UeRadioCapabilityMatchResponse_H_
+#define	_RANAP_UeRadioCapabilityMatchResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UeRadioCapabilityMatchResponse */
+typedef struct RANAP_UeRadioCapabilityMatchResponse {
+	struct ueRadioCapabilityMatchResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} ueRadioCapabilityMatchResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UeRadioCapabilityMatchResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UeRadioCapabilityMatchResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UeRadioCapabilityMatchResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UnsuccessfulOutcome.c b/src/ranap/RANAP_UnsuccessfulOutcome.c
new file mode 100644
index 0000000..6ea65b1
--- /dev/null
+++ b/src/ranap/RANAP_UnsuccessfulOutcome.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UnsuccessfulOutcome.h"
+
+static asn_TYPE_member_t asn_MBR_RANAP_UnsuccessfulOutcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UnsuccessfulOutcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UnsuccessfulOutcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UnsuccessfulOutcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UnsuccessfulOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UnsuccessfulOutcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UnsuccessfulOutcome_specs_1 = {
+	sizeof(struct RANAP_UnsuccessfulOutcome),
+	offsetof(struct RANAP_UnsuccessfulOutcome, _asn_ctx),
+	asn_MAP_RANAP_UnsuccessfulOutcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UnsuccessfulOutcome = {
+	"RANAP_UnsuccessfulOutcome",
+	"RANAP_UnsuccessfulOutcome",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UnsuccessfulOutcome_tags_1,
+	sizeof(asn_DEF_RANAP_UnsuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_RANAP_UnsuccessfulOutcome_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UnsuccessfulOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UnsuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_RANAP_UnsuccessfulOutcome_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UnsuccessfulOutcome_1,
+	3,	/* Elements count */
+	&asn_SPC_RANAP_UnsuccessfulOutcome_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UnsuccessfulOutcome.h b/src/ranap/RANAP_UnsuccessfulOutcome.h
new file mode 100644
index 0000000..5f77557
--- /dev/null
+++ b/src/ranap/RANAP_UnsuccessfulOutcome.h
@@ -0,0 +1,41 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UnsuccessfulOutcome_H_
+#define	_RANAP_UnsuccessfulOutcome_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_ProcedureCode.h"
+#include "RANAP_Criticality.h"
+#include <ANY.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UnsuccessfulOutcome */
+typedef struct RANAP_UnsuccessfulOutcome {
+	RANAP_ProcedureCode_t	 procedureCode;
+	RANAP_Criticality_t	 criticality;
+	ANY_t	 value;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UnsuccessfulOutcome_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UnsuccessfulOutcome;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UnsuccessfulOutcome_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UnsuccessfullyTransmittedDataVolume.c b/src/ranap/RANAP_UnsuccessfullyTransmittedDataVolume.c
new file mode 100644
index 0000000..76bfea6
--- /dev/null
+++ b/src/ranap/RANAP_UnsuccessfullyTransmittedDataVolume.c
@@ -0,0 +1,161 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UnsuccessfullyTransmittedDataVolume.h"
+
+int
+RANAP_UnsuccessfullyTransmittedDataVolume_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	/* Constraint check succeeded */
+	return 0;
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+     /* td->specifics      = asn_DEF_NativeInteger.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_UnsuccessfullyTransmittedDataVolume_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UnsuccessfullyTransmittedDataVolume_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UnsuccessfullyTransmittedDataVolume_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UnsuccessfullyTransmittedDataVolume_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UnsuccessfullyTransmittedDataVolume_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 32, -1,  0l, 4294967295ul }	/* (0..4294967295) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_UnsuccessfullyTransmittedDataVolume_specs_1 = {
+	0,	0,	0,	0,	0,
+	0,	/* Native long size */
+	1	/* Unsigned representation */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume = {
+	"RANAP_UnsuccessfullyTransmittedDataVolume",
+	"RANAP_UnsuccessfullyTransmittedDataVolume",
+	RANAP_UnsuccessfullyTransmittedDataVolume_free,
+	RANAP_UnsuccessfullyTransmittedDataVolume_print,
+	RANAP_UnsuccessfullyTransmittedDataVolume_constraint,
+	RANAP_UnsuccessfullyTransmittedDataVolume_decode_ber,
+	RANAP_UnsuccessfullyTransmittedDataVolume_encode_der,
+	RANAP_UnsuccessfullyTransmittedDataVolume_decode_xer,
+	RANAP_UnsuccessfullyTransmittedDataVolume_encode_xer,
+	RANAP_UnsuccessfullyTransmittedDataVolume_decode_uper,
+	RANAP_UnsuccessfullyTransmittedDataVolume_encode_uper,
+	RANAP_UnsuccessfullyTransmittedDataVolume_decode_aper,
+	RANAP_UnsuccessfullyTransmittedDataVolume_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1,
+	sizeof(asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1)
+		/sizeof(asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1)
+		/sizeof(asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UnsuccessfullyTransmittedDataVolume_constr_1,
+	0, 0,	/* No members */
+	&asn_SPC_RANAP_UnsuccessfullyTransmittedDataVolume_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UnsuccessfullyTransmittedDataVolume.h b/src/ranap/RANAP_UnsuccessfullyTransmittedDataVolume.h
new file mode 100644
index 0000000..be64f7b
--- /dev/null
+++ b/src/ranap/RANAP_UnsuccessfullyTransmittedDataVolume.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UnsuccessfullyTransmittedDataVolume_H_
+#define	_RANAP_UnsuccessfullyTransmittedDataVolume_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UnsuccessfullyTransmittedDataVolume */
+typedef unsigned long	 RANAP_UnsuccessfullyTransmittedDataVolume_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UnsuccessfullyTransmittedDataVolume;
+asn_struct_free_f RANAP_UnsuccessfullyTransmittedDataVolume_free;
+asn_struct_print_f RANAP_UnsuccessfullyTransmittedDataVolume_print;
+asn_constr_check_f RANAP_UnsuccessfullyTransmittedDataVolume_constraint;
+ber_type_decoder_f RANAP_UnsuccessfullyTransmittedDataVolume_decode_ber;
+der_type_encoder_f RANAP_UnsuccessfullyTransmittedDataVolume_encode_der;
+xer_type_decoder_f RANAP_UnsuccessfullyTransmittedDataVolume_decode_xer;
+xer_type_encoder_f RANAP_UnsuccessfullyTransmittedDataVolume_encode_xer;
+per_type_decoder_f RANAP_UnsuccessfullyTransmittedDataVolume_decode_uper;
+per_type_encoder_f RANAP_UnsuccessfullyTransmittedDataVolume_encode_uper;
+per_type_decoder_f RANAP_UnsuccessfullyTransmittedDataVolume_decode_aper;
+per_type_encoder_f RANAP_UnsuccessfullyTransmittedDataVolume_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UnsuccessfullyTransmittedDataVolume_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UplinkInformationExchangeFailure.c b/src/ranap/RANAP_UplinkInformationExchangeFailure.c
new file mode 100644
index 0000000..4a4cbb9
--- /dev/null
+++ b/src/ranap/RANAP_UplinkInformationExchangeFailure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UplinkInformationExchangeFailure.h"
+
+static int
+memb_uplinkInformationExchangeFailure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_uplinkInformationExchangeFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_uplinkInformationExchangeFailure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_uplinkInformationExchangeFailure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_uplinkInformationExchangeFailure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_uplinkInformationExchangeFailure_ies_specs_2 = {
+	sizeof(struct uplinkInformationExchangeFailure_ies),
+	offsetof(struct uplinkInformationExchangeFailure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_uplinkInformationExchangeFailure_ies_2 = {
+	"uplinkInformationExchangeFailure-ies",
+	"uplinkInformationExchangeFailure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_uplinkInformationExchangeFailure_ies_tags_2,
+	sizeof(asn_DEF_uplinkInformationExchangeFailure_ies_tags_2)
+		/sizeof(asn_DEF_uplinkInformationExchangeFailure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_uplinkInformationExchangeFailure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_uplinkInformationExchangeFailure_ies_tags_2)
+		/sizeof(asn_DEF_uplinkInformationExchangeFailure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_uplinkInformationExchangeFailure_ies_constr_2,
+	asn_MBR_uplinkInformationExchangeFailure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_uplinkInformationExchangeFailure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_UplinkInformationExchangeFailure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UplinkInformationExchangeFailure, uplinkInformationExchangeFailure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_uplinkInformationExchangeFailure_ies_2,
+		memb_uplinkInformationExchangeFailure_ies_constraint_1,
+		&asn_PER_memb_uplinkInformationExchangeFailure_ies_constr_2,
+		0,
+		"uplinkInformationExchangeFailure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UplinkInformationExchangeFailure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* uplinkInformationExchangeFailure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UplinkInformationExchangeFailure_specs_1 = {
+	sizeof(struct RANAP_UplinkInformationExchangeFailure),
+	offsetof(struct RANAP_UplinkInformationExchangeFailure, _asn_ctx),
+	asn_MAP_RANAP_UplinkInformationExchangeFailure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UplinkInformationExchangeFailure = {
+	"RANAP_UplinkInformationExchangeFailure",
+	"RANAP_UplinkInformationExchangeFailure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1,
+	sizeof(asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1)
+		/sizeof(asn_DEF_RANAP_UplinkInformationExchangeFailure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UplinkInformationExchangeFailure_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_UplinkInformationExchangeFailure_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UplinkInformationExchangeFailure.h b/src/ranap/RANAP_UplinkInformationExchangeFailure.h
new file mode 100644
index 0000000..7f2f8e4
--- /dev/null
+++ b/src/ranap/RANAP_UplinkInformationExchangeFailure.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UplinkInformationExchangeFailure_H_
+#define	_RANAP_UplinkInformationExchangeFailure_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UplinkInformationExchangeFailure */
+typedef struct RANAP_UplinkInformationExchangeFailure {
+	struct uplinkInformationExchangeFailure_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} uplinkInformationExchangeFailure_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UplinkInformationExchangeFailure_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UplinkInformationExchangeFailure;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UplinkInformationExchangeFailure_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UplinkInformationExchangeRequest.c b/src/ranap/RANAP_UplinkInformationExchangeRequest.c
new file mode 100644
index 0000000..1d1a5be
--- /dev/null
+++ b/src/ranap/RANAP_UplinkInformationExchangeRequest.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UplinkInformationExchangeRequest.h"
+
+static int
+memb_uplinkInformationExchangeRequest_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_uplinkInformationExchangeRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_uplinkInformationExchangeRequest_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_uplinkInformationExchangeRequest_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_uplinkInformationExchangeRequest_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_uplinkInformationExchangeRequest_ies_specs_2 = {
+	sizeof(struct uplinkInformationExchangeRequest_ies),
+	offsetof(struct uplinkInformationExchangeRequest_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_uplinkInformationExchangeRequest_ies_2 = {
+	"uplinkInformationExchangeRequest-ies",
+	"uplinkInformationExchangeRequest-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_uplinkInformationExchangeRequest_ies_tags_2,
+	sizeof(asn_DEF_uplinkInformationExchangeRequest_ies_tags_2)
+		/sizeof(asn_DEF_uplinkInformationExchangeRequest_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_uplinkInformationExchangeRequest_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_uplinkInformationExchangeRequest_ies_tags_2)
+		/sizeof(asn_DEF_uplinkInformationExchangeRequest_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_uplinkInformationExchangeRequest_ies_constr_2,
+	asn_MBR_uplinkInformationExchangeRequest_ies_2,
+	1,	/* Single element */
+	&asn_SPC_uplinkInformationExchangeRequest_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_UplinkInformationExchangeRequest_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UplinkInformationExchangeRequest, uplinkInformationExchangeRequest_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_uplinkInformationExchangeRequest_ies_2,
+		memb_uplinkInformationExchangeRequest_ies_constraint_1,
+		&asn_PER_memb_uplinkInformationExchangeRequest_ies_constr_2,
+		0,
+		"uplinkInformationExchangeRequest-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UplinkInformationExchangeRequest_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* uplinkInformationExchangeRequest-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UplinkInformationExchangeRequest_specs_1 = {
+	sizeof(struct RANAP_UplinkInformationExchangeRequest),
+	offsetof(struct RANAP_UplinkInformationExchangeRequest, _asn_ctx),
+	asn_MAP_RANAP_UplinkInformationExchangeRequest_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UplinkInformationExchangeRequest = {
+	"RANAP_UplinkInformationExchangeRequest",
+	"RANAP_UplinkInformationExchangeRequest",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1,
+	sizeof(asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1)
+		/sizeof(asn_DEF_RANAP_UplinkInformationExchangeRequest_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UplinkInformationExchangeRequest_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_UplinkInformationExchangeRequest_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UplinkInformationExchangeRequest.h b/src/ranap/RANAP_UplinkInformationExchangeRequest.h
new file mode 100644
index 0000000..52603cc
--- /dev/null
+++ b/src/ranap/RANAP_UplinkInformationExchangeRequest.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UplinkInformationExchangeRequest_H_
+#define	_RANAP_UplinkInformationExchangeRequest_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UplinkInformationExchangeRequest */
+typedef struct RANAP_UplinkInformationExchangeRequest {
+	struct uplinkInformationExchangeRequest_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} uplinkInformationExchangeRequest_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UplinkInformationExchangeRequest_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UplinkInformationExchangeRequest;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UplinkInformationExchangeRequest_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UplinkInformationExchangeResponse.c b/src/ranap/RANAP_UplinkInformationExchangeResponse.c
new file mode 100644
index 0000000..cc37599
--- /dev/null
+++ b/src/ranap/RANAP_UplinkInformationExchangeResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_UplinkInformationExchangeResponse.h"
+
+static int
+memb_uplinkInformationExchangeResponse_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_uplinkInformationExchangeResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_uplinkInformationExchangeResponse_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_uplinkInformationExchangeResponse_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_uplinkInformationExchangeResponse_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_uplinkInformationExchangeResponse_ies_specs_2 = {
+	sizeof(struct uplinkInformationExchangeResponse_ies),
+	offsetof(struct uplinkInformationExchangeResponse_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_uplinkInformationExchangeResponse_ies_2 = {
+	"uplinkInformationExchangeResponse-ies",
+	"uplinkInformationExchangeResponse-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_uplinkInformationExchangeResponse_ies_tags_2,
+	sizeof(asn_DEF_uplinkInformationExchangeResponse_ies_tags_2)
+		/sizeof(asn_DEF_uplinkInformationExchangeResponse_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_uplinkInformationExchangeResponse_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_uplinkInformationExchangeResponse_ies_tags_2)
+		/sizeof(asn_DEF_uplinkInformationExchangeResponse_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_uplinkInformationExchangeResponse_ies_constr_2,
+	asn_MBR_uplinkInformationExchangeResponse_ies_2,
+	1,	/* Single element */
+	&asn_SPC_uplinkInformationExchangeResponse_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_UplinkInformationExchangeResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_UplinkInformationExchangeResponse, uplinkInformationExchangeResponse_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_uplinkInformationExchangeResponse_ies_2,
+		memb_uplinkInformationExchangeResponse_ies_constraint_1,
+		&asn_PER_memb_uplinkInformationExchangeResponse_ies_constr_2,
+		0,
+		"uplinkInformationExchangeResponse-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_UplinkInformationExchangeResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* uplinkInformationExchangeResponse-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UplinkInformationExchangeResponse_specs_1 = {
+	sizeof(struct RANAP_UplinkInformationExchangeResponse),
+	offsetof(struct RANAP_UplinkInformationExchangeResponse, _asn_ctx),
+	asn_MAP_RANAP_UplinkInformationExchangeResponse_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UplinkInformationExchangeResponse = {
+	"RANAP_UplinkInformationExchangeResponse",
+	"RANAP_UplinkInformationExchangeResponse",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1,
+	sizeof(asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_UplinkInformationExchangeResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_UplinkInformationExchangeResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_UplinkInformationExchangeResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UplinkInformationExchangeResponse.h b/src/ranap/RANAP_UplinkInformationExchangeResponse.h
new file mode 100644
index 0000000..4c83083
--- /dev/null
+++ b/src/ranap/RANAP_UplinkInformationExchangeResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_UplinkInformationExchangeResponse_H_
+#define	_RANAP_UplinkInformationExchangeResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_UplinkInformationExchangeResponse */
+typedef struct RANAP_UplinkInformationExchangeResponse {
+	struct uplinkInformationExchangeResponse_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} uplinkInformationExchangeResponse_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_UplinkInformationExchangeResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UplinkInformationExchangeResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UplinkInformationExchangeResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_UserPlaneMode.c b/src/ranap/RANAP_UserPlaneMode.c
new file mode 100644
index 0000000..2a30882
--- /dev/null
+++ b/src/ranap/RANAP_UserPlaneMode.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_UserPlaneMode.h"
+
+int
+RANAP_UserPlaneMode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_UserPlaneMode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_UserPlaneMode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UserPlaneMode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_UserPlaneMode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UserPlaneMode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_UserPlaneMode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_UserPlaneMode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_UserPlaneMode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_UserPlaneMode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_UserPlaneMode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_UserPlaneMode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_UserPlaneMode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_UserPlaneMode_value2enum_1[] = {
+	{ 0,	16,	"transparent-mode" },
+	{ 1,	37,	"support-mode-for-predefined-SDU-sizes" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_UserPlaneMode_enum2value_1[] = {
+	1,	/* support-mode-for-predefined-SDU-sizes(1) */
+	0	/* transparent-mode(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_UserPlaneMode_specs_1 = {
+	asn_MAP_RANAP_UserPlaneMode_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_UserPlaneMode_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_UserPlaneMode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_UserPlaneMode = {
+	"RANAP_UserPlaneMode",
+	"RANAP_UserPlaneMode",
+	RANAP_UserPlaneMode_free,
+	RANAP_UserPlaneMode_print,
+	RANAP_UserPlaneMode_constraint,
+	RANAP_UserPlaneMode_decode_ber,
+	RANAP_UserPlaneMode_encode_der,
+	RANAP_UserPlaneMode_decode_xer,
+	RANAP_UserPlaneMode_encode_xer,
+	RANAP_UserPlaneMode_decode_uper,
+	RANAP_UserPlaneMode_encode_uper,
+	RANAP_UserPlaneMode_decode_aper,
+	RANAP_UserPlaneMode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_UserPlaneMode_tags_1,
+	sizeof(asn_DEF_RANAP_UserPlaneMode_tags_1)
+		/sizeof(asn_DEF_RANAP_UserPlaneMode_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_UserPlaneMode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_UserPlaneMode_tags_1)
+		/sizeof(asn_DEF_RANAP_UserPlaneMode_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_UserPlaneMode_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_UserPlaneMode_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_UserPlaneMode.h b/src/ranap/RANAP_UserPlaneMode.h
new file mode 100644
index 0000000..f2d6786
--- /dev/null
+++ b/src/ranap/RANAP_UserPlaneMode.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_UserPlaneMode_H_
+#define	_RANAP_UserPlaneMode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_UserPlaneMode {
+	RANAP_UserPlaneMode_transparent_mode	= 0,
+	RANAP_UserPlaneMode_support_mode_for_predefined_SDU_sizes	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_UserPlaneMode;
+
+/* RANAP_UserPlaneMode */
+typedef long	 RANAP_UserPlaneMode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_UserPlaneMode;
+asn_struct_free_f RANAP_UserPlaneMode_free;
+asn_struct_print_f RANAP_UserPlaneMode_print;
+asn_constr_check_f RANAP_UserPlaneMode_constraint;
+ber_type_decoder_f RANAP_UserPlaneMode_decode_ber;
+der_type_encoder_f RANAP_UserPlaneMode_encode_der;
+xer_type_decoder_f RANAP_UserPlaneMode_decode_xer;
+xer_type_encoder_f RANAP_UserPlaneMode_encode_xer;
+per_type_decoder_f RANAP_UserPlaneMode_decode_uper;
+per_type_encoder_f RANAP_UserPlaneMode_encode_uper;
+per_type_decoder_f RANAP_UserPlaneMode_decode_aper;
+per_type_encoder_f RANAP_UserPlaneMode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_UserPlaneMode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_VelocityEstimate.c b/src/ranap/RANAP_VelocityEstimate.c
new file mode 100644
index 0000000..88d7a06
--- /dev/null
+++ b/src/ranap/RANAP_VelocityEstimate.c
@@ -0,0 +1,92 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_VelocityEstimate.h"
+
+static asn_per_constraints_t asn_PER_type_RANAP_VelocityEstimate_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_VelocityEstimate_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalVelocity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalVelocity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalVelocity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalWithVerticalVelocity),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalWithVerticalVelocity,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalWithVerticalVelocity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalVelocityWithUncertainty),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalVelocityWithUncertainty,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalVelocityWithUncertainty"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VelocityEstimate, choice.horizontalWithVeritcalVelocityAndUncertainty),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_HorizontalWithVerticalVelocityAndUncertainty,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"horizontalWithVeritcalVelocityAndUncertainty"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_VelocityEstimate_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* horizontalVelocity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* horizontalWithVerticalVelocity */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* horizontalVelocityWithUncertainty */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* horizontalWithVeritcalVelocityAndUncertainty */
+};
+static asn_CHOICE_specifics_t asn_SPC_RANAP_VelocityEstimate_specs_1 = {
+	sizeof(struct RANAP_VelocityEstimate),
+	offsetof(struct RANAP_VelocityEstimate, _asn_ctx),
+	offsetof(struct RANAP_VelocityEstimate, present),
+	sizeof(((struct RANAP_VelocityEstimate *)0)->present),
+	asn_MAP_RANAP_VelocityEstimate_tag2el_1,
+	4,	/* Count of tags in the map */
+	0,
+	4	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_VelocityEstimate = {
+	"RANAP_VelocityEstimate",
+	"RANAP_VelocityEstimate",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_RANAP_VelocityEstimate_constr_1,
+	asn_MBR_RANAP_VelocityEstimate_1,
+	4,	/* Elements count */
+	&asn_SPC_RANAP_VelocityEstimate_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_VelocityEstimate.h b/src/ranap/RANAP_VelocityEstimate.h
new file mode 100644
index 0000000..2718dce
--- /dev/null
+++ b/src/ranap/RANAP_VelocityEstimate.h
@@ -0,0 +1,61 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_VelocityEstimate_H_
+#define	_RANAP_VelocityEstimate_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_HorizontalVelocity.h"
+#include "RANAP_HorizontalWithVerticalVelocity.h"
+#include "RANAP_HorizontalVelocityWithUncertainty.h"
+#include "RANAP_HorizontalWithVerticalVelocityAndUncertainty.h"
+#include <constr_CHOICE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_VelocityEstimate_PR {
+	RANAP_VelocityEstimate_PR_NOTHING,	/* No components present */
+	RANAP_VelocityEstimate_PR_horizontalVelocity,
+	RANAP_VelocityEstimate_PR_horizontalWithVerticalVelocity,
+	RANAP_VelocityEstimate_PR_horizontalVelocityWithUncertainty,
+	RANAP_VelocityEstimate_PR_horizontalWithVeritcalVelocityAndUncertainty,
+	/* Extensions may appear below */
+	
+} RANAP_VelocityEstimate_PR;
+
+/* RANAP_VelocityEstimate */
+typedef struct RANAP_VelocityEstimate {
+	RANAP_VelocityEstimate_PR present;
+	union RANAP_VelocityEstimate_u {
+		RANAP_HorizontalVelocity_t	 horizontalVelocity;
+		RANAP_HorizontalWithVerticalVelocity_t	 horizontalWithVerticalVelocity;
+		RANAP_HorizontalVelocityWithUncertainty_t	 horizontalVelocityWithUncertainty;
+		RANAP_HorizontalWithVerticalVelocityAndUncertainty_t	 horizontalWithVeritcalVelocityAndUncertainty;
+		/*
+		 * This type is extensible,
+		 * possible extensions are below.
+		 */
+	} choice;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_VelocityEstimate_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_VelocityEstimate;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_VelocityEstimate_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_VerticalAccuracyCode.c b/src/ranap/RANAP_VerticalAccuracyCode.c
new file mode 100644
index 0000000..8dc6b4a
--- /dev/null
+++ b/src/ranap/RANAP_VerticalAccuracyCode.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_VerticalAccuracyCode.h"
+
+int
+RANAP_VerticalAccuracyCode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 127l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+RANAP_VerticalAccuracyCode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_VerticalAccuracyCode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VerticalAccuracyCode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_VerticalAccuracyCode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VerticalAccuracyCode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_VerticalAccuracyCode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VerticalAccuracyCode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_VerticalAccuracyCode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_VerticalAccuracyCode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_VerticalAccuracyCode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_VerticalAccuracyCode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_VerticalAccuracyCode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 7,  7,  0l,  127l }	/* (0..127) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_VerticalAccuracyCode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_VerticalAccuracyCode = {
+	"RANAP_VerticalAccuracyCode",
+	"RANAP_VerticalAccuracyCode",
+	RANAP_VerticalAccuracyCode_free,
+	RANAP_VerticalAccuracyCode_print,
+	RANAP_VerticalAccuracyCode_constraint,
+	RANAP_VerticalAccuracyCode_decode_ber,
+	RANAP_VerticalAccuracyCode_encode_der,
+	RANAP_VerticalAccuracyCode_decode_xer,
+	RANAP_VerticalAccuracyCode_encode_xer,
+	RANAP_VerticalAccuracyCode_decode_uper,
+	RANAP_VerticalAccuracyCode_encode_uper,
+	RANAP_VerticalAccuracyCode_decode_aper,
+	RANAP_VerticalAccuracyCode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_VerticalAccuracyCode_tags_1,
+	sizeof(asn_DEF_RANAP_VerticalAccuracyCode_tags_1)
+		/sizeof(asn_DEF_RANAP_VerticalAccuracyCode_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_VerticalAccuracyCode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_VerticalAccuracyCode_tags_1)
+		/sizeof(asn_DEF_RANAP_VerticalAccuracyCode_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_VerticalAccuracyCode_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/ranap/RANAP_VerticalAccuracyCode.h b/src/ranap/RANAP_VerticalAccuracyCode.h
new file mode 100644
index 0000000..92cb974
--- /dev/null
+++ b/src/ranap/RANAP_VerticalAccuracyCode.h
@@ -0,0 +1,42 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_VerticalAccuracyCode_H_
+#define	_RANAP_VerticalAccuracyCode_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_VerticalAccuracyCode */
+typedef long	 RANAP_VerticalAccuracyCode_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_VerticalAccuracyCode;
+asn_struct_free_f RANAP_VerticalAccuracyCode_free;
+asn_struct_print_f RANAP_VerticalAccuracyCode_print;
+asn_constr_check_f RANAP_VerticalAccuracyCode_constraint;
+ber_type_decoder_f RANAP_VerticalAccuracyCode_decode_ber;
+der_type_encoder_f RANAP_VerticalAccuracyCode_encode_der;
+xer_type_decoder_f RANAP_VerticalAccuracyCode_decode_xer;
+xer_type_encoder_f RANAP_VerticalAccuracyCode_encode_xer;
+per_type_decoder_f RANAP_VerticalAccuracyCode_decode_uper;
+per_type_encoder_f RANAP_VerticalAccuracyCode_encode_uper;
+per_type_decoder_f RANAP_VerticalAccuracyCode_decode_aper;
+per_type_encoder_f RANAP_VerticalAccuracyCode_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_VerticalAccuracyCode_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_VerticalSpeedDirection.c b/src/ranap/RANAP_VerticalSpeedDirection.c
new file mode 100644
index 0000000..d6aaa0b
--- /dev/null
+++ b/src/ranap/RANAP_VerticalSpeedDirection.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_VerticalSpeedDirection.h"
+
+int
+RANAP_VerticalSpeedDirection_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_VerticalSpeedDirection_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_VerticalSpeedDirection_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VerticalSpeedDirection_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_VerticalSpeedDirection_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VerticalSpeedDirection_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_VerticalSpeedDirection_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VerticalSpeedDirection_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_VerticalSpeedDirection_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_VerticalSpeedDirection_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_VerticalSpeedDirection_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_VerticalSpeedDirection_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_VerticalSpeedDirection_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_VerticalSpeedDirection_value2enum_1[] = {
+	{ 0,	6,	"upward" },
+	{ 1,	8,	"downward" }
+};
+static const unsigned int asn_MAP_RANAP_VerticalSpeedDirection_enum2value_1[] = {
+	1,	/* downward(1) */
+	0	/* upward(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_VerticalSpeedDirection_specs_1 = {
+	asn_MAP_RANAP_VerticalSpeedDirection_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_VerticalSpeedDirection_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_VerticalSpeedDirection_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_VerticalSpeedDirection = {
+	"RANAP_VerticalSpeedDirection",
+	"RANAP_VerticalSpeedDirection",
+	RANAP_VerticalSpeedDirection_free,
+	RANAP_VerticalSpeedDirection_print,
+	RANAP_VerticalSpeedDirection_constraint,
+	RANAP_VerticalSpeedDirection_decode_ber,
+	RANAP_VerticalSpeedDirection_encode_der,
+	RANAP_VerticalSpeedDirection_decode_xer,
+	RANAP_VerticalSpeedDirection_encode_xer,
+	RANAP_VerticalSpeedDirection_decode_uper,
+	RANAP_VerticalSpeedDirection_encode_uper,
+	RANAP_VerticalSpeedDirection_decode_aper,
+	RANAP_VerticalSpeedDirection_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_VerticalSpeedDirection_tags_1,
+	sizeof(asn_DEF_RANAP_VerticalSpeedDirection_tags_1)
+		/sizeof(asn_DEF_RANAP_VerticalSpeedDirection_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_VerticalSpeedDirection_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_VerticalSpeedDirection_tags_1)
+		/sizeof(asn_DEF_RANAP_VerticalSpeedDirection_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_VerticalSpeedDirection_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_VerticalSpeedDirection_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_VerticalSpeedDirection.h b/src/ranap/RANAP_VerticalSpeedDirection.h
new file mode 100644
index 0000000..feac00c
--- /dev/null
+++ b/src/ranap/RANAP_VerticalSpeedDirection.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_VerticalSpeedDirection_H_
+#define	_RANAP_VerticalSpeedDirection_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_VerticalSpeedDirection {
+	RANAP_VerticalSpeedDirection_upward	= 0,
+	RANAP_VerticalSpeedDirection_downward	= 1
+} e_RANAP_VerticalSpeedDirection;
+
+/* RANAP_VerticalSpeedDirection */
+typedef long	 RANAP_VerticalSpeedDirection_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_VerticalSpeedDirection;
+asn_struct_free_f RANAP_VerticalSpeedDirection_free;
+asn_struct_print_f RANAP_VerticalSpeedDirection_print;
+asn_constr_check_f RANAP_VerticalSpeedDirection_constraint;
+ber_type_decoder_f RANAP_VerticalSpeedDirection_decode_ber;
+der_type_encoder_f RANAP_VerticalSpeedDirection_encode_der;
+xer_type_decoder_f RANAP_VerticalSpeedDirection_decode_xer;
+xer_type_encoder_f RANAP_VerticalSpeedDirection_encode_xer;
+per_type_decoder_f RANAP_VerticalSpeedDirection_decode_uper;
+per_type_encoder_f RANAP_VerticalSpeedDirection_encode_uper;
+per_type_decoder_f RANAP_VerticalSpeedDirection_decode_aper;
+per_type_encoder_f RANAP_VerticalSpeedDirection_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_VerticalSpeedDirection_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_VerticalVelocity.c b/src/ranap/RANAP_VerticalVelocity.c
new file mode 100644
index 0000000..659971f
--- /dev/null
+++ b/src/ranap/RANAP_VerticalVelocity.c
@@ -0,0 +1,101 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_VerticalVelocity.h"
+
+static int
+memb_veritcalSpeed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_veritcalSpeed_constr_2 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_RANAP_VerticalVelocity_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VerticalVelocity, veritcalSpeed),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_veritcalSpeed_constraint_1,
+		&asn_PER_memb_veritcalSpeed_constr_2,
+		0,
+		"veritcalSpeed"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_VerticalVelocity, veritcalSpeedDirection),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_RANAP_VerticalSpeedDirection,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"veritcalSpeedDirection"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_VerticalVelocity_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_VerticalVelocity_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* veritcalSpeed */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* veritcalSpeedDirection */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_VerticalVelocity_specs_1 = {
+	sizeof(struct RANAP_VerticalVelocity),
+	offsetof(struct RANAP_VerticalVelocity, _asn_ctx),
+	asn_MAP_RANAP_VerticalVelocity_tag2el_1,
+	2,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_VerticalVelocity = {
+	"RANAP_VerticalVelocity",
+	"RANAP_VerticalVelocity",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_VerticalVelocity_tags_1,
+	sizeof(asn_DEF_RANAP_VerticalVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_VerticalVelocity_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_VerticalVelocity_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_VerticalVelocity_tags_1)
+		/sizeof(asn_DEF_RANAP_VerticalVelocity_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_VerticalVelocity_1,
+	2,	/* Elements count */
+	&asn_SPC_RANAP_VerticalVelocity_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_VerticalVelocity.h b/src/ranap/RANAP_VerticalVelocity.h
new file mode 100644
index 0000000..45be83c
--- /dev/null
+++ b/src/ranap/RANAP_VerticalVelocity.h
@@ -0,0 +1,39 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_VerticalVelocity_H_
+#define	_RANAP_VerticalVelocity_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeInteger.h>
+#include "RANAP_VerticalSpeedDirection.h"
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_VerticalVelocity */
+typedef struct RANAP_VerticalVelocity {
+	long	 veritcalSpeed;
+	RANAP_VerticalSpeedDirection_t	 veritcalSpeedDirection;
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_VerticalVelocity_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_VerticalVelocity;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_VerticalVelocity_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_VoiceSupportMatchIndicator.c b/src/ranap/RANAP_VoiceSupportMatchIndicator.c
new file mode 100644
index 0000000..eff0a3b
--- /dev/null
+++ b/src/ranap/RANAP_VoiceSupportMatchIndicator.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#include "RANAP_VoiceSupportMatchIndicator.h"
+
+int
+RANAP_VoiceSupportMatchIndicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+RANAP_VoiceSupportMatchIndicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+RANAP_VoiceSupportMatchIndicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VoiceSupportMatchIndicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+RANAP_VoiceSupportMatchIndicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VoiceSupportMatchIndicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+RANAP_VoiceSupportMatchIndicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+RANAP_VoiceSupportMatchIndicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+RANAP_VoiceSupportMatchIndicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+RANAP_VoiceSupportMatchIndicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+RANAP_VoiceSupportMatchIndicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	RANAP_VoiceSupportMatchIndicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_RANAP_VoiceSupportMatchIndicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_RANAP_VoiceSupportMatchIndicator_value2enum_1[] = {
+	{ 0,	9,	"supported" },
+	{ 1,	13,	"not-supported" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_RANAP_VoiceSupportMatchIndicator_enum2value_1[] = {
+	1,	/* not-supported(1) */
+	0	/* supported(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_RANAP_VoiceSupportMatchIndicator_specs_1 = {
+	asn_MAP_RANAP_VoiceSupportMatchIndicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_RANAP_VoiceSupportMatchIndicator_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_RANAP_VoiceSupportMatchIndicator = {
+	"RANAP_VoiceSupportMatchIndicator",
+	"RANAP_VoiceSupportMatchIndicator",
+	RANAP_VoiceSupportMatchIndicator_free,
+	RANAP_VoiceSupportMatchIndicator_print,
+	RANAP_VoiceSupportMatchIndicator_constraint,
+	RANAP_VoiceSupportMatchIndicator_decode_ber,
+	RANAP_VoiceSupportMatchIndicator_encode_der,
+	RANAP_VoiceSupportMatchIndicator_decode_xer,
+	RANAP_VoiceSupportMatchIndicator_encode_xer,
+	RANAP_VoiceSupportMatchIndicator_decode_uper,
+	RANAP_VoiceSupportMatchIndicator_encode_uper,
+	RANAP_VoiceSupportMatchIndicator_decode_aper,
+	RANAP_VoiceSupportMatchIndicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1,
+	sizeof(asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1)
+		/sizeof(asn_DEF_RANAP_VoiceSupportMatchIndicator_tags_1[0]), /* 1 */
+	&asn_PER_type_RANAP_VoiceSupportMatchIndicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_RANAP_VoiceSupportMatchIndicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_VoiceSupportMatchIndicator.h b/src/ranap/RANAP_VoiceSupportMatchIndicator.h
new file mode 100644
index 0000000..f4644b3
--- /dev/null
+++ b/src/ranap/RANAP_VoiceSupportMatchIndicator.h
@@ -0,0 +1,51 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-IEs"
+ * 	found in "../../asn1/ranap/RANAP-IEs.asn"
+ */
+
+#ifndef	_RANAP_VoiceSupportMatchIndicator_H_
+#define	_RANAP_VoiceSupportMatchIndicator_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include <NativeEnumerated.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+typedef enum RANAP_VoiceSupportMatchIndicator {
+	RANAP_VoiceSupportMatchIndicator_supported	= 0,
+	RANAP_VoiceSupportMatchIndicator_not_supported	= 1
+	/*
+	 * Enumeration is extensible
+	 */
+} e_RANAP_VoiceSupportMatchIndicator;
+
+/* RANAP_VoiceSupportMatchIndicator */
+typedef long	 RANAP_VoiceSupportMatchIndicator_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_VoiceSupportMatchIndicator;
+asn_struct_free_f RANAP_VoiceSupportMatchIndicator_free;
+asn_struct_print_f RANAP_VoiceSupportMatchIndicator_print;
+asn_constr_check_f RANAP_VoiceSupportMatchIndicator_constraint;
+ber_type_decoder_f RANAP_VoiceSupportMatchIndicator_decode_ber;
+der_type_encoder_f RANAP_VoiceSupportMatchIndicator_encode_der;
+xer_type_decoder_f RANAP_VoiceSupportMatchIndicator_decode_xer;
+xer_type_encoder_f RANAP_VoiceSupportMatchIndicator_encode_xer;
+per_type_decoder_f RANAP_VoiceSupportMatchIndicator_decode_uper;
+per_type_encoder_f RANAP_VoiceSupportMatchIndicator_encode_uper;
+per_type_decoder_f RANAP_VoiceSupportMatchIndicator_decode_aper;
+per_type_encoder_f RANAP_VoiceSupportMatchIndicator_encode_aper;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_VoiceSupportMatchIndicator_H_ */
+#include <asn_internal.h>
