diff --git a/CMakeLists.txt b/CMakeLists.txt
index 15e79dcd72be2bb93a7232626e7b8789d90fdbbf..8e2457630a64788b6762f3335e0de57cc7a652b9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -260,7 +260,6 @@ endif()
 
 # Debug related options
 #########################################
-add_boolean_option(DEBUG_ASN1 False "Enable ASN1 debug logs" OFF)
 # asn1c skeletons have hardcoded this flag to make customized debug logs
 # OAI uses this feature to re-use OAI LOG_I(ASN1, ...)
 # see common/utils/config.h
@@ -346,6 +345,7 @@ set(NGAP_DIR ${OPENAIR3_DIR}/NGAP)
 include_directories ("${NGAP_DIR}")
 add_library(ngap
   ${NGAP_DIR}/ngap_gNB.c
+  ${NGAP_DIR}/ngap_common.c
   ${NGAP_DIR}/ngap_gNB_context_management_procedures.c
   ${NGAP_DIR}/ngap_gNB_decoder.c
   ${NGAP_DIR}/ngap_gNB_encoder.c
@@ -494,7 +494,6 @@ include_directories ("${OPENAIR_DIR}/radio/COMMON")
 add_boolean_option(UE_EXPANSION             False         "enable UE_EXPANSION with max 256 UE" ON)
 add_boolean_option(PHY_TX_THREAD            False         "enable UE_EXPANSION with max 256 UE" ON)
 add_boolean_option(PRE_SCD_THREAD           False         "enable UE_EXPANSION with max 256 UE" ON)
-add_boolean_option(UESIM_EXPANSION          False         "enable UESIM_EXPANSION with max 256 UE" ON)
 
 ##########################
 # SCHEDULING/REAL-TIME/PERF options
@@ -506,20 +505,15 @@ add_boolean_option(ENABLE_VCD_FIFO         False  "time measurements of proc cal
 ##########################
 # PHY options
 ##########################
-add_boolean_option(LOCALIZATION            False "???" ON)
-add_integer_option(MAX_NUM_CCs             1     "????" ON)
+add_integer_option(MAX_NUM_CCs             1     "Carrier component data arrays size (oai doesn't support carrier aggreagtion for now)" ON)
 add_boolean_option(SMBV                    False "Rohde&Schwarz SMBV100A vector signal generator" ON)
 add_boolean_option(DEBUG_PHY               False "Enable PHY layer debugging options" ON)
 add_boolean_option(DEBUG_PHY_PROC          False "Enable debugging of PHY layer procedures" ON)
-add_boolean_option(MEX                     False "Enabling compilation with mex" ON)
 
 ##########################
 # NAS LAYER OPTIONS
 ##########################
-add_boolean_option(ENABLE_NAS_UE_LOGGING   True  "????" ON)
 add_boolean_option(NAS_BUILT_IN_UE         True  "UE NAS layer present in this executable" ON)
-add_boolean_option(NAS_UE                  True  "NAS UE INSTANCE (<> NAS_MME)" ON)
-
 
 ##########################
 # RRC LAYER OPTIONS
@@ -716,6 +710,7 @@ set(NFAPI_PNF_SRC
 )
 add_library(NFAPI_PNF_LIB ${NFAPI_PNF_SRC})
 target_link_libraries(NFAPI_PNF_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs)
+target_link_libraries(NFAPI_PNF_LIB PUBLIC nr_fapi_p7)
 
 include_directories(${NFAPI_DIR}/pnf/public_inc)
 include_directories(${NFAPI_DIR}/pnf/inc)
@@ -746,6 +741,9 @@ set(NFAPI_USER_SRC
 add_library(NFAPI_USER_LIB ${NFAPI_USER_SRC})
 target_link_libraries(NFAPI_USER_LIB PRIVATE asn1_lte_rrc_hdrs asn1_nr_rrc_hdrs UTIL)
 target_link_libraries(NFAPI_USER_LIB PRIVATE nr_fapi_p7)
+if(OAI_AERIAL)
+  target_compile_definitions(NFAPI_USER_LIB PRIVATE ENABLE_AERIAL)
+endif()
 include_directories(${NFAPI_USER_DIR})
 
 # Layer 1
@@ -897,6 +895,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/ulsch_coding.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/rar_tools_ue.c
   ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/initial_sync.c
+  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
   ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep.c
   ${OPENAIR1_DIR}/PHY/MODULATION/slot_fep_mbsfn.c
   ${OPENAIR1_DIR}/PHY/MODULATION/ul_7_5_kHz_ue.c
@@ -1026,8 +1025,6 @@ if (${SMBV})
   set(PHY_SRC "${PHY_SRC} ${OPENAIR1_DIR}/PHY/TOOLS/smbv.c")
 endif  (${SMBV})
 
-set(PHY_SRC_UE ${PHY_SRC_UE} ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c)
-
 add_library(PHY_COMMON ${PHY_SRC_COMMON})
 target_link_libraries(PHY_COMMON PRIVATE shlib_loader)
 add_dependencies(PHY_COMMON dfts)
@@ -1063,28 +1060,6 @@ target_link_libraries(PHY_NR_UE PRIVATE asn1_nr_rrc_hdrs nr_phy_common nr_common
 add_library(PHY_RU ${PHY_SRC_RU})
 target_link_libraries(PHY_RU PRIVATE asn1_lte_rrc_hdrs UTIL)
 
-#Library for mex functions
-#########################3
-set(PHY_MEX_UE
-  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/linear_preprocessing_rec.c
-  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation.c
-  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_demodulation.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/log2_approx.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/lte_mcs.c
-  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/get_pmi.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/dB_routines.c
-  ${OPENAIR1_DIR}/PHY/LTE_TRANSPORT/pmch_common.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cadd_vv.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cmult_sv.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/cmult_vv.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/signal_energy.c
-  ${OPENAIR1_DIR}/PHY/TOOLS/simde_operations.c
-  ${OPENAIR1_DIR}/PHY/LTE_UE_TRANSPORT/dlsch_llr_computation_avx2.c
-  ${OPENAIR1_DIR}/PHY/LTE_ESTIMATION/lte_ue_measurements.c
-  )
-add_library(PHY_MEX ${PHY_MEX_UE})
-target_link_libraries(PHY_MEX PRIVATE asn1_lte_rrc_hdrs UTIL)
-
 #Layer 2 library
 #####################
 set(MAC_DIR ${OPENAIR2_DIR}/LAYER2/MAC)
@@ -2214,7 +2189,7 @@ if (${T_TRACER})
         SECURITY SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
         NFAPI_LIB NFAPI_PNF_LIB NFAPI_VNF_LIB NFAPI_USER_LIB
         MISC_NFAPI_LTE_LIB MISC_NFAPI_NR_LIB
-        PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU PHY_MEX
+        PHY_COMMON PHY PHY_UE PHY_NR PHY_NR_COMMON PHY_NR_UE PHY_RU
         L2 L2_LTE L2_NR L2_LTE_NR L2_UE NR_L2_UE L2_UE_LTE_NR MAC_NR_COMMON MAC_UE_NR ngap
         CN_UTILS GTPV1U SCTP_CLIENT MME_APP LIB_NAS_UE NB_IoT SIMU OPENAIR0_LIB
         dfts config_internals nr_common)
diff --git a/ci-scripts/conf_files/gnb-pnf.band66.rfsim.conf b/ci-scripts/conf_files/gnb-pnf.band66.rfsim.conf
new file mode 100644
index 0000000000000000000000000000000000000000..d61d3032beed5b3c819b80ece4b5dd01e473e3d1
--- /dev/null
+++ b/ci-scripts/conf_files/gnb-pnf.band66.rfsim.conf
@@ -0,0 +1,43 @@
+L1s = (
+{
+  num_cc = 1;
+  tr_n_preference       = "nfapi";
+  remote_n_address = "192.168.71.140"; // vnf addr
+  local_n_address  = "192.168.71.141"; // pnf addr
+  local_n_portc    = 50000; // pnf p5 port [!]
+  remote_n_portc   = 50001; // vnf p5 port
+  local_n_portd    = 50010; // pnf p7 port
+  remote_n_portd   = 50011; // vnf p7 port
+  prach_dtx_threshold   = 120;
+  pucch0_dtx_threshold  = 150;
+  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = ({
+  local_rf       = "yes";
+  nb_tx          = 1;
+  nb_rx          = 1;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [7];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain                    = 114;
+  sf_extension                  = 0;
+  eNB_instances  = [0];
+});
+
+rfsimulator :
+{
+  serveraddr = "server";
+  serverport = 4043;
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+  IQfile = "/tmp/rfsimulator.iqs";
+};
+
+log_config: {
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+};
diff --git a/ci-scripts/conf_files/gnb-pnf.band77.usrpn310.4x4.conf b/ci-scripts/conf_files/gnb-pnf.band77.usrpn310.4x4.conf
new file mode 100644
index 0000000000000000000000000000000000000000..6a7f4b46428cb6c875df0f1d790ba3bd20499e2f
--- /dev/null
+++ b/ci-scripts/conf_files/gnb-pnf.band77.usrpn310.4x4.conf
@@ -0,0 +1,31 @@
+usrp-tx-thread-config = 1;
+tune-offset = 30720000;
+
+L1s = ({
+  num_cc = 1;
+  tr_n_preference = "nfapi";
+  remote_n_address = "127.0.0.1"; // vnf addr
+  local_n_address  = "127.0.0.1"; // pnf addr
+  local_n_portc    = 50000; // pnf p5 port [!]
+  remote_n_portc   = 50001; // vnf p5 port
+  local_n_portd    = 50010; // pnf p7 port
+  remote_n_portd   = 50011; // vnf p7 port
+  prach_dtx_threshold = 120;
+  pusch_dtx_threshold = 20;
+  max_ldpc_iterations = 10;
+});
+
+RUs = ({
+  local_rf       = "yes"
+  nb_tx          = 4;
+  nb_rx          = 4;
+  att_tx         = 0;
+  att_rx         = 0;
+  bands          = [77];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain     = 75;
+  eNB_instances  = [0];
+  #clock_src = "internal";
+  sdr_addrs = "addr=192.168.80.53, clock_source=internal,time_source=internal"
+});
+
diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf b/ci-scripts/conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf
new file mode 100644
index 0000000000000000000000000000000000000000..c14759c6af34e8483de5efe2b6a8931547de204e
--- /dev/null
+++ b/ci-scripts/conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf
@@ -0,0 +1,218 @@
+Active_gNBs = ( "5G-GOA-gNB");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "5G-GOA-gNB";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    sib1_tda                                                  = 5;
+    min_rxtxtime                                              = 6;
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 2150.43 MHz + 14 PRBs@15kHz SCS (same as initial BWP), points to Subcarrier 0 of RB#10 of SSB block
+      absoluteFrequencySSB                                          = 430590;
+      dl_frequencyBand                                              = 66;
+      # this is 2150.43 MHz
+      dl_absoluteFrequencyPointA                                    = 430086;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                           = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                        = 0;
+        dl_carrierBandwidth                                         = 25;
+     #initialDownlinkBWP
+      #genericParameters
+        # this is RBstart=0,L=25 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                            = 6600;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                               = 0;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                          = 2;
+        initialDLBWPsearchSpaceZero                                 = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                              = 66;
+      # this is 1750.43 MHz
+      ul_absoluteFrequencyPointA                                    = 350086;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                             = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                          = 0;
+      ul_carrierBandwidth                                           = 25;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+      #genericParameters
+        initialULBWPlocationAndBandwidth                            = 6600;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                               = 0;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 13;
+          preambleReceivedTargetPower                               = -118;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#one (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 0;
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0;
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -90;
+
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 0;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 0;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 6;
+      nrofDownlinkSlots                                             = 7;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 2;
+      nrofUplinkSymbols                                             = 4;
+
+      ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address = ({ ipv4 = "192.168.71.132"; });
+
+    NETWORK_INTERFACES :
+    {
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.71.140/26";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.71.140/26";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference             = "nfapi";
+  remote_s_address            = "192.168.71.141"; // pnf addr [!]
+  local_s_address             = "192.168.71.140"; // vnf addr
+  local_s_portc               = 50001; // vnf p5 port
+  remote_s_portc              = 50000; // pnf p5 port [!]
+  local_s_portd               = 50011; // vnf p7 port [!]
+  remote_s_portd              = 50010; // pnf p7 port [!]
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 150;
+  pucch_TargetSNRx10          = 200;
+}
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="info";
+};
diff --git a/ci-scripts/conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf b/ci-scripts/conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf
new file mode 100644
index 0000000000000000000000000000000000000000..d9f09dca3dfd8f3471e77e7645e338a2f3e54618
--- /dev/null
+++ b/ci-scripts/conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf
@@ -0,0 +1,224 @@
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+    ////////// Identification parameters:
+    gNB_ID    =  0xe00;
+    gNB_name  =  "gNB-OAI";
+
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  1;
+    plmn_list = ({ mcc = 208; mnc = 97; mnc_length = 2; snssaiList = ({ sst = 1; }) });
+
+    nr_cellid = 12345678L;
+
+    ////////// Physical parameters:
+
+    pdsch_AntennaPorts_XP = 2;
+    pusch_AntennaPorts    = 4;
+    pdsch_AntennaPorts_N1 = 2;
+    maxMIMO_layers        = 4;
+    do_CSIRS              = 1;
+    do_SRS                = 1;
+
+    servingCellConfigCommon = (
+    {
+ #spCellConfigCommon
+
+      physCellId                                                    = 0;
+
+#  downlinkConfigCommon
+    #frequencyInfoDL
+      # this is 4100.16 MHz
+      absoluteFrequencySSB                                             = 673344;
+      # this is 4071 MHz
+      dl_absoluteFrequencyPointA                                       = 671400;
+      dl_frequencyBand                                                 = 77;
+      #scs-SpecificCarrierList
+        dl_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        dl_subcarrierSpacing                                           = 1;
+        dl_carrierBandwidth                                            = 162;
+     #initialDownlinkBWP
+      #genericParameters
+       # this is RBstart=0,L=162 (275*(275-L+1))+(274-RBstart))
+       initialDLBWPlocationAndBandwidth                                        = 31624;
+       #
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialDLBWPsubcarrierSpacing                                           = 1;
+      #pdcch-ConfigCommon
+        initialDLBWPcontrolResourceSetZero                                      = 12;
+        initialDLBWPsearchSpaceZero                                             = 0;
+
+  #uplinkConfigCommon
+     #frequencyInfoUL
+      ul_frequencyBand                                                 = 77;
+      #scs-SpecificCarrierList
+      ul_offstToCarrier                                              = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      ul_subcarrierSpacing                                           = 1;
+      ul_carrierBandwidth                                            = 162;
+      pMax                                                          = 20;
+     #initialUplinkBWP
+     #genericParameters
+        initialULBWPlocationAndBandwidth                                        = 31624;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+        initialULBWPsubcarrierSpacing                                           = 1;
+      #rach-ConfigCommon
+        #rach-ConfigGeneric
+          prach_ConfigurationIndex                                  = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+          prach_msg1_FDM                                            = 0;
+          prach_msg1_FrequencyStart                                 = 0;
+          zeroCorrelationZoneConfig                                 = 12;
+          preambleReceivedTargetPower                               = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+          preambleTransMax                                          = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+        powerRampingStep                                            = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+        ra_ResponseWindow                                           = 5;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
+#one (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+        ra_ContentionResolutionTimer                                = 7;
+        rsrp_ThresholdSSB                                           = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
+        prach_RootSequenceIndex                                     = 1;
+        # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+        #
+        msg1_SubcarrierSpacing                                      = 1,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+        restrictedSetConfig                                         = 0,
+
+        msg3_DeltaPreamble                                          = 1;
+        p0_NominalWithGrant                                         =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+        pucchGroupHopping                                           = 0;
+        hoppingId                                                   = 40;
+        p0_nominal                                                  = -70;
+
+      ssb_PositionsInBurst_Bitmap                                   = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+      ssb_periodicityServingCell                                    = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+      dmrs_TypeA_Position                                           = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      subcarrierSpacing                                             = 1;
+
+
+  #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+      referenceSubcarrierSpacing                                    = 1;
+      # pattern1
+      # dl_UL_TransmissionPeriodicity
+      # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+      dl_UL_TransmissionPeriodicity                                 = 5;
+      nrofDownlinkSlots                                             = 3;
+      nrofDownlinkSymbols                                           = 6;
+      nrofUplinkSlots                                               = 1;
+      nrofUplinkSymbols                                             = 4;
+
+  ssPBCH_BlockPower                                             = -25;
+  }
+
+  );
+
+
+    # ------- SCTP definitions
+    SCTP :
+    {
+        # Number of streams to use in input/output
+        SCTP_INSTREAMS  = 2;
+        SCTP_OUTSTREAMS = 2;
+    };
+
+
+    ////////// AMF parameters:
+    amf_ip_address = ({ ipv4 = "192.168.61.132"; });
+
+    NETWORK_INTERFACES :
+    {
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.61.129/26";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.61.129/26";
+        GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+
+  }
+);
+
+MACRLCs = (
+{
+  num_cc                      = 1;
+  tr_s_preference = "nfapi";
+  remote_s_address = "127.0.0.1"; // pnf addr [!]
+  local_s_address  = "127.0.0.1"; // vnf addr
+  local_s_portc    = 50001; // vnf p5 port
+  remote_s_portc   = 50000; // pnf p5 port [!]
+  local_s_portd    = 50011; // vnf p7 port [!]
+  remote_s_portd   = 50010; // pnf p7 port [!]
+
+  tr_n_preference             = "local_RRC";
+  pusch_TargetSNRx10          = 250;
+  pucch_TargetSNRx10          = 250;
+  pusch_FailureThres          = 100;
+  ul_max_mcs		      = 28;
+}
+);
+
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea1", "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia1", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "yes";
+};
+
+log_config :
+{
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+  mac_log_level                         ="info";
+  rlc_log_level                         ="info";
+  pdcp_log_level                        ="info";
+  rrc_log_level                         ="info";
+  ngap_log_level                        ="debug";
+  f1ap_log_level                        ="debug";
+};
diff --git a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
index 7014c54a2aaa517570e27ae593b581bf6ffa3f53..ee4c334cee1ed73a625b7e8ebf885823da0b2fbd 100644
--- a/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
+++ b/ci-scripts/xml_files/container_5g_rfsim_u0_25prb.xml
@@ -22,7 +22,7 @@
 -->
 <testCaseList>
         <htmlTabRef>rfsim-5gnr-fdd-u0-25prb</htmlTabRef>
-        <htmlTabName>Monolithic SA FDD u0 25PRB gNB</htmlTabName>
+        <htmlTabName>VNF-PNF nFAPI FDD u0 25PRB gNB</htmlTabName>
         <htmlTabIcon>wrench</htmlTabIcon>
         <TestCaseRequestedList>
  111111
@@ -62,9 +62,9 @@
 
         <testCase id="000002">
                 <class>Deploy_Object</class>
-                <desc>Deploy OAI 5G gNB+nrUE RF sim SA</desc>
+                <desc>Deploy OAI 5G VNF+PNF+nrUE RF sim SA</desc>
                 <yaml_path>ci-scripts/yaml_files/5g_rfsimulator_u0_25prb</yaml_path>
-                <services>oai-gnb oai-nr-ue</services>
+                <services>oai-vnf oai-pnf oai-nr-ue</services>
                 <eNB_instance>0</eNB_instance>
                 <eNB_serverId>0</eNB_serverId>
         </testCase>
@@ -122,6 +122,7 @@
                 <class>Undeploy_Object</class>
                 <always_exec>true</always_exec>
                 <desc>Undeploy all OAI 5G stack</desc>
+                <services>oai-vnf oai-pnf</services>
                 <yaml_path>ci-scripts/yaml_files/5g_rfsimulator_u0_25prb</yaml_path>
                 <d_retx_th>1,0,0,0</d_retx_th>
                 <u_retx_th>1,0,0,0</u_retx_th>
diff --git a/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml b/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml
index e9833887dfd71e2cf8f89225f44a0f9cb2af01ba..9ec5b3724524dbdff20c81cfa6ccd0d11976e0cb 100644
--- a/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml
+++ b/ci-scripts/xml_files/container_sa_n310_4X4_60MHz_quectel.xml
@@ -22,7 +22,7 @@
 -->
 <testCaseList>
   <htmlTabRef>TEST-SA-FR1-N310-4x4-60MHz</htmlTabRef>
-  <htmlTabName>60 MHz 4x4 TDD SA</htmlTabName>
+  <htmlTabName>nFAPI 60 MHz 4x4 TDD SA</htmlTabName>
   <htmlTabIcon>tasks</htmlTabIcon>
   <TestCaseRequestedList>
     100000
@@ -85,7 +85,7 @@
   </testCase>
   <testCase id="030101">
       <class>Deploy_Object</class>
-      <desc>Deploy gNB (TDD/Band77/60MHz/N310) in a container</desc>
+      <desc>Deploy VNF-PNF (TDD/Band77/60MHz/N310) in a container</desc>
       <yaml_path>ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz</yaml_path>
       <eNB_instance>0</eNB_instance>
       <eNB_serverId>0</eNB_serverId>
@@ -144,11 +144,11 @@
   <testCase id="030201">
     <class>Undeploy_Object</class>
     <always_exec>true</always_exec>
-    <desc>Undeploy gNB</desc>
+    <desc>Undeploy VNF-PNF</desc>
     <yaml_path>ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz</yaml_path>
     <eNB_instance>0</eNB_instance>
     <eNB_serverId>0</eNB_serverId>
-    <services>oai-gnb</services>
+    <services>oai-vnf oai-pnf</services>
     <d_retx_th>10,100,100,100</d_retx_th>
     <u_retx_th>10,100,100,100</u_retx_th>
   </testCase>
diff --git a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml
index 50871c5131fb1fd0165c1e00ce76a5799386b35b..05b2122ccb38b8ff32566c505c78787f12e76004 100644
--- a/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml
+++ b/ci-scripts/yaml_files/5g_rfsimulator_u0_25prb/docker-compose.yaml
@@ -80,13 +80,15 @@ services:
             interval: 10s
             timeout: 5s
             retries: 5
-    oai-gnb:
+
+    oai-vnf:
         image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
-        container_name: rfsim5g-oai-gnb
+        container_name: rfsim5g-oai-vnf
         cap_drop:
             - ALL
         environment:
-            USE_ADDITIONAL_OPTIONS: --rfsim --log_config.global_log_options level,nocolor,time
+            USE_ADDITIONAL_OPTIONS: --nfapi VNF --log_config.global_log_options level,nocolor,time
+            NFAPI_TRACE_LEVEL: info
             ASAN_OPTIONS: detect_leaks=0
         depends_on:
             - oai-ext-dn
@@ -94,7 +96,29 @@ services:
             public_net:
                 ipv4_address: 192.168.71.140
         volumes:
-            - ../../conf_files/gnb.sa.band66.u0.25prb.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
+            - ../../conf_files/gnb-vnf.sa.band66.u0.25prb.nfapi.conf:/opt/oai-gnb/etc/gnb.conf
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+
+    oai-pnf:
+        image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
+        container_name: rfsim5g-oai-pnf
+        cap_drop:
+            - ALL
+        environment:
+            USE_ADDITIONAL_OPTIONS: --nfapi PNF --rfsim --log_config.global_log_options level,nocolor,time
+            NFAPI_TRACE_LEVEL: info
+            ASAN_OPTIONS: detect_leaks=0
+        depends_on:
+            - oai-vnf
+        networks:
+            public_net:
+                ipv4_address: 192.168.71.141
+        volumes:
+            - ../../conf_files/gnb-pnf.band66.rfsim.conf:/opt/oai-gnb/etc/gnb.conf
         healthcheck:
             test: /bin/bash -c "pgrep nr-softmodem"
             interval: 10s
@@ -110,9 +134,9 @@ services:
             - NET_ADMIN  # for interface bringup
             - NET_RAW    # for ping
         environment:
-            USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48 --rfsimulator.serveraddr 192.168.71.140 --log_config.global_log_options level,nocolor,time
+            USE_ADDITIONAL_OPTIONS: --rfsim -r 25 --numerology 0 --uicc0.imsi 208990100001100 --band 66 -C 2152680000 --CO -400000000 --ssb 48 --rfsimulator.serveraddr 192.168.71.141 --log_config.global_log_options level,nocolor,time
         depends_on:
-            - oai-gnb
+            - oai-pnf
         networks:
             public_net:
                 ipv4_address: 192.168.71.150
diff --git a/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml b/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml
index ed6c76ae78359693677ca49dff930e63a54cbb91..c349ac0406d38a6239b5a7aa6a2889a15ebff900 100644
--- a/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml
+++ b/ci-scripts/yaml_files/5g_sa_n310_4x4_60MHz/docker-compose.yml
@@ -1,8 +1,8 @@
 services:
-    oai-gnb:
+    oai-vnf:
         image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
         network_mode: "host"
-        container_name: oai-gnb
+        container_name: oai-vnf
         cap_drop:
             - ALL
         cap_add:
@@ -10,9 +10,30 @@ services:
             - IPC_LOCK
         environment:
             TZ: Europe/Paris
-            USE_ADDITIONAL_OPTIONS: --log_config.global_log_options level,nocolor,time
+            USE_ADDITIONAL_OPTIONS: --nfapi VNF
+            NFAPI_TRACE_LEVEL: info
         volumes:
-            - ../../conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf:/opt/oai-gnb/etc/gnb.conf
+            - ../../conf_files/gnb-vnf.sa.band77.162prb.nfapi.4x4.conf:/opt/oai-gnb/etc/gnb.conf
+        healthcheck:
+            test: /bin/bash -c "pgrep nr-softmodem"
+            interval: 10s
+            timeout: 5s
+            retries: 5
+    oai-pnf:
+        image: ${REGISTRY:-oaisoftwarealliance}/${GNB_IMG:-oai-gnb}:${TAG:-develop}
+        network_mode: "host"
+        container_name: oai-pnf
+        cap_drop:
+            - ALL
+        cap_add:
+            - SYS_NICE
+            - IPC_LOCK
+        environment:
+            TZ: Europe/Paris
+            USE_ADDITIONAL_OPTIONS: --nfapi PNF
+            NFAPI_TRACE_LEVEL: info
+        volumes:
+            - ../../conf_files/gnb-pnf.band77.usrpn310.4x4.conf:/opt/oai-gnb/etc/gnb.conf
         healthcheck:
             test: /bin/bash -c "pgrep nr-softmodem"
             interval: 10s
diff --git a/cmake_targets/at_commands/CMakeLists.txt b/cmake_targets/at_commands/CMakeLists.txt
index 146b63028c3c0a06095427919548b76ba0ab0681..c912bf960267637d2de79045e86233eaaf5adf4d 100755
--- a/cmake_targets/at_commands/CMakeLists.txt
+++ b/cmake_targets/at_commands/CMakeLists.txt
@@ -105,11 +105,7 @@ add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")
 ##########################
 # NAS LAYER OPTIONS
 ##########################
-add_boolean_option(ENABLE_NAS_UE_LOGGING   True  "????")
-add_boolean_option(NAS_BUILT_IN_EPC        False "MME NAS layer not present in this executable")
 add_boolean_option(NAS_BUILT_IN_UE         False  "UE NAS layer present in this executable")
-add_boolean_option(NAS_UE                  True  "NAS UE INSTANCE (<> NAS_MME)")
-add_boolean_option(NAS_MME                 False "NAS_UE and NAS_MME are incompatible options")
 
 ################################################################################
 # SECU LIB
diff --git a/common/utils/LOG/DOC/rtusage.md b/common/utils/LOG/DOC/rtusage.md
index b3de6cd71eb105fb9855291398a1cf89c1c59782..7d5bd94b8c11c69a6038c36338e90a0e17c8da9f 100644
--- a/common/utils/LOG/DOC/rtusage.md
+++ b/common/utils/LOG/DOC/rtusage.md
@@ -228,6 +228,10 @@ It can also be retrieved when using the telnet server, as explained  [below](###
 | `<flag>_debug` | `boolean` | 0 = false | Triggers the activation of conditional code identified by the specified flag.
 | `<flag>_dump` | `boolean` | 0 = false| Triggers buffer dump, on the console in text form or in a file in matlab format, depending on the developper choice and forcasted usage|
 
+Example: dump all ASN.1 structures during operation with
+`--log_config.ASN1_debug`. To get a list of all flag/dump options, provide an
+invalid flag, e.g. `--log_config.HELP_debug`.
+
 ### Using the configuration file to configure the logging facility
 The following example sets all components log level to info, exept for hw,phy,mac,rlc,pdcp,rrc which log levels are set to error or warning.
 ```bash
diff --git a/common/utils/LOG/log.c b/common/utils/LOG/log.c
index af6c30b858d96882436a18ce7077a5ad9d33523b..b8349fb35855af7d1cf89f0e46c56cf84552551a 100644
--- a/common/utils/LOG/log.c
+++ b/common/utils/LOG/log.c
@@ -120,28 +120,6 @@ mapping * log_option_names_ptr(void)
   return log_options;
 }
 
-static mapping log_maskmap[] = {{"PRACH", DEBUG_PRACH},
-                               {"RU", DEBUG_RU},
-                               {"UE_PHYPROC", DEBUG_UE_PHYPROC},
-                               {"LTEESTIM", DEBUG_LTEESTIM},
-                               {"DLCELLSPEC", DEBUG_DLCELLSPEC},
-                               {"ULSCH", DEBUG_ULSCH},
-                               {"RRC", DEBUG_RRC},
-                               {"PDCP", DEBUG_PDCP},
-                               {"DFT", DEBUG_DFT},
-                               {"ASN1", DEBUG_ASN1},
-                               {"CTRLSOCKET", DEBUG_CTRLSOCKET},
-                               {"SECURITY", DEBUG_SECURITY},
-                               {"NAS", DEBUG_NAS},
-                               {"RLC", DEBUG_RLC},
-                               {"DLSCH_DECOD", DEBUG_DLSCH_DECOD},
-                               {"UE_TIMING", UE_TIMING},
-                               {NULL, -1}};
-mapping * log_maskmap_ptr(void)
-{
-  return log_maskmap;
-}
-
 /* .log_format = 0x13 uncolored standard messages
  * .log_format = 0x93 colored standard messages */
 /* keep white space in first position; switching it to 0 allows colors to be disabled*/
@@ -327,6 +305,9 @@ int write_file_matlab(const char *fname, const char *vname, void *data, int leng
   return 0;
 }
 
+#define FLAG_SETDEBUG(flag) g_log->debug_mask.DEBUG_##flag = *logparams_debug[i++].uptr;
+#define FLAG_SETDUMP(flag) g_log->dump_mask.DEBUG_##flag = *logparams_dump[i++].uptr;
+
 /* get log parameters from configuration file */
 void log_getconfig(log_t *g_log)
 {
@@ -335,8 +316,6 @@ void log_getconfig(log_t *g_log)
   paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC;
   paramdef_t logparams_level[MAX_LOG_PREDEF_COMPONENTS];
   paramdef_t logparams_logfile[MAX_LOG_PREDEF_COMPONENTS];
-  paramdef_t logparams_debug[sizeofArray(log_maskmap)];
-  paramdef_t logparams_dump[sizeofArray(log_maskmap)];
   int ret = config_get(config_get_if(), logparams_defaults, sizeofArray(logparams_defaults), CONFIG_STRING_LOG_PREFIX);
 
   if (ret <0) {
@@ -404,37 +383,45 @@ void log_getconfig(log_t *g_log)
   }
 
   /* build then read the debug and dump parameter array */
-  for (int i=0; log_maskmap[i].name != NULL ; i++) {
-    sprintf(logparams_debug[i].optname,  LOG_CONFIG_DEBUG_FORMAT, log_maskmap[i].name);
-    sprintf(logparams_dump[i].optname,   LOG_CONFIG_DUMP_FORMAT, log_maskmap[i].name);
-    logparams_debug[i].defuintval  = 0;
-    logparams_debug[i].type        = TYPE_UINT;
-    logparams_debug[i].paramflags  = PARAMFLAG_BOOL;
-    logparams_debug[i].uptr        = NULL;
-    logparams_debug[i].chkPptr     = NULL;
-    logparams_debug[i].numelt      = 0;
-    logparams_dump[i].defuintval  = 0;
-    logparams_dump[i].type        = TYPE_UINT;
-    logparams_dump[i].paramflags  = PARAMFLAG_BOOL;
-    logparams_dump[i].uptr        = NULL;
-    logparams_dump[i].chkPptr     = NULL;
-    logparams_dump[i].numelt      = 0;
+  int sz = 0;
+  for (const char *const *ptr = flag_name; strlen(*ptr) > 1; ptr++)
+    sz++;
+  paramdef_t logparams_debug[sz];
+  paramdef_t logparams_dump[sz];
+  for (int i = 0; i < sz; i++) {
+    logparams_debug[i] = (paramdef_t){
+        .type = TYPE_UINT,
+        .paramflags = PARAMFLAG_BOOL,
+    };
+    sprintf(logparams_debug[i].optname, LOG_CONFIG_DEBUG_FORMAT, flag_name[i]);
+    logparams_dump[i] = (paramdef_t){.type = TYPE_UINT, .paramflags = PARAMFLAG_BOOL};
+    sprintf(logparams_dump[i].optname, LOG_CONFIG_DUMP_FORMAT, flag_name[i]);
   }
 
-  config_get(config_get_if(), logparams_debug, sizeofArray(log_maskmap) - 1, CONFIG_STRING_LOG_PREFIX);
-  config_get(config_get_if(), logparams_dump, sizeofArray(log_maskmap) - 1, CONFIG_STRING_LOG_PREFIX);
-
-  if (config_check_unknown_cmdlineopt(config_get_if(), CONFIG_STRING_LOG_PREFIX) > 0)
+  config_get(config_get_if(), logparams_debug, sz, CONFIG_STRING_LOG_PREFIX);
+  config_get(config_get_if(), logparams_dump, sz, CONFIG_STRING_LOG_PREFIX);
+
+  bool old = CONFIG_ISFLAGSET(CONFIG_NOABORTONCHKF);
+  CONFIG_SETRTFLAG(CONFIG_NOABORTONCHKF);
+  if (config_check_unknown_cmdlineopt(config_get_if(), CONFIG_STRING_LOG_PREFIX) > 0) {
+    printf("Existing log_config options:\n");
+    printf("   Boolean options:\n");
+    for (int i = 0; i < sz; i++)
+      printf("      %s, \t%s\n", logparams_debug[i].optname, logparams_dump[i].optname);
+    printf("   Log level per module (");
+    for (int i = 0; log_level_names[i].name != NULL; i++)
+      printf("%s ", log_level_names[i].name);
+    printf(")\n");
+    for (int i = 0; i < MAX_LOG_PREDEF_COMPONENTS; i++)
+      printf("      %s\n", logparams_level[i].optname);
     exit(1);
-
-  /* set the debug mask according to the debug parameters values */
-  for (int i=0; log_maskmap[i].name != NULL ; i++) {
-    if (*(logparams_debug[i].uptr) )
-      g_log->debug_mask = g_log->debug_mask | log_maskmap[i].value;
-
-    if (*(logparams_dump[i].uptr) )
-      g_log->dump_mask = g_log->dump_mask | log_maskmap[i].value;
   }
+  if (!old)
+    CONFIG_CLEARRTFLAG(CONFIG_NOABORTONCHKF);
+  int i = 0;
+  FOREACH_FLAG(FLAG_SETDEBUG);
+  i = 0;
+  FOREACH_FLAG(FLAG_SETDUMP);
 
   /* log globally enabled/disabled */
   set_glog_onlinelog(consolelog);
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index f16ee296d478ac0186fb7e2d03a180b80720e190..d153a4aeafdb1ce3a72849bb2f2e33c94c0c8efb 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -88,7 +88,7 @@ extern "C" {
 #define NUM_LOG_LEVEL 6 /*!< \brief the number of message levels users have with LOG (OAILOG_DISABLE is not available to user as a level, so it is not included)*/
 /** @}*/
 
-#define SET_LOG_OPTION(O)   g_log->flag = (g_log->flag | O)
+#define SET_LOG_OPTION(O) g_log->flag = (g_log->flag | O)
 #define CLEAR_LOG_OPTION(O) g_log->flag = (g_log->flag & (~O))
 
 /** @defgroup macros to identify a debug entity
@@ -99,28 +99,37 @@ extern "C" {
  *            server.
  *  @brief
  * @{*/
-#define DEBUG_PRACH        (1<<0)
-#define DEBUG_RU           (1<<1)
-#define DEBUG_UE_PHYPROC   (1<<2)
-#define DEBUG_LTEESTIM     (1<<3)
-#define DEBUG_DLCELLSPEC   (1<<4)
-#define DEBUG_ULSCH        (1<<5)
-#define DEBUG_RRC          (1<<6)
-#define DEBUG_PDCP         (1<<7)
-#define DEBUG_DFT          (1<<8)
-#define DEBUG_ASN1         (1<<9)
-#define DEBUG_CTRLSOCKET   (1<<10)
-#define DEBUG_SECURITY     (1<<11)
-#define DEBUG_NAS          (1<<12)
-#define DEBUG_RLC          (1<<13)
-#define DEBUG_DLSCH_DECOD  (1<<14)
-#define UE_TIMING          (1<<20)
-
-#define SET_LOG_DEBUG(B)   g_log->debug_mask = (g_log->debug_mask | B)
-#define CLEAR_LOG_DEBUG(B) g_log->debug_mask = (g_log->debug_mask & (~B))
-
-#define SET_LOG_DUMP(B)   g_log->dump_mask = (g_log->dump_mask | B)
-#define CLEAR_LOG_DUMP(B) g_log->dump_mask = (g_log->dump_mask & (~B))
+
+#define FOREACH_FLAG(FLAG_DEF) \
+  FLAG_DEF(PRACH)              \
+  FLAG_DEF(UE_PHYPROC)         \
+  FLAG_DEF(LTEESTIM)           \
+  FLAG_DEF(DLCELLSPEC)         \
+  FLAG_DEF(ULSCH)              \
+  FLAG_DEF(RRC)                \
+  FLAG_DEF(PDCP)               \
+  FLAG_DEF(DFT)                \
+  FLAG_DEF(ASN1)               \
+  FLAG_DEF(CTRLSOCKET)         \
+  FLAG_DEF(SECURITY)           \
+  FLAG_DEF(NAS)                \
+  FLAG_DEF(DLSCH_DECOD)        \
+  FLAG_DEF(UE_TIMING)          \
+  FLAG_DEF(F1AP)
+
+#define FLAG_BITF(flag) uint64_t DEBUG_##flag: 1;
+typedef struct {
+  FOREACH_FLAG(FLAG_BITF)
+} debug_flags_t;
+
+#define FLAG_TEXT(flag) #flag,
+static const char *const flag_name[] = {FOREACH_FLAG(FLAG_TEXT) ""};
+
+#define SET_LOG_DEBUG(B) g_log->debug_mask.B = true
+#define CLEAR_LOG_DEBUG(B) g_log->debug_mask.B = false
+
+#define SET_LOG_DUMP(B) g_log->dump_mask.B = true
+#define CLEAR_LOG_DUMP(B) g_log->dump_mask.B = false
 
 #define FOREACH_COMP(COMP_DEF)  \
   COMP_DEF(PHY, log)            \
@@ -215,8 +224,8 @@ typedef struct {
   char                    level2string[NUM_LOG_LEVEL];
   int                     flag;
   char                   *filelog_name;
-  uint64_t                debug_mask;
-  uint64_t                dump_mask;
+  debug_flags_t debug_mask;
+  debug_flags_t dump_mask;
 } log_t;
 
 #ifdef LOG_MAIN
@@ -230,7 +239,28 @@ extern "C" {
 }
 #endif
 #endif
-
+#define FLAG_DEBUG_SET(flag)              \
+  if (strcmp(name, #flag) == 0) {         \
+    g_log->debug_mask.DEBUG_##flag = val; \
+    return true;                          \
+  };
+static inline bool set_log_debug(char *name, bool val)
+{
+  FOREACH_FLAG(FLAG_DEBUG_SET);
+  printf("Error: setting log debug of %s option, not existing\n", name);
+  return false;
+}
+#define FLAG_DUMP_SET(flag)              \
+  if (strcmp(name, #flag) == 0) {        \
+    g_log->dump_mask.DEBUG_##flag = val; \
+    return true;                         \
+  };
+static inline bool set_log_dump(char *name, bool val)
+{
+  FOREACH_FLAG(FLAG_DUMP_SET);
+  printf("Error: setting log dump of %s option, not existing\n", name);
+  return false;
+}
 /*----------------------------------------------------------------------------*/
 int  logInit (void);
 void logTerm (void);
@@ -418,15 +448,15 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
 /* macro used to dump a buffer or a message as in openair2/RRC/LTE/RRC_eNB.c, replaces LOG_F macro */
 #define LOG_DUMPMSG(c, f, b, s, x...)      \
   do {                                     \
-    if (g_log->dump_mask & f)              \
+    if (g_log->dump_mask.f)                \
       log_dump(c, b, s, LOG_DUMP_CHAR, x); \
   } while (0)
 
 /* bitmask dependent macros, to isolate debugging code */
-#define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
+#define LOG_DEBUGFLAG(D) (g_log->debug_mask.D)
 
 /* bitmask dependent macros, to generate debug file such as matlab file or message dump */
-#define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
+#define LOG_DUMPFLAG(D) (g_log->dump_mask.D)
 
 #define LOG_M(file, vector, data, len, dec, format)             \
   do {                                                          \
@@ -529,11 +559,11 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
   } while (0)
 
 #define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...)
-#define LOG_DEBUGFLAG(D) (g_log->debug_mask & D)
-#define LOG_DUMPFLAG(D) (g_log->dump_mask & D)
+#define LOG_DEBUGFLAG(D) (g_log->debug_mask.D)
+#define LOG_DUMPFLAG(D) (g_log->dump_mask.D)
 #define LOG_DUMPMSG(c, f, b, s, x...)      \
   do {                                     \
-    if (g_log->dump_mask & f)              \
+    if (g_log->dump_mask.f)                \
       log_dump(c, b, s, LOG_DUMP_CHAR, x); \
   } while (0) /* */
 
diff --git a/common/utils/T/DOC/T/basic.md b/common/utils/T/DOC/T/basic.md
index 6bac0c5801d86716f800ff8e3137587b35751cac..5f1c97704492fd5415b43ddd1bf52cb527f57ed9 100644
--- a/common/utils/T/DOC/T/basic.md
+++ b/common/utils/T/DOC/T/basic.md
@@ -31,7 +31,7 @@ CMake Error at /usr/share/cmake-3.16/Modules/FindPkgConfig.cmake:463 (message):
 Run:
 
 ```shell
-sudo apt-get install libxft-dev
+sudo apt-get install libx11-dev libpng-dev libxft-dev
 ```
 
 ## Run the softmodem
diff --git a/common/utils/T/tracer/hacks/Makefile b/common/utils/T/tracer/hacks/Makefile
index f345bb4499a51f1e2b08ae697eb72c5c9c33aa02..71574067961b5eb4c19df9fee106d811602c0316 100644
--- a/common/utils/T/tracer/hacks/Makefile
+++ b/common/utils/T/tracer/hacks/Makefile
@@ -25,4 +25,4 @@ multi-rru-clean: ../utils.o ../database.o ../event.o ../configuration.o multi-rr
 	$(CC) $(CFLAGS) -c -o $@ $<
 
 clean:
-	rm -f *.o core dump_nack_signal time_meas timeplot
+	rm -f *.o core dump_nack_signal time_meas timeplot multi-rru-clean
diff --git a/common/utils/T/tracer/hacks/time_meas.c b/common/utils/T/tracer/hacks/time_meas.c
index dccba130ad143226e70fb32f33012a00cfb7ac14..5c945db814e1578afa31d60bfa8831479ad7cc0d 100644
--- a/common/utils/T/tracer/hacks/time_meas.c
+++ b/common/utils/T/tracer/hacks/time_meas.c
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
 #include "utils.h"
 #include "event.h"
 #include "database.h"
@@ -14,7 +15,8 @@ void usage(void)
 "    -d <database file>        this option is mandatory\n"
 "    -ip <host>                connect to given IP address (default %s)\n"
 "    -p <port>                 connect to given port (default %d)\n"
-"    -e <event>                event to trace (default VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER)\n",
+"    -e <event>                event to trace (default VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER)\n"
+"    -s                        stat mode, print every second min/avg/max + count\n",
   DEFAULT_REMOTE_IP,
   DEFAULT_REMOTE_PORT
   );
@@ -34,6 +36,21 @@ struct timespec time_sub(struct timespec a, struct timespec b)
   return ret;
 }
 
+volatile uint64_t acc, count, acc_min, acc_max;
+
+void *stat_thread(void *_)
+{
+  while (1) {
+    uint64_t v = acc;
+    uint64_t c = count;
+    uint64_t min = acc_min;
+    uint64_t max = acc_max;
+    acc = acc_min = acc_max = count = 0;
+    printf("%ld %ld %ld [%ld]\n", min, c==0 ? 0 : v/c, max, c);
+    sleepms(1000);
+  }
+}
+
 int main(int n, char **v)
 {
   char *database_filename = NULL;
@@ -49,6 +66,7 @@ int main(int n, char **v)
   int start_valid = 0;
   struct timespec start_time, stop_time, delta_time;
   char *name = "VCD_FUNCTION_ENB_DLSCH_ULSCH_SCHEDULER";
+  int stat_mode = 0;
 
   for (i = 1; i < n; i++) {
     if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
@@ -58,9 +76,13 @@ int main(int n, char **v)
     if (!strcmp(v[i], "-p"))
       { if (i > n-2) usage(); port = atoi(v[++i]); continue; }
     if (!strcmp(v[i], "-e")) { if (i > n-2) usage(); name = v[++i]; continue; }
+    if (!strcmp(v[i], "-s")) { stat_mode = 1; continue; }
     usage();
   }
 
+  if (stat_mode)
+    new_thread(stat_thread, NULL);
+
   if (database_filename == NULL) {
     printf("ERROR: provide a database file (-d)\n");
     exit(1);
@@ -96,7 +118,8 @@ int main(int n, char **v)
     if (e.type != ev_fun)
       { printf("unhandled event %d\n", e.type); continue; }
     on_off = e.e[0].i;
-printf("yo %d\n", on_off);
+    if (!stat_mode)
+      printf("yo %d\n", on_off);
     if (on_off == 1) {
       start_time = e.sending_time;
       start_valid = 1;
@@ -104,11 +127,20 @@ printf("yo %d\n", on_off);
     }
     if (on_off != 0) { printf("fatal!\n"); abort(); }
     if (!start_valid) continue;
+    start_valid = 0;
     stop_time = e.sending_time;
     delta_time = time_sub(stop_time, start_time);
-    fprintf(stderr, "%ld\n",
-        delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec);
-    fflush(stderr);
+    if (stat_mode) {
+      uint64_t v = delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec;
+      if (count == 0 || v < acc_min) acc_min = v;
+      if (v > acc_max) acc_max = v;
+      acc += v;
+      count++;
+    } else {
+      fprintf(stderr, "%ld\n",
+              delta_time.tv_sec * 1000000000UL + delta_time.tv_nsec);
+      fflush(stderr);
+    }
   }
 
   return 0;
diff --git a/common/utils/ds/byte_array.c b/common/utils/ds/byte_array.c
index 78e1ef4e31d6310c07496aed70bddd1866524a2d..d6ad97e3248bae1a72f3a39e9a9b59b9cb54b798 100644
--- a/common/utils/ds/byte_array.c
+++ b/common/utils/ds/byte_array.c
@@ -72,3 +72,17 @@ byte_array_t cp_str_to_ba(const char* str)
 
   return dst;
 }
+
+char* cp_ba_to_str(const byte_array_t ba)
+{
+  assert(ba.len > 0);
+
+  const size_t sz = ba.len;
+  char* str = calloc(sz+1, sizeof(char));
+  assert(str != NULL && "Memory exhausted");
+
+  memcpy(str, ba.buf, sz);
+  str[sz] = '\0';
+
+  return str;
+}
diff --git a/common/utils/ds/byte_array.h b/common/utils/ds/byte_array.h
index 236f3e683f6b271f6723c32a44f87435168b421f..18adb33047a365ced2ceeb5dc4bef2bcbd2df3fb 100644
--- a/common/utils/ds/byte_array.h
+++ b/common/utils/ds/byte_array.h
@@ -42,5 +42,6 @@ void free_byte_array(byte_array_t ba);
 bool eq_byte_array(const byte_array_t* m0, const byte_array_t* m1);
 
 byte_array_t cp_str_to_ba(const char* str);
+char* cp_ba_to_str(const byte_array_t ba);
 
 #endif
diff --git a/common/utils/telnetsrv/telnetsrv_proccmd.c b/common/utils/telnetsrv/telnetsrv_proccmd.c
index f081bb66a1cfa73eed94f981837c30e098986af4..f79e9f5287bd37924af209c48c58db91d386f6a9 100644
--- a/common/utils/telnetsrv/telnetsrv_proccmd.c
+++ b/common/utils/telnetsrv/telnetsrv_proccmd.c
@@ -251,12 +251,17 @@ void print_threads(char *buf, int debug, telnet_printfunc_t prnt)
   proccmd_get_threaddata(buf, debug, prnt, NULL);
 }
 
+#define FLAG_PRINT_DEBUG_DUMP(flag)                                              \
+  logsdata->lines[i].val[0] = (char *)flag_name[i];                              \
+  logsdata->lines[i].val[1] = g_log->debug_mask.DEBUG_##flag ? "true" : "false"; \
+  logsdata->lines[i].val[1] = g_log->dump_mask.DEBUG_##flag ? "true" : "false";  \
+  i++;
+
 int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfunc_t prnt)
 {
   webdatadef_t *logsdata = (webdatadef_t *)data;
   const mapping *const log_level_names = log_level_names_ptr();
   const mapping *const log_options = log_option_names_ptr();
-  const mapping *log_maskmap = log_maskmap_ptr();
   if (strncmp(cmdbuff, "set", 3) == 0) {
     telnet_printfunc_t printfunc = (prnt != NULL) ? prnt : (telnet_printfunc_t)printf;
     if (strcasestr(cmdbuff, "loglvl") != NULL) {
@@ -291,23 +296,16 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
       }
     }
     if (strcasestr(cmdbuff, "dbgopt") != NULL) {
-      int optbit = map_str_to_int(log_maskmap, logsdata->lines[0].val[0]);
-      if (optbit < 0) {
-        printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
-      } else {
-        if (strcmp(logsdata->lines[0].val[1], "true") == 0)
-          SET_LOG_DEBUG(optbit);
-        else
-          CLEAR_LOG_DEBUG(optbit);
-        if (strcmp(logsdata->lines[0].val[2], "true") == 0)
-          SET_LOG_DUMP(optbit);
-        else
-          CLEAR_LOG_DUMP(optbit);
-        printfunc("%s debug %s dump %s\n",
-                  logsdata->lines[0].val[0],
-                  (strcmp(logsdata->lines[0].val[1], "true") == 0) ? "enabled" : "disabled",
-                  (strcmp(logsdata->lines[0].val[2], "true") == 0) ? "enabled" : "disabled");
-      }
+      if (strcmp(logsdata->lines[0].val[1], "true") == 0)
+        if (!set_log_debug(logsdata->lines[0].val[0], strcmp(logsdata->lines[0].val[2], "true") == 0))
+          printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
+      if (strcmp(logsdata->lines[0].val[2], "true") == 0)
+        if (!set_log_dump(logsdata->lines[0].val[0], strcmp(logsdata->lines[0].val[2], "true") == 0))
+          printfunc("debug option %s unknown\n", logsdata->lines[0].val[0]);
+      printfunc("%s debug %s dump %s\n",
+                logsdata->lines[0].val[0],
+                (strcmp(logsdata->lines[0].val[1], "true") == 0) ? "enabled" : "disabled",
+                (strcmp(logsdata->lines[0].val[2], "true") == 0) ? "enabled" : "disabled");
     }
     if (strcasestr(cmdbuff, "threadsched") != NULL) {
       unsigned int tid = strtoll(logsdata->lines[0].val[0], NULL, 0);
@@ -354,12 +352,9 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
       snprintf(logsdata->columns[2].coltitle, TELNET_CMD_MAXSIZE, "dump");
       logsdata->columns[2].coltype = TELNET_CHECKVAL_BOOL;
 
-      for (int i = 0; log_maskmap[i].name != NULL; i++) {
-        logsdata->numlines++;
-        logsdata->lines[i].val[0] = (char *)log_maskmap[i].name;
-        logsdata->lines[i].val[1] = (g_log->debug_mask & log_maskmap[i].value) ? "true" : "false";
-        logsdata->lines[i].val[2] = (g_log->dump_mask & log_maskmap[i].value) ? "true" : "false";
-      }
+      int i = 0;
+      FOREACH_FLAG(FLAG_PRINT_DEBUG_DUMP);
+      logsdata->numlines += i;
     }
 
     if (strcasestr(cmdbuff, "logopt") != NULL) {
@@ -385,6 +380,14 @@ int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_printfun
   return 0;
 }
 
+#define FLAG_PRINT2_DEBUG_DUMP(flag)               \
+  prnt("%02i %17.17s %5.5s   %5.5s\n",             \
+       i,                                          \
+       flag_name[i],                               \
+       g_log->debug_mask.DEBUG_##flag ? "Y" : "N", \
+       g_log->dump_mask.DEBUG_##flag ? "Y" : "N"); \
+  i++;
+
 int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
 {
   if (buf == NULL) {
@@ -422,12 +425,8 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
    }
    if (strcasestr(buf,"dbgopt") != NULL) {
        prnt("\n               module  debug dumpfile\n");
-       const mapping *log_maskmap = log_maskmap_ptr();
-       for (int i=0; log_maskmap[i].name != NULL ; i++) {
-               prnt("%02i %17.17s %5.5s   %5.5s\n",i ,log_maskmap[i].name, 
-	             ((g_log->debug_mask &  log_maskmap[i].value)?"Y":"N"),
-                     ((g_log->dump_mask & log_maskmap[i].value)?"Y":"N") );
-       }
+       int i = 0;
+       FOREACH_FLAG(FLAG_PRINT2_DEBUG_DUMP);
    }
    if (strcasestr(buf,"config") != NULL) {
        prnt("Command line arguments:\n");
@@ -593,28 +592,16 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
         }
       }
       else if (l == 2 && strcmp(logparam,"debug") == 0){
-        optbit = map_str_to_int(log_maskmap, opt);
-        if (optbit < 0) {
+        int ret = set_log_debug(opt, idx1 > 0);
+        if (!ret)
           prnt("module %s unknown\n", opt);
-        } else {
-          if (idx1 > 0)
-            SET_LOG_DEBUG(optbit);
-          else
-            CLEAR_LOG_DEBUG(optbit);
-          proccmd_show("dbgopt", debug, prnt);
-        }
+        proccmd_show("dbgopt", debug, prnt);
       }  
        else if (l == 2 && strcmp(logparam,"dump") == 0){
-        optbit = map_str_to_int(log_maskmap, opt);
-        if (optbit < 0) {
+        int ret = set_log_dump(opt, idx1 > 0);
+        if (!ret)
           prnt("module %s unknown\n", opt);
-        } else {
-          if (idx1 > 0)
-            SET_LOG_DUMP(optbit);
-          else
-            CLEAR_LOG_DUMP(optbit);
-          proccmd_show("dump", debug, prnt);
-        }
+        proccmd_show("dump", debug, prnt);
       }       
       if (logparam != NULL) free(logparam);
       if (opt != NULL)      free(opt); 
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 564c43bb3fef95b1798e76829b8097780a87d3a4..023fe8469325b9ceaa045f4e5f80d2e19be137c0 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -997,7 +997,6 @@ INPUT                  = \
 @CMAKE_CURRENT_SOURCE_DIR@/../executables/softmodem-common.h \
 @CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-softmodem.c \
 @CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-gnb.c \
-@CMAKE_CURRENT_SOURCE_DIR@/../executables/rt_profiling.h \
 @CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-uesoftmodem.h \
 @CMAKE_CURRENT_SOURCE_DIR@/../executables/nr-uesoftmodem.c \
 @CMAKE_CURRENT_SOURCE_DIR@/../executables/lte-softmodem.h \
diff --git a/doc/E1AP/E1-design.md b/doc/E1AP/E1-design.md
index e98c0ac581102e9de9e480467210c2b00c6d1b63..8fafd09f6677f1d81845f51d6290b3f2afcafe47 100644
--- a/doc/E1AP/E1-design.md
+++ b/doc/E1AP/E1-design.md
@@ -194,3 +194,7 @@ Note that CU-UPs are not released from CU-CP internal structures. That means
 that you have to restart the CU-CP if you want to connect the CU-UP again
 (e.g., after a crash). The CU-CP might also misfunction during attach if a
 CU-UP was connected, but disconnected in the meantime.
+
+# 5. Abnormal conditions
+
+* The CU-UP goes offline during normal operation (e.g. UEs have a valid PDU Session and are exchanging data on the UP): after restarting the CU-UP, the UP is not restored and the user will notice GTP errors. In this case the UEs have to reconnect.
diff --git a/doc/MAC/mac-usage.md b/doc/MAC/mac-usage.md
index 31461f68eb01771feb94c8fe30fbc741b773c679..c3dbd6f199355dcc78c7d6e0fb4931fcb427667e 100644
--- a/doc/MAC/mac-usage.md
+++ b/doc/MAC/mac-usage.md
@@ -145,8 +145,8 @@ In the last lines:
 
 ## Split-related options (running in a DU)
 
-See [nFAPI documentation](../L2NFAPI.md) or [Aerial
-tutorial](../Aerial_FAPI_Split_Tutorial.md) for information about the FAPI
+See [nFAPI documentation](../nfapi.md) or [Aerial
+tutorial](../Aerial_FAPI_Split_Tutorial.md) for information about the (n)FAPI
 split.
 
 See [F1 documentation](../F1-design.md) for information about the F1 split.
diff --git a/doc/README.md b/doc/README.md
index c4b24f39ec8fd1edc764fb4a8adacaef64c620d8..2e84db217cab69109e64cd3efeaac242b0d5d905 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -57,7 +57,8 @@ There is some general information in the [OpenAirInterface Gitlab Wiki](https://
 - [How to use the L2 simulator](./L2NFAPI.md)
 - [How to use the OAI channel simulator](../openair1/SIMULATION/TOOLS/DOC/channel_simulation.md)
 - [How to use multiple BWPs](./RUN_NR_multiple_BWPs.md)
-- [How to run OAI-VNF and OAI-PNF](./RUN_NR_NFAPI.md) _Note: does not work currently_
+- [How to run OAI-VNF and OAI-PNF](./nfapi.md): how to run the nFAPI split,
+  including some general remarks on FAPI/nFAPI.
 - [How to use the positioning reference signal (PRS)](./RUN_NR_PRS.md)
 - [How to use device-to-device communication (D2D, 4G)](./d2d_emulator_setup.txt)
 - [How to run with E2 agent](../openair2/E2AP/README.md)
diff --git a/doc/RUN_NR_NFAPI.md b/doc/RUN_NR_NFAPI.md
deleted file mode 100644
index 5b597aa32669b9c7a35bf6b0fd54e174f58eba90..0000000000000000000000000000000000000000
--- a/doc/RUN_NR_NFAPI.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Procedure to run nFAPI in 5G NR
-
-## Contributed by 5G Testbed IISc 
-
-### Developers: Gokul S, Mahesh A, Aniq U R
-
-## Procedure to Build gNB and UE
-
-The regular commands to build gNB and UE can be used
-```
-sudo ./build_oai --gNB --nrUE
-
-```
-## Procedure to run NR nFAPI using RF-Simulator
-
-### Bring up another loopback interface
-
-If running for the first time on your computer, or you have restarted your computer, bring up another loopback interface with this command:  
-
-sudo ifconfig lo: 127.0.0.2 netmask 255.0.0.0 up
-
-### VNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --phy-test
-
-```
-### PNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi PNF --rfsim --phy-test --rfsimulator.serveraddr server
-
-```
-### UE command
-```
-sudo ./nr-uesoftmodem --rfsim --phy-test -d --rfsimulator.serveraddr 127.0.0.1
-
-```
-## Procedure to run NR nFAPI using Hardware (tested with USRP x310)
-
-### VNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi VNF --noS1 --phy-test
-
-```
-### PNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi PNF --phy-test
-
-```
-### UE command
-```
-sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test
-
-```
-
diff --git a/doc/environment-variables.md b/doc/environment-variables.md
index 31520b0a2dd73ca3e2c323da5f877895f46b72fe..9778665afea0b071f1352f01027e2da4b6345045 100644
--- a/doc/environment-variables.md
+++ b/doc/environment-variables.md
@@ -2,7 +2,7 @@
 
 OAI uses/supports a number of environment variables, documented in the following:
 
-- `NFAPI_TRACE_LEVEL`: set the nfapi custom logging framework's log level; can be one of `error`, `warn`, `note`, `info`, `debug`
+- `NFAPI_TRACE_LEVEL`: set the nfapi custom logging framework's log level; can be one of `error`, `warn`, `note`, `info`, `debug`. Default is `warn`.
 - `NR_AWGN_RESULTS_DIR`: directory containing BLER curves for L2simulator channel modelling in SISO case
 - `NR_MIMO2x2_AWGN_RESULTS_DIR`: directory containing BLER curves for L2simulator channel modelling in 2x2 MIMO case
 - `NVRAM_DIR`: directory to read/write NVRAM data in (5G) `nvram` tool; if not defined, will use `PWD` (working directory)
diff --git a/doc/nfapi.md b/doc/nfapi.md
new file mode 100644
index 0000000000000000000000000000000000000000..366b5fb4ac97ac86f824eb8d82be5dec6329d99b
--- /dev/null
+++ b/doc/nfapi.md
@@ -0,0 +1,137 @@
+This document describes the SmallCellForum (SCF) (n)FAPI split in 5G, i.e.,
+between the MAC/L2 and PHY/L1.
+
+The interested reader is recommended to read a copy of the SCF 222.10
+specification ("FAPI"). This includes information on what is P5, P7, and how
+FAPI works. The currently used version is SCF 222.10.02, with some messages
+upgraded to SCF 222.10.04 due to bugfixes in the spec. Further information
+about nFAPI can be found in SCF 225.2.0.
+
+# Quickstart
+
+Compile OAI as normal. Start the CN and make sure that the VNF configuration
+matches the PLMN/IP addresses. Then, run the VNF
+
+    sudo NFAPI_TRACE_LEVEL=info ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf --nfapi VNF
+
+Afterwards, start and connect the PNF
+
+    sudo NFAPI_TRACE_LEVEL=info ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf --nfapi PNF --rfsim
+
+Finally, you can start the UE (observe the radio configuration info in the
+VNF!)
+
+    sudo ./nr-uesoftmodem -r 106 --numerology 1 --band 78 -C 3619200000 -O ue.conf
+
+You should not observe a difference between nFAPI split and monolithic.
+
+
+# Status
+
+All FAPI message can be transferred between VNF and PNF. This is because OAI
+uses FAPI with its corresponding messages internally, whether a split is in use
+or not.
+
+The nFAPI split mode supports any radio configuration that is also supported by
+the monolithic gNB, with the notable exceptions that only numerologies of 15kHz
+and 30kHz (mu=0 and mu=1, respectively) are supported.
+
+The VNF requests to be notified about every slot by the PNF. No delay
+management is employed as of now; instead, the PNF sends a Slot.indication to
+the VNF in every slot (in divergence from the nFAPI spec). 
+
+Currently, downlink transmissions work the same in monolithic and nFAPI. In
+uplink, we observe an increased number of retransmissions, which limits the MCS
+and hence the achievable throughput (which is limited to 10-20Mbps). We are still
+debugging the root cause of this.
+
+After stopping the PNF, you also have to restart the VNF.
+
+When using RFsim, the system might run slower than in monolithic. This is
+because the PNF needs to slow down the execution time of a specific slot,
+because it has to send a Slot.indication to the VNF for scheduling.
+
+# Configuration
+
+Both PNF and VNF are run through the `nr-softmodem` executable. The type of
+mode is switched through the `--nfapi` switch, with options `MONOLITHIC`
+(default if not provided), `VNF`, `PNF`.
+
+If the type is `VNF`, you have to modify the `MACRLCs.tr_s_preference`
+(transport south preference) to `nfapi`. Further, configure these options:
+
+- `MACRLCs.remote_s_address` (remote south address): IP of the PNF
+- `MACRLCs.local_s_address` (local south address): IP of the VNF
+- `MACRLCs.local_s_portc` (local south port for control): VNF's P5 local port
+- `MACRLCs.remote_s_portc` (remote south port for data): PNF's P5 remote port
+- `MACRLCs.local_s_portd` (local south port for control): VNF's P5 local port
+- `MACRLCs.remote_s_portd` (remote south port for data): PNF's P7 remote port
+
+Note that any L1-specific section (`L1s`, `RUs`,
+RFsimulator-specific/IF7.2-specific configuration or other radios, if
+necessary) will be ignored and can be deleted.
+
+If the type is `PNF`, you have to modify modify the `L1s.tr_n_preference`
+(transport north preference) to `nfapi`. Further, configure these options:
+
+- `L1s.remote_n_address` (remote north address): IP of the VNF
+- `L1s.local_n_address` (local north address): IP of the PNF
+- `L1s.local_n_portc` (local north port for control): PNF's P5 local port
+- `L1s.remote_n_portc` (remote north port for control): VNF's P5 remote port
+- `L1s.local_n_portd` (local north port for data): PNF's P7 local port
+- `L1s.remote_n_portd` (remote north port for data): VNF's P7 remote port
+
+Note that this file should contain additional, L1-specific sections (`L1s`,
+`RUs` RFsimulator-specific/IF7.2-specific configuration or other radios, if
+necessary).
+
+To split an existing config file `monolithic.conf` for nFAPI operation, you
+can proceed as follows:
+
+- copy `monolithic.conf`, which will be your VNF file (`vnf.conf`)
+- in `vnf.conf`
+  * modify `MACRLCs` section to configure south-bound nFAPI transport
+  * delete `L1s`, `RUs`, and radio-specific sections.
+  * in `gNBs` section, increase the `ra_ResponseWindow` by one to extend the RA
+    window: this is necessary because the PNF triggers the scheduler in the VNF
+    in advance, which might make the RA window more likely to run out
+- copy `monolithic.conf`, which will be your PNF file (`pnf.conf`)
+- in `pnf.conf`
+  * modify `L1s` section to configure north-bound nFAPI transport (make sure it
+    matches the `MACRLCs` section for `vnf.conf`
+  * delete all the `gNBs`, `MACRLCs`, `security` sections (they are not needed)
+- if you have root-level options in `monolithic.conf`, such as
+  `usrp-tx-thread-config` or `tune-offset`, make sure to to add them to
+  `pnf.conf`, or provide them on the command line for the PNF.
+- to run, proceed as described in the quick start above.
+
+Note: all L1-specific options have to be passed to the PNF, and remaining
+options to the VNF.
+
+# nFAPI logging system
+
+nFAPI has its own logging system, independent of OAI's. It can be activated by
+setting the `NFAPI_TRACE_LEVEL` environment variable to an appropriate value;
+see [the environment variables documentation](./environment-variables.md) for
+more info.
+
+To see the (any) periodical output at the PNF, define `NFAPI_TRACE_LEVEL=info`.
+This output shows:
+
+```
+41056.739654 [I] 3556767424: pnf_p7_slot_ind: [P7:1] msgs ontime 489 thr DL 0.06 UL 0.01 msg late 0 (vtime)
+```
+
+The first numbers are timestamps. `pnf_p7_slot_ind` is the name of the
+functions that prints the output. `[P7:1]` refers to the fact that these are
+information on P7, of PHY ID 1. Finally, `msgs ontime 489` means that in the
+last window (since the last print), 489 messages arrived at the PNF in total.
+The combined throughput of `TX_data.requests` (DL traffic) was 0.06 Mbps; note
+that this includes SIB1 and other periodical data channels. In UL, 0.01 Mbps
+have been sent through `RX_data.indication`. `msg late 0` means that 0 packets
+have been late. _This number is an aggregate over the total runtime_, unlike
+the other messages. Finally, `(vtime)` is a reminder that the calculations are
+done over virtual time, i.e., frames/slots as executed by the 5G Systems. For
+instance, these numbers might be slightly higher or slower in RFsim than in
+wall-clock time, depending if the system advances faster or slower than
+wall-clock time.
diff --git a/executables/lte-enb.c b/executables/lte-enb.c
index 477ff5cd6837bfd2390d5d95fcec5abc3a6e96b8..39f72db86ce0c378653f09d4aedb48a320208b60 100644
--- a/executables/lte-enb.c
+++ b/executables/lte-enb.c
@@ -568,7 +568,7 @@ int wakeup_rxtx(PHY_VARS_eNB *eNB,
   LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
   int ret;
   LOG_D(PHY,"ENTERED wakeup_rxtx, %d.%d\n",ru_proc->frame_rx,ru_proc->tti_rx);
-  // wake up TX for subframe n+sl_ahead
+  // wake up TX for subframe n+sf_ahead
   // lock the TX mutex and make sure the thread is ready
   AssertFatal((ret=pthread_mutex_lock(&L1_proc->mutex)) == 0,"mutex_lock returns %d\n", ret);
 
diff --git a/executables/lte-softmodem.c b/executables/lte-softmodem.c
index 2a0b73c0197148cadc1aecc5cb64e9e3cacf5d08..6a7e607586fdfa14a06e4198f9de6e9896652b50 100644
--- a/executables/lte-softmodem.c
+++ b/executables/lte-softmodem.c
@@ -195,6 +195,15 @@ void handle_nr_srs_measurements(const module_id_t module_id,
 /* forward declarations */
 void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]);
 
+/* TODO these declarations are to be removed */
+void nr_schedule_dl_tti_req(void) {};
+void nr_schedule_ul_dci_req() {};
+void nr_schedule_tx_req() {};
+void nr_schedule_ul_tti_req() {};
+void nr_slot_select() {};
+void NR_UL_indication(NR_UL_IND_t *UL_INFO) {};
+void gNB_dlsch_ulsch_scheduler() {};
+
 /*---------------------BMC: timespec helpers -----------------------------*/
 
 struct timespec min_diff_time = { .tv_sec = 0, .tv_nsec = 0 };
diff --git a/executables/lte-ue.c b/executables/lte-ue.c
index 41ce61f384f59049fc5f4c033b91a45740919623..e941690f268e7ecb7db4c53357bae957e8dcd3f4 100644
--- a/executables/lte-ue.c
+++ b/executables/lte-ue.c
@@ -1726,7 +1726,8 @@ void *UE_thread(void *arg) {
   pthread_mutex_unlock(&sync_mutex);
   */
   wait_sync("UE thread");
-#ifdef NAS_UE
+
+#ifdef NAS_BUILT_IN_UE
   MessageDef *message_p;
   message_p = itti_alloc_new_message(TASK_NAS_UE, 0, INITIALIZE_MESSAGE);
   itti_send_msg_to_task (TASK_NAS_UE, UE->Mod_id + NB_eNB_INST, message_p);
@@ -2089,7 +2090,7 @@ void init_UE_single_thread_stub(int nb_inst) {
     AssertFatal(PHY_vars_UE_g[i][0]!=NULL,"PHY_vars_UE_g[inst][0] is NULL\n");
 
     if(NFAPI_MODE==NFAPI_UE_STUB_PNF || NFAPI_MODE==NFAPI_MODE_STANDALONE_PNF) {
-#ifdef NAS_UE
+#ifdef NAS_BUILT_IN_UE
       MessageDef *message_p;
       message_p = itti_alloc_new_message(TASK_NAS_UE, 0, INITIALIZE_MESSAGE);
       itti_send_msg_to_task (TASK_NAS_UE, i + NB_eNB_INST, message_p);
diff --git a/executables/lte-uesoftmodem.c b/executables/lte-uesoftmodem.c
index 0a4a4e8d0ee32275c63abc31dfc3359bc216ec06..ea48edd80183a3372861e3e644a6db26290cacb1 100644
--- a/executables/lte-uesoftmodem.c
+++ b/executables/lte-uesoftmodem.c
@@ -155,6 +155,12 @@ double cpuf;
 extern char uecap_xer[1024];
 char uecap_xer_in=0;
 
+/* TODO these declarations are to be removed */
+void nr_schedule_dl_tti_req(void) {};
+void nr_schedule_ul_dci_req() {};
+void nr_schedule_tx_req() {};
+void nr_schedule_ul_tti_req() {};
+void nr_slot_select() {};
 
 /* see file openair2/LAYER2/MAC/main.c for why abstraction_flag is needed
  * this is very hackish - find a proper solution
diff --git a/executables/nr-cuup.c b/executables/nr-cuup.c
index 978486f261f0f0338d788258f3c6953ea05e98ec..856dcd61522b29c69f03fa950e090bc0bad54b55 100644
--- a/executables/nr-cuup.c
+++ b/executables/nr-cuup.c
@@ -172,6 +172,7 @@ int main(int argc, char **argv)
   MessageDef *msg = RCconfig_NR_CU_E1(&e1type);
   AssertFatal(msg != NULL, "Send init to task for E1AP UP failed\n");
   itti_send_msg_to_task(TASK_CUUP_E1, 0, msg);
+  LOG_D(E1AP, "Send E1AP REGISTER REQ to TASK_CUUP_E1\n");
 
   #ifdef E2_AGENT
   //////////////////////////////////
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index 3f306e99eed68dbc983c8194ea8f689e16db0336..0aa538c348658b3a609c04192652a1fb6c2d7d4f 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -36,7 +36,6 @@
 #include "assertions.h"
 #include <common/utils/LOG/log.h>
 #include <common/utils/system.h>
-#include "rt_profiling.h"
 
 #include "PHY/types.h"
 
@@ -91,12 +90,6 @@ static void tx_func(processingData_L1tx_t *info)
   int slot_tx = info->slot;
   int frame_rx = info->frame_rx;
   int slot_rx = info->slot_rx;
-  int64_t absslot_tx = info->timestamp_tx / info->gNB->frame_parms.get_samples_per_slot(slot_tx, &info->gNB->frame_parms);
-  int64_t absslot_rx = absslot_tx - info->gNB->RU_list[0]->sl_ahead;
-  if (absslot_rx < 0) {
-    LOG_W(NR_PHY, "Slot ahead %d is larger than absslot_tx %ld. Cannot start TX yet.\n", info->gNB->RU_list[0]->sl_ahead, absslot_tx);
-    return;
-  }
   LOG_D(NR_PHY, "%d.%d running tx_func\n", frame_tx, slot_tx);
   PHY_VARS_gNB *gNB = info->gNB;
   module_id_t module_id = gNB->Mod_id;
@@ -134,8 +127,6 @@ static void tx_func(processingData_L1tx_t *info)
   if (tx_slot_type == NR_DOWNLINK_SLOT || tx_slot_type == NR_MIXED_SLOT || get_softmodem_params()->continuous_tx) {
     start_meas(&info->gNB->phy_proc_tx);
     phy_procedures_gNB_TX(info, frame_tx, slot_tx, 1);
-    const int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
-    clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.return_L1_TX[rt_prof_idx]);
 
     PHY_VARS_gNB *gNB = info->gNB;
     processingData_RU_t syncMsgRU;
@@ -147,9 +138,14 @@ static void tx_func(processingData_L1tx_t *info)
     ru_tx_func((void *)&syncMsgRU);
     stop_meas(&info->gNB->phy_proc_tx);
   }
-  /* this thread is done with the sched_info, decrease the reference counter */
-  LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx);
-  deref_sched_response(info->sched_response_id);
+
+  if (NFAPI_MODE == NFAPI_MONOLITHIC) {
+    /* this thread is done with the sched_info, decrease the reference counter.
+     * This only applies for monolithic; in the PNF, the memory is allocated in
+     * a ring buffer that should never be overwritten (one frame duration). */
+    LOG_D(NR_PHY, "Calling deref_sched_response for id %d (tx_func) in %d.%d\n", info->sched_response_id, frame_tx, slot_tx);
+    deref_sched_response(info->sched_response_id);
+  }
 }
 
 void *L1_rx_thread(void *arg) 
@@ -187,24 +183,6 @@ static void rx_func(processingData_L1_t *info)
   int frame_rx = info->frame_rx;
   int slot_rx = info->slot_rx;
   nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
-  int cumul_samples = gNB->frame_parms.get_samples_per_slot(0, &gNB->frame_parms);
-  int i = 1;
-  for (; i < gNB->frame_parms.slots_per_subframe / 2; i++)
-    cumul_samples += gNB->frame_parms.get_samples_per_slot(i, &gNB->frame_parms);
-  int samples = cumul_samples / i;
-  int64_t absslot_tx = info->timestamp_tx / samples;
-  int64_t absslot_rx = absslot_tx - gNB->RU_list[0]->sl_ahead;
-  int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
-  clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.start_L1_RX[rt_prof_idx]);
-
-  // *******************************************************************
-
-  if (NFAPI_MODE == NFAPI_MODE_PNF) {
-    // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
-    // LOG_D(PHY, "oai_nfapi_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx);
-    handle_nr_slot_ind(frame_rx, slot_rx);
-  }
-  // ****************************************
 
   // RX processing
   int rx_slot_type = nr_slot_select(cfg, frame_rx, slot_rx);
@@ -253,7 +231,6 @@ static void rx_func(processingData_L1_t *info)
 #endif
   }
 
-  clock_gettime(CLOCK_MONOTONIC, &info->gNB->rt_L1_profiling.return_L1_RX[rt_prof_idx]);
 }
 
 static size_t dump_L1_meas_stats(PHY_VARS_gNB *gNB, RU_t *ru, char *output, size_t outputlen) {
@@ -331,7 +308,13 @@ void *nrL1_stats_thread(void *param) {
   return(NULL);
 }
 
-void init_gNB_Tpool(int inst) {
+void init_gNB_Tpool(int inst)
+{
+  AssertFatal(NFAPI_MODE == NFAPI_MODE_PNF || NFAPI_MODE == NFAPI_MONOLITHIC,
+              "illegal NFAPI_MODE %d (%s): it cannot have an L1\n",
+              NFAPI_MODE,
+              nfapi_get_strmode());
+
   PHY_VARS_gNB *gNB;
   gNB = RC.gNB[inst];
   gNB_L1_proc_t *proc = &gNB->proc;
@@ -364,8 +347,7 @@ void init_gNB_Tpool(int inst) {
   // this will be removed when the msgDataTx is not necessary anymore
   gNB->msgDataTx = msgDataTx;
 
-  if ((!get_softmodem_params()->emulate_l1) && (!IS_SOFTMODEM_NOSTATS) && (NFAPI_MODE != NFAPI_MODE_VNF)
-      && (NFAPI_MODE != NFAPI_MODE_AERIAL))
+  if (!IS_SOFTMODEM_NOSTATS)
     threadCreate(&proc->L1_stats_thread, nrL1_stats_thread, (void *)gNB, "L1_stats", -1, OAI_PRIORITY_RT_LOW);
 }
 
@@ -384,8 +366,7 @@ void term_gNB_Tpool(int inst) {
   abortNotifiedFIFO(&gNB->L1_rx_out);
 
   gNB_L1_proc_t *proc = &gNB->proc;
-  if (!get_softmodem_params()->emulate_l1)
-    pthread_join(proc->L1_stats_thread, NULL);
+  pthread_join(proc->L1_stats_thread, NULL);
 }
 
 /// eNB kept in function name for nffapi calls, TO FIX
@@ -393,7 +374,7 @@ void init_eNB_afterRU(void) {
   int inst,ru_id,i,aa;
   PHY_VARS_gNB *gNB;
 
-  for (inst=0; inst<RC.nb_nr_inst; inst++) {
+  for (inst=0; inst<RC.nb_nr_L1_inst; inst++) {
     gNB = RC.gNB[inst];
 
     phy_init_nr_gNB(gNB);
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 90d7e235dec71a2ffd77f78aafca1ad07e05e9fa..8d240b72a35418ae97d4f5a6b7ec8f5a43df8f43 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -33,7 +33,6 @@
 #include "common/utils/assertions.h"
 #include "common/utils/system.h"
 #include "common/ran_context.h"
-#include "rt_profiling.h"
 
 #include "radio/COMMON/common_lib.h"
 #include "radio/ETHERNET/ethernet_lib.h"
@@ -69,7 +68,6 @@ static int DEFRUTPCORES[] = {-1,-1,-1,-1};
 #include <nfapi/oai_integration/vendor_ext.h>
 #include "executables/nr-softmodem-common.h"
 
-int sl_ahead;
 static void NRRCconfig_RU(configmodule_interface_t *cfg);
 
 /*************************************************************/
@@ -1038,15 +1036,6 @@ void ru_tx_func(void *param)
   int print_frame = 8;
   char filename[40];
 
-  int cumul_samples = fp->get_samples_per_slot(0, fp);
-  int i = 1;
-  for (; i < fp->slots_per_subframe / 2; i++)
-    cumul_samples += fp->get_samples_per_slot(i, fp);
-  int samples = cumul_samples / i;
-  int64_t absslot_tx = info->timestamp_tx / samples;
-  int64_t absslot_rx = absslot_tx - ru->sl_ahead;
-  int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
-  clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.start_RU_TX[rt_prof_idx]);
   // do TX front-end processing if needed (precoding and/or IDFTs)
   if (ru->feptx_prec)
     ru->feptx_prec(ru,frame_tx,slot_tx);
@@ -1093,11 +1082,6 @@ void ru_tx_func(void *param)
       }//for (i=0; i<ru->nb_tx; i++)
     }//if(frame_tx == print_frame)
   }//else  emulate_rf
-  clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_TX[rt_prof_idx]);
-  struct timespec *t0=&ru->rt_ru_profiling.start_RU_TX[rt_prof_idx];
-  struct timespec *t1=&ru->rt_ru_profiling.return_RU_TX[rt_prof_idx];
-
-  LOG_D(PHY,"rt_prof_idx %d : RU_TX time %d\n",rt_prof_idx,(int)(1e9 * (t1->tv_sec - t0->tv_sec) + (t1->tv_nsec-t0->tv_nsec)));
 }
 
 void *ru_thread(void *param)
@@ -1216,29 +1200,7 @@ void *ru_thread(void *param)
   struct timespec slot_start;
 	clock_gettime(CLOCK_MONOTONIC, &slot_start);
   
-  struct timespec slot_duration; 
-	slot_duration.tv_sec = 0;
-	//slot_duration.tv_nsec = 0.5e6;
-	slot_duration.tv_nsec = 0.5e6;
-
-  
-
   while (!oai_exit) {
-    
-    if (NFAPI_MODE==NFAPI_MODE_VNF || NFAPI_MODE == NFAPI_MODE_AERIAL ) {
-      // We should make a VNF main loop with proper tasks calls in case of VNF
-      slot_start = timespec_add(slot_start,slot_duration);
-      struct timespec curr_time;
-      clock_gettime(CLOCK_MONOTONIC, &curr_time);    
-      struct timespec sleep_time;
-      
-      if((slot_start.tv_sec > curr_time.tv_sec) ||
-	 (slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){
-	sleep_time = timespec_sub(slot_start,curr_time);
-	usleep(sleep_time.tv_nsec * 1e-3); 
-      }
-    }
-    
     if (slot==(fp->slots_per_frame-1)) {
       slot=0;
       frame++;
@@ -1273,9 +1235,6 @@ void *ru_thread(void *param)
       proc->timestamp_tx += fp->get_samples_per_slot(i % fp->slots_per_frame, fp);
     proc->tti_tx = (proc->tti_rx + ru->sl_ahead) % fp->slots_per_frame;
     proc->frame_tx = proc->tti_rx > proc->tti_tx ? (proc->frame_rx + 1) & 1023 : proc->frame_rx;
-    int64_t absslot_rx = proc->timestamp_rx/fp->get_samples_per_slot(proc->tti_rx,fp);
-    int rt_prof_idx = absslot_rx % RT_PROF_DEPTH;
-    clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_south_in[rt_prof_idx]);
     LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n",
           frame,slot,
           proc->frame_rx,proc->tti_rx,
@@ -1321,7 +1280,6 @@ void *ru_thread(void *param)
         rx_tti_busy[proc->tti_rx % RU_RX_SLOT_DEPTH] = true;
         ru->feprx(ru,proc->tti_rx);
         LOG_D(NR_PHY, "Setting %d.%d (%d) to busy\n", proc->frame_rx, proc->tti_rx, proc->tti_rx % RU_RX_SLOT_DEPTH);
-        clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_feprx[rt_prof_idx]);
         //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
         LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
         gNBscopeCopy(RC.gNB[0],
@@ -1352,15 +1310,10 @@ void *ru_thread(void *param)
                            proc->frame_rx,
                            proc->tti_rx);
           }
-          clock_gettime(CLOCK_MONOTONIC,&ru->rt_ru_profiling.return_RU_prachrx[rt_prof_idx]);
           free_nr_ru_prach_entry(ru,prach_id);
           VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0);
         } // end if (prach_id > 0)
       } // end if (ru->feprx)
-      else {
-         memset(&ru->rt_ru_profiling.return_RU_feprx[rt_prof_idx],0,sizeof(struct timespec));
-         memset(&ru->rt_ru_profiling.return_RU_prachrx[rt_prof_idx],0,sizeof(struct timespec));
-      }
     } // end if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
 #endif
 
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index a200b1e8a413dc5f8ed68552a73846145022c5da..e14e482b6d19a44895f6755e1724154b0d25dfe6 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -678,26 +678,29 @@ int main( int argc, char **argv ) {
 
 #endif // E2_AGENT
 
-
-  if (NFAPI_MODE==NFAPI_MODE_PNF) {
-    wait_nfapi_init("main?");
-  }
-
   // wait for F1 Setup Response before starting L1 for real
-  if (NODE_IS_DU(node_type) || NODE_IS_MONOLITHIC(node_type))
+  if (NFAPI_MODE != NFAPI_MODE_PNF && (NODE_IS_DU(node_type) || NODE_IS_MONOLITHIC(node_type)))
     wait_f1_setup_response();
 
   if (RC.nb_RU > 0)
     start_NR_RU();
+
 #ifdef ENABLE_AERIAL
   gNB_MAC_INST *nrmac = RC.nrmac[0];
   nvIPC_Init(nrmac->nvipc_params_s);
 #endif
+
+  for (int idx = 0; idx < RC.nb_nr_L1_inst; idx++)
+    RC.gNB[idx]->if_inst->sl_ahead = sl_ahead;
+
+  if (NFAPI_MODE==NFAPI_MODE_PNF) {
+    wait_nfapi_init("main?");
+  }
+
   if (RC.nb_nr_L1_inst > 0) {
     wait_RUs();
     // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
 
-    for (int idx=0;idx<RC.nb_nr_L1_inst;idx++) RC.gNB[idx]->if_inst->sl_ahead = sl_ahead;
     if (IS_SOFTMODEM_DOSCOPE || IS_SOFTMODEM_IMSCOPE_ENABLED) {
       sleep(1);
       scopeParms_t p;
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index e54af77ab6284424e1b24d1e522f13924b736fd5..ef45cd3cb7afddd923277fc3b6140add05b354b1 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -190,17 +190,21 @@ void init_nrUE_standalone_thread(int ue_idx)
   pthread_setname_np(phy_thread, "oai:nrue-stand-phy");
 }
 
-static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot)
+static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn, int slot)
 {
+  struct sfn_slot_s sfn_slot = {.sfn = sfn, .slot = slot};
   nfapi_nr_rach_indication_t *rach_ind = unqueue_matching(&nr_rach_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
   nfapi_nr_dl_tti_request_t *dl_tti_request = get_queue(&nr_dl_tti_req_queue);
   nfapi_nr_ul_dci_request_t *ul_dci_request = get_queue(&nr_ul_dci_req_queue);
 
   for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) {
-    LOG_D(NR_MAC, "Try to get a ul_tti_req by matching CRC active SFN %d/SLOT %d from queue with %lu items\n",
-            NFAPI_SFNSLOT2SFN(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot),
-            NFAPI_SFNSLOT2SLOT(mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot), nr_ul_tti_req_queue.num_items);
-    nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot);
+    LOG_D(NR_MAC,
+          "Try to get a ul_tti_req by matching CRC active sfn/slot %d.%d from queue with %lu items\n",
+          sfn,
+          slot,
+          nr_ul_tti_req_queue.num_items);
+    struct sfn_slot_s sfn_sf = {.sfn = mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn, .slot = mac->nr_ue_emul_l1.harq[i].active_ul_harq_slot };
+    nfapi_nr_ul_tti_request_t *ul_tti_request_crc = unqueue_matching(&nr_ul_tti_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_sf);
     if (ul_tti_request_crc && ul_tti_request_crc->n_pdus > 0) {
       check_and_process_dci(NULL, NULL, NULL, ul_tti_request_crc);
       free_and_zero(ul_tti_request_crc);
@@ -216,11 +220,11 @@ static void process_queued_nr_nfapi_msgs(NR_UE_MAC_INST_t *mac, int sfn_slot)
       free_and_zero(rach_ind);
   }
   if (dl_tti_request) {
-    int dl_tti_sfn_slot = NFAPI_SFNSLOT2HEX(dl_tti_request->SFN, dl_tti_request->Slot);
-    nfapi_nr_tx_data_request_t *tx_data_request = unqueue_matching(&nr_tx_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &dl_tti_sfn_slot);
+    struct sfn_slot_s sfn_slot = {.sfn = dl_tti_request->SFN, .slot = dl_tti_request->Slot};
+    nfapi_nr_tx_data_request_t *tx_data_request = unqueue_matching(&nr_tx_req_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
     if (!tx_data_request) {
-      LOG_E(NR_MAC, "[%d %d] No corresponding tx_data_request for given dl_tti_request sfn/slot\n",
-            NFAPI_SFNSLOT2SFN(dl_tti_sfn_slot), NFAPI_SFNSLOT2SLOT(dl_tti_sfn_slot));
+      LOG_E(NR_MAC, "[%d.%d] No corresponding tx_data_request for given dl_tti_request sfn/slot\n",
+            dl_tti_request->SFN, dl_tti_request->Slot);
       if (get_softmodem_params()->nsa)
         save_nr_measurement_info(dl_tti_request);
       free_and_zero(dl_tti_request);
@@ -262,7 +266,8 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
   for (int i = 0; i < NR_MAX_HARQ_PROCESSES; i++) {
       mac->nr_ue_emul_l1.harq[i].active = false;
-      mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn_slot = -1;
+      mac->nr_ue_emul_l1.harq[i].active_ul_harq_sfn = -1;
+      mac->nr_ue_emul_l1.harq[i].active_ul_harq_slot = -1;
   }
 
   while (!oai_exit) {
@@ -285,8 +290,9 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
       free_and_zero(ch_info);
     }
 
-    frame_t frame = NFAPI_SFNSLOT2SFN(sfn_slot);
-    int slot = NFAPI_SFNSLOT2SLOT(sfn_slot);
+    int mu = 1; // NR-UE emul-L1 is hardcoded to 30kHZ, see check_and_process_dci()
+    frame_t frame = NFAPI_SFNSLOTDEC2SFN(mu, sfn_slot);
+    int slot = NFAPI_SFNSLOTDEC2SLOT(mu, sfn_slot);
     if (sfn_slot == last_sfn_slot) {
       LOG_D(NR_MAC, "repeated sfn_sf = %d.%d\n",
             frame, slot);
@@ -300,7 +306,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
     if (IS_SA_MODE(get_softmodem_params()) && mac->mib == NULL) {
       LOG_D(NR_MAC, "We haven't gotten MIB. Lets see if we received it\n");
       nr_ue_dl_indication(&mac->dl_info);
-      process_queued_nr_nfapi_msgs(mac, sfn_slot);
+      process_queued_nr_nfapi_msgs(mac, frame, slot);
     }
 
     int CC_id = 0;
@@ -340,7 +346,7 @@ static void *NRUE_phy_stub_standalone_pnf_task(void *arg)
       LOG_D(NR_MAC, "Slot %d. calling nr_ue_ul_ind()\n", ul_info.slot);
       nr_ue_ul_scheduler(mac, &ul_info);
     }
-    process_queued_nr_nfapi_msgs(mac, sfn_slot);
+    process_queued_nr_nfapi_msgs(mac, frame, slot);
   }
   return NULL;
 }
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index d5896bbffde6e28f4dd09ed1d9c6959413a73635..ca92f30d4fcacc97596ff460a00100bb83cc4dbb 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -99,7 +99,6 @@ nrUE_params_t nrUE_params = {0};
 pthread_cond_t nfapi_sync_cond;
 pthread_mutex_t nfapi_sync_mutex;
 int nfapi_sync_var=-1; //!< protected by mutex \ref nfapi_sync_mutex
-int sf_ahead = 6; //??? value ???
 pthread_cond_t sync_cond;
 pthread_mutex_t sync_mutex;
 int sync_var=-1; //!< protected by mutex \ref sync_mutex.
@@ -573,6 +572,7 @@ int main(int argc, char **argv)
     }
   }
 
+  free_nrLDPC_coding_interface(&nrLDPC_coding_interface);
   free(pckg);
   return 0;
 }
diff --git a/executables/rt_profiling.h b/executables/rt_profiling.h
deleted file mode 100644
index 9b72a7091fe1efa02251f758c9da829cfbb9b699..0000000000000000000000000000000000000000
--- a/executables/rt_profiling.h
+++ /dev/null
@@ -1,64 +0,0 @@
-
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-/*! \file rt_profiling.h
- * \brief Definitions for proflling real-time scheduling
- * \author
- * \date 2022
- * \version 0.1
- * \company Eurecom
- * \email:
- * \note
- * \warning
- */
-#ifndef TIME_PROFILING_H
-#define TIME_PROFILING_H
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-// depth of trace in slots
-#define RT_PROF_DEPTH 100
-typedef struct {
-   int64_t absslot_rx[RT_PROF_DEPTH];
-   struct timespec return_RU_south_in[RT_PROF_DEPTH];
-   struct timespec return_RU_feprx[RT_PROF_DEPTH];
-   struct timespec return_RU_prachrx[RT_PROF_DEPTH];
-   struct timespec return_RU_pushL1[RT_PROF_DEPTH];
-   struct timespec start_RU_TX[RT_PROF_DEPTH];
-   struct timespec return_RU_TX[RT_PROF_DEPTH];
-} rt_ru_profiling_t;
-
-typedef struct {
-   int64_t absslot_ux[RT_PROF_DEPTH];
-   struct timespec start_L1_RX[RT_PROF_DEPTH];
-   struct timespec return_L1_RX[RT_PROF_DEPTH];
-   struct timespec start_L1_TX[RT_PROF_DEPTH];
-   struct timespec return_L1_TX[RT_PROF_DEPTH];
-   struct timespec return_L1_prachrx[RT_PROF_DEPTH];
-   struct timespec return_L1_puschL1[RT_PROF_DEPTH];
-} rt_L1_profiling_t;
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index e593a78210dc1561d70d417ba11bb93864a412d8..2e7aaacc21bb1a02f1b7026eb351abc356a89687 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -352,7 +352,6 @@ void set_softmodem_sighandler(void);
 extern uint64_t downlink_frequency[MAX_NUM_CCs][4];
 extern int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
 extern int usrp_tx_thread;
-extern int sl_ahead;
 extern int sf_ahead;
 extern int oai_exit;
 
diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p5.c b/nfapi/oai_integration/aerial/fapi_vnf_p5.c
index 26c59c8301a935d54282cf270a490c0110a863ec..1b01fd6c098ed30cd50057603c74051d0e18dcd2 100644
--- a/nfapi/oai_integration/aerial/fapi_vnf_p5.c
+++ b/nfapi/oai_integration/aerial/fapi_vnf_p5.c
@@ -49,7 +49,6 @@ void *aerial_vnf_nr_p7_config_init(void *ptr)
   init_queue(&gnb_rx_ind_queue);
   init_queue(&gnb_crc_ind_queue);
   init_queue(&gnb_uci_ind_queue);
-  init_queue(&gnb_slot_ind_queue);
 
   p7_vnf->config->port = p7_vnf->local_port;
   p7_vnf->config->sync_indication = NULL;
@@ -335,12 +334,6 @@ int aerial_nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_co
 int aerial_nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_response_scf_t *resp)
 {
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
-  vnf_info *vnf = (vnf_info *)(config->user_data);
-  pnf_info *pnf = vnf->pnfs;
-  phy_info *phy = pnf->phys;
-  vnf_p7_info *p7_vnf = vnf->p7_vnfs;
-
-  nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id);
   return 0;
 }
 
diff --git a/nfapi/oai_integration/aerial/fapi_vnf_p7.c b/nfapi/oai_integration/aerial/fapi_vnf_p7.c
index 85308472f38070324169c5e39c081e62e04e6b63..45f3aa1a058a276dc092d1febfa94ec49124cc87 100644
--- a/nfapi/oai_integration/aerial/fapi_vnf_p7.c
+++ b/nfapi/oai_integration/aerial/fapi_vnf_p7.c
@@ -93,56 +93,17 @@ int aerial_phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind)
   return 1;
 }
 
-NR_Sched_Rsp_t g_sched_resp;
 void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, sub_frame_t slot, NR_Sched_Rsp_t* sched_info);
 int oai_fapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req);
 int oai_fapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req);
 int oai_fapi_tx_data_req(nfapi_nr_tx_data_request_t* tx_data_req);
 int oai_fapi_ul_dci_req(nfapi_nr_ul_dci_request_t* ul_dci_req);
 int oai_fapi_send_end_request(int cell, uint32_t frame, uint32_t slot);
-
-int trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind)
-{
-
-  NR_UL_IND_t ind = {.frame = slot_ind->sfn, .slot = slot_ind->slot, };
-  NR_UL_indication(&ind);
-  // Call into the scheduler (this is hardcoded and should be init properly!)
-  // memset(sched_resp, 0, sizeof(*sched_resp));
-  gNB_dlsch_ulsch_scheduler(0, slot_ind->sfn, slot_ind->slot, &g_sched_resp);
-
-  bool send_slt_resp = false;
-  if (g_sched_resp.DL_req.dl_tti_request_body.nPDUs> 0) {
-    oai_fapi_dl_tti_req(&g_sched_resp.DL_req);
-    send_slt_resp = true;
-  }
-  if (g_sched_resp.UL_tti_req.n_pdus > 0) {
-    oai_fapi_ul_tti_req(&g_sched_resp.UL_tti_req);
-    send_slt_resp = true;
-  }
-  if (g_sched_resp.TX_req.Number_of_PDUs > 0) {
-    oai_fapi_tx_data_req(&g_sched_resp.TX_req);
-    send_slt_resp = true;
-  }
-  if (g_sched_resp.UL_dci_req.numPdus > 0) {
-    oai_fapi_ul_dci_req(&g_sched_resp.UL_dci_req);
-    send_slt_resp = true;
-  }
-  if (send_slt_resp) {
-    oai_fapi_send_end_request(0,slot_ind->sfn, slot_ind->slot);
-  }
-
-  return 1;
-}
-
+extern int trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind);
 
 int aerial_phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind)
 {
-  uint8_t vnf_slot_ahead = 0;
-  uint32_t vnf_sfn_slot = sfnslot_add_slot(ind->sfn, ind->slot, vnf_slot_ahead);
-  uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot);
-  uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot);
-  LOG_D(MAC, "VNF SFN/Slot %d.%d \n", vnf_sfn, vnf_slot);
-  // printf( "VNF SFN/Slot %d.%d \n", vnf_sfn, vnf_slot);
+  LOG_D(MAC, "VNF SFN/Slot %d.%d \n", ind->sfn, ind->slot);
   trigger_scheduler(ind);
 
   return 1;
diff --git a/nfapi/oai_integration/gnb_ind_vars.c b/nfapi/oai_integration/gnb_ind_vars.c
index f1f22bcc6628443a3fe6a9d617247411ac9e118b..80ed29d318d03fd1823d6650c1864d00a749e59e 100644
--- a/nfapi/oai_integration/gnb_ind_vars.c
+++ b/nfapi/oai_integration/gnb_ind_vars.c
@@ -25,4 +25,3 @@ queue_t gnb_rach_ind_queue;
 queue_t gnb_rx_ind_queue;
 queue_t gnb_crc_ind_queue;
 queue_t gnb_uci_ind_queue;
-queue_t gnb_slot_ind_queue;
diff --git a/nfapi/oai_integration/gnb_ind_vars.h b/nfapi/oai_integration/gnb_ind_vars.h
index 8561037d3e444ca2f6686714da556407e6cb482e..0f03ba11749f6eb8c3ddeaf36da348bcec4c163c 100644
--- a/nfapi/oai_integration/gnb_ind_vars.h
+++ b/nfapi/oai_integration/gnb_ind_vars.h
@@ -6,4 +6,3 @@ extern queue_t gnb_rach_ind_queue;
 extern queue_t gnb_rx_ind_queue;
 extern queue_t gnb_crc_ind_queue;
 extern queue_t gnb_uci_ind_queue;
-extern queue_t gnb_slot_ind_queue;
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index 8880a5f3150c6631dd0023f925e221a3fb56099a..10d635562f7157743c9dc61a9619bd2f06070df5 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -544,7 +544,6 @@ int param_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nfapi
   nfapi_resp.num_tlv++;
   nfapi_pnf_param_resp(config, &nfapi_resp);
   printf("[PNF] Sent NFAPI_PARAM_RESPONSE phy_id:%d number_of_tlvs:%u\n", req->header.phy_id, nfapi_resp.num_tlv);
-  printf("[PNF] param request .. exit\n");
   return 0;
 }
 
@@ -763,7 +762,6 @@ int nr_param_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf
   nfapi_nr_pnf_param_resp(config, &nfapi_resp);
 
   printf("[PNF] Sent NFAPI_PNF_PARAM_RESPONSE phy_id:%d number_of_tlvs:%u\n", req->header.phy_id, nfapi_resp.num_tlv);
-  printf("[PNF] param request .. exit\n");
   return 0;
 }
 
@@ -1102,38 +1100,13 @@ void pnf_nr_phy_deallocate_p7_vendor_ext(void *header)
   free(header);
 }
 
-notifiedFIFO_elt_t *l1tx_message_extract(PHY_VARS_gNB *gNB, int frame, int slot) {
-  notifiedFIFO_elt_t *res;
-
-  //TODO: This needs to be reworked for nfapi to work
-  res = pullNotifiedFIFO(&gNB->L1_tx_free);
-  return res;
-}
-
-int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req) {
+extern void nr_schedule_ul_dci_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_dci_request_t *UL_dci_req);
+int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_dci_request_t *req)
+{
+  DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL);
+  PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst?
   
-  //   LOG_D(PHY,"[PNF] HI_DCI0_REQUEST SFN/SF:%05d dci:%d hi:%d\n", NFAPI_SFNSF2DEC(req->sfn_sf), req->hi_dci0_request_body.number_of_dci, req->hi_dci0_request_body.number_of_hi);
-
-  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
-
-  // extract the next available thread message (priority to message with current slot, then free message)
-  notifiedFIFO_elt_t *res;
-  res = l1tx_message_extract(gNB, req->SFN, req->Slot);
-  processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
-
-  if (proc ==NULL) 
-    proc = &gNB->proc.L1_proc;
-
-  if (req->numPdus > 0) {
-    for (int i=0; i<req->numPdus; i++) {
-      if (req->ul_dci_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) // only possible value 0: PDCCH PDU
-        msgTx->ul_pdcch_pdu[i] = req->ul_dci_pdu_list[i];
-      else
-        LOG_E(PHY,"[PNF] UL_DCI_REQ sfn_slot:%d PDU[%d] - unknown pdu type:%d\n", NFAPI_SFNSLOT2DEC(req->SFN, req->Slot), req->numPdus-1, req->ul_dci_pdu_list[req->numPdus-1].PDUType);
-    }
-  }
-
-  pushNotifiedFIFO(&gNB->L1_tx_filled, res);
+  nr_schedule_ul_dci_req(gNB, req);
 
   return 0;
 }
@@ -1168,84 +1141,16 @@ int pnf_phy_hi_dci0_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfa
 }
 
 
-int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_dl_tti_request_t *req) {
-  if (RC.ru == 0) {
-    return -1;
-  }
-
-  if (RC.gNB == 0) {
-    return -2;
-  }
-
-  if (RC.gNB[0] == 0) {
-    return -3;
-  }
-
-  if (sync_var != 0) {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy subframe?\n", __FUNCTION__);
-    return -4;
-  }
-
-  int sfn = req->SFN;
-  int slot =  req->Slot;
-  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
-  if (proc==NULL)
-     proc = &gNB->proc.L1_proc;
-  nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu_list = req->dl_tti_request_body.dl_tti_pdu_list;
-
-  if (req->dl_tti_request_body.nPDUs)
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX:%d/%d RX:%d/%d; sfn:%d, slot:%d, nGroup:%u, nPDUs: %u, nUE: %p, PduIdx: %p,\n",
-                __FUNCTION__, proc->frame_tx, proc->slot_tx, proc->frame_rx, proc->slot_rx, // TODO: change subframes to slot
-                req->SFN,
-                req->Slot,
-                req->dl_tti_request_body.nGroup,
-                req->dl_tti_request_body.nPDUs,
-                req->dl_tti_request_body.nUe,
-                req->dl_tti_request_body.PduIdx);
-
-  for (int i=0; i<req->dl_tti_request_body.nPDUs; i++) {
-    // NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sfn/sf:%d PDU[%d] size:%d pdcch_vars->num_dci:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, dl_config_pdu_list[i].pdu_size,pdcch_vars->num_dci);
-    notifiedFIFO_elt_t *res;
-    res = l1tx_message_extract(gNB, sfn, slot);
-    processingData_L1tx_t *msgTx = (processingData_L1tx_t *)NotifiedFifoData(res);
-
-    if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) {
-      msgTx->pdcch_pdu[i] = dl_tti_pdu_list[i].pdcch_pdu; // copies all the received PDCCH PDUs
-    } 
-    else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_SSB_PDU_TYPE) {
-      //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PDU:%d BCH: pdu_index:%u pdu_length:%d sdu_length:%d BCH_SDU:%x,%x,%x\n", __FUNCTION__, i, pdu_index, bch_pdu->bch_pdu_rel8.length, tx_request_pdu[sfn][sf][pdu_index]->segments[0].segment_length, sdu[0], sdu[1], sdu[2]);
-      handle_nr_nfapi_ssb_pdu(msgTx, sfn, slot, &dl_tti_pdu_list[i]);
-    }
-    else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) {
-      nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu = &dl_tti_pdu_list[i].pdsch_pdu;
-      nfapi_nr_dl_tti_pdsch_pdu_rel15_t *rel15_pdu = &pdsch_pdu->pdsch_pdu_rel15;
-      nfapi_nr_pdu_t *tx_data = tx_data_request[sfn][slot][rel15_pdu->pduIndex];
-
-      if (tx_data != NULL) {
-        uint8_t *dlsch_sdu = (uint8_t *)tx_data->TLVs[0].value.direct;
-        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() DLSCH:pdu_index:%d handle_nfapi_dlsch_pdu(eNB, proc_rxtx, dlsch_pdu, transport_blocks:%d sdu:%p) eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols:%d\n", __FUNCTION__, rel8_pdu->pdu_index, rel8_pdu->transport_blocks, dlsch_sdu, eNB->pdcch_vars[proc->subframe_tx & 1].num_pdcch_symbols);
-        AssertFatal(msgTx->num_pdsch_slot < gNB->max_nb_pdsch,
-                    "Number of PDSCH PDUs %d exceeded the limit %d\n",
-                    msgTx->num_pdsch_slot,
-                    gNB->max_nb_pdsch);
-        handle_nr_nfapi_pdsch_pdu(msgTx, pdsch_pdu, dlsch_sdu);
-      } 
-      else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() DLSCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(sfn,slot), rel15_pdu->pduIndex);     
-      }
-    }
-    else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE) {
-      nfapi_nr_dl_tti_csi_rs_pdu *csi_rs_pdu = &dl_tti_pdu_list[i].csi_rs_pdu;
-      handle_nfapi_nr_csirs_pdu(msgTx, sfn, slot, csi_rs_pdu);
-    }
-    else {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType);
-    }
-    pushNotifiedFIFO(&gNB->L1_tx_filled, res);
-  }
+// from dl_tti_req_fn fptr
+extern void nr_schedule_dl_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_dl_tti_request_t *DL_req);
+int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_dl_tti_request_t *DL_req) 
+{
+  DevAssert(proc == NULL);
+  DevAssert(sync_var == 0);
+  DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL);
+  PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst?
 
-  if(req->vendor_extension)
-    free(req->vendor_extension);
+  nr_schedule_dl_tti_req(gNB, DL_req);
 
   return 0;
 }
@@ -1343,29 +1248,13 @@ int pnf_phy_dl_config_req(L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, n
 }
 
 
+extern void nr_schedule_tx_req(PHY_VARS_gNB *gNB, nfapi_nr_tx_data_request_t *TX_req);
+int pnf_phy_tx_data_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_tx_data_request_t *req)
+{
+  DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL);
+  PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst?
 
-int pnf_phy_tx_data_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_tx_data_request_t *req) {
-  uint16_t sfn = req->SFN;
-  uint16_t slot = req->Slot;
-
-  if (req->Number_of_PDUs == 0)
-    LOG_D(PHY,"%s() SFN/SLOT:%d%d PDUs:%d\n", __FUNCTION__, sfn, slot, req->Number_of_PDUs);
-
-  //if (req->pdu_list[0].TLVs->tag ==  NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST) {
-    for (int i=0; i<req->Number_of_PDUs; i++) {
-      // LOG_D(PHY,"%s() SFN/SF:%d%d number_of_pdus:%d [PDU:%d] pdu_length:%d pdu_index:%d num_segments:%d\n",
-      //       __FUNCTION__,
-      //       sfn, sf,
-      //       req->tx_request_body.number_of_pdus,
-      //       i,
-      //       req->tx_request_body.tx_pdu_list[i].pdu_length,
-      //       req->tx_request_body.tx_pdu_list[i].pdu_index,
-      //       req->tx_request_body.tx_pdu_list[i].num_segments
-      //      );
-      // tx_request_pdu[sfn][sf][i] = &req->tx_request_body.tx_pdu_list[i];
-      tx_data_request[sfn][slot][i] = &req->pdu_list[i];
-    }
-  //}
+  nr_schedule_tx_req(gNB, req);
 
   return 0;
 }
@@ -1396,77 +1285,13 @@ int pnf_phy_tx_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *req) {
   return 0;
 }
 
+extern void nr_schedule_ul_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_tti_request_t *UL_tti_req);
+int pnf_phy_ul_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_tti_request_t *req)
+{
+  DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL);
+  PHY_VARS_gNB *gNB = RC.gNB[0]; // phy_inst?
 
-
-int pnf_phy_ul_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7, nfapi_nr_ul_tti_request_t *req) {
-  LOG_D(PHY,"[PNF] UL_TTI_REQ recvd, writing into structs, SFN/slot:%d.%d pdu:%d \n",
-                req->SFN,req->Slot,
-                req->n_pdus
-               );
-
-  if (RC.ru == 0) {
-    return -1;
-  }
-
-  if (RC.gNB == 0) {
-    return -2;
-  }
-
-  if (RC.gNB[0] == 0) {
-    return -3;
-  }
-
-  if (sync_var != 0) {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Main system not up - is this a dummy slot?\n", __FUNCTION__);
-    return -4;
-  }
-  uint16_t curr_sfn = req->SFN;
-  uint16_t curr_slot = req->Slot;
-  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
-
-  if (proc==NULL)
-     proc = &gNB->proc.L1_proc;
-
-  nfapi_nr_ul_tti_request_number_of_pdus_t *ul_tti_pdu_list = req->pdus_list;
-
-  for (int i=0; i< req->n_pdus; i++) {
-    switch (ul_tti_pdu_list[i].pdu_type) {
-      case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
-        //LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-        //curr_sfn = curr_sfn + 3; //Gokul
-        nr_fill_ulsch(gNB,curr_sfn, curr_slot, &ul_tti_pdu_list[i].pusch_pdu);
-        break;
-      case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
-        //LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-        nr_fill_pucch(gNB,curr_sfn, curr_slot, &ul_tti_pdu_list[i].pucch_pdu);
-        break;
-      case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
-        //LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-        nr_fill_prach(gNB, curr_sfn, curr_slot, &ul_tti_pdu_list[i].prach_pdu);
-        if (gNB->RU_list[0]->if_south == LOCAL_RF) nr_fill_prach_ru(gNB->RU_list[0], curr_sfn, curr_slot, &ul_tti_pdu_list[i].prach_pdu);
-        break;
-      default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n", __FUNCTION__, i, ul_tti_pdu_list[i].pdu_type);
-      break;
-
-    }
-    // //LOG_D(PHY, "%s() sfn/sf:%d PDU[%d] size:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), i, ul_config_pdu_list[i].pdu_size);
-    // if (
-    //   ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE ||
-    //   ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE ||
-    //   ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE ||
-    //   ul_tti_pdu_list[i].pdu_type == NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE
-    // ) {
-    //   //LOG_D(PHY, "%s() handle_nfapi_ul_pdu() for PDU:%d\n", __FUNCTION__, i);
-    //   // handle_nfapi_ul_pdu(eNB,proc,&ul_config_pdu_list[i],curr_sfn,curr_sf,req->ul_config_request_body.srs_present);
-      
-    //   // TODO: dont have an NR function for this, also srs_present flag not there
-      
-    // } else {
-    //   NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() PDU:%i UNKNOWN type :%d\n", __FUNCTION__, i, ul_tti_pdu_list[i].pdu_type);
-    // }
-  }
-
+  nr_schedule_ul_tti_req(gNB, req);
   return 0;
 }
 
@@ -1931,6 +1756,18 @@ int nr_start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] HACK - Set p7_config global ready for subframe ind%s\n", __FUNCTION__);
   p7_config_g = p7_config;
 
+  // Hack? in the config request (which comes before the start request here),
+  // we receive the SCS/mu. The PNF needs that for calculating frame/slot
+  // offsets. However, the memory for the structure which actually keeps track
+  // of the time, is only allocated here, so "pick" the SCS from memory.
+  PHY_VARS_gNB *gNB = RC.gNB[0];
+  DevAssert(gNB != NULL);
+  // check that SCS has actually been received
+  const nfapi_uint8_tlv_t *scs = &gNB->gNB_config.ssb_config.scs_common;
+  DevAssert(scs->tl.tag == NFAPI_NR_CONFIG_SCS_COMMON_TAG);
+  pnf_p7_t* pnf_p7 = (pnf_p7_t*)(p7_config);
+  pnf_p7->mu = scs->value;
+
   // Need to wait for main thread to create RU structures
   while (config_sync_var < 0) {
     usleep(5000000);
@@ -1955,7 +1792,7 @@ int nr_start_request(nfapi_pnf_config_t *config, nfapi_pnf_phy_config_t *phy, nf
   }
 
   while(sync_var<0) {
-    usleep(5000000);
+    usleep(50000);
     printf("[PNF] waiting for OAI to be started\n");
   }
 
@@ -2430,24 +2267,53 @@ void oai_subframe_ind(uint16_t sfn, uint16_t sf) {
   }
 }
 
-void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) {
+#define SLOT_DURATION 800 // in microseconds
+static void maybe_slow_down_pnf(int mu)
+{
+  /* uses a usleep to wait for approximately the same time period (300 us) */
+  static struct timespec last_execution = {0};
+  struct timespec current_execution;
+  clock_gettime(CLOCK_REALTIME, &current_execution);
+  // Calculate elapsed time since last execution
+  long elapsed_time = (current_execution.tv_sec - last_execution.tv_sec) * 1000000; // Convert seconds to microseconds
+  elapsed_time += (current_execution.tv_nsec - last_execution.tv_nsec) / 1000; // Convert nanoseconds to microseconds
+  int duration = SLOT_DURATION >> mu;
+  if (elapsed_time < duration)
+    usleep(duration - elapsed_time);
+  // Update last_execution time
+  last_execution = current_execution;
+}
+
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot)
+{
+  nfapi_pnf_p7_config_t *config = p7_config_g;
+  pnf_p7_t *_this = (pnf_p7_t *)(config);
+  int mu = _this->mu;
+
+  if (IS_SOFTMODEM_RFSIM) {
+    // RFsim can run faster than realtime. However, we need to give the VNF
+    // some time to send an answer, so the PNF can run faster than realtime,
+    // but it should not too much. This function will "maybe" slow down, up to
+    // a slot length
+    maybe_slow_down_pnf(mu);
+  }
 
     //send VNF slot indication, which is aligned with TX thread, so that it can call the scheduler
-    nfapi_nr_slot_indication_scf_t *ind;
-    ind = (nfapi_nr_slot_indication_scf_t *) malloc(sizeof(nfapi_nr_slot_indication_scf_t));
-    int slot_ahead = 6;
-    uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
-    uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
-    uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
+    //we give four additional slots (2ms) which should be enough time for the VNF to
+    //answer
+  int slot_ahead = 2 << mu;
+  uint16_t sfn_tx = sfn;
+  uint16_t slot_tx = slot;
+  sfnslot_add_slot(mu, &sfn_tx, &slot_tx, slot_ahead); // modify: do in place
 
-    ind->sfn = sfn_tx;
-    ind->slot = slot_tx;
-    oai_nfapi_nr_slot_indication(ind); 
+  // printf("send slot indication for sfn/slot:%4d.%2d current:%4d.%2d\n", sfn_tx, slot_tx, sfn, slot);
+  nfapi_nr_slot_indication_scf_t ind = {.sfn = sfn_tx, .slot = slot_tx};
+  oai_nfapi_nr_slot_indication(&ind);
 
-    //copy data from appropriate p7 slot buffers into channel structures for PHY processing
-    nfapi_pnf_p7_slot_ind(p7_config_g, p7_config_g->phy_id, sfn, slot); 
+  // copy data from appropriate p7 slot buffers into channel structures for PHY processing
+  nfapi_pnf_p7_slot_ind(config, config->phy_id, sfn, slot);
 
-    return;
+  return;
 }
 
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) {
diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h
index b7ebdb36eae1d22befc314098078ab7618cc51db..0ba0676f106292f6f27ea3ad8a9f852af5185b6d 100644
--- a/nfapi/oai_integration/nfapi_pnf.h
+++ b/nfapi/oai_integration/nfapi_pnf.h
@@ -19,6 +19,8 @@
  *      contact@openairinterface.org
  */
 
+#ifndef NFAPI_PNF_H_
+#define NFAPI_PNF_H_
 
 extern nfapi_ue_release_request_body_t release_rntis;
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
@@ -27,7 +29,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add
 
 void oai_subframe_ind(uint16_t sfn, uint16_t sf);
 void handle_nr_slot_ind(uint16_t sfn, uint16_t slot);
-uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset);
+void sfnslot_add_slot(int mu, uint16_t *sfn, uint16_t *slot, int offset);
 
 int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind);
 int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind);
@@ -36,3 +38,4 @@ int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind);
 int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind);
 int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind);
 
+#endif /* NFAPI_PNF_H_ */
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index 9bc3c37452bfcf9d9f20167580d1852f19440fbf..ff4dcfa39314c55c6cb1e3de4f160b6fbbe000ee 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -50,6 +50,9 @@
 #include "nr_fapi_p7_utils.h"
 #include <NR_MAC_gNB/mac_proto.h>
 
+#ifdef ENABLE_AERIAL
+#include "aerial/fapi_vnf_p5.h"
+#endif
 
 #define TEST
 
@@ -272,49 +275,6 @@ void oai_enb_init(void) {
   init_eNB_afterRU();
 }
 
-
-void oai_create_gnb(void) {
-  int bodge_counter=0;
-
-  if (RC.gNB == NULL) {
-    RC.gNB = (PHY_VARS_gNB **) calloc(1, sizeof(PHY_VARS_gNB *));
-    LOG_D(PHY,"gNB L1 structure RC.gNB allocated @ %p\n",RC.gNB);
-  }
-
-
-  if (RC.gNB[0] == NULL) {
-    RC.gNB[0] = (PHY_VARS_gNB *) calloc(1, sizeof(PHY_VARS_gNB));
-    LOG_D(PHY,"[nr-gnb.c] gNB structure RC.gNB[%d] allocated @ %p\n",0,RC.gNB[0]);
-  }
-  
-  PHY_VARS_gNB *gNB = RC.gNB[0];
-  RC.nb_nr_CC = (int *)malloc(sizeof(int)); // TODO: find a better function to place this in
-
-  gNB->Mod_id = bodge_counter;
-  gNB->CC_id = bodge_counter;
-  RC.nb_nr_CC[bodge_counter] = 1;
-
-  if (gNB->if_inst==0) {
-    gNB->if_inst = NR_IF_Module_init(bodge_counter);
-  }
-
-
-  // This will cause phy_config_request to be installed. That will result in RRC configuring the PHY
-  // that will result in gNB->configured being set to true.
-  // See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
-  if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n");
-    install_nr_schedule_handlers(RC.gNB[0]->if_inst);
-  }
-
-  do {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Waiting for gNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
-    usleep(50000);
-  } while(gNB->configured != 1);
-
-  NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() gNB is now configured\n", __FUNCTION__);
-}
-
 int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf connection indication idx:%d\n", p5_idx);
   oai_create_enb();
@@ -327,7 +287,6 @@ int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
 
 int pnf_nr_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf connection indication idx:%d\n", p5_idx);
-  oai_create_gnb();
   nfapi_nr_pnf_param_request_t req;
   memset(&req, 0, sizeof(req));
   req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST;
@@ -650,7 +609,7 @@ int phy_slot_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uin
   static uint8_t first_time = 1;
 
   if (first_time) {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] slot indication %d\n", NFAPI_SFNSLOT2DEC(sfn, slot));
+    NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] slot indication %d.%d\n", sfn, slot);
     first_time = 0;
   }
 
@@ -1118,24 +1077,66 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
 
 //NR phy indication
 
-int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) {
 
-  uint8_t vnf_slot_ahead = 0;
-  uint32_t vnf_sfn_slot = sfnslot_add_slot(ind->sfn, ind->slot, vnf_slot_ahead);
-  uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot);
-  uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot);
-  LOG_D(MAC, "VNF SFN/Slot %d.%d \n", vnf_sfn, vnf_slot);
+NR_Sched_Rsp_t g_sched_resp;
+void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, frame_t frame, sub_frame_t slot, NR_Sched_Rsp_t* sched_info);
+int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req);
+int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req);
+int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t* tx_data_req);
+int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t* ul_dci_req);
 
-  nfapi_nr_slot_indication_scf_t *nr_slot_ind = CALLOC(1, sizeof(*nr_slot_ind));
-  nr_slot_ind->header = ind->header;
-  nr_slot_ind->sfn = vnf_sfn;
-  nr_slot_ind->slot = vnf_slot;
-  if (!put_queue(&gnb_slot_ind_queue, nr_slot_ind))
-  {
-    LOG_E(NR_MAC, "Put_queue failed for slot_ind\n");
-    free(nr_slot_ind);
-    nr_slot_ind = NULL;
-  }
+int trigger_scheduler(nfapi_nr_slot_indication_scf_t *slot_ind)
+{
+  // Call into the scheduler (this is hardcoded and should be init properly!)
+  // memset(sched_resp, 0, sizeof(*sched_resp));
+  gNB_dlsch_ulsch_scheduler(0, slot_ind->sfn, slot_ind->slot, &g_sched_resp);
+
+#ifdef ENABLE_AERIAL
+    bool send_slt_resp = false;
+    if (g_sched_resp.DL_req.dl_tti_request_body.nPDUs> 0) {
+      oai_fapi_dl_tti_req(&g_sched_resp.DL_req);
+      send_slt_resp = true;
+    }
+    if (g_sched_resp.UL_tti_req.n_pdus > 0) {
+      oai_fapi_ul_tti_req(&g_sched_resp.UL_tti_req);
+      send_slt_resp = true;
+    }
+    if (g_sched_resp.TX_req.Number_of_PDUs > 0) {
+      oai_fapi_tx_data_req(&g_sched_resp.TX_req);
+      send_slt_resp = true;
+    }
+    if (g_sched_resp.UL_dci_req.numPdus > 0) {
+      oai_fapi_ul_dci_req(&g_sched_resp.UL_dci_req);
+      send_slt_resp = true;
+    }
+    if (send_slt_resp) {
+      oai_fapi_send_end_request(0,slot_ind->sfn, slot_ind->slot);
+    }
+#else
+  if (g_sched_resp.DL_req.dl_tti_request_body.nPDUs > 0)
+    oai_nfapi_dl_tti_req(&g_sched_resp.DL_req);
+
+  if (g_sched_resp.UL_tti_req.n_pdus > 0)
+    oai_nfapi_ul_tti_req(&g_sched_resp.UL_tti_req);
+
+  if (g_sched_resp.TX_req.Number_of_PDUs > 0)
+    oai_nfapi_tx_data_req(&g_sched_resp.TX_req);
+
+  if (g_sched_resp.UL_dci_req.numPdus > 0)
+    oai_nfapi_ul_dci_req(&g_sched_resp.UL_dci_req);
+#endif
+
+  NR_UL_IND_t ind = {.frame = slot_ind->sfn, .slot = slot_ind->slot, };
+  NR_UL_indication(&ind);
+
+  return 1;
+}
+
+int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind)
+{
+  LOG_D(MAC, "VNF SFN/Slot %d.%d \n", ind->sfn, ind->slot);
+
+  trigger_scheduler(ind);
 
   return 1;
 }
@@ -1413,7 +1414,6 @@ void *vnf_nr_p7_thread_start(void *ptr)
   init_queue(&gnb_rx_ind_queue);
   init_queue(&gnb_crc_ind_queue);
   init_queue(&gnb_uci_ind_queue);
-  init_queue(&gnb_slot_ind_queue);
 
   vnf_p7_info *p7_vnf = (vnf_p7_info *)ptr;
   p7_vnf->config->port = p7_vnf->local_port;
@@ -1551,6 +1551,17 @@ int nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_param_resp
   // for now just 1
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled,
          p7_vnf->periodic_timing_period);
+  // Hack? the VNF might need the subcarrier spacing for some calculations
+  // (that we actually don't use as of now...). We therefore need to save the
+  // mu, for the current PNF connection (together with where we have frame/slot
+  // info). nfapi_vnf_p7_add_pnf() prepends the current P7 connection to the
+  // beginning of the list. Pick it from there, and save the mu.
+  // check that SCS has actually been set
+  const nfapi_uint8_tlv_t *scs = &req->ssb_config.scs_common;
+  DevAssert(scs->tl.tag == NFAPI_NR_CONFIG_SCS_COMMON_TAG);
+  int mu = scs->value;
+  nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id, mu);
+
   req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST;
   req->header.phy_id = phy->id;
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Send NFAPI_CONFIG_REQUEST\n");
@@ -1683,18 +1694,12 @@ int start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_start_response_t
   pnf_info *pnf = vnf->pnfs;
   phy_info *phy = pnf->phys;
   vnf_p7_info *p7_vnf = vnf->p7_vnfs;
-  nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, htons(phy->remote_port), phy->id);
+  nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, htons(phy->remote_port), phy->id, 0);
   return 0;
 }
 
 int nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_response_scf_t *resp) {
   NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
-  vnf_info *vnf = (vnf_info *)(config->user_data);
-  pnf_info *pnf = vnf->pnfs;
-  phy_info *phy = pnf->phys;
-  vnf_p7_info *p7_vnf = vnf->p7_vnfs;
-
- nfapi_vnf_p7_add_pnf((p7_vnf->config), phy->remote_addr, phy->remote_port, phy->id);
   return 0;
 }
 
@@ -1816,7 +1821,7 @@ void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr,
   vnf.p7_vnfs[0].timing_window = 30;
   vnf.p7_vnfs[0].periodic_timing_enabled = 0;
   vnf.p7_vnfs[0].aperiodic_timing_enabled = 0;
-  vnf.p7_vnfs[0].periodic_timing_period = 10;
+  vnf.p7_vnfs[0].periodic_timing_period = 1;
   vnf.p7_vnfs[0].config = nfapi_vnf_p7_config_create();
   NFAPI_TRACE(NFAPI_TRACE_INFO,
               "[VNF] %s() vnf.p7_vnfs[0].config:%p VNF ADDRESS:%s:%d\n",
diff --git a/nfapi/oai_integration/nfapi_vnf.h b/nfapi/oai_integration/nfapi_vnf.h
index 12126465febe63233144425f9ae3c80a98dfbe95..71cc50c2f74863a1efd7e543ac84c3f12038ad99 100644
--- a/nfapi/oai_integration/nfapi_vnf.h
+++ b/nfapi/oai_integration/nfapi_vnf.h
@@ -19,9 +19,10 @@
  *      contact@openairinterface.org
  */
 
+#ifndef NFAPI_VNF_H_
+#define NFAPI_VNF_H_
 
 void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 
-uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset);
-
+#endif /* NFAPI_VNF_H_ */
diff --git a/nfapi/open-nFAPI/CMakeLists.txt b/nfapi/open-nFAPI/CMakeLists.txt
index ad4131c621f54eb7309eabed5160dd6da601283a..c36fca6f831abb268ef253a77ea1a213ef78f21f 100644
--- a/nfapi/open-nFAPI/CMakeLists.txt
+++ b/nfapi/open-nFAPI/CMakeLists.txt
@@ -1,2 +1,3 @@
 add_subdirectory(common)
 add_subdirectory(fapi)
+add_subdirectory(utils)
diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c
index 628e64d9473b103815ac0b8f2eab14f1faa92384..cd872afc11d05d1989407e3961f5f6663a5b4839 100644
--- a/nfapi/open-nFAPI/common/src/debug.c
+++ b/nfapi/open-nFAPI/common/src/debug.c
@@ -66,7 +66,7 @@ void nfapi_trace(nfapi_trace_level_t level,
 {
     struct timespec ts;
     clock_gettime(CLOCK_MONOTONIC, &ts);
-    printf("%ld%06ld [%c] %10u: %s: ",
+    printf("%ld.%06ld [%c] %10u: %s: ",
            ts.tv_sec,
            ts.tv_nsec / 1000,
            "XEWNID"[level], // NFAPI_TRACE_NONE, NFAPI_TRACE_ERROR, ...
diff --git a/nfapi/open-nFAPI/fapi/inc/nr_fapi.h b/nfapi/open-nFAPI/fapi/inc/nr_fapi.h
index f90fafebebc393f8c8ae620ee85eaae52cdfd1a4..e8e645b8cfe292ab19e916f5d07c5718e14dc4dd 100644
--- a/nfapi/open-nFAPI/fapi/inc/nr_fapi.h
+++ b/nfapi/open-nFAPI/fapi/inc/nr_fapi.h
@@ -34,6 +34,8 @@
 #include "assertions.h"
 #include "debug.h"
 
+#define INDENTED_PRINTF(format, ...) printf("%*s" format, depth * 2, "", ##__VA_ARGS__)
+
 #define EQ_TLV(_tlv_a, _tlv_b)        \
   do {                                \
     EQ(_tlv_a.tl.tag, _tlv_b.tl.tag); \
diff --git a/nfapi/open-nFAPI/fapi/inc/nr_fapi_p5_utils.h b/nfapi/open-nFAPI/fapi/inc/nr_fapi_p5_utils.h
index edd75df6775a63fbe927f9d813ed3dd4a1e239c0..77ed67e2efd3a3dde8a274cd78fbb336672975ee 100644
--- a/nfapi/open-nFAPI/fapi/inc/nr_fapi_p5_utils.h
+++ b/nfapi/open-nFAPI/fapi/inc/nr_fapi_p5_utils.h
@@ -56,4 +56,15 @@ void copy_stop_request(const nfapi_nr_stop_request_scf_t *src, nfapi_nr_stop_req
 void copy_stop_indication(const nfapi_nr_stop_indication_scf_t *src, nfapi_nr_stop_indication_scf_t *dst);
 void copy_error_indication(const nfapi_nr_error_indication_scf_t *src, nfapi_nr_error_indication_scf_t *dst);
 
+void dump_param_request(const nfapi_nr_param_request_scf_t *msg);
+void dump_param_response(const nfapi_nr_param_response_scf_t *msg);
+void dump_config_request(const nfapi_nr_config_request_scf_t *msg);
+void dump_config_response(const nfapi_nr_config_response_scf_t *msg);
+void dump_start_request(const nfapi_nr_start_request_scf_t *msg);
+void dump_start_response(const nfapi_nr_start_response_scf_t *msg);
+void dump_stop_request(const nfapi_nr_stop_request_scf_t *msg);
+void dump_stop_indication(const nfapi_nr_stop_indication_scf_t *msg);
+void dump_error_indication(const nfapi_nr_error_indication_scf_t *msg);
+
+
 #endif // OPENAIRINTERFACE_NR_FAPI_P5_UTILS_H
diff --git a/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h b/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h
index e0682dbb44e88eda2d27ff926eac4d3645393f2e..f9155487830afaa648c9621cbeb4d9affb8a33ac 100644
--- a/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h
+++ b/nfapi/open-nFAPI/fapi/inc/nr_fapi_p7_utils.h
@@ -75,4 +75,16 @@ size_t get_crc_indication_size(const nfapi_nr_crc_indication_t *msg);
 size_t get_uci_indication_size(const nfapi_nr_uci_indication_t *msg);
 size_t get_srs_indication_size(const nfapi_nr_srs_indication_t *msg);
 size_t get_rach_indication_size(nfapi_nr_rach_indication_t *msg);
+
+void dump_dl_tti_request(const nfapi_nr_dl_tti_request_t *msg);
+void dump_ul_tti_request(const nfapi_nr_ul_tti_request_t *msg);
+void dump_slot_indication(const nfapi_nr_slot_indication_scf_t *msg);
+void dump_ul_dci_request(const nfapi_nr_ul_dci_request_t *msg);
+void dump_tx_data_request(const nfapi_nr_tx_data_request_t *msg);
+void dump_rx_data_indication(const nfapi_nr_rx_data_indication_t *msg);
+void dump_crc_indication(const nfapi_nr_crc_indication_t *msg);
+void dump_uci_indication(const nfapi_nr_uci_indication_t *msg);
+void dump_srs_indication(const nfapi_nr_srs_indication_t *msg);
+void dump_rach_indication(const nfapi_nr_rach_indication_t *msg);
+
 #endif // OPENAIRINTERFACE_NR_FAPI_P7_UTILS_H
diff --git a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c
index b5ff0a24900d4c4e711be375dadb587b124dd6f1..796f424abe5391743be35284e6a7ead022d0f97f 100644
--- a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c
+++ b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5.c
@@ -714,16 +714,7 @@ uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *
       {NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
       {NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
   };
-  // print ppReadPackedMsg
-  uint8_t *ptr = *ppReadPackedMsg;
-  printf("\n Read message unpack_param_response:   ");
 
-  while (ptr < end) {
-    printf(" 0x%02x", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
   return (pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) && pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end)
           && unpack_nr_tlv_list(unpack_fns,
                                 sizeof(unpack_fns) / sizeof(unpack_tlv_t),
@@ -1017,22 +1008,24 @@ uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
 
   // END SSB Table
   // START TDD Table
-  retval &=
-      pack_nr_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value);
-  numTLVs++;
-  const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
-  // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
-  uint8_t cyclicprefix = 1;
-  // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
-  uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
-  for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) { // TODO check right number of slots
-    for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change?
-      retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,
-                            &pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
-                            ppWritePackedMsg,
-                            end,
-                            &pack_uint8_tlv_value);
-      numTLVs++;
+  if (pNfapiMsg->cell_config.frame_duplex_type.value == 1 /* TDD */) {
+    retval &=
+        pack_nr_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value);
+    numTLVs++;
+    const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
+    // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
+    uint8_t cyclicprefix = 1;
+    // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
+    uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
+    for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) { // TODO check right number of slots
+      for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change?
+        retval &= pack_nr_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,
+                              &pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
+                              ppWritePackedMsg,
+                              end,
+                              &pack_uint8_tlv_value);
+        numTLVs++;
+      }
     }
   }
 
@@ -1232,27 +1225,28 @@ uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
             pNfapiMsg->prach_config.num_prach_fd_occasions.tl.tag = generic_tl.tag;
             pNfapiMsg->prach_config.num_prach_fd_occasions.tl.length = generic_tl.length;
             result = (*unpack_fns[idx].unpack_func)(&pNfapiMsg->prach_config.num_prach_fd_occasions, ppReadPackedMsg, end);
-            pNfapiMsg->prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *)malloc(
-                pNfapiMsg->prach_config.num_prach_fd_occasions.value * sizeof(nfapi_nr_num_prach_fd_occasions_t));
+            pNfapiMsg->prach_config.num_prach_fd_occasions_list = calloc(pNfapiMsg->prach_config.num_prach_fd_occasions.value, sizeof(nfapi_nr_num_prach_fd_occasions_t));
             prach_root_seq_idx = 0;
             break;
           case NFAPI_NR_CONFIG_SCS_COMMON_TAG:
             pNfapiMsg->ssb_config.scs_common.tl.tag = generic_tl.tag;
             pNfapiMsg->ssb_config.scs_common.tl.length = generic_tl.length;
             result = (*unpack_fns[idx].unpack_func)(&pNfapiMsg->ssb_config.scs_common, ppReadPackedMsg, end);
-            const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
+
             // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
             uint8_t cyclicprefix = 1;
             // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
             uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
 
-            pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc(
-                slotsperframe[pNfapiMsg->ssb_config.scs_common.value] * sizeof(nfapi_nr_max_tdd_periodicity_t));
+            if (pNfapiMsg->cell_config.frame_duplex_type.value == 1 /* TDD */) {
+              const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
+              int n = slotsperframe[pNfapiMsg->ssb_config.scs_common.value];
+              pNfapiMsg->tdd_table.max_tdd_periodicity_list = calloc(n, sizeof(nfapi_nr_max_tdd_periodicity_t));
 
-            for (int i = 0; i < slotsperframe[pNfapiMsg->ssb_config.scs_common.value]; i++) {
-              pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
-                  (nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot
-                                                                  * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
+              for (int i = 0; i < n; i++) {
+                pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
+                    calloc(number_of_symbols_per_slot, sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
+              }
             }
             break;
           case NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG:
diff --git a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c
index 6450fadb44dc903fb8c4ee0ff6068236ad4a3b46..4267992d07ea6c6a6e5d81f669b2f5706078020e 100644
--- a/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c
+++ b/nfapi/open-nFAPI/fapi/src/nr_fapi_p5_utils.c
@@ -240,18 +240,20 @@ bool eq_config_request(const nfapi_nr_config_request_scf_t *unpacked_req, const
     EQ_TLV(unpacked_req->ssb_table.ssb_beam_id_list[i].beam_id, req->ssb_table.ssb_beam_id_list[i].beam_id);
   }
 
-  EQ_TLV(unpacked_req->tdd_table.tdd_period, req->tdd_table.tdd_period);
-
-  const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
-  // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
-  uint8_t cyclicprefix = 1;
-  // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
-  uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
-
-  for (int i = 0; i < slotsperframe[unpacked_req->ssb_config.scs_common.value]; i++) {
-    for (int k = 0; k < number_of_symbols_per_slot; k++) {
-      EQ_TLV(unpacked_req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
-             req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config);
+  if (req->cell_config.frame_duplex_type.value == 1 /* TDD */) {
+    EQ_TLV(unpacked_req->tdd_table.tdd_period, req->tdd_table.tdd_period);
+
+    const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
+    // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
+    uint8_t cyclicprefix = 1;
+    // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
+    uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
+
+    for (int i = 0; i < slotsperframe[unpacked_req->ssb_config.scs_common.value]; i++) {
+      for (int k = 0; k < number_of_symbols_per_slot; k++) {
+        EQ_TLV(unpacked_req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
+               req->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config);
+      }
     }
   }
 
@@ -768,24 +770,26 @@ void copy_config_request(const nfapi_nr_config_request_scf_t *src, nfapi_nr_conf
     COPY_TLV(dst->ssb_table.ssb_beam_id_list[i].beam_id, src->ssb_table.ssb_beam_id_list[i].beam_id);
   }
 
-  COPY_TLV(dst->tdd_table.tdd_period, src->tdd_table.tdd_period);
+  if (src->cell_config.frame_duplex_type.value == 1 /* TDD */) {
+    COPY_TLV(dst->tdd_table.tdd_period, src->tdd_table.tdd_period);
 
-  const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
-  // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
-  uint8_t cyclicprefix = 1;
-  // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
-  uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
-  dst->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc(slotsperframe[dst->ssb_config.scs_common.value]
-                                                                                     * sizeof(nfapi_nr_max_tdd_periodicity_t));
-
-  for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) {
-    dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
-        (nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
-  }
-  for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { // TODO check right number of slots
-    for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change?
-      COPY_TLV(dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
-               src->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config);
+    const uint8_t slotsperframe[5] = {10, 20, 40, 80, 160};
+    // Assuming always CP_Normal, because Cyclic prefix is not included in CONFIG.request 10.02, but is present in 10.04
+    uint8_t cyclicprefix = 1;
+    // 3GPP 38.211 Table 4.3.2.1 & Table 4.3.2.2
+    uint8_t number_of_symbols_per_slot = cyclicprefix ? 14 : 12;
+    dst->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *)malloc(slotsperframe[dst->ssb_config.scs_common.value]
+                                                                                       * sizeof(nfapi_nr_max_tdd_periodicity_t));
+
+    for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) {
+      dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list =
+          (nfapi_nr_max_num_of_symbol_per_slot_t *)malloc(number_of_symbols_per_slot * sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
+    }
+    for (int i = 0; i < slotsperframe[dst->ssb_config.scs_common.value]; i++) { // TODO check right number of slots
+      for (int k = 0; k < number_of_symbols_per_slot; k++) { // TODO can change?
+        COPY_TLV(dst->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config,
+                 src->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[k].slot_config);
+      }
     }
   }
 
@@ -936,3 +940,113 @@ void copy_error_indication(const nfapi_nr_error_indication_scf_t *src, nfapi_nr_
   dst->message_id = src->message_id;
   dst->error_code = src->error_code;
 }
+
+static void dump_p5_message_header(const nfapi_nr_p4_p5_message_header_t *hdr, int depth)
+{
+  INDENTED_PRINTF("Message ID = 0x%02x\n", hdr->message_id);
+  INDENTED_PRINTF("Message Length = 0x%02x\n", hdr->message_length);
+}
+
+void dump_param_request(const nfapi_nr_param_request_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+}
+
+void dump_param_response(const nfapi_nr_param_response_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+  depth++;
+  INDENTED_PRINTF("Error Code = 0x%02x\n", msg->error_code);
+  INDENTED_PRINTF("Number of TLVs = 0x%02x\n", msg->num_tlv);
+  /* dump all TLVs from each table */
+  depth--;
+}
+
+void dump_config_request(const nfapi_nr_config_request_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+  depth++;
+  INDENTED_PRINTF("Number of TLVs = 0x%02x\n", msg->num_tlv);
+  /* dump all TLVs from each table */
+  depth--;
+}
+
+void dump_config_response(const nfapi_nr_config_response_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+  depth++;
+  INDENTED_PRINTF("Error Code = 0x%02x\n", msg->error_code);
+  INDENTED_PRINTF("Number of Invalid or Unsupported TLVs = 0x%02x\n", msg->num_invalid_tlvs);
+  INDENTED_PRINTF("Number of Invalid TLVs that can be configured in IDLE = 0x%02x\n", msg->num_invalid_tlvs_configured_in_idle);
+  INDENTED_PRINTF("Number of Invalid TLVs that can be configured in RUNNING = 0x%02x\n",
+                  msg->num_invalid_tlvs_configured_in_running);
+  INDENTED_PRINTF("Number of Missing TLVs = 0x%02x\n", msg->num_missing_tlvs);
+  /* dump all TLVs from each table */
+  depth--;
+}
+
+void dump_start_request(const nfapi_nr_start_request_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+}
+
+void dump_start_response(const nfapi_nr_start_response_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+}
+
+void dump_stop_request(const nfapi_nr_stop_request_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+}
+
+void dump_stop_indication(const nfapi_nr_stop_indication_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+}
+
+static char *error_code_to_str(uint8_t error_code)
+{
+  switch (error_code) {
+    case NFAPI_NR_PHY_API_MSG_OK:
+      return "NFAPI_NR_PHY_API_MSG_OK";
+    case NFAPI_NR_PHY_API_MSG_INVALID_STATE:
+      return "NFAPI_NR_PHY_API_MSG_INVALID_STATE";
+    case NFAPI_NR_PHY_API_MSG_INVALID_CONFIG:
+      return "NFAPI_NR_PHY_API_MSG_INVALID_CONFIG";
+    case NFAPI_NR_PHY_API_SFN_OUT_OF_SYNC:
+      return "NFAPI_NR_PHY_API_SFN_OUT_OF_SYNC";
+    case NFAPI_NR_PHY_API_MSG_SLOR_ERR:
+      return "NFAPI_NR_PHY_API_MSG_SLOR_ERR";
+    case NFAPI_NR_PHY_API_MSG_BCH_MISSING:
+      return "NFAPI_NR_PHY_API_MSG_BCH_MISSING";
+    case NFAPI_NR_PHY_API_MSG_INVALID_SFN:
+      return "NFAPI_NR_PHY_API_MSG_INVALID_SFN";
+    case NFAPI_NR_PHY_API_MSG_UL_DCI_ERR:
+      return "NFAPI_NR_PHY_API_MSG_UL_DCI_ERR";
+    case NFAPI_NR_PHY_API_MSG_TX_ERR:
+      return "NFAPI_NR_PHY_API_MSG_TX_ERR";
+    default:
+      return "Unknown Error code";
+  }
+}
+
+void dump_error_indication(const nfapi_nr_error_indication_scf_t *msg)
+{
+  int depth = 0;
+  dump_p5_message_header(&msg->header,depth);
+  depth++;
+  INDENTED_PRINTF("SFN = 0x%02x (%d)\n", msg->sfn, msg->sfn);
+  INDENTED_PRINTF("Slot = 0x%02x (%d)\n", msg->slot, msg->slot);
+  INDENTED_PRINTF("Message ID = 0x%02x\n", msg->message_id);
+  INDENTED_PRINTF("Error Code = 0x%02x (%s) \n", msg->error_code, error_code_to_str(msg->error_code));
+  depth--;
+}
diff --git a/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c b/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c
index 395cb29fe1d741efe67c07284e3b75f124022927..c753cbcb1cf5820a89c98bbea859b4c8da9404ab 100644
--- a/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c
+++ b/nfapi/open-nFAPI/fapi/src/nr_fapi_p7_utils.c
@@ -2001,3 +2001,743 @@ size_t get_rach_indication_size(nfapi_nr_rach_indication_t *msg)
 
   return total_size;
 }
+
+static void dump_p7_message_header(const nfapi_nr_p7_message_header_t *hdr, int depth)
+{
+  INDENTED_PRINTF("Message ID = 0x%02x\n", hdr->message_id);
+  INDENTED_PRINTF("Message Length = 0x%02x\n", hdr->message_length);
+}
+
+static void dump_dl_beamforming_pdu(const nfapi_nr_tx_precoding_and_beamforming_t *pdu, int depth)
+{
+  INDENTED_PRINTF("numPRGs = %d\n", pdu->num_prgs);
+  INDENTED_PRINTF("prgSize = %d\n", pdu->prg_size);
+  INDENTED_PRINTF("digBFInterfaces = %d\n", pdu->dig_bf_interfaces);
+  depth++;
+  for (int i = 0; i < pdu->num_prgs; ++i) {
+    INDENTED_PRINTF("PMIdx = %d\n", pdu->prgs_list[i].pm_idx);
+    depth++;
+    for (int j = 0; j < pdu->dig_bf_interfaces; ++j) {
+      INDENTED_PRINTF("beamIDX = %d\n", pdu->prgs_list[i].dig_bf_interface_list[j].beam_idx);
+    }
+    depth--;
+  }
+}
+
+static void dump_dl_dci_pdu(const nfapi_nr_dl_dci_pdu_t *pdu, int depth)
+{
+  INDENTED_PRINTF("RNTI = 0x%x\n", pdu->RNTI);
+  INDENTED_PRINTF("ScramblingId = %d\n", pdu->ScramblingId);
+  INDENTED_PRINTF("ScramblingRNTI = 0x%x\n", pdu->ScramblingRNTI);
+  INDENTED_PRINTF("CCEIndex = %d\n", pdu->CceIndex);
+  INDENTED_PRINTF("AggregationLevel = %d\n", pdu->AggregationLevel);
+  dump_dl_beamforming_pdu(&pdu->precodingAndBeamforming, depth + 1);
+  INDENTED_PRINTF("beta_PDCCH_1_0 = %d\n", pdu->beta_PDCCH_1_0);
+  INDENTED_PRINTF("powerControlOffsetSS = %d\n", pdu->powerControlOffsetSS);
+  INDENTED_PRINTF("PayloadSizeBits = %d\n", pdu->PayloadSizeBits);
+  INDENTED_PRINTF("Payload = ");
+  for (int i = 0; i < (pdu->PayloadSizeBits + 7) / 8; ++i) {
+    printf("0x%02x ", pdu->Payload[i]);
+  }
+  printf("\n");
+}
+
+static void dump_dl_tti_request_PDCCH_PDU(const nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdu, int depth)
+{
+  INDENTED_PRINTF("BWPSize = %d\n", pdu->BWPSize);
+  INDENTED_PRINTF("BWPStart = %d\n", pdu->BWPStart);
+  INDENTED_PRINTF("Subcarrier Spacing = %d\n", pdu->SubcarrierSpacing);
+  INDENTED_PRINTF("Ciclic Prefix = %d\n", pdu->CyclicPrefix);
+  INDENTED_PRINTF("StartSymbolIndex = %d\n", pdu->StartSymbolIndex);
+  INDENTED_PRINTF("DurationSymbols = %d\n", pdu->DurationSymbols);
+  INDENTED_PRINTF("FrequencyDomainResource : ");
+  for (int i = 0; i < 6; ++i) {
+    printf("%d ", pdu->FreqDomainResource[i]);
+  }
+  printf("\n");
+  INDENTED_PRINTF("CCE Reg Mapping Type = %d\n", pdu->CceRegMappingType);
+  INDENTED_PRINTF("Reg Bundle Size = %d\n", pdu->RegBundleSize);
+  INDENTED_PRINTF("Interleaver Size = %d\n", pdu->InterleaverSize);
+  INDENTED_PRINTF("CoreSetType = %d\n", pdu->CoreSetType);
+  INDENTED_PRINTF("ShiftIndex = %d\n", pdu->ShiftIndex);
+  INDENTED_PRINTF("precoderGranularity = %d\n", pdu->precoderGranularity);
+  INDENTED_PRINTF("numDLDCI = %d\n", pdu->numDlDci);
+  for (int i = 0; i < pdu->numDlDci; ++i) {
+    dump_dl_dci_pdu(&pdu->dci_pdu[i], depth + 1);
+  }
+}
+
+static void dump_dl_tti_request_PDSCH_PDU(const nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdu, int depth)
+{
+  INDENTED_PRINTF("pduBitmap = %d\n", pdu->pduBitmap);
+  INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
+  INDENTED_PRINTF("pduIndex = %d\n", pdu->pduIndex);
+  INDENTED_PRINTF("BWPSize = %d\n", pdu->BWPSize);
+  INDENTED_PRINTF("BWPStart = %d\n", pdu->BWPStart);
+  INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->SubcarrierSpacing);
+  INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->CyclicPrefix);
+  INDENTED_PRINTF("NrOfCodewords = %d\n", pdu->NrOfCodewords);
+  for (int i = 0; i < pdu->NrOfCodewords; ++i) {
+    depth++;
+    INDENTED_PRINTF("Codeword #%d\n", i);
+    depth++;
+    INDENTED_PRINTF("targetCoderate = %d\n", pdu->targetCodeRate[i]);
+    INDENTED_PRINTF("qamModOrder = %d\n", pdu->qamModOrder[i]);
+    INDENTED_PRINTF("mcsIndex = %d\n", pdu->mcsIndex[i]);
+    INDENTED_PRINTF("mcsTable = %d\n", pdu->mcsTable[i]);
+    INDENTED_PRINTF("rvIndex = %d\n", pdu->rvIndex[i]);
+    INDENTED_PRINTF("TBSize = %d\n", pdu->TBSize[i]);
+    depth--;
+    depth--;
+  }
+
+  INDENTED_PRINTF("dataScramblingId = %d\n", pdu->dataScramblingId);
+  INDENTED_PRINTF("nrOfLayers = %d\n", pdu->nrOfLayers);
+  INDENTED_PRINTF("transmissionScheme = %d\n", pdu->transmissionScheme);
+  INDENTED_PRINTF("refPoint = %d\n", pdu->refPoint);
+  INDENTED_PRINTF("dlDmrsSymbPos = %d\n", pdu->dlDmrsSymbPos);
+  INDENTED_PRINTF("dmrsConfigType = %d\n", pdu->dmrsConfigType);
+  INDENTED_PRINTF("dlDmrsScramblingId = %d\n", pdu->dlDmrsScramblingId);
+  INDENTED_PRINTF("SCID = %d\n", pdu->SCID);
+  INDENTED_PRINTF("numDmrsCdmGrpsNoData = %d\n", pdu->numDmrsCdmGrpsNoData);
+  INDENTED_PRINTF("dmrsPorts = %d\n", pdu->dmrsPorts);
+  INDENTED_PRINTF("resourceAlloc = %d\n", pdu->resourceAlloc);
+  INDENTED_PRINTF("rbBitmap = ");
+  for (int i = 0; i < 36; ++i) {
+    printf("%d ", pdu->rbBitmap[i]);
+  }
+  printf("\n");
+  INDENTED_PRINTF("rbStart = %d\n", pdu->rbStart);
+  INDENTED_PRINTF("rbSize = %d\n", pdu->rbSize);
+  INDENTED_PRINTF("VRBtoPRBMapping = %d\n", pdu->VRBtoPRBMapping);
+  INDENTED_PRINTF("StartSymbolIndex = %d\n", pdu->StartSymbolIndex);
+  INDENTED_PRINTF("NrOfSymbols = %d\n", pdu->NrOfSymbols);
+
+  INDENTED_PRINTF("PTRSPortIndex = %d\n", pdu->PTRSPortIndex);
+  INDENTED_PRINTF("PTRSTimeDensity = %d\n", pdu->PTRSTimeDensity);
+  INDENTED_PRINTF("PTRSFreqDensity = %d\n", pdu->PTRSFreqDensity);
+  INDENTED_PRINTF("PTRSReOffset = %d\n", pdu->PTRSReOffset);
+  INDENTED_PRINTF("nEpreRatioOfPDSCHToPTRS = %d\n", pdu->nEpreRatioOfPDSCHToPTRS);
+
+  dump_dl_beamforming_pdu(&pdu->precodingAndBeamforming, depth + 1);
+  INDENTED_PRINTF("powerControlOffset = %d\n", pdu->powerControlOffset);
+  INDENTED_PRINTF("powerControlOffsetSS = %d\n", pdu->powerControlOffsetSS);
+
+  INDENTED_PRINTF("isLastCbPresent = %d\n", pdu->isLastCbPresent);
+  INDENTED_PRINTF("isInlineTbCrc = %d\n", pdu->isInlineTbCrc);
+  INDENTED_PRINTF("dlTbCrc = %d\n", pdu->dlTbCrc);
+}
+
+static void dump_dl_tti_request_CSI_RS_PDU(const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *pdu, int depth)
+{
+  INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
+  INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
+  INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
+  INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
+  INDENTED_PRINTF("StartRB = %d\n", pdu->start_rb);
+  INDENTED_PRINTF("NrOfRBs = %d\n", pdu->nr_of_rbs);
+  INDENTED_PRINTF("CSIType = %d\n", pdu->csi_type);
+  INDENTED_PRINTF("Row = %d\n", pdu->row);
+  INDENTED_PRINTF("FreqDomain = %d\n", pdu->freq_domain);
+  INDENTED_PRINTF("SymbL0 = %d\n", pdu->symb_l0);
+  INDENTED_PRINTF("SymbL1 = %d\n", pdu->symb_l1);
+  INDENTED_PRINTF("CDMType = %d\n", pdu->cdm_type);
+  INDENTED_PRINTF("FreqDensity = %d\n", pdu->freq_density);
+  INDENTED_PRINTF("ScrambId = %d\n", pdu->scramb_id);
+  INDENTED_PRINTF("powerControllOffset = %d\n", pdu->power_control_offset);
+  INDENTED_PRINTF("powerControllOffsetSS = %d\n", pdu->power_control_offset_ss);
+  dump_dl_beamforming_pdu(&pdu->precodingAndBeamforming, depth + 1);
+}
+
+static void dump_dl_tti_request_SSB_PDU(const nfapi_nr_dl_tti_ssb_pdu_rel15_t *pdu, int depth)
+{
+  INDENTED_PRINTF("physCellId = %d\n", pdu->PhysCellId);
+  INDENTED_PRINTF("BetaPss = %d\n", pdu->BetaPss);
+  INDENTED_PRINTF("SSBBlockIndex = %d\n", pdu->SsbBlockIndex);
+  INDENTED_PRINTF("SSBSubcarrierOffset = %d\n", pdu->SsbSubcarrierOffset);
+  INDENTED_PRINTF("SSBOffsetPointA = %d\n", pdu->ssbOffsetPointA);
+  INDENTED_PRINTF("bchPayloadFlag = %d\n", pdu->bchPayloadFlag);
+  INDENTED_PRINTF("bchPayload = %x\n", pdu->bchPayload);
+  dump_dl_beamforming_pdu(&pdu->precoding_and_beamforming, depth + 1);
+}
+
+static char *dl_tti_pdu_type_to_str(uint16_t pdu_type)
+{
+  switch (pdu_type) {
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+      return "NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE";
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+      return "NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE";
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+      return "NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE";
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+      return "NFAPI_NR_DL_TTI_SSB_PDU_TYPE";
+    default:
+      return "Unknown";
+      break;
+  }
+}
+
+void dump_dl_tti_request(const nfapi_nr_dl_tti_request_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->SFN);
+  INDENTED_PRINTF("Slot = %d\n", msg->Slot);
+  INDENTED_PRINTF("nPDUs = %d\n", msg->dl_tti_request_body.nPDUs);
+  INDENTED_PRINTF("nGroup = %d\n", msg->dl_tti_request_body.nGroup);
+  for (int i = 0; i < msg->dl_tti_request_body.nPDUs; ++i) {
+    const nfapi_nr_dl_tti_request_pdu_t *pdu = &msg->dl_tti_request_body.dl_tti_pdu_list[i];
+    depth++;
+    INDENTED_PRINTF("PDU #%d\n", i);
+    INDENTED_PRINTF("PDUType = 0x%02x (%s)\n", pdu->PDUType, dl_tti_pdu_type_to_str(pdu->PDUType));
+    INDENTED_PRINTF("PDUSize = 0x%02x\n", pdu->PDUSize);
+    /* call to dump_dl_tti_request_<PDU_Type>_pdu */
+    switch (pdu->PDUType) {
+      case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+        dump_dl_tti_request_PDCCH_PDU(&pdu->pdcch_pdu.pdcch_pdu_rel15, depth + 1);
+        break;
+      case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+        dump_dl_tti_request_PDSCH_PDU(&pdu->pdsch_pdu.pdsch_pdu_rel15, depth + 1);
+        break;
+      case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+        dump_dl_tti_request_CSI_RS_PDU(&pdu->csi_rs_pdu.csi_rs_pdu_rel15, depth + 1);
+        break;
+      case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+        dump_dl_tti_request_SSB_PDU(&pdu->ssb_pdu.ssb_pdu_rel15, depth + 1);
+        break;
+      default:
+        INDENTED_PRINTF("Unknown PDU type 0x%02x\n", pdu->PDUType);
+        break;
+    }
+    depth--;
+  }
+  for (int group_idx = 0; group_idx < msg->dl_tti_request_body.nGroup; group_idx++) {
+    depth++;
+    INDENTED_PRINTF("Group #%d\n", group_idx);
+    INDENTED_PRINTF("nUe[%d] = 0x%02x\n", group_idx, msg->dl_tti_request_body.nUe[group_idx]);
+    for (int ue_idx = 0; ue_idx < msg->dl_tti_request_body.nUe[group_idx]; ue_idx++) {
+      depth++;
+      INDENTED_PRINTF("UE #%d\n", ue_idx);
+      INDENTED_PRINTF("PduIdx[%d][%d] = 0x%02x\n", group_idx, ue_idx, msg->dl_tti_request_body.PduIdx[group_idx][ue_idx]);
+      depth--;
+    }
+    depth--;
+  }
+}
+
+static void dump_ul_tti_beamforming(const nfapi_nr_ul_beamforming_t *pdu, int depth)
+{
+  INDENTED_PRINTF("TRP Scheme = %d\n", pdu->trp_scheme);
+  INDENTED_PRINTF("numPRGs = %d\n", pdu->num_prgs);
+  INDENTED_PRINTF("prgSize = %d\n", pdu->prg_size);
+  INDENTED_PRINTF("digBFInterface = %d\n", pdu->dig_bf_interface);
+  for (int prg = 0; prg < pdu->num_prgs; ++prg) {
+    INDENTED_PRINTF("PRG #%d \n", prg);
+    depth++;
+    for (int dbf_if = 0; dbf_if < pdu->dig_bf_interface; ++dbf_if) {
+      INDENTED_PRINTF("digBFInterface #%d \n", dbf_if);
+      depth++;
+      INDENTED_PRINTF("beamIdx = %d\n", pdu->prgs_list[prg].dig_bf_interface_list[dbf_if].beam_idx);
+      depth--;
+    }
+    depth--;
+  }
+}
+
+static char *ul_tti_prach_format_to_str(int prach_format)
+{
+  switch (prach_format) {
+    case 0:
+      return "0";
+    case 1:
+      return "1";
+    case 2:
+      return "2";
+    case 3:
+      return "3";
+    case 4:
+      return "A1";
+    case 5:
+      return "A2";
+    case 6:
+      return "A3";
+    case 7:
+      return "B1";
+    case 8:
+      return "B4";
+    case 9:
+      return "C0";
+    case 10:
+      return "C2";
+    case 11:
+      return "A1/B1";
+    case 12:
+      return "A2/B2";
+    case 13:
+      return "A3/B3";
+    default:
+      return "Unknown";
+  }
+}
+
+static void dump_ul_tti_request_PRACH_PDU(const nfapi_nr_prach_pdu_t *pdu, int depth)
+{
+  INDENTED_PRINTF("physCellID = %d\n", pdu->phys_cell_id);
+  INDENTED_PRINTF("NumPrachOcas = %d\n", pdu->num_prach_ocas);
+  INDENTED_PRINTF("prachFormat = %d (%s)\n", pdu->prach_format, ul_tti_prach_format_to_str(pdu->prach_format));
+  INDENTED_PRINTF("numRa = %d\n", pdu->num_ra);
+  INDENTED_PRINTF("prachStartSymbol = %d\n", pdu->prach_start_symbol);
+  INDENTED_PRINTF("numCs = %d\n", pdu->num_cs);
+  dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
+}
+
+static void dump_ul_tti_request_PUSCH_PDU(const nfapi_nr_pusch_pdu_t *pdu, int depth)
+{
+  INDENTED_PRINTF("pduBitmap = %d\n", pdu->pdu_bit_map);
+  INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
+  INDENTED_PRINTF("Handle = %d\n", pdu->handle);
+  INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
+  INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
+  INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
+  INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
+  INDENTED_PRINTF("targetCodeRate = %d\n", pdu->target_code_rate);
+  INDENTED_PRINTF("qamModOrder = %d\n", pdu->qam_mod_order);
+  INDENTED_PRINTF("mcsIndex = %d\n", pdu->mcs_index);
+  INDENTED_PRINTF("mcsTable = %d\n", pdu->mcs_table);
+  INDENTED_PRINTF("TransformPrecoding = %d\n", pdu->transform_precoding);
+  INDENTED_PRINTF("dataScramblingId = %d\n", pdu->data_scrambling_id);
+  INDENTED_PRINTF("nrOfLayers = %d\n", pdu->nrOfLayers);
+  INDENTED_PRINTF("ulDmrsSymbPos = %d\n", pdu->ul_dmrs_symb_pos);
+  INDENTED_PRINTF("dmrsConfigType = %d\n", pdu->dmrs_config_type);
+  INDENTED_PRINTF("ulDmrsScramblingId = %d\n", pdu->ul_dmrs_scrambling_id);
+  INDENTED_PRINTF("puschIdentity = %d\n", pdu->pusch_identity);
+  INDENTED_PRINTF("SCID = %d\n", pdu->scid);
+  INDENTED_PRINTF("numDmrsCdmGrpsNoData = %d\n", pdu->num_dmrs_cdm_grps_no_data);
+  INDENTED_PRINTF("dmrsPorts = %d\n", pdu->dmrs_ports);
+  INDENTED_PRINTF("resourceAlloc = %d\n", pdu->resource_alloc);
+  INDENTED_PRINTF("rbBitmap = ");
+  for (int i = 0; i < 36; ++i) {
+    printf("%d ", pdu->rb_bitmap[i]);
+  }
+  printf("\n");
+  INDENTED_PRINTF("rbStart = %d\n", pdu->rb_start);
+  INDENTED_PRINTF("rbSize = %d\n", pdu->rb_size);
+  INDENTED_PRINTF("VRBtoPRBMapping = %d\n", pdu->vrb_to_prb_mapping);
+  INDENTED_PRINTF("FrequencyHopping = %d\n", pdu->frequency_hopping);
+  INDENTED_PRINTF("txDirectCurrentLocation = %d\n", pdu->tx_direct_current_location);
+  INDENTED_PRINTF("uplinkFrequencyShift7p5khz = %d\n", pdu->uplink_frequency_shift_7p5khz);
+  INDENTED_PRINTF("NrOfSymbols = %d\n", pdu->nr_of_symbols);
+
+  INDENTED_PRINTF("puschData (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA ? "included" : "not included");
+  if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_DATA) {
+    depth++;
+    INDENTED_PRINTF("rvIndex = %d\n", pdu->pusch_data.rv_index);
+    INDENTED_PRINTF("harqProcessID = %d\n", pdu->pusch_data.harq_process_id);
+    INDENTED_PRINTF("newDataIndicator = %d\n", pdu->pusch_data.new_data_indicator);
+    INDENTED_PRINTF("TBSize = %d\n", pdu->pusch_data.tb_size);
+    INDENTED_PRINTF("numCB = %d\n", pdu->pusch_data.num_cb);
+    INDENTED_PRINTF("cbPresentAndPosition = ");
+    for (int i = 0; i < (pdu->pusch_data.num_cb + 7) / 8; i++) {
+      printf("%d ", pdu->pusch_data.cb_present_and_position[i]);
+    }
+    printf("\n");
+    depth--;
+  }
+
+  INDENTED_PRINTF("puschUci (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI ? "included" : "not included");
+  if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_UCI) {
+    depth++;
+    INDENTED_PRINTF("harqAckBitLength = %d\n", pdu->pusch_uci.harq_ack_bit_length);
+    INDENTED_PRINTF("csiPart1BitLength = %d\n", pdu->pusch_uci.csi_part1_bit_length);
+    INDENTED_PRINTF("csiPart2BitLength = %d\n", pdu->pusch_uci.csi_part2_bit_length);
+    INDENTED_PRINTF("AlphaScaling = %d\n", pdu->pusch_uci.alpha_scaling);
+    INDENTED_PRINTF("betaOffsetHarqAck = %d\n", pdu->pusch_uci.beta_offset_harq_ack);
+    INDENTED_PRINTF("betaOffsetCsi1 = %d\n", pdu->pusch_uci.beta_offset_csi1);
+    INDENTED_PRINTF("betaOffsetCsi2 = %d\n", pdu->pusch_uci.beta_offset_csi2);
+    depth--;
+  }
+
+  INDENTED_PRINTF("puschPtrs (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS ? "included" : "not included");
+  if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_PUSCH_PTRS) {
+    depth++;
+    INDENTED_PRINTF("lowPaprGroupNumber = %d\n", pdu->pusch_ptrs.num_ptrs_ports);
+    for (int i = 0; i < pdu->pusch_ptrs.num_ptrs_ports; ++i) {
+      INDENTED_PRINTF("ptrsPort #%d\n", i);
+      depth++;
+      INDENTED_PRINTF("PTRSPortIndex = %d\n", pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_port_index);
+      INDENTED_PRINTF("PTRSDmrsPort = %d\n", pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_dmrs_port);
+      INDENTED_PRINTF("PTRSReOffset = %d\n", pdu->pusch_ptrs.ptrs_ports_list[i].ptrs_re_offset);
+      depth--;
+    }
+    INDENTED_PRINTF("PTRSTimeDensity = %d\n", pdu->pusch_ptrs.ptrs_time_density);
+    INDENTED_PRINTF("PTRSFreqDensity = %d\n", pdu->pusch_ptrs.ptrs_freq_density);
+    INDENTED_PRINTF("ulPTRSPower = %d\n", pdu->pusch_ptrs.ul_ptrs_power);
+    depth--;
+  }
+
+  INDENTED_PRINTF("dtfsOfdm (%s)\n", pdu->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM ? "included" : "not included");
+  if (pdu->pdu_bit_map & PUSCH_PDU_BITMAP_DFTS_OFDM) {
+    depth++;
+    INDENTED_PRINTF("lowPaprGroupNumber = %d\n", pdu->dfts_ofdm.low_papr_group_number);
+    INDENTED_PRINTF("lowPaprSequenceNumber = %d\n", pdu->dfts_ofdm.low_papr_sequence_number);
+    INDENTED_PRINTF("ulPtrsSampleDensity = %d\n", pdu->dfts_ofdm.ul_ptrs_sample_density);
+    INDENTED_PRINTF("ulPtrsTimeDensityTransformPrecoding = %d\n", pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding);
+    depth--;
+  }
+  dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
+}
+
+static void dump_ul_tti_request_PUCCH_PDU(const nfapi_nr_pucch_pdu_t *pdu, int depth)
+{
+  INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
+  INDENTED_PRINTF("Handle = %d\n", pdu->handle);
+  INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
+  INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
+  INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
+  INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
+  INDENTED_PRINTF("FormatType = %d\n", pdu->format_type);
+  INDENTED_PRINTF("multiSlotTxIndicator = %d\n", pdu->multi_slot_tx_indicator);
+  INDENTED_PRINTF("pi2Bpsk = %d\n", pdu->pi_2bpsk);
+  INDENTED_PRINTF("prbStart = %d\n", pdu->prb_start);
+  INDENTED_PRINTF("prbSize = %d\n", pdu->prb_size);
+  INDENTED_PRINTF("StartSymbolIndex = %d\n", pdu->start_symbol_index);
+  INDENTED_PRINTF("NrOfSymbols = %d\n", pdu->nr_of_symbols);
+  INDENTED_PRINTF("freqHopFlag = %d\n", pdu->freq_hop_flag);
+  INDENTED_PRINTF("secondHopPRB = %d\n", pdu->second_hop_prb);
+  INDENTED_PRINTF("groupHopFlag = %d\n", pdu->group_hop_flag);
+  INDENTED_PRINTF("sequenceHopFlag = %d\n", pdu->sequence_hop_flag);
+  INDENTED_PRINTF("hoppingId = %d\n", pdu->hopping_id);
+  INDENTED_PRINTF("InitialCyclicShift = %d\n", pdu->initial_cyclic_shift);
+  INDENTED_PRINTF("dataScramblingId = %d\n", pdu->data_scrambling_id);
+  INDENTED_PRINTF("TimeDomainOccIdx = %d\n", pdu->time_domain_occ_idx);
+  INDENTED_PRINTF("PreDftOccIdx = %d\n", pdu->pre_dft_occ_idx);
+  INDENTED_PRINTF("PreDftOccLen = %d\n", pdu->pre_dft_occ_len);
+  INDENTED_PRINTF("AddDmrsFlag = %d\n", pdu->add_dmrs_flag);
+  INDENTED_PRINTF("DmrsScramblingId = %d\n", pdu->dmrs_scrambling_id);
+  INDENTED_PRINTF("DMRScyclicshift = %d\n", pdu->dmrs_cyclic_shift);
+  INDENTED_PRINTF("SRFlag = %d\n", pdu->sr_flag);
+  INDENTED_PRINTF("BitLenHarq = %d\n", pdu->bit_len_harq);
+  INDENTED_PRINTF("BitLenCsiPart1 = %d\n", pdu->bit_len_csi_part1);
+  INDENTED_PRINTF("BitLenCsiPart2 = %d\n", pdu->bit_len_csi_part2);
+  dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
+}
+
+static void dump_ul_tti_request_srs_parameters(const nfapi_v4_srs_parameters_t *pdu, const uint8_t num_symbols, uint8_t depth)
+{
+  INDENTED_PRINTF("srsBandwidthSize = %d\n", pdu->srs_bandwidth_size);
+  for (int symbol_idx = 0; symbol_idx < num_symbols; ++symbol_idx) {
+    const nfapi_v4_srs_parameters_symbols_t *symbol = &pdu->symbol_list[symbol_idx];
+    INDENTED_PRINTF("Symbol #%d\n", symbol_idx);
+    depth++;
+    INDENTED_PRINTF("srsBandwidthStart = %d\n", symbol->srs_bandwidth_start);
+    INDENTED_PRINTF("sequenceGroup = %d\n", symbol->sequence_group);
+    INDENTED_PRINTF("sequenceNumber = %d\n", symbol->sequence_number);
+    depth--;
+  }
+  const uint8_t nUsage = __builtin_popcount(pdu->usage);
+  INDENTED_PRINTF("Usage = %d (nUsage = %d)\n", pdu->usage, nUsage);
+  depth++;
+  for (int idx = 0; idx < nUsage; ++idx) {
+    INDENTED_PRINTF("ReportType[%d] = %d\n", idx, pdu->report_type[idx]);
+  }
+  depth--;
+  INDENTED_PRINTF("singular Value Representation = %d\n", pdu->singular_Value_representation);
+  INDENTED_PRINTF("iq Representation = %d\n", pdu->iq_representation);
+  INDENTED_PRINTF("prgSize = %d\n", pdu->prg_size);
+  INDENTED_PRINTF("numTotalUeAntennas = %d\n", pdu->num_total_ue_antennas);
+  INDENTED_PRINTF("ueAntennasInThisSrsResourceSet = %d\n", pdu->ue_antennas_in_this_srs_resource_set);
+  INDENTED_PRINTF("sampledUeAntennas = %d\n", pdu->sampled_ue_antennas);
+  INDENTED_PRINTF("reportScope = %d\n", pdu->report_scope);
+  INDENTED_PRINTF("NumULSpatialStreamsPorts = %d\n", pdu->num_ul_spatial_streams_ports);
+  depth++;
+  for (int idx = 0; idx < pdu->num_ul_spatial_streams_ports; ++idx) {
+    INDENTED_PRINTF("UlSpatialStreamPorts[%d] = %d\n", idx, pdu->Ul_spatial_stream_ports[idx]);
+  }
+}
+
+static void dump_ul_tti_request_SRS_PDU(const nfapi_nr_srs_pdu_t *pdu, int depth)
+{
+  INDENTED_PRINTF("RNTI = 0x%x\n", pdu->rnti);
+  INDENTED_PRINTF("Handle = %d\n", pdu->handle);
+  INDENTED_PRINTF("BWPSize = %d\n", pdu->bwp_size);
+  INDENTED_PRINTF("BWPStart = %d\n", pdu->bwp_start);
+  INDENTED_PRINTF("SubcarrierSpacing = %d\n", pdu->subcarrier_spacing);
+  INDENTED_PRINTF("CyclicPrefix = %d\n", pdu->cyclic_prefix);
+  INDENTED_PRINTF("numAntPorts = %d\n", pdu->num_ant_ports);
+  INDENTED_PRINTF("numSymbols = %d\n", pdu->num_symbols);
+  INDENTED_PRINTF("numRepetitions = %d\n", pdu->num_repetitions);
+  INDENTED_PRINTF("timeStartPosition = %d\n", pdu->time_start_position);
+  INDENTED_PRINTF("configIndex = %d\n", pdu->config_index);
+  INDENTED_PRINTF("sequenceId = %d\n", pdu->sequence_id);
+  INDENTED_PRINTF("bandwidthIndex = %d\n", pdu->bandwidth_index);
+  INDENTED_PRINTF("combSize = %d\n", pdu->comb_size);
+  INDENTED_PRINTF("combOffset = %d\n", pdu->comb_offset);
+  INDENTED_PRINTF("cyclicShift = %d\n", pdu->cyclic_shift);
+  INDENTED_PRINTF("frequencyPosition = %d\n", pdu->frequency_position);
+  INDENTED_PRINTF("frequencyShift = %d\n", pdu->frequency_shift);
+  INDENTED_PRINTF("frequencyHopping = %d\n", pdu->frequency_hopping);
+  INDENTED_PRINTF("groupOrSequenceHopping = %d\n", pdu->group_or_sequence_hopping);
+  INDENTED_PRINTF("resourceType = %d\n", pdu->resource_type);
+  INDENTED_PRINTF("Tsrs = %d\n", pdu->t_srs);
+  INDENTED_PRINTF("Toffset = %d\n", pdu->t_offset);
+  dump_ul_tti_beamforming(&pdu->beamforming, depth + 1);
+  dump_ul_tti_request_srs_parameters(&pdu->srs_parameters_v4, 1 << pdu->num_symbols, depth + 1);
+}
+
+static char *ul_tti_pdu_type_to_str(uint16_t pdu_type)
+{
+  switch (pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
+      return "NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE";
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
+      return "NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE";
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
+      return "NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE";
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
+      return "NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE";
+    default:
+      return "Unknown";
+      break;
+  }
+}
+
+void dump_ul_tti_request(const nfapi_nr_ul_tti_request_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->SFN);
+  INDENTED_PRINTF("Slot = %d\n", msg->Slot);
+  INDENTED_PRINTF("nPDUs = %d\n", msg->n_pdus);
+  INDENTED_PRINTF("RachPresent = %d\n", msg->rach_present);
+  INDENTED_PRINTF("nULSCH = %d\n", msg->n_ulsch);
+  INDENTED_PRINTF("nULCCH = %d\n", msg->n_ulcch);
+  INDENTED_PRINTF("nGroup = %d\n", msg->n_group);
+  for (int i = 0; i < msg->n_pdus; ++i) {
+    const nfapi_nr_ul_tti_request_number_of_pdus_t *pdu = &msg->pdus_list[i];
+    depth++;
+    INDENTED_PRINTF("PDU #%d\n", i);
+    INDENTED_PRINTF("PDUType = 0x%02x (%s)\n", pdu->pdu_type, ul_tti_pdu_type_to_str(pdu->pdu_type));
+    INDENTED_PRINTF("PDUSize = 0x%02x\n", pdu->pdu_size);
+    /* call to dump_ul_tti_request_<PDU_Type>_pdu */
+    switch (pdu->pdu_type) {
+      case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
+        dump_ul_tti_request_PRACH_PDU(&pdu->prach_pdu, depth + 1);
+        break;
+      case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
+        dump_ul_tti_request_PUSCH_PDU(&pdu->pusch_pdu, depth + 1);
+        break;
+      case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
+        dump_ul_tti_request_PUCCH_PDU(&pdu->pucch_pdu, depth + 1);
+        break;
+      case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
+        dump_ul_tti_request_SRS_PDU(&pdu->srs_pdu, depth + 1);
+        break;
+      default:
+        INDENTED_PRINTF("Unknown PDU type 0x%02x\n", pdu->pdu_type);
+        break;
+    }
+    depth--;
+  }
+  for (int group_idx = 0; group_idx < msg->n_group; group_idx++) {
+    const nfapi_nr_ul_tti_request_number_of_groups_t *grp = &msg->groups_list[group_idx];
+    depth++;
+    INDENTED_PRINTF("Group #%d\n", group_idx);
+    INDENTED_PRINTF("nUe[%d] = 0x%02x\n", group_idx, grp->n_ue);
+    for (int ue_idx = 0; ue_idx < grp->n_ue; ue_idx++) {
+      depth++;
+      INDENTED_PRINTF("UE #%d\n", ue_idx);
+      INDENTED_PRINTF("PduIdx[%d][%d] = 0x%02x\n", group_idx, ue_idx, grp->ue_list[ue_idx].pdu_idx);
+      depth--;
+    }
+    depth--;
+  }
+}
+
+void dump_slot_indication(const nfapi_nr_slot_indication_scf_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->sfn);
+  INDENTED_PRINTF("Slot = %d\n", msg->slot);
+}
+
+void dump_ul_dci_request(const nfapi_nr_ul_dci_request_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->SFN);
+  INDENTED_PRINTF("Slot = %d\n", msg->Slot);
+
+  INDENTED_PRINTF("numPDUs = %d\n", msg->numPdus);
+  for (int i = 0; i < msg->numPdus; i++) {
+    depth++;
+    INDENTED_PRINTF("PDU #%d\n", i);
+    const nfapi_nr_ul_dci_request_pdus_t *pdu = &msg->ul_dci_pdu_list[i];
+    INDENTED_PRINTF("PDUType = 0x%02x\n", pdu->PDUType);
+    INDENTED_PRINTF("PDUSize = 0x%02x\n", pdu->PDUSize);
+    /* call to dump_dl_tti_request_pdcch_pdu */
+    dump_dl_tti_request_PDCCH_PDU(&pdu->pdcch_pdu.pdcch_pdu_rel15, depth + 1);
+    depth--;
+  }
+}
+
+void dump_tx_data_request(const nfapi_nr_tx_data_request_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->SFN);
+  INDENTED_PRINTF("Slot = %d\n", msg->Slot);
+  INDENTED_PRINTF("Number of PDUs = %d\n", msg->Number_of_PDUs);
+  for (int i = 0; i < msg->Number_of_PDUs; i++) {
+    depth++;
+    INDENTED_PRINTF("PDU #%d\n", i);
+    const nfapi_nr_pdu_t *pdu = &msg->pdu_list[i];
+    INDENTED_PRINTF("PDU Length = 0x%02x\n", pdu->PDU_length);
+    INDENTED_PRINTF("PDU Index = 0x%02x\n", pdu->PDU_index);
+    INDENTED_PRINTF("numTLV = 0x%02x\n", pdu->num_TLV);
+    /* call to dump_tx_data_request_tlv */
+    depth--;
+  }
+}
+
+void dump_rx_data_indication(const nfapi_nr_rx_data_indication_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->sfn);
+  INDENTED_PRINTF("Slot = %d\n", msg->slot);
+  INDENTED_PRINTF("Number of PDUs = %d\n", msg->number_of_pdus);
+  for (int pdu_idx = 0; pdu_idx < msg->number_of_pdus; pdu_idx++) {
+    depth++;
+    INDENTED_PRINTF("PDU #%d\n", pdu_idx);
+    const nfapi_nr_rx_data_pdu_t *pdu = &msg->pdu_list[pdu_idx];
+    INDENTED_PRINTF("Handle = 0x%02x\n", pdu->handle);
+    INDENTED_PRINTF("RNTI = 0x%02x\n", pdu->rnti);
+    INDENTED_PRINTF("HarqID = 0x%02x\n", pdu->harq_id);
+    INDENTED_PRINTF("PDU Length = 0x%02x\n", pdu->pdu_length);
+    INDENTED_PRINTF("UL_CQI = 0x%02x\n", pdu->ul_cqi);
+    INDENTED_PRINTF("Timing advance = 0x%02x\n", pdu->timing_advance);
+    INDENTED_PRINTF("RSSI = 0x%02x\n", pdu->rssi);
+    INDENTED_PRINTF("PDU =");
+    for (int i = 0; i < pdu->pdu_length; i++) {
+      printf("%02x ", pdu->pdu[i]);
+    }
+    printf("\n");
+    depth--;
+  }
+}
+
+void dump_crc_indication(const nfapi_nr_crc_indication_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->sfn);
+  INDENTED_PRINTF("Slot = %d\n", msg->slot);
+  INDENTED_PRINTF("NumCRCs = %d\n", msg->number_crcs);
+  for (int i = 0; i < msg->number_crcs; i++) {
+    depth++;
+    INDENTED_PRINTF("CRC #%d\n", i);
+    const nfapi_nr_crc_t *crc = &msg->crc_list[i];
+    INDENTED_PRINTF("Handle = 0x%02x\n", crc->handle);
+    INDENTED_PRINTF("RNTI = 0x%02x\n", crc->rnti);
+    INDENTED_PRINTF("HarqID = 0x%02x\n", crc->harq_id);
+    INDENTED_PRINTF("TbCrcStatus = 0x%02x\n", crc->tb_crc_status);
+    INDENTED_PRINTF("NumCb = 0x%02x\n", crc->num_cb);
+    const uint16_t cb_len = (crc->num_cb / 8) + 1; // length is ceil(NumCb/8)
+    INDENTED_PRINTF("CbCrcStatus =\n");
+    for (int j = 0; j < cb_len; j++) {
+      printf("%02x ", crc->cb_crc_status[j]);
+    }
+    printf("\n");
+    INDENTED_PRINTF("UL_CQI = 0x%02x\n", crc->ul_cqi);
+    INDENTED_PRINTF("Timing advance = 0x%02x\n", crc->timing_advance);
+    INDENTED_PRINTF("RSSI = 0x%02x\n", crc->rssi);
+    depth--;
+  }
+}
+
+void dump_uci_indication(const nfapi_nr_uci_indication_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->sfn);
+  INDENTED_PRINTF("Slot = %d\n", msg->slot);
+
+  INDENTED_PRINTF("NumUCIS = %d\n", msg->num_ucis);
+  for (int i = 0; i < msg->num_ucis; i++) {
+    depth++;
+    INDENTED_PRINTF("UCI #%d\n", i);
+    const nfapi_nr_uci_t *uci = &msg->uci_list[i];
+    INDENTED_PRINTF("PDUType = 0x%02x\n", uci->pdu_type);
+    INDENTED_PRINTF("PDUSize = 0x%02x\n", uci->pdu_size);
+    /* call to dump_uci_indication_<PDU_Type>_pdu */
+    depth--;
+  }
+}
+
+void dump_srs_indication(const nfapi_nr_srs_indication_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->sfn);
+  INDENTED_PRINTF("Slot = %d\n", msg->slot);
+
+  INDENTED_PRINTF("controlLength = %d\n", msg->control_length);
+  INDENTED_PRINTF("Number of PDUs = %d\n", msg->number_of_pdus);
+  for (int i = 0; i < msg->number_of_pdus; i++) {
+    depth++;
+    INDENTED_PRINTF("PDU #%d\n", i);
+    const nfapi_nr_srs_indication_pdu_t *pdu = &msg->pdu_list[i];
+    INDENTED_PRINTF("Handle = 0x%02x\n", pdu->handle);
+    INDENTED_PRINTF("RNTI = 0x%02x\n", pdu->rnti);
+    INDENTED_PRINTF("Timing advance offset = 0x%02x\n", pdu->timing_advance_offset);
+    INDENTED_PRINTF("Timing advance offset in nanoseconds = 0x%02x\n", pdu->timing_advance_offset_nsec);
+    INDENTED_PRINTF("SRS usage = 0x%02x\n", pdu->srs_usage);
+    INDENTED_PRINTF("Report Type = 0x%02x\n", pdu->report_type);
+    /* call to dump_srs_report_tlv */
+    depth--;
+  }
+}
+
+void dump_rach_indication(const nfapi_nr_rach_indication_t *msg)
+{
+  int depth = 0;
+  dump_p7_message_header(&msg->header, depth);
+  depth++;
+  INDENTED_PRINTF("SFN = %d\n", msg->sfn);
+  INDENTED_PRINTF("Slot = %d\n", msg->slot);
+
+  INDENTED_PRINTF("Number of PDUs = %d\n", msg->number_of_pdus);
+  for (int i = 0; i < msg->number_of_pdus; i++) {
+    depth++;
+    INDENTED_PRINTF("PRACH PDU #%d\n", i);
+    const nfapi_nr_prach_indication_pdu_t *pdu = &msg->pdu_list[i];
+    INDENTED_PRINTF("physCellID = 0x%02x\n", pdu->phy_cell_id);
+    INDENTED_PRINTF("SymbolIndex = 0x%02x\n", pdu->symbol_index);
+    INDENTED_PRINTF("SlotIndex = 0x%02x\n", pdu->slot_index);
+    INDENTED_PRINTF("FreqIndex = 0x%02x\n", pdu->freq_index);
+    INDENTED_PRINTF("avgRssi = 0x%02x\n", pdu->avg_rssi);
+    INDENTED_PRINTF("avgSnr = 0x%02x\n", pdu->avg_snr);
+    INDENTED_PRINTF("numPreamble = 0x%02x\n", pdu->num_preamble);
+    for (int j = 0; j < pdu->num_preamble; j++) {
+      depth++;
+      INDENTED_PRINTF("Preamble #%d\n", j);
+      const nfapi_nr_prach_indication_preamble_t *preamble = &pdu->preamble_list[j];
+      INDENTED_PRINTF("preambleIndex = 0x%02x\n", preamble->preamble_index);
+      INDENTED_PRINTF("Timing advance = 0x%02x\n", preamble->timing_advance);
+      INDENTED_PRINTF("PreamblePwr = 0x%02x\n", preamble->preamble_pwr);
+      depth--;
+    }
+    depth--;
+  }
+}
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
index 2d761bab8865827a196c3736df8ed8c337f52f53..f830e904e2697e2796df610a594e6fbd4e3ce1b6 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
@@ -120,16 +120,14 @@ typedef struct {
 #define NFAPI_TAG_LENGTH_PACKED_LEN 4
 
 // Convenience methods to convert between SFN/SLOT formats
-#define NFAPI_SFNSLOT2DEC(_sfn,_slot) ( _sfn*20 + _slot  )  // total count of slots
-#define NFAPI_SFNSLOTDEC2SFNSLOT(_sfnslot_dec) ((((_sfnslot_dec) / 20) << 6) | (((_sfnslot_dec) - (((_sfnslot_dec) / 20) * 20)) & 0x3F))
+#define NFAPI_SLOTNUM(_mu) (10 << (_mu))
+#define NFAPI_SLOTLEN(_mu) (1000.f / (1 << _mu))
 
-#define NFAPI_SFNSLOT2SFN(_sfnslot) ((_sfnslot) >> 6)
-#define NFAPI_SFNSLOT2SLOT(_sfnslot) ((_sfnslot) & 0x3F)
-#define NFAPI_SFNSLOTDEC2SFN(_sfnslot_dec) ((_sfnslot_dec) / 20)
-#define NFAPI_SFNSLOTDEC2SLOT(_sfnslot_dec) ((_sfnslot_dec) % 20)
-#define NFAPI_SFNSLOT2HEX(_sfn,_slot) ((_sfn << 6) | (_slot & 0x3F))
+#define NFAPI_SFNSLOT2DEC(_mu, _sfn, _slot) ((_sfn) * NFAPI_SLOTNUM(_mu) + (_slot))
+#define NFAPI_SFNSLOTDEC2SFN(_mu, _sfnslot_dec) ((_sfnslot_dec) / NFAPI_SLOTNUM(_mu))
+#define NFAPI_SFNSLOTDEC2SLOT(_mu, _sfnslot_dec) ((_sfnslot_dec) % NFAPI_SLOTNUM(_mu))
 
-#define NFAPI_MAX_SFNSLOTDEC 1024*20 // 20 is for numerology 1
+#define NFAPI_MAX_SFNSLOTDEC(_mu) (1024 * NFAPI_SLOTNUM(_mu))
 
 // Convenience methods to convert between SFN/SFN formats
 #define NFAPI_SFNSF2DEC(_sfnsf) ((((_sfnsf) >> 4) * 10) + ((_sfnsf) & 0xF))
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
index c68566634dcf1bd550e53df80bb743c9df98f81c..39e9eca3e037eb82a75355bf4b988c452464a279 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
@@ -10,6 +10,8 @@
 #define _NFAPI_NR_INTERFACE_H_
 #include "nfapi_common_interface.h"
 
+#include <stdbool.h>
+
 #define NFAPI_NR_P5_HEADER_LENGTH 10
 #define NFAPI_NR_P7_HEADER_LENGTH 18
 
@@ -177,6 +179,18 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf,
                                uint32_t unpackedBufLen,
                                nfapi_p7_codec_config_t *config);
 
+/*! \brief Peeks the SFN and Slot of an (n)FAPI P7 message
+ *  \param pMessageBuf A pointer to an encoded P7 message header
+ *  \param messageBufLen The size of the encoded P7 message header
+ *  \param SFN A pointer to store the peeked SFN
+ *  \param Slot A pointer to store the peeked Slot
+ *  \return true on success, false, otherwise.
+ *
+ * The function will decode the encoded SFN and Slot from an encoded P7 (n)FAPI message
+
+ */
+bool peek_nr_nfapi_p7_sfn_slot(void *pMessageBuf, uint32_t messageBufLen, uint16_t *SFN, uint16_t *Slot);
+
 /*! \brief Calculates the checksum of a  message
  *
  *  \param buffer Pointer to the packed message
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index df554ab599834c74d0e9e708c36e3eb7ad30ecfc..8cf42cf51178897bbf5c9c15a81cfcd9bd60cb05 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -6202,6 +6202,18 @@ int nfapi_p7_message_unpack(void *pMessageBuf,
     return 0;
 }
 
+bool peek_nr_nfapi_p7_sfn_slot(void *pMessageBuf, uint32_t messageBufLen, uint16_t *SFN, uint16_t *Slot)
+{
+  uint8_t *pReadPackedMessage = &((uint8_t *)pMessageBuf)[NFAPI_NR_P7_HEADER_LENGTH];
+  uint8_t *end = (uint8_t*)pMessageBuf + messageBufLen;
+  if(!(pull16(&pReadPackedMessage, SFN, end) && pull16(&pReadPackedMessage, Slot, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to peek SFN.Slot\n");
+    return false;
+  }
+  NFAPI_TRACE(NFAPI_TRACE_DEBUG, "Peeked SFN.Slot is (%d.%d)\n", *SFN, *Slot);
+  return true;
+}
+
 int nfapi_nr_p7_message_unpack(void *pMessageBuf,
                                uint32_t messageBufLen,
                                void *pUnpackedBuf,
diff --git a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
index 737e76e04fc863b1f340d31a26fee586e97ed038..0c14fcebef17304b1e624ca5df2ac431521b0cd1 100644
--- a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
+++ b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
@@ -29,37 +29,32 @@
 
 typedef struct {
 	uint16_t dl_conf_ontime;
-	uint16_t dl_tti_ontime;
 	uint16_t dl_conf_late;
-	uint16_t dl_tti_late;
 	uint16_t ul_conf_ontime;
-	uint16_t ul_tti_ontime;
 	uint16_t ul_conf_late;
-	uint16_t ul_tti_late;
 	uint16_t hi_dci0_ontime;
 	uint16_t hi_dci0_late;
-	uint16_t ul_dci_ontime;
-	uint16_t ul_dci_late;
 	uint16_t tx_ontime;
 	uint16_t tx_late;
-	uint16_t tx_data_ontime;
-	uint16_t tx_data_late;
 } pnf_p7_stats_t;
 
 
-typedef struct { // TODO: replace with the stats
-	uint16_t dl_tti_ontime;
-	uint16_t dl_tti_late;
-	uint16_t ul_tti_ontime;
-	uint16_t ul_tti_late;
-	uint16_t ul_dci_ontime;
-	uint16_t ul_dci_late;
-	uint16_t tx_data_ontime;
-	uint16_t tx_data_late;
+typedef struct pnf_p7_arr_time {
+  uint16_t ontime;
+  uint16_t late;
+} pnf_p7_arr_time_t;
+typedef struct pnf_p7_dir {
+  uint32_t bytes;
+} pnf_p7_dir_t;
+typedef struct {
+  pnf_p7_arr_time_t dl_tti;
+  pnf_p7_arr_time_t ul_tti;
+  pnf_p7_arr_time_t ul_dci;
+  pnf_p7_arr_time_t tx_data;
+  pnf_p7_dir_t dl;
+  pnf_p7_dir_t ul;
 } pnf_p7_nr_stats_t;
 
-
-
 typedef struct {
 	uint8_t* buffer;
 	uint16_t length;
@@ -119,6 +114,7 @@ typedef struct {
 	
 	uint16_t sfn;
 	uint16_t slot;
+  int mu;
 	uint16_t sfn_slot;
 	uint32_t slot_start_time_hr;
 	int32_t slot_shift;
diff --git a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
index cb8dd6f6d71694b9d0885a3970d5ad2664f2620a..5e964f10faf39721e316ce997ee0e152c5871059 100644
--- a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
+++ b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
@@ -573,11 +573,10 @@ typedef struct
 	//uint16_t sfn_slot
 	uint16_t sfn;
 	uint16_t slot;
-	//TODO: Change P7 structs to NR
-	nfapi_nr_dl_tti_request_t* dl_tti_req;//nfapi_dl_config_request_t* dl_config_req; 
-	nfapi_nr_ul_tti_request_t* ul_tti_req;//nfapi_ul_config_request_t* ul_config_req;
-	nfapi_nr_ul_dci_request_t* ul_dci_req;//nfapi_hi_dci0_request_t* hi_dci0_req;
-	nfapi_nr_tx_data_request_t* tx_data_req;//nfapi_tx_request_t* tx_req;
+	nfapi_nr_dl_tti_request_t  dl_tti_req;
+	nfapi_nr_ul_tti_request_t  ul_tti_req;
+	nfapi_nr_ul_dci_request_t  ul_dci_req;
+	nfapi_nr_tx_data_request_t tx_data_req;
 
 	//TODO: check these two later
 	//nfapi_lbt_dl_config_request_t* lbt_dl_config_req;
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
index 4232bb27dee4f666252fec3be4cc597f4cb6132a..81de4d7acc67f67061fa1515a689401315bbae67 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
@@ -28,14 +28,17 @@
 #include <stdio.h>
 
 #include "pnf_p7.h"
+#include "nr_fapi_p7_utils.h" // for 5G/NR message utils
 
+#include "common/ran_context.h"
+#include <SCHED_NR/phy_frame_config_nr.h>
 #define FAPI2_IP_DSCP	0
 
 extern int sf_ahead;
 
-void add_slot(uint16_t *frameP, uint16_t *slotP, int offset)
+static void add_slot(int mu, uint16_t *frameP, uint16_t *slotP, int offset)
 {
-	uint16_t num_slots = 20; // set based on numerlogy (fixing for 1)
+	uint16_t num_slots = NFAPI_SLOTNUM(mu);
 
     *frameP    = (*frameP + ((*slotP + offset) / num_slots))%1024; 
 
@@ -58,20 +61,12 @@ void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset)
   *subframeP = (*subframeP+10-offset)%10;
 }
 
-uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset)
+void sfnslot_add_slot(int mu, uint16_t *sfn, uint16_t *slot, int offset)
 {
-  uint32_t new_sfnslot;
-//   uint16_t sfn = NFAPI_SFNSLOT2SFN(sfnslot);
-//   uint16_t slot  = NFAPI_SFNSLOT2SLOT(sfnslot);
-
   //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf);
-  add_slot(&sfn, &slot, offset);
-
-  new_sfnslot = sfn<<6|slot;
+  add_slot(mu, sfn, slot, offset);
 
   //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf));
-
-  return new_sfnslot;
 }
 
 uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset)
@@ -137,34 +132,12 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr)
 	}
 }
 
-// todo : for now these just malloc/free need to move to a memory cache
-nfapi_nr_dl_tti_request_t* allocate_nfapi_dl_tti_request(pnf_p7_t* pnf_p7) 
-{ 
-	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_dl_tti_request_t));
-        //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
-        return ptr;
-}
 nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) 
 { 
 	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t));
         //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
         return ptr;
 }
-void deallocate_nfapi_dl_tti_request(nfapi_nr_dl_tti_request_t* req, pnf_p7_t* pnf_p7) 
-{ 
-  //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list);
-	
-	// if(pnf_p7->_public.codec_config.deallocate)
-	// {	
-	// 	(pnf_p7->_public.codec_config.deallocate)(req); 
-	// }
-	// else
-	// {
-	// 	free(req);
-	// }
-
-	pnf_p7_free(pnf_p7, req);
-}
 
 void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) 
 { 
@@ -182,13 +155,6 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t
 	pnf_p7_free(pnf_p7, req);
 }
 
-nfapi_nr_ul_tti_request_t* allocate_nfapi_ul_tti_request(pnf_p7_t* pnf_p7) 
-{ 
-	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_ul_tti_request_t));
-        //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
-        return ptr;
-}
-
 nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) 
 { 
 	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t));
@@ -196,23 +162,6 @@ nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7)
         return ptr;
 }
 
-void deallocate_nfapi_ul_tti_request(nfapi_nr_ul_tti_request_t* req, pnf_p7_t* pnf_p7) 
-{ 
-  //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list);
-	/*if(pnf_p7->_public.codec_config.deallocate)
-	{
-		(pnf_p7->_public.codec_config.deallocate)(req->pdus_list);
-		(pnf_p7->_public.codec_config.deallocate)(req->groups_list);
-	}
-	else
-	{
-		free(req->pdus_list);
-		free(req->groups_list);
-	}
-	*/
-	pnf_p7_free(pnf_p7, req);
-}
-
 void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) 
 { 
   //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list);
@@ -229,31 +178,11 @@ void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t
 	pnf_p7_free(pnf_p7, req);
 }
 
-nfapi_nr_ul_dci_request_t* allocate_nfapi_ul_dci_request(pnf_p7_t* pnf_p7) 
-{ 
-	return pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_ul_dci_request_t));
-}
-
 nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7) 
 { 
 	return pnf_p7_malloc(pnf_p7, sizeof(nfapi_hi_dci0_request_t));
 }
 
-void deallocate_nfapi_ul_dci_request(nfapi_nr_ul_dci_request_t* req, pnf_p7_t* pnf_p7) 
-{ 
-  //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list);
-	// if(pnf_p7->_public.codec_config.deallocate)
-	// {
-	// 	(pnf_p7->_public.codec_config.deallocate)(req->ul_dci_pdu_list);
-	// }
-	// else
-	// {
-	// 	free(req->ul_dci_pdu_list);
-	// }
-
-	pnf_p7_free(pnf_p7, req);
-}
-
 void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) 
 { 
   //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list);
@@ -270,32 +199,11 @@ void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pn
 	pnf_p7_free(pnf_p7, req);
 }
 
-nfapi_nr_tx_data_request_t* allocate_nfapi_tx_data_request(pnf_p7_t* pnf_p7) 
-{ 
-	return pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_tx_data_request_t));
-}
-
 nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7) 
 { 
 	return pnf_p7_malloc(pnf_p7, sizeof(nfapi_tx_request_t));
 }
 
-//TODO: Check if deallocate_nfapi_tx_data_request defn is proper
-void deallocate_nfapi_tx_data_request(nfapi_nr_tx_data_request_t* req, pnf_p7_t* pnf_p7) 
-{
-/*
-	if(pnf_p7->_public.codec_config.deallocate)
-	{
-		(pnf_p7->_public.codec_config.deallocate)(req->pdu_list);
-	}
-	else
-	{
-		free(req->pdu_list);
-	}
-*/
-	pnf_p7_free(pnf_p7, req);
-}
-
 void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) 
 { 
 	int i = 0;
@@ -471,7 +379,7 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas
 				previous->next = iterator->next;
 			}
 			
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta);
+			NFAPI_TRACE(NFAPI_TRACE_WARN, "Deleting stale reassembly message (packet rx_hr_time %u current rx_hr_time %u delta %d us)\n", iterator->rx_hr_time, rx_hr_time, delta);
 
 			pnf_p7_rx_message_t* to_delete = iterator;
 			iterator = iterator->next;
@@ -544,10 +452,7 @@ static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr)
 int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t len)
 {
 	// todo : consider how to do this only once
-	struct sockaddr_in remote_addr;
-	memset((char*)&remote_addr, 0, sizeof(struct sockaddr_in));
-	remote_addr.sin_family = AF_INET;
-	remote_addr.sin_port = htons(pnf_p7->_public.remote_p7_port);
+  struct sockaddr_in remote_addr = {.sin_family = AF_INET, .sin_port = htons(pnf_p7->_public.remote_p7_port)};
 
 	
 	if(inet_aton(pnf_p7->_public.remote_p7_addr, &remote_addr.sin_addr) == -1)
@@ -674,8 +579,8 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea
     return -1;
   }
 
-  int len =
-      nfapi_nr_p7_message_pack(header, pnf_p7->tx_message_buffer, sizeof(pnf_p7->tx_message_buffer), &pnf_p7->_public.codec_config);
+  uint8_t tx_buf[131072]; // four times NFAPI_MAX_PACKED_MESSAGE_SIZE as of this commit
+  int len = nfapi_nr_p7_message_pack(header, tx_buf, sizeof(tx_buf), &pnf_p7->_public.codec_config);
 
   if (len < 0) {
     if (pthread_mutex_unlock(&(pnf_p7->pack_mutex)) != 0) {
@@ -706,7 +611,7 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea
       uint16_t segment_size = size + NFAPI_NR_P7_HEADER_LENGTH;
 
       // Update the header with the m and segement
-      memcpy(&buffer[0], pnf_p7->tx_message_buffer, NFAPI_NR_P7_HEADER_LENGTH);
+      memcpy(&buffer[0], tx_buf, NFAPI_NR_P7_HEADER_LENGTH);
 
       // set the segment length
       buffer[6] = (segment_size & 0xFF00) >> 8;
@@ -715,7 +620,7 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea
       // set the m & segment number
       buffer[8] = ((!last) << 7) + segment;
 
-      memcpy(&buffer[NFAPI_NR_P7_HEADER_LENGTH], pnf_p7->tx_message_buffer + offset, size);
+      memcpy(&buffer[NFAPI_NR_P7_HEADER_LENGTH], tx_buf + offset, size);
       offset += size;
 
       if (pnf_p7->_public.checksum_enabled) {
@@ -726,11 +631,11 @@ int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_nr_p7_message_hea
     }
   } else {
     if (pnf_p7->_public.checksum_enabled) {
-      nfapi_nr_p7_update_checksum(pnf_p7->tx_message_buffer, len);
+      nfapi_nr_p7_update_checksum(tx_buf, len);
     }
 
     // simple case that the message fits in a single segment
-    pnf_p7_send_message(pnf_p7, pnf_p7->tx_message_buffer, len);
+    pnf_p7_send_message(pnf_p7, tx_buf, len);
   }
 
   pnf_p7->sequence_number++;
@@ -807,55 +712,6 @@ void pnf_nr_pack_and_send_timing_info(pnf_p7_t* pnf_p7)
 	pnf_p7->timing_info_ms_counter = 0;
 }
 
-
-void send_dummy_slot(pnf_p7_t* pnf_p7, uint16_t sfn, uint16_t slot)
-{
-  struct timespec t;
-  clock_gettime( CLOCK_MONOTONIC, &t);
-
-  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec);
-
-	if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req)
-	{
-		pnf_p7->_public.dummy_slot.tx_data_req->SFN = sfn;
-		pnf_p7->_public.dummy_slot.tx_data_req->Slot = slot;
-		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n");
-		(pnf_p7->_public.tx_data_req_fn)(&pnf_p7->_public, pnf_p7->_public.dummy_slot.tx_data_req);
-		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n");
-	}
-	if(pnf_p7->_public.dl_tti_req_fn && pnf_p7->_public.dummy_slot.dl_tti_req)
-	{
-		pnf_p7->_public.dummy_slot.dl_tti_req->SFN = sfn;
-		pnf_p7->_public.dummy_slot.dl_tti_req->Slot = slot;
-		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n");
-		(pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.dl_tti_req);
-		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n");
-	}
-	if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req)
-	{
-		pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn;
-		pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot;
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n");
-		(pnf_p7->_public.ul_tti_req_fn)(NULL, &pnf_p7->_public, pnf_p7->_public.dummy_slot.ul_tti_req);
-	}
-	if(pnf_p7->_public.ul_dci_req_fn && pnf_p7->_public.dummy_slot.ul_dci_req)
-	{
-		pnf_p7->_public.dummy_slot.ul_dci_req->SFN = sfn;
-		pnf_p7->_public.dummy_slot.ul_dci_req->Slot = slot;
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n");
-		(pnf_p7->_public.ul_dci_req_fn)(NULL, &pnf_p7->_public, pnf_p7->_public.dummy_slot.ul_dci_req);
-	}
-	#if 0
-	if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req) // TODO: Change later
-	{
-		pnf_p7->_public.dummy_slot.lbt_dl_config_req->sfn_sf = sfn;
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n");
-		(pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_slot.lbt_dl_config_req);
-	}
-	#endif
-}
-
-
 void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf)
 {
   struct timespec t;
@@ -918,21 +774,14 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 
 	// save the curren time, sfn and slot
 	pnf_p7->slot_start_time_hr = pnf_get_current_time_hr();
-	int slot_ahead = 6;
-	uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
-	uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
-	uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
 
 	//We align the pnf_p7 sfn/slot with tx sfn/slot, and vnf is synced with pnf_p7 sfn/slot. This is so that the scheduler runs slot_ahead from rx thread.
 
-	pnf_p7->sfn = sfn_tx;
-	pnf_p7->slot = slot_tx; 
+	pnf_p7->sfn = sfn;
+	pnf_p7->slot = slot;
 
-	uint32_t rx_slot_dec = NFAPI_SFNSLOT2DEC(sfn, slot);
-	uint8_t buffer_index_rx = rx_slot_dec % 20; 
-
-	uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(sfn_tx,slot_tx);
-	uint8_t buffer_index_tx = tx_slot_dec % 20;
+	uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, sfn,slot);
+	uint8_t buffer_index_tx = tx_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu);
 
 	// If the subframe_buffer has been configured
 	if(pnf_p7->_public.slot_buffer_size!= 0) // for now value is same as sf_buffer_size
@@ -945,9 +794,9 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 
 			// adjust for wrap-around
 			if(shifted_slot < 0)
-				shifted_slot += NFAPI_MAX_SFNSLOTDEC;
-			else if(shifted_slot > NFAPI_MAX_SFNSLOTDEC)
-				shifted_slot -= NFAPI_MAX_SFNSLOTDEC;
+				shifted_slot += NFAPI_MAX_SFNSLOTDEC(pnf_p7->mu);
+			else if(shifted_slot > NFAPI_MAX_SFNSLOTDEC(pnf_p7->mu))
+				shifted_slot -= NFAPI_MAX_SFNSLOTDEC(pnf_p7->mu);
 
 	//		NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/slot (%d -> %d)\n", pnf_p7->sfn_slot_shift, NFAPI_SFNSF2DEC(sfn_slot), shifted_sfn_slot);
 			slot = shifted_slot;
@@ -959,175 +808,48 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			pnf_p7->slot_shift = 0;
 		}
 
-		nfapi_pnf_p7_slot_buffer_t* rx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_rx]);
-
 		nfapi_pnf_p7_slot_buffer_t* tx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_tx]);
 
-                // if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d slot_buffer->sfn_sf:%d tx_slot_buffer->sfn_slot:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] "
-                //     "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", 
-                //     __FUNCTION__, 
-                //     pnf_p7->slot_shift, 
-                //     NFAPI_SFNSLOT2DEC(rx_slot_buffer->sfn, rx_slot_buffer->slot), 
-                //     NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), 
-                //        	slot_dec,    buffer_index_rx, rx_slot_buffer->dl_tti_req, rx_slot_buffer->tx_data_req, 
-                //     	tx_slot_dec, buffer_index_tx, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req);
-					//TODO: Change later if required
-
-		// todo : how to handle the messages we don't have, send dummies for
-		// now
-
-		//printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx);
-		//printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf);
-		//printf("tx_slot_buff_sfn - %d, tx_slot_buf_slot - %d, sfn_tx = %d, sllot_tx - %d \n",tx_slot_buffer->sfn,tx_slot_buffer->slot,sfn_tx,slot_tx);
-		// if(tx_slot_buffer->slot == slot_tx && tx_slot_buffer->sfn == sfn_tx)
-		// {	
-		
-		//checking in the tx slot buffers to see if a p7 msg is present. todo: what if it's a mixed slot? 
-
-		if(tx_slot_buffer->tx_data_req != 0 && tx_slot_buffer->tx_data_req->SFN == sfn_tx && tx_slot_buffer->tx_data_req->Slot == slot_tx)
-		{
-				
-			if(pnf_p7->_public.tx_data_req_fn)
-			{	
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling tx_data_req_fn in SFN/slot %d.%d \n",sfn,slot);
-				LOG_D(PHY, "Process tx_data SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);	
-				(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_slot_buffer->tx_data_req);
-			}
-		}
-		else 
-		{
-			// send dummy
-			if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req)
-			{
-				pnf_p7->_public.dummy_slot.tx_data_req->SFN = sfn_tx;
-				pnf_p7->_public.dummy_slot.tx_data_req->Slot = slot_tx; 
-					
-				(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), pnf_p7->_public.dummy_slot.tx_data_req);
-			}
-		}
-		 
-		if(tx_slot_buffer->dl_tti_req != 0 && tx_slot_buffer->dl_tti_req->SFN == sfn_tx && tx_slot_buffer->dl_tti_req->Slot == slot_tx) 
-		{
-			if(pnf_p7->_public.dl_tti_req_fn)
-			{
-				LOG_D(PHY, "Process dl_tti SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);
-				(pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->dl_tti_req);
-			}
-		}
-		else
-		{
-			// send dummy
-			if(pnf_p7->_public.dl_tti_req_fn && pnf_p7->_public.dummy_slot.dl_tti_req)
-			{   
-				pnf_p7->_public.dummy_slot.dl_tti_req->SFN = sfn_tx;
-				pnf_p7->_public.dummy_slot.dl_tti_req->Slot = slot_tx;
-				(pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.dl_tti_req);
-			}
-		}
-
-
-		if(tx_slot_buffer->ul_dci_req!= 0 && tx_slot_buffer->ul_dci_req->SFN == sfn_tx && tx_slot_buffer->ul_dci_req->Slot == slot_tx)
-		{
-			if(pnf_p7->_public.ul_dci_req_fn)
-			{   
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling UL_dci_req_fn in SFN/slot %d.%d \n",sfn,slot);
-				LOG_D(PHY, "Process ul_dci SFN/slot %d.%d buffer index: %d \n",sfn_tx,slot_tx,buffer_index_tx);
- 				(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->ul_dci_req);
-			}
-		}
-		else
-		{
-			//send dummy
-			if(pnf_p7->_public.ul_dci_req_fn && pnf_p7->_public.dummy_slot.ul_dci_req)
-			{
-				pnf_p7->_public.dummy_slot.ul_dci_req->SFN = sfn_tx;
-				pnf_p7->_public.dummy_slot.ul_dci_req->Slot = slot_tx;
-				(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_dci_req);
-			}
-		}
-		if(tx_slot_buffer->ul_tti_req != 0)
-		{
-			if(pnf_p7->_public.ul_tti_req_fn)
-			{ 
-				(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), tx_slot_buffer->ul_tti_req);
-			}
-		}
-		else
-		{
-			// send dummy
-			if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req)
-			{
-				pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn_tx;
-				pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot_tx;
-				(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_tti_req);
-			}
-		}
-
-		//deallocate slot buffers after passing down the PDUs to PHY processing
-
-		if(tx_slot_buffer->dl_tti_req != 0)
-		{
-			deallocate_nfapi_dl_tti_request(tx_slot_buffer->dl_tti_req, pnf_p7);
-			tx_slot_buffer->dl_tti_req = 0;
-			LOG_D(PHY,"SFN/slot %d.%d Buffer index : %d freed \n",sfn_tx,slot_tx,buffer_index_tx);
-		}
-
-		if(tx_slot_buffer->tx_data_req != 0)
-		{
-			deallocate_nfapi_tx_data_request(tx_slot_buffer->tx_data_req, pnf_p7);
-			tx_slot_buffer->tx_data_req = 0;
-		}
-
-		if(tx_slot_buffer->ul_dci_req != 0)
-		{
-			deallocate_nfapi_ul_dci_request(tx_slot_buffer->ul_dci_req, pnf_p7);
-			tx_slot_buffer->ul_dci_req = 0;
-		}
-
-
-		//checking in the rx slot buffers to see if a p7 msg is present.
+    nfapi_nr_dl_tti_request_t* dl_tti_req = &tx_slot_buffer->dl_tti_req;
+    nfapi_nr_tx_data_request_t* tx_data_req = &tx_slot_buffer->tx_data_req;
+    if (dl_tti_req->dl_tti_request_body.nPDUs > 0 && dl_tti_req->SFN == sfn && dl_tti_req->Slot == slot) {
+      DevAssert(pnf_p7->_public.dl_tti_req_fn != NULL);
+      DevAssert(pnf_p7->_public.tx_data_req_fn != NULL);
+      if (tx_data_req->Number_of_PDUs > 0 && tx_data_req->SFN == sfn && tx_data_req->Slot == slot) {
+        (pnf_p7->_public.dl_tti_req_fn)(NULL, &(pnf_p7->_public), dl_tti_req);
+        (pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_data_req);
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%4d.%2d no corresponding tx_data.request for dl_tti.request, dropping\n", sfn, slot);
+      }
+      tx_slot_buffer->dl_tti_req.SFN = -1;
+      tx_slot_buffer->dl_tti_req.Slot = -1;
+      tx_slot_buffer->tx_data_req.SFN = -1;
+      tx_slot_buffer->tx_data_req.Slot = -1;
+    }
+    if (tx_data_req->Number_of_PDUs > 0 && tx_data_req->SFN == sfn && tx_data_req->Slot == slot) {
+      // there is a tx_data.request in this slot, but no corresponding
+      // dl_tti.request (when they need to come pairwise)
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%4d.%2d no corresponding dl_tti.request for tx_data.request, dropping\n", sfn, slot);
+      tx_slot_buffer->tx_data_req.SFN = -1;
+      tx_slot_buffer->tx_data_req.Slot = -1;
+    }
 
-		if(rx_slot_buffer->ul_tti_req != 0 && rx_slot_buffer->ul_tti_req->SFN == sfn && rx_slot_buffer->ul_tti_req->Slot == slot)
+		if(tx_slot_buffer->ul_tti_req.n_pdus > 0 && tx_slot_buffer->ul_tti_req.SFN == sfn && tx_slot_buffer->ul_tti_req.Slot == slot)
 		{
-			if(pnf_p7->_public.ul_tti_req_fn)
-			{ 	
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Calling UL_tti_req_fn in SFN/slot %d.%d \n",sfn,slot);
-				(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), rx_slot_buffer->ul_tti_req);
-			}
+			DevAssert(pnf_p7->_public.ul_tti_req_fn != NULL);
+			(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), &tx_slot_buffer->ul_tti_req);
+      tx_slot_buffer->ul_tti_req.SFN = -1;
+      tx_slot_buffer->ul_tti_req.Slot = -1;
 		}
-		else
-		{
-			// send dummy
-			if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req)
-			{
-				pnf_p7->_public.dummy_slot.ul_tti_req->SFN = sfn;
-				pnf_p7->_public.dummy_slot.ul_tti_req->Slot = slot;
-				LOG_D(PHY, "Process ul_tti SFN/slot %d.%d buffer index: %d \n",sfn,slot,buffer_index_rx);
-				(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_tti_req);
-			}
-		}
-		if(rx_slot_buffer->ul_tti_req != 0)
-		{
-			deallocate_nfapi_ul_tti_request(rx_slot_buffer->ul_tti_req, pnf_p7);
-			rx_slot_buffer->ul_tti_req = 0;
-
-		}
-
-		//reset slot buffer 
 
-		if ( rx_slot_buffer->dl_tti_req == 0 &&
-			 rx_slot_buffer->tx_data_req == 0 && 
-			 rx_slot_buffer->ul_tti_req == 0)
+		if(tx_slot_buffer->ul_dci_req.numPdus > 0 && tx_slot_buffer->ul_dci_req.SFN == sfn && tx_slot_buffer->ul_dci_req.Slot == slot)
 		{
-			memset(&(pnf_p7->slot_buffer[buffer_index_rx]), 0, sizeof(nfapi_pnf_p7_slot_buffer_t));
-			pnf_p7->slot_buffer[buffer_index_rx].sfn = -1;
-			pnf_p7->slot_buffer[buffer_index_rx].slot = -1;
+			DevAssert(pnf_p7->_public.ul_dci_req_fn != NULL);
+      (pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), &tx_slot_buffer->ul_dci_req);
+      tx_slot_buffer->ul_dci_req.SFN = -1;
+      tx_slot_buffer->ul_dci_req.Slot = -1;
 		}
 
-		//printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period);
-		//printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send);
-		//printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter);
-
 		//send the periodic timing info if configured
 		if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period)
 		{
@@ -1148,7 +870,18 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 
 	}
 
-	if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
+  if (sfn % 128 == 0 && slot == 0) {
+    pnf_p7_nr_stats_t* s = &pnf_p7->nr_stats;
+    int ontime = s->dl_tti.ontime + s->ul_tti.ontime + s->ul_dci.ontime + s->tx_data.ontime;
+    int late = s->dl_tti.late + s->ul_tti.late + s->ul_dci.late + s->tx_data.late;
+
+    float dl_thr = (float) s->dl.bytes * 8 / 1000 / 1000 / 1.28f; // every 128 frames = 1.28 s
+    float ul_thr = (float) s->ul.bytes * 8 / 1000 / 1000 / 1.28f;
+    NFAPI_TRACE(NFAPI_TRACE_INFO, "[P7:%d] msgs ontime %d thr DL %.2f UL %.2f msg late %d (vtime)\n", pnf_p7->_public.phy_id, ontime, dl_thr, ul_thr, late);
+    memset(s, 0, sizeof(*s));
+  }
+
+  if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
 	{
 		NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
 		return -1;
@@ -1446,86 +1179,45 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
 	return 0;
 }
 
-
-
-// return 1 if in window
-// return 0 if out of window
-
-uint8_t is_nr_p7_request_in_window(uint16_t sfn,uint16_t slot, const char* name, pnf_p7_t* phy)
+bool is_nr_p7_request_in_window(const uint16_t sfn, const uint16_t slot, const char* name, const pnf_p7_t* phy)
 {
-	uint32_t recv_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot);
-	uint32_t current_sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->sfn,phy->slot);
-	//printf("p7_msg_sfn: %d, p7_msg_slot: %d, phy_sfn:%d , phy_slot:%d \n",sfn,slot,phy->sfn,phy->slot);
-	uint8_t in_window = 0;
-	uint8_t timing_window = phy->_public.slot_buffer_size;
-
-	// if(recv_sfn_slot_dec <= current_sfn_slot_dec)
-	// {
-	// 	// Need to check for wrap in window
-	// 	if(((recv_sfn_slot_dec + timing_window) % NFAPI_MAX_SFNSLOTDEC) < recv_sfn_slot_dec)
-	// 	{
-	// 		if(current_sfn_slot_dec > ((recv_sfn_slot_dec + timing_window) % NFAPI_MAX_SFNSLOTDEC))
-	// 		{
-	// 			// out of window
-	// 			NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
-	// 		}
-	// 		else
-	// 		{
-	// 			// ok
-	// 			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec);
-	// 			in_window = 1;
-	// 		}
-	// 	}
-	// 	else
-	// 	{
-	// 		if((current_sfn_slot_dec - recv_sfn_slot_dec) <= timing_window)
-	// 			{
-	// 				// in window
-	// 				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
-	// 				in_window = 1;
-	// 			}
-	// 		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_slot_dec, name, recv_sfn_slot_dec, (current_sfn_slot_dec - recv_sfn_slot_dec));
-	// 	}
-
-	// }
-	// else
-	// {
-	// 	// Need to check it is in window
-	// 	if((recv_sfn_slot_dec - current_sfn_slot_dec) <= timing_window)
-	// 	{
-	// 		// in window
-	// 		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_sf_dec, name, recv_sfn_sf_dec);
-	// 		in_window = 1;
-	// 	}
-	// 	else
-	// 	{
-	// 		// too far in the future
-	// 		NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_slot_dec, name, recv_sfn_slot_dec,  (recv_sfn_slot_dec - current_sfn_slot_dec), timing_window);
-	// 	}
-
-	// }
-	if(current_sfn_slot_dec <= recv_sfn_slot_dec + timing_window){
-		in_window = 1;
-		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
-	}
-	else if(current_sfn_slot_dec + NFAPI_MAX_SFNSLOTDEC <= recv_sfn_slot_dec + timing_window){ //checking for wrap
-		in_window = 1;
-		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
-	}
-  
-	else
-	{ 	
-		
-		NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_slot_dec, name, recv_sfn_slot_dec,  (current_sfn_slot_dec - recv_sfn_slot_dec), timing_window);
-		
-	}//Need to add more cases
-	
-
-	return in_window;
+  const uint32_t recv = NFAPI_SFNSLOT2DEC(phy->mu, sfn, slot); // unpack sfn/slot
+  const uint32_t curr = NFAPI_SFNSLOT2DEC(phy->mu, phy->sfn, phy->slot);
+  const uint8_t timing_window = phy->_public.slot_buffer_size; // TODO check
+  uint32_t diff = curr < recv ? recv - curr : curr - recv;
+  if (diff > NFAPI_MAX_SFNSLOTDEC(phy->mu) / 2)
+    diff = NFAPI_MAX_SFNSLOTDEC(phy->mu) - diff;
+  if (diff > timing_window) {
+    NFAPI_TRACE(NFAPI_TRACE_WARN, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", curr, name, recv, diff, timing_window);
+    return false;
+  }
+  return true;
+}
+
+/*! \brief Checks if the slot a message is intended to configure is of the appropriate type ( DL or UL slot )
+ *  \param sfn The SFN from a P7 message
+ *  \param slot The Slot from a P7 message
+ *  \param name A string with the message name (e.g. DL_TTI.request) for the warning
+ *  \param type The slot type intended for the message ( NR_DOWNLINK_SLOT or NR_UPLINK_SLOT )
+ *  \return true if the slot type is correct, false if not
+ *
+ * The function will take a SFN and Slot and check if it is of the intended type ( DL or UL ), indicated by parameter type
+ * Will print a warning if the check fails and return false
+ * returns true on success
+ */
+bool check_nr_nfapi_p7_slot_type(const uint16_t sfn, const uint16_t slot, const char* name, int type)
+{
+  DevAssert(RC.gNB != NULL && RC.gNB[0] != NULL);
+  PHY_VARS_gNB *gNB = RC.gNB[0];
+  nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
+  const int slot_type = nr_slot_select(cfg, sfn, slot);
+  if(slot_type != type && slot_type != NR_MIXED_SLOT) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%4d.%2d Slot type is not appropriate for %s\n", sfn, slot, name);
+    return false;
+  }
+  return true;
 }
 
-
-
 uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
 {
 	uint32_t recv_sfn_sf_dec = NFAPI_SFNSF2DEC(sfnsf);
@@ -1579,80 +1271,50 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
 }
 
 
-// P7 messages 
+// P7 messages
 void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
-	//NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n");
-	nfapi_nr_dl_tti_request_t* req  = allocate_nfapi_dl_tti_request(pnf_p7);
-
-	if(req == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_dl_tti_request structure\n");
-		return;
-	}
-	int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_dl_tti_request_t), &(pnf_p7->_public.codec_config));
-
-	if(unpack_result == 0)
-	{
-		if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
-			return;
-		}
-
-        if(is_nr_p7_request_in_window(req->SFN,req->Slot, "dl_tti_request", pnf_p7))
-            {
-                uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-                uint8_t buffer_index = sfn_slot_dec % 20;
-
-                struct timespec t;
-                clock_gettime(CLOCK_MONOTONIC, &t);
-
-                NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, pnf_p7->sfn,pnf_p7->slot, req->SFN, req->Slot, buffer_index);
-
-			// if there is already an dl_tti_req make sure we free it.
-			if(pnf_p7->slot_buffer[buffer_index].dl_tti_req != 0)
-			{
-				NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_nr_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_slot:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(req->SFN,req->Slot), buffer_index);
-				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", 
-				//			pMyPhyInfo->sfnSf, bufferIdx,
-				//			SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
-				deallocate_nfapi_dl_tti_request(pnf_p7->slot_buffer[buffer_index].dl_tti_req, pnf_p7);
-			}
-
-			// filling dl_tti_request in slot buffer
-			pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
-			pnf_p7->slot_buffer[buffer_index].slot = req->Slot;
-			pnf_p7->slot_buffer[buffer_index].dl_tti_req = req;
-
-			pnf_p7->stats.dl_tti_ontime++;
-		}
-		else
-		{
-			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "NOT storing dl_config_req SFN/SF %d\n", req->sfn_sf);
-			deallocate_nfapi_dl_tti_request(req, pnf_p7);
-
-			if(pnf_p7->_public.timing_info_mode_aperiodic)
-			{
-				pnf_p7->timing_info_aperiodic_send = 1;
-			}
-
-			pnf_p7->stats.dl_tti_late++;
-		} 
-		if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
-			return;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack dl_tti_req");
-		deallocate_nfapi_dl_tti_request(req, pnf_p7);
-	}
+  // NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n");
+  uint16_t frame, slot;
+  if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) {
+    if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
+      return;
+    }
+    if (check_nr_nfapi_p7_slot_type(frame, slot, "DL_TTI.request", NR_DOWNLINK_SLOT)
+        && is_nr_p7_request_in_window(frame, slot, "dl_tti_request", pnf_p7)) {
+      uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot);
+      uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu);
+      pnf_p7->slot_buffer[buffer_index].sfn = frame;
+      pnf_p7->slot_buffer[buffer_index].slot = slot;
+      nfapi_nr_dl_tti_request_t *req = &pnf_p7->slot_buffer[buffer_index].dl_tti_req;
+      pnf_p7->nr_stats.dl_tti.ontime++;
+
+      NFAPI_TRACE(NFAPI_TRACE_DEBUG,
+                  "POPULATE DL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n",
+                  pnf_p7->sfn,
+                  pnf_p7->slot,
+                  frame,
+                  slot,
+                  buffer_index);
+
+      if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &(pnf_p7->_public.codec_config)) != 0)
+        NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unpack request\n");
+    } else {
+      if (pnf_p7->_public.timing_info_mode_aperiodic)
+        pnf_p7->timing_info_aperiodic_send = 1;
+
+      pnf_p7->nr_stats.dl_tti.late++;
+    }
+    if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
+      return;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack dl_tti_req");
+  }
 }
 
-
 void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
 	//NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n");
@@ -1743,80 +1405,52 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
 	}
 }
 
-
 void pnf_handle_ul_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
-	//NFAPI_TRACE(NFAPI_TRACE_INFO, "UL_CONFIG.req Received\n");
-
-	nfapi_nr_ul_tti_request_t* req  = allocate_nfapi_ul_tti_request(pnf_p7);
-
-	if(req == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_ul_tti_request structure\n");
-		return;
-	}
-
-	int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_ul_tti_request_t), &(pnf_p7->_public.codec_config));
-
-	if(unpack_result == 0)
-	{
-		if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
-			return;
-		}
-
-		if(is_nr_p7_request_in_window(req->SFN,req->Slot, "ul_tti_request", pnf_p7))
-		{
-			uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-			uint8_t buffer_index = (sfn_slot_dec % 20);
-
-                        struct timespec t;
-                        clock_gettime(CLOCK_MONOTONIC, &t);
-
-                        NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_TTI_REQ current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, pnf_p7->sfn,pnf_p7->slot, req->SFN, req->Slot, buffer_index);
-
-			if(pnf_p7->slot_buffer[buffer_index].ul_tti_req != 0)
-			{
-				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", 
-				//			pMyPhyInfo->sfnSf, bufferIdx,
-				//			SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
-
-				deallocate_nfapi_ul_tti_request(pnf_p7->slot_buffer[buffer_index].ul_tti_req, pnf_p7);
-			}
-			
-			//filling slot buffer
-
-			pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
-			pnf_p7->slot_buffer[buffer_index].slot = req->Slot;
-			pnf_p7->slot_buffer[buffer_index].ul_tti_req = req;
-			
-			pnf_p7->stats.ul_tti_ontime++;
-		}
-		else
-		{
-			NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_tti_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SLOT %d\n", NFAPI_SFNSLOT2DEC(pnf_p7->sfn,pnf_p7->slot), NFAPI_SFNSLOT2DEC(req->SFN,req->Slot));
-			deallocate_nfapi_ul_tti_request(req, pnf_p7);
-
-			if(pnf_p7->_public.timing_info_mode_aperiodic)
-			{
-				pnf_p7->timing_info_aperiodic_send = 1;
-			}
+  uint16_t frame, slot;
+  if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) {
+    if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
+      return;
+    }
 
-			pnf_p7->stats.ul_tti_late++;
-		}
+    if (check_nr_nfapi_p7_slot_type(frame, slot, "UL_TTI.request", NR_UPLINK_SLOT)
+        && is_nr_p7_request_in_window(frame, slot, "ul_tti_request", pnf_p7)) {
+      uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot);
+      uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu);
+      pnf_p7->slot_buffer[buffer_index].sfn = frame;
+      pnf_p7->slot_buffer[buffer_index].slot = slot;
+      nfapi_nr_ul_tti_request_t* req = &pnf_p7->slot_buffer[buffer_index].ul_tti_req;
+      pnf_p7->nr_stats.ul_tti.ontime++;
+
+      NFAPI_TRACE(NFAPI_TRACE_DEBUG,
+                  "POPULATE UL_TTI.request current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n",
+                  pnf_p7->sfn,
+                  pnf_p7->slot,
+                  frame,
+                  slot,
+                  buffer_index);
+
+      if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &(pnf_p7->_public.codec_config)) != 0)
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "failed to unpack UL_TTI.request\n");
+    } else {
+      NFAPI_TRACE(NFAPI_TRACE_NOTE,
+                  "[%d.%d] NOT storing ul_tti_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SLOT %d.%d\n",
+                  pnf_p7->sfn, pnf_p7->slot,
+                  frame, slot);
+      if (pnf_p7->_public.timing_info_mode_aperiodic)
+        pnf_p7->timing_info_aperiodic_send = 1;
+
+      pnf_p7->nr_stats.ul_tti.late++;
+    }
 
-		if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
-			return;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack ul_tti_req\n");
-		deallocate_nfapi_ul_tti_request(req, pnf_p7);
-	}
+    if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
+      return;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack ul_tti_req\n");
+  }
 }
 
 void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
@@ -1891,77 +1525,50 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
 	}
 }
 
-
 void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
-	//NFAPI_TRACE(NFAPI_TRACE_INFO, "HI_DCI0.req Received\n");
-
-	nfapi_nr_ul_dci_request_t* req  = allocate_nfapi_ul_dci_request(pnf_p7);
-
-	if(req == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_ul_dci_request structure\n");
-		return;
-	}
-
-	int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_ul_dci_request_t), &pnf_p7->_public.codec_config);
-
-	if(unpack_result == 0)
-	{
-		if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
-			return;
-		}
-
-		if(is_nr_p7_request_in_window(req->SFN,req->Slot,"ul_dci_request", pnf_p7))
-		{
-			uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-			uint8_t buffer_index = sfn_slot_dec % 20;
-
-			if(pnf_p7->slot_buffer[buffer_index].ul_dci_req!= 0)
-			{
-				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing hi_dci0_req at index %d (%d/%d)", 
-				//			pMyPhyInfo->sfnSf, bufferIdx,
-				//			SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
-
-				deallocate_nfapi_ul_dci_request(pnf_p7->slot_buffer[buffer_index].ul_dci_req, pnf_p7);
-			}
-
-			pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
-			pnf_p7->slot_buffer[buffer_index].ul_dci_req = req;
-
-			pnf_p7->stats.ul_dci_ontime++;
-			
-		}
-		else
-		{
-			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing hi_dci0_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf));
-			deallocate_nfapi_ul_dci_request(req, pnf_p7);
-
-			if(pnf_p7->_public.timing_info_mode_aperiodic)
-			{
-				pnf_p7->timing_info_aperiodic_send = 1;
-			}
+  uint16_t frame, slot;
+  if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) {
+    if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
+      return;
+    }
+    if (check_nr_nfapi_p7_slot_type(frame, slot, "UL_DCI.request", NR_DOWNLINK_SLOT)
+        && is_nr_p7_request_in_window(frame, slot, "ul_dci_request", pnf_p7)) {
+      uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot);
+      uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu);
+      pnf_p7->slot_buffer[buffer_index].sfn = frame;
+      pnf_p7->slot_buffer[buffer_index].slot = slot;
+      nfapi_nr_ul_dci_request_t *req = &pnf_p7->slot_buffer[buffer_index].ul_dci_req;
+      pnf_p7->nr_stats.ul_dci.ontime++;
+
+      NFAPI_TRACE(NFAPI_TRACE_DEBUG,
+                  "POPULATE UL_DCI.request current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n",
+                  pnf_p7->sfn,
+                  pnf_p7->slot,
+                  frame,
+                  slot,
+                  buffer_index);
+
+      if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &pnf_p7->_public.codec_config) != 0)
+        NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unpack request\n");
+    } else {
+      if (pnf_p7->_public.timing_info_mode_aperiodic) {
+        pnf_p7->timing_info_aperiodic_send = 1;
+      }
 
-			pnf_p7->stats.ul_dci_late++;
-		}
+      pnf_p7->nr_stats.ul_dci.late++;
+    }
 
-		if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
-			return;
-		}
-	}
-	else
-	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n");
-		deallocate_nfapi_ul_dci_request(req, pnf_p7);
-	}
+    if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
+      return;
+    }
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n");
+  }
 }
 
-
-
 void pnf_handle_hi_dci0_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 
 {
@@ -2031,87 +1638,57 @@ void pnf_handle_hi_dci0_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7
 	}
 }
 
-
 void pnf_handle_tx_data_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
-	//NFAPI_TRACE(NFAPI_TRACE_INFO, "TX.req Received\n");
-	
-	nfapi_nr_tx_data_request_t* req = allocate_nfapi_tx_data_request(pnf_p7);
-
-	if(req == NULL)
-	{
-		NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to allocate nfapi_tx_request structure\n");
-		return;
-	}
-
-	int unpack_result = nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_tx_data_request_t), &pnf_p7->_public.codec_config);
-	if(unpack_result == 0)
-	{
-		if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
-			return;
-		}
-
-		if(is_nr_p7_request_in_window(req->SFN, req->Slot,"tx_request", pnf_p7))
-		{
-			uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(req->SFN,req->Slot);
-			uint8_t buffer_index = sfn_slot_dec % 20;
-
-                        struct timespec t;
-                        clock_gettime(CLOCK_MONOTONIC, &t);
-
-                        //NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_DATA_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
-#if 0
-                        if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n",
-                            __FUNCTION__,
-                            NFAPI_SFNSF2DEC(req->sfn_sf),
-                            req->tx_request_body.number_of_pdus);
-#endif
-
-			if(pnf_p7->slot_buffer[buffer_index].tx_data_req != 0)
-			{
-				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", 
-				//			pMyPhyInfo->sfnSf, bufferIdx,
-				//			SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
-
-				deallocate_nfapi_tx_data_request(pnf_p7->slot_buffer[buffer_index].tx_data_req, pnf_p7);
-			}
-
-			pnf_p7->slot_buffer[buffer_index].sfn = req->SFN;
-			pnf_p7->slot_buffer[buffer_index].slot = req->Slot;
-			pnf_p7->slot_buffer[buffer_index].tx_data_req = req;
-
-			pnf_p7->stats.tx_data_ontime++;
-		}
-		else
-		{
-                  NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_DATA_REQUEST Request is outside of window REQ:SFN_SLOT:%d CURR:SFN_SLOT:%d\n", __FUNCTION__, NFAPI_SFNSLOT2DEC(req->SFN,req->Slot), NFAPI_SFNSLOT2DEC(pnf_p7->sfn,pnf_p7->slot));
-
-			deallocate_nfapi_tx_data_request(req, pnf_p7);
-
-			if(pnf_p7->_public.timing_info_mode_aperiodic)
-			{
-				pnf_p7->timing_info_aperiodic_send = 1;
-			}
+  uint16_t frame, slot;
+  if (peek_nr_nfapi_p7_sfn_slot(pRecvMsg, recvMsgLen, &frame, &slot)) {
+    if (pthread_mutex_lock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
+      return;
+    }
+    if (check_nr_nfapi_p7_slot_type(frame, slot, "TX_DATA.REQUEST", NR_DOWNLINK_SLOT)
+        && is_nr_p7_request_in_window(frame, slot, "tx_request", pnf_p7)) {
+      uint32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(pnf_p7->mu, frame, slot);
+      uint8_t buffer_index = sfn_slot_dec % NFAPI_SLOTNUM(pnf_p7->mu); // TODO where is buffer length?
+      pnf_p7->slot_buffer[buffer_index].sfn = frame;
+      pnf_p7->slot_buffer[buffer_index].slot = slot;
+      nfapi_nr_tx_data_request_t *req = &pnf_p7->slot_buffer[buffer_index].tx_data_req;
+      pnf_p7->nr_stats.tx_data.ontime++;
+
+      NFAPI_TRACE(NFAPI_TRACE_DEBUG,
+                  "POPULATE TX_data.request current tx sfn/slot:%d.%d p7 msg sfn/slot: %d.%d buffer_index:%d\n",
+                  pnf_p7->sfn,
+                  pnf_p7->slot,
+                  frame,
+                  slot,
+                  buffer_index);
+
+      if (nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(*req), &pnf_p7->_public.codec_config) == 0) {
+        for (int i = 0; i < req->Number_of_PDUs; ++i)
+          pnf_p7->nr_stats.dl.bytes += req->pdu_list[i].PDU_length;
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "failed to unpack TX_data.request\n");
+      }
+    } else {
+      NFAPI_TRACE(NFAPI_TRACE_INFO,
+                  "TX_DATA_REQUEST Request is outside of window REQ:SFN_SLOT:%d.%d CURR:SFN_SLOT:%d.%d\n",
+                  frame, slot,
+                  pnf_p7->sfn, pnf_p7->slot);
+
+      if (pnf_p7->_public.timing_info_mode_aperiodic) {
+        pnf_p7->timing_info_aperiodic_send = 1;
+      }
 
-			pnf_p7->stats.tx_data_late++;
-		}
+      pnf_p7->nr_stats.tx_data.late++;
+    }
 
-		if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
-		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
-			return;
-		}
-	}
-	else
-	{
-		deallocate_nfapi_tx_data_request(req, pnf_p7);
-	}
+    if (pthread_mutex_unlock(&(pnf_p7->mutex)) != 0) {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
+      return;
+    }
+  }
 }
 
-
-
 void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
 	//NFAPI_TRACE(NFAPI_TRACE_INFO, "TX.req Received\n");
@@ -2374,18 +1951,17 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t
 	return t2;
 }
 
-uint32_t calculate_nr_t2(uint32_t now_time_hr, uint16_t sfn,uint16_t slot, uint32_t slot_start_time_hr)
+static uint32_t calculate_nr_t2(uint32_t now_time_hr, int mu, uint16_t sfn,uint16_t slot, uint32_t slot_start_time_hr)
 {
 	uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
-	uint32_t t2 = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us;
+	uint32_t t2 = NFAPI_SFNSLOT2DEC(mu, sfn, slot) * NFAPI_SLOTLEN(mu) + slot_time_us;
 	
         if (0)
         {
           static uint32_t prev_t2 = 0;
 
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn to slot:%d slot_start_time_Hr:%u) slot_time_us:%u t2:%u prev_t2:%u diff:%u\n",
-              __FUNCTION__,
-              now_time_hr, NFAPI_SFNSLOT2DEC(sfn, slot), slot_start_time_hr,
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "(now_time_hr:%u sfn.slot:%d.%d slot_start_time_Hr:%u) slot_time_us:%u t2:%u prev_t2:%u diff:%u\n",
+              now_time_hr, sfn, slot, slot_start_time_hr,
               slot_time_us,
               t2,
               prev_t2,
@@ -2408,13 +1984,13 @@ uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr)
 	return t3;
 }
 
-uint32_t calculate_nr_t3(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
+static uint32_t calculate_nr_t3(int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
 {
 	uint32_t now_time_hr = pnf_get_current_time_hr();
 
 	uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
 
-	uint32_t t3 = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us;
+	uint32_t t3 = NFAPI_SFNSLOT2DEC(mu, sfn, slot) * NFAPI_SLOTLEN(mu) + slot_time_us;
 	
 	return t3;
 }
@@ -2510,8 +2086,8 @@ void pnf_nr_handle_dl_node_sync(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7
 	ul_node_sync.header.message_id = NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC;
 	ul_node_sync.header.phy_id = dl_node_sync.header.phy_id;
 	ul_node_sync.t1 = dl_node_sync.t1;
-	ul_node_sync.t2 = calculate_nr_t2(rx_hr_time, pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr);
-	ul_node_sync.t3 = calculate_nr_t3(pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr);
+	ul_node_sync.t2 = calculate_nr_t2(rx_hr_time, pnf_p7->mu, pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr);
+	ul_node_sync.t3 = calculate_nr_t3(pnf_p7->mu, pnf_p7->sfn,pnf_p7->slot, pnf_p7->slot_start_time_hr);
 
 	if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
 	{
@@ -2844,7 +2420,13 @@ void pnf_nr_handle_p7_message(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7,
     }
   }
 
-  pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7, &(pnf_p7->reassembly_queue), rx_hr_time, 1000);
+  // The timeout used to be 1000, i.e., 1ms, which is too short. The below 10ms
+  // is selected to be able to encompass any "reasonable" slot ahead time for the VNF.
+  // Ideally, we would remove old msg (segments) if we detect packet loss
+  // (e.g., if the sequence numbers advances sufficiently); in the branch of
+  // this commit, our goal is to make the PNF work, so we content ourselves to
+  // just remove very old messages.
+  pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7, &(pnf_p7->reassembly_queue), rx_hr_time, 10000);
 }
 
 
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
index 9b78d80fd39072fee03d7292d81f07569077bfaa..6e5569d9726a09402b0f4bfa91cd75b662c84e75 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
@@ -21,14 +21,15 @@
 
 nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create()
 {
-	pnf_p7_t* _this = (pnf_p7_t*)calloc(1, sizeof(pnf_p7_t));
+  pnf_p7_t* _this = NULL;
+  int rc = posix_memalign((void**)&_this, 32, sizeof(pnf_p7_t));
 
-	if(_this == 0)
-		return 0;
+  if (_this == NULL || rc != 0)
+    return 0;
 
 
 	// set the default parameters
-	_this->_public.segment_size = 1400;
+	_this->_public.segment_size = 65000; // UDP max packet size is 65535
 	_this->max_num_segments = 8;
 	
 	_this->_public.subframe_buffer_size = 8;// TODO: Initialize the slot_buffer size
@@ -271,7 +272,13 @@ int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_
 	}
 
 	pnf_p7_t* _this = (pnf_p7_t*)(config);
-	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_nr_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+
+	int ret = pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_nr_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+  if (ret == 0) {
+    for (int i = 0; i < ind->number_of_pdus; ++i)
+      _this->nr_stats.ul.bytes += ind->pdu_list[i].pdu_length;
+  }
+  return ret;
 }
 
 int nfapi_pnf_p7_nr_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_crc_indication_t* ind)
diff --git a/nfapi/open-nFAPI/utils/CMakeLists.txt b/nfapi/open-nFAPI/utils/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..24013cbcb3d68026cb9430623a861748a41cf522
--- /dev/null
+++ b/nfapi/open-nFAPI/utils/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_executable(nfapi_hex_parser nfapi_hex_parser.c)
+target_link_libraries(nfapi_hex_parser PUBLIC nr_fapi_p5 nr_fapi_p7)
+# This makes it so nfapi_hex_parser is always compiled whenever NFAPI_LIB is compiled
+add_dependencies(NFAPI_LIB nfapi_hex_parser )
diff --git a/nfapi/open-nFAPI/utils/examples.md b/nfapi/open-nFAPI/utils/examples.md
new file mode 100644
index 0000000000000000000000000000000000000000..4380de53243406049fce9ebd3884842a04cb750b
--- /dev/null
+++ b/nfapi/open-nFAPI/utils/examples.md
@@ -0,0 +1,401 @@
+# Example runs of nfapi_hex_parser
+## 1 - An invalid DL_TTI.request
+```
+./nfapi/open-nFAPI/utils/nfapi_hex_parser 0x00 0x00 0x00 0x80 0x00 0x00 0x01 0x7e 0x00 0x62 0x00 0x00 0x03 0x01 0x00 0x03 0x00 0x15 0x00 0x01 0x00 0x00 0x00 0x00 0x18 0x01 0x06 0x00 0x0d 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x34 0x01 0x11 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0xe0 0x01 0x01 0x06 0x02 0x00 0x00 0x01 0x00 0x00 0x01 0xff 0xff 0x00 0x01 0x00 0x00 0x00 0x04 0x00 0x01 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x1c 0x00 0x00 0x00 0x80 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x71 0x00 0x00 0xff 0xff 0x00 0x00 0x01 0x11 0x00 0x00 0x00 0x00 0x01 0x01 0x34 0x02 0x04 0x00 0x00 0x00 0x00 0x00 0x7b 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x01 0x00 0x00 0x00 0x04 0x00 0x00 0x01 0x00 0x01 0x00 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x2d 0x00 0x0e 0x00 0x03 0x0b 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
+Parsed 382 bytes:
+00 00 00 80 00 00 01 7e   00 62 00 00 03 01 00 03
+00 15 00 01 00 00 00 00   18 01 06 00 0d 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 34 01   11 00 00 00 00 00 02 00
+00 00 00 e0 01 01 06 02   00 00 01 00 00 01 ff ff
+00 01 00 00 00 04 00 01   00 01 00 00 00 00 00 00
+00 00 1c 00 00 00 80 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 01 00 71 00 00 ff ff
+00 00 01 11 00 00 00 00   01 01 34 02 04 00 00 00
+00 00 7b 00 00 00 00 00   00 00 00 00 00 00 01 01
+00 00 00 04 00 00 01 00   01 00 01 01 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 2d 00 0e 00 03 0b 00   00 00 00 00 00 01 00 01
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00
+Decoded message NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message length 0x17e
+Message ID = 0x80
+Message Length = 0x17e
+  SFN = 98
+  Slot = 0
+  nPDUs = 3
+  nGroup = 1
+    PDU #0
+    PDUType = 0x03 (NFAPI_NR_DL_TTI_SSB_PDU_TYPE)
+    PDUSize = 0x15
+      physCellId = 1
+      BetaPss = 0
+      SSBBlockIndex = 0
+      SSBSubcarrierOffset = 0
+      SSBOffsetPointA = 24
+      bchPayloadFlag = 1
+      bchPayload = 6000d
+        numPRGs = 0
+        prgSize = 0
+        digBFInterfaces = 0
+    PDU #1
+    PDUType = 0x00 (NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE)
+    PDUSize = 0x00
+      BWPSize = 0
+      BWPStart = 0
+      Subcarrier Spacing = 0
+      Ciclic Prefix = 0
+      StartSymbolIndex = 0
+      DurationSymbols = 0
+      FrequencyDomainResource : 0 0 0 0 0 0
+      CCE Reg Mapping Type = 0
+      Reg Bundle Size = 0
+      Interleaver Size = 0
+      CoreSetType = 0
+      ShiftIndex = 0
+      precoderGranularity = 0
+      numDLDCI = 0
+    PDU #2
+    PDUType = 0x00 (NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE)
+    PDUSize = 0x00
+      BWPSize = 0
+      BWPStart = 0
+      Subcarrier Spacing = 0
+      Ciclic Prefix = 0
+      StartSymbolIndex = 0
+      DurationSymbols = 0
+      FrequencyDomainResource : 0 0 0 0 0 0
+      CCE Reg Mapping Type = 0
+      Reg Bundle Size = 0
+      Interleaver Size = 0
+      CoreSetType = 0
+      ShiftIndex = 0
+      precoderGranularity = 0
+      numDLDCI = 0
+    Group #0
+    nUe[0] = 0x00
+```
+
+## 2 - A valid ERROR.indication
+```
+./nfapi/open-nFAPI/utils/nfapi_hex_parser 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x06 0x00 0x0a 0x00 0x10 0x80 0x06
+Parsed values:
+00 00 00 07 00 00 00 06   00 0a 00 10 80 06
+Processing message NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION
+Message ID = 0x07
+Message Length = 0x06
+SFN = 0x0a
+Slot = 0x10
+Message ID = 0x80
+Error Code = 0x06 (NFAPI_NR_PHY_API_MSG_INVALID_SFN)
+```
+
+## 3 - A valid SLOT.indication
+```
+./nfapi/open-nFAPI/utils/nfapi_hex_parser 0x00 0x01 0x00 0x82 0x00 0x00 0x00 0x04 0x00 0x05 0x00 0x06
+Parsed values:
+00 01 00 82 00 00 00 04   00 05 00 06
+Processing message NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION
+Message ID = 0x82
+Message Length = 0x04
+SFN = 5
+Slot = 6
+```
+
+## 4 - A valid ERROR.indication, with diverging formats for the hexdump passed as a parameter
+```
+user@user-PC:~/nfapi_parser/cmake_targets/ran_build/build$ ./nfapi/open-nFAPI/utils/nfapi_hex_parser "00 0 0x00 7 0x00 0x00 0x00" 0x06 0x00 "a 0x00 0x10 0x80 7"
+Parsed 14 bytes:
+00 00 00 07 00 00 00 06   00 0a 00 10 80 07
+Decoded message NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION message length 0x06
+Message ID = 0x07
+Message Length = 0x06
+  SFN = 0x0a (10)
+  Slot = 0x10 (16)
+  Message ID = 0x80
+  Error Code = 0x07 (NFAPI_NR_PHY_API_MSG_UL_DCI_ERR)
+```
+
+## 5 - An invalid message, passing less bytes than the minimum required to encode a FAPI message header
+```
+user@user-PC:~/nfapi_parser/cmake_targets/ran_build/build$ ./nfapi/open-nFAPI/utils/nfapi_hex_parser 1
+Parsed 1 bytes:
+01
+
+Assertion (byte_count >= sizeof(fapi_message_header_t)) failed!
+In main() /home/user/nfapi_parser/nfapi/open-nFAPI/utils/nfapi_hex_parser.c:293
+Read byte amount not enough to encode the header. Should have a minimum of 8 bytes, aborting...
+Exiting execution
+/home/user/nfapi_parser/nfapi/open-nFAPI/utils/nfapi_hex_parser.c:293 main() Exiting OAI (n)FAPI Hex Parser: _Assert_Exit_
+Aborted (core dumped)
+```
+
+## 7 - A valid DL_TTI.request
+```
+./nfapi/open-nFAPI/utils/nfapi_hex_parser 0x00 0x01 0x00 0x80 0x00 0x00 0x00 0xc3 0x00 0x02 0x00 0x00 0x03 0x00 0x00 0x03 0x00 0x19 0x00 0x00 0x00 0x00 0x0c 0x00 0xfc 0x01 0x06 0xc6 0x01 0x00 0x00 0x01 0x01 0x13 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x31 0x00 0x30 0x00 0x6e 0x01 0x00 0x00 0x01 0xff 0x00 0x00 0x00 0x00 0x00 0x01 0x06 0x02 0x00 0x00 0x00 0x00 0x00 0x01 0xff 0xff 0x00 0x00 0x00 0x00 0x00 0x04 0x00 0x00 0x00 0x00 0x01 0x00 0x01 0x00 0x27 0x00 0x00 0x14 0x01 0x2d 0x00 0x01 0x00 0x61 0x00 0x00 0xff 0xff 0x00 0x00 0x00 0x30 0x00 0x6e 0x01 0x00 0x01 0x0e 0xce 0x02 0x05 0x00 0x00 0x00 0x00 0x00 0x81 0x00 0x00 0x01 0x00 0x01 0x02 0x44 0x00 0x00 0x00 0x00 0x02 0x00 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x10 0x00 0x02 0x0a 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x02 0x00 0x00 0xe0 0x20 0x10 0x29 0x00 0x01 0x62 0x00 0x00 0x00
+Parsed 193 bytes:
+00 01 00 80 00 00 00 c3   00 02 00 00 03 00 00 03
+00 19 00 00 00 00 0c 00   fc 01 06 c6 01 00 00 01
+01 13 01 00 00 00 00 00   00 00 31 00 30 00 6e 01
+00 00 01 ff 00 00 00 00   00 01 06 02 00 00 00 00
+00 01 ff ff 00 00 00 00   00 04 00 00 00 00 01 00
+01 00 27 00 00 14 01 2d   00 01 00 61 00 00 ff ff
+00 00 00 30 00 6e 01 00   01 0e ce 02 05 00 00 00
+00 00 81 00 00 01 00 01   02 44 00 00 00 00 02 00
+01 01 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
+00 00 00 00 00 00 00 00   00 10 00 02 0a 00 00 00
+00 01 00 00 02 00 00 e0   20 10 29 00 01 62 00 00
+00
+Decoded message NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST message length 0xc3
+Message ID = 0x80
+Message Length = 0xc3
+  SFN = 2
+  Slot = 0
+  nPDUs = 3
+  nGroup = 0
+    PDU #0
+    PDUType = 0x03 (NFAPI_NR_DL_TTI_SSB_PDU_TYPE)
+    PDUSize = 0x19
+      physCellId = 0
+      BetaPss = 0
+      SSBBlockIndex = 0
+      SSBSubcarrierOffset = 12
+      SSBOffsetPointA = 252
+      bchPayloadFlag = 1
+      bchPayload = 6c601
+        numPRGs = 1
+        prgSize = 275
+        digBFInterfaces = 1
+          PMIdx = 0
+            beamIDX = 0
+    PDU #1
+    PDUType = 0x00 (NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE)
+    PDUSize = 0x31
+      BWPSize = 48
+      BWPStart = 110
+      Subcarrier Spacing = 1
+      Ciclic Prefix = 0
+      StartSymbolIndex = 0
+      DurationSymbols = 1
+      FrequencyDomainResource : 255 0 0 0 0 0
+      CCE Reg Mapping Type = 1
+      Reg Bundle Size = 6
+      Interleaver Size = 2
+      CoreSetType = 0
+      ShiftIndex = 0
+      precoderGranularity = 0
+      numDLDCI = 1
+        RNTI = 0xffff
+        ScramblingId = 0
+        ScramblingRNTI = 0x0
+        CCEIndex = 0
+        AggregationLevel = 4
+          numPRGs = 0
+          prgSize = 0
+          digBFInterfaces = 1
+        beta_PDCCH_1_0 = 0
+        powerControlOffsetSS = 1
+        PayloadSizeBits = 39
+        Payload = 0x00 0x00 0x14 0x01 0x2d
+    PDU #2
+    PDUType = 0x01 (NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE)
+    PDUSize = 0x61
+      pduBitmap = 0
+      RNTI = ffff
+      pduIndex = 0
+      BWPSize = 48
+      BWPStart = 110
+      SubcarrierSpacing = 1
+      CyclicPrefix = 0
+      NrOfCodewords = 1
+        Codeword #0
+          targetCoderate = 3790
+          qamModOrder = 2
+          mcsIndex = 5
+          mcsTable = 0
+          rvIndex = 0
+          TBSize = 129
+      dataScramblingId = 0
+      nrOfLayers = 1
+      transmissionScheme = 0
+      refPoint = 1
+      dlDmrsSymbPos = 580
+      dmrsConfigType = 0
+      dlDmrsScramblingId = 0
+      SCID = 0
+      numDmrsCdmGrpsNoData = 2
+      dmrsPorts = 1
+      resourceAlloc = 1
+      rbBitmap = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+      rbStart = 0
+      rbSize = 16
+      VRBtoPRBMapping = 0
+      StartSymbolIndex = 2
+      NrOfSymbols = 10
+      PTRSPortIndex = 0
+      PTRSTimeDensity = 0
+      PTRSFreqDensity = 0
+      PTRSReOffset = 0
+      nEpreRatioOfPDSCHToPTRS = 0
+        numPRGs = 0
+        prgSize = 0
+        digBFInterfaces = 1
+      powerControlOffset = 0
+      powerControlOffsetSS = 0
+      isLastCbPresent = 0
+      isInlineTbCrc = 0
+      dlTbCrc = 0
+```
+
+## 7 - A Valid UL_TTI.request
+
+```
+./nfapi/open-nFAPI/utils/nfapi_hex_parser 0x00 0x01 0x00 0x81 0x00 0x00 0x00 0x98 0x02 0xd0 0x00 0x04 0x02 0x00 0x00 0x01 0x00 0x00 0x03 0x00 0x45 0x30 0x39 0x00 0x00 0x00 0x00 0x01 0x11 0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x0c 0x3d 0x00 0x28 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x50 0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x01 0x00 0x01 0x00 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x38 0x30 0x39 0x00 0x00 0x00 0x00 0x01 0x11 0x00 0x00 0x01 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x03 0x0d 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x28 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
+Parsed 150 bytes:
+00 01 00 81 00 00 00 98   02 d0 00 04 02 00 00 01 
+00 00 03 00 45 30 39 00   00 00 00 01 11 00 00 01 
+00 00 00 00 0c 3d 00 28   00 00 00 00 00 00 00 00 
+00 02 00 50 00 04 00 00   00 00 00 00 01 10 00 00 
+00 00 00 00 00 02 01 00   01 00 01 01 00 00 00 00 
+00 00 00 00 00 00 00 02   00 38 30 39 00 00 00 00 
+01 11 00 00 01 00 02 00   00 00 00 00 03 0d 01 00 
+00 00 00 00 00 28 00 00   00 00 00 00 00 00 00 00 
+00 00 00 00 00 07 00 00   00 00 00 00 00 00 00 00 
+00 00 00 00 00 00 
+Decoded message NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message length 0x98
+Message ID = 0x81
+Message Length = 0x98
+  SFN = 720
+  Slot = 4
+  nPDUs = 2
+  RachPresent = 0
+  nULSCH = 0
+  nULCCH = 1
+  nGroup = 0
+    PDU #0
+    PDUType = 0x03 (NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE)
+    PDUSize = 0x45
+      RNTI = 3039
+      Handle = 0
+      BWPSize = 273
+      BWPStart = 0
+      SubcarrierSpacing = 1
+      CyclicPrefix = 0
+      numAntPorts = 0
+      numSymbols = 0
+      numRepetitions = 0
+      timeStartPosition = 12
+      configIndex = 61
+      sequenceId = 40
+      bandwidthIndex = 0
+      combSize = 0
+      combOffset = 0
+      cyclicShift = 0
+      frequencyPosition = 0
+      frequencyShift = 0
+      frequencyHopping = 0
+      groupOrSequenceHopping = 0
+      resourceType = 2
+      Tsrs = 80
+      Toffset = 4
+        TRP Scheme = 0
+        numPRGs = 0
+        prgSize = 0
+        digBFInterface = 0
+        srsBandwidthSize = 272
+        Symbol #0
+          srsBandwidthStart = 0
+          sequenceGroup = 0
+          sequenceNumber = 0
+        Usage = 2 (nUsage = 1)
+          ReportType[0] = 1
+        singular Value Representation = 0
+        iq Representation = 1
+        prgSize = 1
+        numTotalUeAntennas = 1
+        ueAntennasInThisSrsResourceSet = 0
+        sampledUeAntennas = 0
+        reportScope = 0
+        NumULSpatialStreamsPorts = 0
+    PDU #1
+    PDUType = 0x02 (NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE)
+    PDUSize = 0x38
+      RNTI = 3039
+      Handle = 0
+      BWPSize = 273
+      BWPStart = 0
+      SubcarrierSpacing = 1
+      CyclicPrefix = 0
+      FormatType = 2
+      multiSlotTxIndicator = 0
+      pi2Bpsk = 0
+      prbStart = 0
+      prbSize = 3
+      StartSymbolIndex = 13
+      NrOfSymbols = 1
+      freqHopFlag = 0
+      secondHopPRB = 0
+      groupHopFlag = 0
+      sequenceHopFlag = 0
+      hoppingId = 40
+      InitialCyclicShift = 0
+      dataScramblingId = 0
+      TimeDomainOccIdx = 0
+      PreDftOccIdx = 0
+      PreDftOccLen = 0
+      AddDmrsFlag = 0
+      DmrsScramblingId = 0
+      DMRScyclicshift = 0
+      SRFlag = 0
+      BitLenHarq = 0
+      BitLenCsiPart1 = 7
+      BitLenCsiPart2 = 0
+        TRP Scheme = 0
+        numPRGs = 0
+        prgSize = 0
+        digBFInterface = 0
+
+```
+
+## 8 - A valid UL_TTI.request with a PRACH PDU
+
+```
+./nfapi/open-nFAPI/utils/nfapi_hex_parser  0x00 0x01 0x00 0x81 0x00 0x00 0x00 0x2d 0x02 0xd1 0x00 0x13 0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x12 0x00 0x00 0x03 0x05 0x00 0x00 0x00 0x1b 0x00 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x08 0x00 0x01 0x0d 0x01 0x00 
+Parsed 43 bytes:
+00 01 00 81 00 00 00 2d   02 d1 00 13 01 01 00 00 
+00 00 00 00 12 00 00 03   05 00 00 00 1b 00 00 00 
+00 00 01 00 00 08 00 01   0d 01 00 
+Decoded message NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST message length 0x2d
+Message ID = 0x81
+Message Length = 0x2d
+  SFN = 721
+  Slot = 19
+  nPDUs = 1
+  RachPresent = 1
+  nULSCH = 0
+  nULCCH = 0
+  nGroup = 0
+    PDU #0
+    PDUType = 0x00 (NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE)
+    PDUSize = 0x12
+      physCellID = 0
+      NumPrachOcas = 3
+      prachFormat = 5 (A2)
+      numRa = 0
+      prachStartSymbol = 0
+      numCs = 27
+        TRP Scheme = 0
+        numPRGs = 0
+        prgSize = 0
+        digBFInterface = 1
+```
diff --git a/nfapi/open-nFAPI/utils/nfapi_hex_parser.c b/nfapi/open-nFAPI/utils/nfapi_hex_parser.c
new file mode 100644
index 0000000000000000000000000000000000000000..342492ba92468f4fae1c315c3b8e30455285062c
--- /dev/null
+++ b/nfapi/open-nFAPI/utils/nfapi_hex_parser.c
@@ -0,0 +1,294 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "nr_fapi.h"
+#include "nr_fapi_p5.h"
+#include "nr_fapi_p5_utils.h"
+#include "nr_fapi_p7.h"
+#include "nr_fapi_p7_utils.h"
+#define MAX_BUFFER_SIZE (1024 * 1024 * 2)
+
+void exit_function(const char *file, const char *function, const int line, const char *s, const int assert)
+{
+  if (s != NULL) {
+    printf("%s:%d %s() Exiting OAI (n)FAPI Hex Parser: %s\n", file, line, function, s);
+  }
+  abort();
+}
+
+char *message_id_to_str(uint32_t message_id)
+{
+  switch (message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      return "NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE";
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      return "NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE";
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_START_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      return "NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE";
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+      return "NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST";
+    case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION";
+    case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+      return "NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION";
+    default:
+      return "UNKNOWN PHY MSG TYPE";
+  }
+}
+
+void unpack_and_dump_message(void *buf, fapi_message_header_t hdr)
+{
+  void *unpacked_req = calloc(1,MAX_BUFFER_SIZE);
+  AssertFatal(unpacked_req != NULL, "malloc failed");
+  if (hdr.message_id >= NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST && hdr.message_id <= NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION) {
+    const int ret = fapi_nr_p5_message_unpack(buf, hdr.message_length + NFAPI_HEADER_LENGTH, unpacked_req, MAX_BUFFER_SIZE, 0);
+    DevAssert(ret >= 0);
+  } else if (hdr.message_id >= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST && hdr.message_id <= NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION) {
+    const int ret = fapi_nr_p7_message_unpack(buf, hdr.message_length + NFAPI_HEADER_LENGTH, unpacked_req, MAX_BUFFER_SIZE, 0);
+    DevAssert(ret >= 0);
+  }
+
+  switch (hdr.message_id) {
+    /* P5 messages */
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST: {
+      dump_param_request(unpacked_req);
+      free_param_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE: {
+      dump_param_response(unpacked_req);
+      free_param_response(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST: {
+      dump_config_request(unpacked_req);
+      free_config_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE: {
+      dump_config_response(unpacked_req);
+      free_config_response(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST: {
+      dump_start_request(unpacked_req);
+      free_start_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE: {
+      dump_start_response(unpacked_req);
+      free_start_response(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST: {
+      dump_stop_request(unpacked_req);
+      free_stop_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_INDICATION: {
+      dump_stop_indication(unpacked_req);
+      free_stop_indication(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_ERROR_INDICATION: {
+      dump_error_indication(unpacked_req);
+      free_error_indication(unpacked_req);
+      return;
+    }
+    /* P7 messages */
+    case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST: {
+      dump_dl_tti_request(unpacked_req);
+      free_dl_tti_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST: {
+      dump_ul_tti_request(unpacked_req);
+      free_ul_tti_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION: {
+      dump_slot_indication(unpacked_req);
+      free_slot_indication(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST: {
+      dump_ul_dci_request(unpacked_req);
+      free_ul_dci_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST: {
+      dump_tx_data_request(unpacked_req);
+      free_tx_data_request(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION: {
+      dump_rx_data_indication(unpacked_req);
+      free_rx_data_indication(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: {
+      dump_crc_indication(unpacked_req);
+      free_crc_indication(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION: {
+      dump_uci_indication(unpacked_req);
+      free_crc_indication(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION: {
+      dump_srs_indication(unpacked_req);
+      free_srs_indication(unpacked_req);
+      return;
+    }
+    case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION: {
+      dump_rach_indication(unpacked_req);
+      free_rach_indication(unpacked_req);
+      return;
+    }
+    default:
+      printf("Unknown Msg ID 0x%02x\n", hdr.message_id);
+  }
+  free(unpacked_req);
+}
+
+static uint8_t to_hex(char c)
+{
+  if (c >= '0' && c <= '9')
+    return c - '0';
+  if (c >= 'a' && c <= 'f')
+    return c - 'a' + 10;
+  printf("found invalid char %c\n", c);
+  return 0xff;
+}
+
+/* @brief decodes one byte in text representation (0xab or just ab) of s and places it in b
+ * @return the number of bytes read, or -1 on error */
+static int parse_byte(const char *s, uint8_t *b)
+{
+  if (!s)
+    return -1;
+  int c = 0;
+  // skip any whitespaces
+  while (s[0] && isspace(*s)) {
+    c++;
+    s++;
+  }
+  // end of string -> nothing to be read
+  if (s[0] == 0)
+    return -1;
+  // jump over leading "0x"
+  if (s[0] == '0' && s[1] == 'x') {
+    c += 2;
+    s += 2;
+  }
+  // only one digit, if s[1] has other garbage, it will be caught after
+  if (s[1] == 0 || s[1] == ' ') {
+    // only one digit
+    *b = to_hex(s[0]);
+    // check if valid
+    return *b != 0xff ? c + 1 : -1;
+  }
+  // read both bytes, check if valid
+  uint8_t hb = to_hex(s[0]);
+  uint8_t lb = to_hex(s[1]);
+  if (hb == 0xff || lb == 0xff)
+    return -1;
+  *b = ((hb & 0xf) << 4) | (lb & 0xf);
+  return c + 2;
+}
+
+int main(int argc, char *argv[])
+{
+  // Check if there are enough arguments
+  if (argc < 2) {
+    printf("Usage: %s [0xNN 0xNN ... | NN NN ... ]\n", argv[0]);
+    return 1;
+  }
+
+  uint8_t hex_values[MAX_BUFFER_SIZE]; // Array to hold the parsed values, assuming max 1024 values
+  int byte_count = 0;
+
+  for (int i = 1; i < argc; ++i) {
+    const char *l = argv[i];
+    int ret;
+    do {
+      ret = parse_byte(l, &hex_values[byte_count]);
+      if (ret > 0)
+        byte_count++;
+      l += ret;
+    } while (ret > 0 && byte_count < MAX_BUFFER_SIZE);
+  }
+
+  // Print the converted values
+  printf("Parsed %d bytes:\n", byte_count);
+  for (int i = 0; i < byte_count; i++) {
+    if (i % 16 == 0 && i != 0) {
+      printf("\n"); // Start a new line every 16 bytes
+    } else if (i % 8 == 0 && i % 16 != 0) {
+      printf("  "); // Add extra space between 8-byte sections
+    }
+    printf("%02x ", hex_values[i]);
+  }
+  printf("\n");
+  AssertFatal(byte_count >= sizeof(fapi_message_header_t), "Read byte amount not enough to encode the header. Should have a minimum of %lu bytes, aborting...", sizeof(fapi_message_header_t));
+  uint8_t *ptr = hex_values; // Points to the first element of the array
+  uint8_t **msg_ptr = &ptr; // Pointer to the pointer
+
+  fapi_message_header_t hdr = {.num_msg = 0, .opaque_handle = 0, .message_id = 0, .message_length = 0};
+  fapi_nr_message_header_unpack(msg_ptr, NFAPI_HEADER_LENGTH, &hdr, sizeof(fapi_message_header_t), 0);
+
+  printf("Decoded message %s message length 0x%02x\n", message_id_to_str(hdr.message_id), hdr.message_length);
+  // Unpack the message
+  unpack_and_dump_message((uint8_t *)hex_values, hdr);
+
+  return 0;
+}
diff --git a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
index 31512124acd9a86fa939feb7f87a05e49919d070..3684997c22126e835ef49ec080501bc8552602bb 100644
--- a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
+++ b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
@@ -91,6 +91,8 @@ typedef struct nfapi_vnf_p7_connection_info {
 	int sfn_sf;
 	int sfn;
 	int slot;
+  int mu; // some 5G slot calculations need the numerology to know the number
+          // of slots
 
 	int socket;
 	struct sockaddr_in local_addr;
diff --git a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
index 30d1edfe320919ab1b50a144f35f2c0cd926f696..77f0358e40977b5d1062962cb19979419cb7d7a4 100644
--- a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
+++ b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
@@ -901,7 +901,6 @@ void nfapi_vnf_p7_config_destory(nfapi_vnf_p7_config_t* config);
  * This function is blocking and will not return until the nfapi_vnf_p7_stop
  * function is called. 
  */
-extern queue_t gnb_slot_ind_queue;
 int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config);
 int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config);
 
@@ -933,13 +932,14 @@ int nfapi_vnf_p7_release_pdu(nfapi_vnf_p7_config_t* config, void*);
  *  \param pnf_p7_addr The udp address the pnf p7 entity has chosen 
  *  \param pnf_p7_port The udp port the pnf p7 entity has chosen
  *  \param phy_id The unique phy id for the pnf p7 entity
+ *  \param mu The subcarrier spacing the PNF is operating with.
  *  \return A status value. 0 equal success, -1 indicates failure
  *
  * This function should be used to each pnf p7 entity that is to be added to this
  * vnf p7 entity. Once added the vnf p7 entity will start establish sync with the
  * pnf p7 entity and that has been sucessfull will generate subframe indications for it
  */
-int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id);
+int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id, int mu);
 
 /*! Delete a vnf p7 instance to the vnf p7 module
  *  \param config A pointer to the vnf p7 configuration
diff --git a/nfapi/open-nFAPI/vnf/src/vnf.c b/nfapi/open-nFAPI/vnf/src/vnf.c
index cf8a945264c9ed89a75a2d9ef4c6f4323d45fc0f..390c4b15d9883153e56a154c1e9342972dbb1823 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf.c
@@ -93,20 +93,14 @@ nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5
 	NFAPI_TRACE(NFAPI_TRACE_DEBUG, "config->pnf_list:%p\n", config->pnf_list);
 
 	nfapi_vnf_pnf_info_t* curr = config->pnf_list;
-	while(curr != 0)
-	{
-		if(curr->p5_idx == p5_idx)
-                {
-                  NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx);
-			return curr;
-                        }
-
-                NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next);
-
-		curr = curr->next;
-	}
+  while (curr != 0) {
+    if (curr->p5_idx == p5_idx)
+      return curr;
+    curr = curr->next;
+  }
+  NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): could not find P5 connection for p5_idx %d\n", __func__, p5_idx);
 
-	return 0;
+  return 0;
 }
 
 void vnf_nr_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_t* config, int p5_idx)
@@ -129,7 +123,9 @@ void vnf_nr_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_
 			if(config->pnf_nr_param_resp)
 			{
 				(config->pnf_nr_param_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_nr_param_resp cb installed\n", __func__);
+      }
 		}	
 		else
 		{
@@ -162,7 +158,9 @@ void vnf_handle_pnf_param_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_con
 			if(config->pnf_param_resp)
 			{
 				(config->pnf_param_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_params_resp cb installed\n", __func__);
+      }
 		}	
 		else
 		{
@@ -196,7 +194,9 @@ void vnf_nr_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf
 			if(config->pnf_nr_config_resp)
 			{
 				(config->pnf_nr_config_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_nr_config_resp cb installed\n", __func__);
+      }
 		}
 		else
 		{
@@ -229,7 +229,9 @@ void vnf_handle_pnf_config_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_co
 			if(config->pnf_config_resp)
 			{
 				(config->pnf_config_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_config_resp cb installed\n", __func__);
+      }
 		}
 		else
 		{
@@ -261,7 +263,9 @@ void vnf_nr_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_
 			if(config->pnf_nr_start_resp)
 			{
 				(config->pnf_nr_start_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_nr_start_resp cb installed\n", __func__);
+      }
 		}
 		else
 		{
@@ -293,7 +297,9 @@ void vnf_handle_pnf_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_con
 			if(config->pnf_start_resp)
 			{
 				(config->pnf_start_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_start_resp cb installed\n", __func__);
+      }
 		}
 		else
 		{
@@ -325,7 +331,9 @@ void vnf_handle_pnf_stop_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_conf
 			if(config->pnf_stop_resp)
 			{
 				(config->pnf_stop_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no pnf_stop_resp cb installed\n", __func__);
+      }
 		}
 		else
 		{
@@ -565,7 +573,9 @@ void vnf_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_config_
 			if(config->start_resp)
 			{
 				(config->start_resp)(config, p5_idx, &msg);
-			}
+			} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no start_resp cb installed\n", __func__);
+      }
 		}
 		else
 		{
@@ -598,7 +608,9 @@ void vnf_nr_handle_start_response(void *pRecvMsg, int recvMsgLen, nfapi_vnf_conf
 				if(config->nr_start_resp)
 				{
 					(config->nr_start_resp)(config, p5_idx, &msg);
-				}
+				} else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): no nr_start_resp cb installed\n", __func__);
+      }
 			}
 		}
 		else
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index e68712131272a3ac1b4dc709877f86e8b8699ccb..0caebd213006158b9a4d562e086651bc5695d0c5 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -89,16 +89,14 @@ void vnf_p7_connection_info_list_add(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_i
 nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_find(vnf_p7_t* vnf_p7, uint16_t phy_id)
 {
 	nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections;
-	while(curr != 0)
-	{
-		if(curr->phy_id == phy_id)
-		{
-			return curr;
-		}
-		curr = curr->next;
-	}
+  while (curr != 0) {
+    if (curr->phy_id == phy_id)
+      return curr;
+    curr = curr->next;
+  }
+  NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(): could not find P7 connection for phy_id %d\n", __func__, phy_id);
 
-	return 0;
+  return 0;
 }
 
 nfapi_vnf_p7_connection_info_t* vnf_p7_connection_info_list_delete(vnf_p7_t* vnf_p7, uint16_t phy_id)
@@ -243,7 +241,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas
 				previous->next = iterator->next;
 			}
 			
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "Deleting stale reassembly message (%u %u %d)\n", iterator->rx_hr_time, rx_hr_time, delta);
+			NFAPI_TRACE(NFAPI_TRACE_WARN, "Deleting stale reassembly message (packet rx_hr_time %u current rx_hr_time %u delta %d us)\n", iterator->rx_hr_time, rx_hr_time, delta);
 
 			vnf_p7_rx_message_t* to_delete = iterator;
 			iterator = iterator->next;
@@ -364,13 +362,13 @@ uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr)
 	return t1;
 }
 
-uint32_t calculate_nr_t1(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
+uint32_t calculate_nr_t1(int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
 {
 	uint32_t now_time_hr = vnf_get_current_time_hr();
 
 	uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
 
-	uint32_t t1 = (NFAPI_SFNSLOT2DEC(sfn,slot) * 500) + slot_time_us;
+	uint32_t t1 = NFAPI_SFNSLOT2DEC(mu, sfn,slot) * NFAPI_SLOTLEN(mu) + slot_time_us;
 	
 	return t1;
 }
@@ -386,24 +384,24 @@ uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t
 
 }
 
-uint32_t calculate_nr_t4(uint32_t now_time_hr, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
+uint32_t calculate_nr_t4(uint32_t now_time_hr, int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
 {
 	uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
 
-	uint32_t t4 = (NFAPI_SFNSLOT2DEC(sfn,slot) * 500) + slot_time_us;
+	uint32_t t4 = NFAPI_SFNSLOT2DEC(mu, sfn,slot) * NFAPI_SLOTLEN(mu) + slot_time_us;
 	
 	return t4;
 
 }
 
 
-uint32_t calculate_transmit_timestamp(uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
+uint32_t calculate_transmit_timestamp(int mu, uint16_t sfn, uint16_t slot, uint32_t slot_start_time_hr)
 {
 	uint32_t now_time_hr = vnf_get_current_time_hr();
 
 	uint32_t slot_time_us = get_slot_time(now_time_hr, slot_start_time_hr);
 
-	uint32_t tt = (NFAPI_SFNSLOT2DEC(sfn, slot) * 500) + slot_time_us;
+	uint32_t tt = NFAPI_SFNSLOT2DEC(mu, sfn, slot) * NFAPI_SLOTLEN(mu) + slot_time_us;
 	
 	return tt;
 }
@@ -509,7 +507,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_
 			int segment = 0;
 			int offset = NFAPI_NR_P7_HEADER_LENGTH;
 			uint8_t tx_buffer[vnf_p7->_public.segment_size];
-                        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size);
+                        NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size);
 			for(segment = 0; segment < segment_count; ++segment)
 			{
 				uint8_t last = 0;
@@ -540,7 +538,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_
 					nfapi_nr_p7_update_checksum(tx_buffer, segment_size);
 				}
 			
-				nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
+				nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
 
 				send_result = vnf_send_p7_msg(vnf_p7, p7_connection,  &tx_buffer[0], segment_size);
 
@@ -553,7 +551,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_nr_p7_message_header_
 				nfapi_nr_p7_update_checksum(buffer, len);
 			}
 
-			nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
+			nfapi_nr_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));
 
 			// simple case that the message fits in a single segement
 			send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len);
@@ -634,7 +632,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
 					nfapi_p7_update_checksum(tx_buffer, segment_size);
 				}
 			
-				nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));	
+				nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));	
 
 				send_result = vnf_send_p7_msg(vnf_p7, p7_connection,  &tx_buffer[0], segment_size);
 			}
@@ -646,7 +644,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
 				nfapi_p7_update_checksum(buffer, len);
 			}
 
-			nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));	
+			nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(p7_connection->mu, p7_connection->sfn, p7_connection->slot, vnf_p7->slot_start_time_hr));	
 
 			// simple case that the message fits in a single segement
 			send_result = vnf_send_p7_msg(vnf_p7, p7_connection, &buffer[0], len);
@@ -683,7 +681,7 @@ int vnf_nr_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_inf
 	dl_node_sync.header.phy_id = p7_info->phy_id;
 	dl_node_sync.header.message_id = NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC;
 	//dl_node_sync.t1 = calculate_t1(p7_info->sfn_sf, vnf_p7->sf_start_time_hr);
-	dl_node_sync.t1 = calculate_nr_t1(p7_info->sfn,p7_info->slot, vnf_p7->slot_start_time_hr);
+	dl_node_sync.t1 = calculate_nr_t1(p7_info->mu, p7_info->sfn,p7_info->slot, vnf_p7->slot_start_time_hr);
 	dl_node_sync.delta_sfn_slot = 0;
 
 	return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &dl_node_sync.header);	
@@ -695,11 +693,9 @@ int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
 	if(p7_info->in_sync == 1)
 	{
 		uint16_t dl_sync_period_mask = p7_info->dl_in_sync_period-1;
-	//	uint16_t sfn_sf_dec = NFAPI_SFNSF2DEC(p7_info->sfn_sf);
-		uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->sfn,p7_info->slot);
+		uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->mu, p7_info->sfn,p7_info->slot);
 
-		//if ((((sfn_sf_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0)
-		if ((((sfn_slot_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSLOTDEC) & dl_sync_period_mask) == 0)
+		if ((((sfn_slot_dec + p7_info->dl_in_sync_offset) % NFAPI_MAX_SFNSLOTDEC(p7_info->mu)) & dl_sync_period_mask) == 0)
 		{
 			vnf_nr_build_send_dl_node_sync(vnf_p7, p7_info);
 		}
@@ -708,10 +704,9 @@ int vnf_nr_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
 	{
 		uint16_t dl_sync_period_mask = p7_info->dl_out_sync_period-1;
 		//uint16_t sfn_sf_dec = NFAPI_SFNSF2DEC(p7_info->sfn_sf);
-		uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->sfn, p7_info->slot);
+		uint16_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(p7_info->mu, p7_info->sfn, p7_info->slot);
 
-		//if ((((sfn_sf_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSFDEC) & dl_sync_period_mask) == 0)
-		if ((((sfn_slot_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSLOTDEC) & dl_sync_period_mask) == 0) 
+		if ((((sfn_slot_dec + p7_info->dl_out_sync_offset) % NFAPI_MAX_SFNSLOTDEC(p7_info->mu)) & dl_sync_period_mask) == 0) 
 		{
 			vnf_nr_build_send_dl_node_sync(vnf_p7, p7_info);
 		}
@@ -1499,7 +1494,7 @@ void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf
 	}
 	else
 	{
-		nfapi_nr_slot_indication_scf_t ind;
+		nfapi_nr_slot_indication_scf_t ind = {0};
 	
 		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
 		{
@@ -1534,7 +1529,7 @@ void vnf_handle_nr_rx_data_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t*
 		}
 		else
 		{
-			NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling RX Indication\n", __FUNCTION__);
+			NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling RX Indication\n", __FUNCTION__);
                         if(vnf_p7->_public.nr_rx_data_indication)
 			{
 				(vnf_p7->_public.nr_rx_data_indication)(&ind);
@@ -1561,7 +1556,7 @@ void vnf_handle_nr_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
 		}
 		else
 		{
-		        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling CRC Indication\n", __FUNCTION__);
+		        NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling CRC Indication\n", __FUNCTION__);
 			if(vnf_p7->_public.nr_crc_indication)
 			{
 				(vnf_p7->_public.nr_crc_indication)(&ind);
@@ -1614,7 +1609,7 @@ void vnf_handle_nr_uci_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_
 		}
 		else
 		{
-		        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s: Handling UCI Indication\n", __FUNCTION__);
+		        NFAPI_TRACE(NFAPI_TRACE_DEBUG, "%s: Handling UCI Indication\n", __FUNCTION__);
 			if(vnf_p7->_public.nr_uci_indication)
 			{
 				(vnf_p7->_public.nr_uci_indication)(&ind);
@@ -1673,9 +1668,9 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 	//NFAPI_TRACE(NFAPI_TRACE_INFO, "Received UL_NODE_SYNC phy_id:%d t1:%d t2:%d t3:%d\n", ind.header.phy_id, ind.t1, ind.t2, ind.t3);
 
 	nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id);
-	uint32_t t4 = calculate_nr_t4(now_time_hr, phy->sfn, phy->slot, vnf_p7->slot_start_time_hr);
+	uint32_t t4 = calculate_nr_t4(now_time_hr, phy->mu, phy->sfn, phy->slot, vnf_p7->slot_start_time_hr);
 
-	uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSLOTDEC - ind.t1 ; //time taken to receive ul node sync - time taken to send dl node sync
+	uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSLOTDEC(phy->mu) - ind.t1 ; //time taken to receive ul node sync - time taken to send dl node sync
 	uint32_t pnf_proc_time = ind.t3 - ind.t2;
 
 	// divide by 2 using shift operator
@@ -1700,12 +1695,12 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 			if (ind.t2 < phy->previous_t2 && ind.t1 > phy->previous_t1)
 			{
 				// Only t2 wrap has occurred!!!
-				phy->slot_offset = (NFAPI_MAX_SFNSLOTDEC + ind.t2) - ind.t1 - latency;
+				phy->slot_offset = (NFAPI_MAX_SFNSLOTDEC(phy->mu) + ind.t2) - ind.t1 - latency;
 			}
 			else if (ind.t2 > phy->previous_t2 && ind.t1 < phy->previous_t1)
 			{
 				// Only t1 wrap has occurred
-				phy->slot_offset = ind.t2 - ( ind.t1 + NFAPI_MAX_SFNSLOTDEC) - latency;
+				phy->slot_offset = ind.t2 - ( ind.t1 + NFAPI_MAX_SFNSLOTDEC(phy->mu)) - latency;
 			}
 			else
 			{
@@ -1757,7 +1752,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 	{
 		uint32_t curr_sfn = phy->sfn;
 		uint32_t curr_slot = phy->slot;
-		int32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->sfn,phy->slot);
+		int32_t sfn_slot_dec = NFAPI_SFNSLOT2DEC(phy->mu, phy->sfn,phy->slot);
 
 		if(!phy->filtered_adjust)
 		{
@@ -1774,7 +1769,7 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 
 			sfn_slot_dec += (phy->slot_offset / 500);
 			
-			NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) );
+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF slot offset:%d sfn :%d slot:%d \n",phy->slot_offset,NFAPI_SFNSLOTDEC2SFN(phy->mu, sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(phy->mu, sfn_slot_dec) );
 
 
 		}
@@ -1786,19 +1781,19 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 
 		if(sfn_slot_dec < 0)
 		{
-			sfn_slot_dec += NFAPI_MAX_SFNSLOTDEC;
+			sfn_slot_dec += NFAPI_MAX_SFNSLOTDEC(phy->mu);
 		}
-		else if( sfn_slot_dec >= NFAPI_MAX_SFNSLOTDEC)
+		else if( sfn_slot_dec >= NFAPI_MAX_SFNSLOTDEC(phy->mu))
 		{
-			sfn_slot_dec -= NFAPI_MAX_SFNSLOTDEC;
+			sfn_slot_dec -= NFAPI_MAX_SFNSLOTDEC(phy->mu);
 		}
 
 		
-		uint16_t new_sfn = NFAPI_SFNSLOTDEC2SFN(sfn_slot_dec);
-		uint16_t new_slot = NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec);
+		uint16_t new_sfn = NFAPI_SFNSLOTDEC2SFN(phy->mu, sfn_slot_dec);
+		uint16_t new_slot = NFAPI_SFNSLOTDEC2SLOT(phy->mu, sfn_slot_dec);
 	
 		{
-			phy->adjustment = NFAPI_SFNSLOT2DEC(new_sfn, new_slot) - NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot);
+			phy->adjustment = NFAPI_SFNSLOT2DEC(phy->mu, new_sfn, new_slot) - NFAPI_SFNSLOT2DEC(phy->mu, curr_sfn, curr_slot);
 
 			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_slot_offset_filtered:%d phy->previous_slot_offset_filtered:%d phy->slot_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_slot_offset_filtered, phy->previous_slot_offset_filtered, phy->slot_offset_trend);
 
@@ -1906,15 +1901,24 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 
 						if(phy->insync_minor_adjustment != 0)
 						{
-							// NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", 
-							// 			phy->sfn, phy->slot, ind.header.phy_id,
-							// 			phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, 
-                            //                                                     phy->slot_offset_filtered, 
-                            //                                                     insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend,
-                            //                                                     NFAPI_SFNSLOT2DEC(new_sfn, new_slot),
-                            //                                                     NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot),
-                            //                                                     phy->adjustment); 
-						}
+              NFAPI_TRACE(NFAPI_TRACE_DEBUG,
+                          "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (slot_offset_filtered:%d) %d %d "
+                          "%d NEW:%d.%d CURR:%d.%d adjustment:%d\n",
+                          phy->sfn,
+                          phy->slot,
+                          ind.header.phy_id,
+                          phy->insync_minor_adjustment,
+                          phy->insync_minor_adjustment_duration,
+                          phy->slot_offset_filtered,
+                          insync_minor_adjustment_1,
+                          insync_minor_adjustment_2,
+                          phy->slot_offset_trend,
+                          new_sfn,
+                          new_slot,
+                          curr_sfn,
+                          curr_slot,
+                          phy->adjustment);
+            }
 					}
 				}
 				else
@@ -1948,16 +1952,27 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 							{
 								// out of sync?
 							}
-							
-							// NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d slot_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", 
-							// 			phy->sfn, phy->slot, ind.header.phy_id,
-							// 			phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->slot_offset_filtered,
-							// 			insync_minor_adjustment_1, insync_minor_adjustment_2, phy->slot_offset_trend,
-                            //                                                     NFAPI_SFNSLOT2DEC(new_sfn, new_slot),
-                            //                                                     NFAPI_SFNSLOT2DEC(curr_sfn, curr_slot),
-                            //                                                     phy->adjustment); 
-							
-						}
+
+              NFAPI_TRACE(NFAPI_TRACE_DEBUG,
+                          "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d slots (adjustment:%d "
+                          "slot_offset_filtered:%d) %d %d %d NEW:%d.%d CURR:%d.%d adj:%d\n",
+                          phy->sfn,
+                          phy->slot,
+                          ind.header.phy_id,
+                          phy->insync_minor_adjustment,
+                          phy->insync_minor_adjustment_duration,
+                          phy->adjustment,
+                          phy->slot_offset_filtered,
+                          insync_minor_adjustment_1,
+                          insync_minor_adjustment_2,
+                          phy->slot_offset_trend,
+                          new_sfn,
+                          new_slot,
+                          curr_sfn,
+                          curr_slot,
+                          phy->adjustment);
+
+            }
 						else if(phy->adjustment < 0)
 						{
 							// VNF is fast
@@ -2088,15 +2103,16 @@ void vnf_nr_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
         if (vnf_p7 && vnf_p7->p7_connections)
         {
           //int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf);
-            vnf_pnf_sfnslot_delta = NFAPI_SFNSLOT2DEC(vnf_p7->p7_connections[0].sfn,vnf_p7->p7_connections[0].slot) - NFAPI_SFNSLOT2DEC(ind.last_sfn,ind.last_slot);
+          nfapi_vnf_p7_connection_info_t *p7_con = &vnf_p7->p7_connections[0];
+            vnf_pnf_sfnslot_delta = NFAPI_SFNSLOT2DEC(p7_con->mu, p7_con->sfn,p7_con->slot) - NFAPI_SFNSLOT2DEC(p7_con->mu, ind.last_sfn,ind.last_slot);
           //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta);
 
           // Panos: Careful here!!! Modification of the original nfapi-code
           //if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1)
 		  //printf("VNF-PNF delta - %d", vnf_pnf_sfnslot_delta);
-          if (vnf_pnf_sfnslot_delta != 0)
+          if (vnf_pnf_sfnslot_delta > 1) // we need to have a small delta, otherwise it would mean we don't advance
           {
-            NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SLOT DELTA between PNF and VNF. Delta %d. PNF:%d.%d VNF:%d.%d\n\n\n\n\n\n\n\n\n",
+            NFAPI_TRACE(NFAPI_TRACE_WARN, "%s() LARGE SFN/SLOT DELTA between PNF and VNF. Delta %d slots. PNF:%d.%d VNF:%d.%d\n",
                         __FUNCTION__, vnf_pnf_sfnslot_delta,
                         ind.last_sfn, ind.last_slot,
                         vnf_p7->p7_connections[0].sfn, vnf_p7->p7_connections[0].slot);
@@ -2507,7 +2523,8 @@ void vnf_nr_handle_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 				vnf_p7_rx_reassembly_queue_remove_msg(vnf_p7, &(phy->reassembly_queue), rx_msg);
 			}
 
-			vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7, &(phy->reassembly_queue), 1000);
+      // see corresponding comment in pnf_nr_handle_p7_message() [same commit]
+			vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7, &(phy->reassembly_queue), 10000);
 		}
 		else
 		{
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
index a883ccf4a275fb739751b43648cf7450826c8184..d3160f4e306fd84ed3996e3e1f8168d093302769 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
@@ -42,7 +42,7 @@ nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create()
 		return 0;
 
 	// todo : initialize
-	_this->_public.segment_size = 1400;
+	_this->_public.segment_size = 65000; // UDP max packet size is 65535
 	_this->_public.max_num_segments = 8;
 	_this->_public.checksum_enabled = 1;
 
@@ -98,8 +98,6 @@ struct timespec timespec_sub(struct timespec lhs, struct timespec rhs)
 // send indications to mac
 int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 {	
-	struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
-	uint8_t prev_slot = 0;
 	if(config == 0)
 		return -1;
 
@@ -157,7 +155,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 
     struct timespec ref_time;
 	clock_gettime(CLOCK_MONOTONIC, &ref_time);
-	uint8_t setup_done;
 	while(vnf_p7->terminate == 0)
 	{	
 		fd_set rfds;
@@ -169,39 +166,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 		FD_SET(vnf_p7->socket, &rfds);
 		maxSock = vnf_p7->socket;
 
-    if (setup_done == 0) {
-      struct timespec curr_time;
-      clock_gettime(CLOCK_MONOTONIC, &curr_time);
-      uint8_t setup_time = curr_time.tv_sec - ref_time.tv_sec;
-      if (setup_time > 3) {
-        setup_done = 1;
-      }
-    }
-
-		nfapi_nr_slot_indication_scf_t *slot_ind = get_queue(&gnb_slot_ind_queue);
-		NFAPI_TRACE(NFAPI_TRACE_DEBUG, "This is the slot_ind queue size %ld in %s():%d\n",
-			    gnb_slot_ind_queue.num_items, __FUNCTION__, __LINE__);
-		if (slot_ind) {
-      NR_UL_IND_t UL_INFO = {.frame = slot_ind->sfn, .slot = slot_ind->slot};
-
-      NFAPI_TRACE(NFAPI_TRACE_DEBUG, "UL_INFO.frame = %d and slot %d, prev_slot = %d\n", UL_INFO.frame, UL_INFO.slot, prev_slot);
-      if (setup_done && prev_slot != UL_INFO.slot) { // Give the VNF sufficient time to setup before starting scheduling  &&
-                                                     // prev_slot != UL_INFO.slot
-
-        // Call the scheduler
-        UL_INFO.module_id = gNB->Mod_id;
-        UL_INFO.CC_id = gNB->CC_id;
-        NFAPI_TRACE(NFAPI_TRACE_DEBUG,
-                    "Calling NR_UL_indication for UL_INFO.frame = %d and slot %d\n",
-                    UL_INFO.frame,
-                    UL_INFO.slot);
-        gNB->if_inst->NR_UL_indication(&UL_INFO);
-        prev_slot = UL_INFO.slot;
-      }
-      free(slot_ind);
-      slot_ind = NULL;
-    }
-
 		selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
 
 		if(selectRetval == 0)
@@ -570,7 +534,7 @@ int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config)
 	return 0;
 }
 
-int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id)
+int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id, int mu)
 {
 	NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id,  pnf_p7_addr, pnf_p7_port);
 
@@ -594,6 +558,7 @@ int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr,
 	node->sfn = 0;
     node->slot = 0;
 	node->min_sync_cycle_count = 8;
+  node->mu = mu;
 
 	// save the remote endpoint information
 	node->remote_addr.sin_family = AF_INET;
diff --git a/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c b/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c
index 4df5da7c261d6398cce7aaaf6c3e4d13b8a14500..0b951047da739d34f5f2ed3b316b1c735a369c9a 100644
--- a/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c
+++ b/nfapi/open-nFAPI/vnf/tests/vnf_cunit_main.c
@@ -769,7 +769,7 @@ int start_response(nfapi_vnf_config_t* config, int p5_idx, nfapi_start_response_
 
 	vnf_test_config_vnf_t* vnf = &(vnf_test_config[0].vnfs[phy->vnf_idx]);
 
-	nfapi_vnf_p7_add_pnf(vnf->config, addr, port, response->header.phy_id);
+	nfapi_vnf_p7_add_pnf(vnf->config, addr, port, response->header.phy_id, 0);
 	return 0;
 }
 
diff --git a/nfapi/open-nfapi.oai.patch b/nfapi/open-nfapi.oai.patch
deleted file mode 100644
index 5b91e3675b0ab0483cd68d940595c58e2060ea29..0000000000000000000000000000000000000000
--- a/nfapi/open-nfapi.oai.patch
+++ /dev/null
@@ -1,20010 +0,0 @@
-diff --git a/common/public_inc/debug.h b/common/public_inc/debug.h
-index 05e9870..14f97a1 100644
---- a/common/public_inc/debug.h
-+++ b/common/public_inc/debug.h
-@@ -39,7 +39,8 @@ extern nfapi_trace_fn_t nfapi_trace_g;
- extern nfapi_trace_level_t nfapi_trace_level_g;
- 
- /*! NFAPI trace macro */
--#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); }
-+//#define NFAPI_TRACE(level, format, ...) { if(nfapi_trace_g && ((nfapi_trace_level_t)level <= nfapi_trace_level_g)) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); }
-+#define NFAPI_TRACE(level, format, ...) { if (nfapi_trace_g) (*nfapi_trace_g)(level, format, ##__VA_ARGS__); }
- 
- /*! Function to change the trace level 
-  * \param new_level The modified trace level
-diff --git a/nfapi/public_inc/nfapi_interface.h b/nfapi/public_inc/nfapi_interface.h
-index 2d58c2a..f665d11 100644
---- a/nfapi/public_inc/nfapi_interface.h
-+++ b/nfapi/public_inc/nfapi_interface.h
-@@ -1772,7 +1772,7 @@ typedef struct {
- 	uint8_t number_of_cc;
- 	struct {
- 		uint8_t ri_size;
--		uint8_t dl_cqi_pmi_size;
-+		uint8_t dl_cqi_pmi_size[8];
- 	} cc[NFAPI_MAX_CC];
- } nfapi_ul_config_aperiodic_cqi_pmi_ri_report_t;
- 
-diff --git a/nfapi/src/nfapi.c b/nfapi/src/nfapi.c
-index 0e06963..3f017bc 100644
---- a/nfapi/src/nfapi.c
-+++ b/nfapi/src/nfapi.c
-@@ -823,6 +823,10 @@ uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *e
- 		{
- 			NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
- 		}
-+                else
-+                {
-+			//NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
-+                }
- 	}
- 
- 	return 1;
-diff --git a/nfapi/src/nfapi_p7.c b/nfapi/src/nfapi_p7.c
-index a3b0141..69ff860 100644
---- a/nfapi/src/nfapi_p7.c
-+++ b/nfapi/src/nfapi_p7.c
-@@ -111,6 +111,8 @@ static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void* tlv, uint8_t **ppWrite
- {
- 	nfapi_dl_config_dci_dl_pdu_rel8_t* value = (nfapi_dl_config_dci_dl_pdu_rel8_t*)tlv;
- 	
-+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci_format:%u\n", __FUNCTION__, value->dci_format);
-+
- 	return ( push8(value->dci_format, ppWritePackedMsg, end) &&
- 			 push8(value->cce_idx, ppWritePackedMsg, end) &&
- 			 push8(value->aggregation_level, ppWritePackedMsg, end) &&
-@@ -234,6 +236,8 @@ static uint8_t pack_dl_config_bch_pdu_rel8_value(void* tlv, uint8_t **ppWritePac
- {
- 	nfapi_dl_config_bch_pdu_rel8_t* value = (nfapi_dl_config_bch_pdu_rel8_t*)tlv;
- 	
-+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s()\n", __FUNCTION__);
-+
- 	return( push16(value->length, ppWritePackedMsg, end) &&
- 			push16(value->pdu_index, ppWritePackedMsg, end) &&
- 			push16(value->transmission_power, ppWritePackedMsg, end));
-@@ -545,6 +549,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac
- {
- 	nfapi_dl_config_request_body_t* value = (nfapi_dl_config_request_body_t*)tlv;
- 
-+        //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() dci:%u pdu:%u pdsch:%u rnti:%u pcfich:%u\n", __FUNCTION__, value->number_dci, value->number_pdu, value->number_pdsch_rnti, value->transmission_power_pcfich);
-+
- 	if(!(push8(value->number_pdcch_ofdm_symbols, ppWritePackedMsg, end) &&
- 		 push8(value->number_dci, ppWritePackedMsg, end) &&
- 		 push16(value->number_pdu, ppWritePackedMsg, end) &&
-@@ -574,6 +580,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac
- 		{
- 			case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE:
- 				{
-+                                  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE\n", __FUNCTION__);
-+
- 					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
- 					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
- 					pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
-@@ -587,6 +595,8 @@ static uint8_t pack_dl_config_request_body_value(void* tlv, uint8_t **ppWritePac
- 				break;
- 			case NFAPI_DL_CONFIG_BCH_PDU_TYPE:
- 				{
-+                                  //NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() NFAPI_DL_CONFIG_BCH_PDU_TYPE\n", __FUNCTION__);
-+
- 					if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_bch_pdu_rel8_value)))
- 						return 0;
- 				}
-@@ -684,10 +694,21 @@ static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uin
- {
- 	nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t*)msg;
- 	
--	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
--			 pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) &&
--			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-+	//return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-+			 //pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value) &&
-+			 //pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-+        { 
-+          uint8_t x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-+          uint8_t y = pack_tlv(NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, ppWritePackedMsg, end, &pack_dl_config_request_body_value);
-+          uint8_t z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
- 
-+          if (!x || !y || !z)
-+          {
-+            NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST x:%u y:%u z:%u \n", __FUNCTION__,x,y,z);
-+          }
-+
-+          return x && y && z;
-+        }
- }
- 
- static uint8_t pack_ul_config_request_ulsch_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t * end)
-@@ -796,9 +817,10 @@ static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppW
- 					if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
- 						return 0;
- 
--					if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0)
-+                                        uint8_t j;
-+                                        for(j = 0; j < 8; ++j)
- 					{
--						if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, ppWritePackedMsg, end) == 0)
-+                                              if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], ppWritePackedMsg, end) == 0)
- 							return 0;
- 					}
- 				}
-@@ -1518,7 +1540,21 @@ static uint8_t pack_tx_request_body_value(void* tlv, uint8_t **ppWritePackedMsg,
- 		for(j = 0; j < pdu->num_segments; ++j)
- 		{
- 			// Use -1 as it is unbounded 
--			if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
-+			// DJP - does not handle -1
-+                        // DJP - if(pusharray8(pdu->segments[j].segment_data, (uint32_t)(-1), pdu->segments[j].segment_length, ppWritePackedMsg, end) == 0)
-+			int push_ret = pusharray8(pdu->segments[j].segment_data, 65535, pdu->segments[j].segment_length, ppWritePackedMsg, end);
-+                        
-+                        if (0 && pdu->segments[j].segment_length == 3)
-+                        {
-+                          NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, 
-+                          pdu->segments[j].segment_data[0], 
-+                          pdu->segments[j].segment_data[1], 
-+                          pdu->segments[j].segment_data[2]
-+                          );
-+                        }
-+                        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() segment_data:%p segment_length:%u pusharray8()=%d\n", __FUNCTION__, pdu->segments[j].segment_data, pdu->segments[j].segment_length, push_ret);
-+
-+                        if (push_ret == 0)
- 			{
- 				return 0;
- 			}
-@@ -1532,9 +1568,13 @@ static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *e
- {
- 	nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t*)msg;
- 	
--	return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
--			 pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value) &&
--			 pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-+	int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-+        int y = pack_tlv(NFAPI_TX_REQUEST_BODY_TAG, &pNfapiMsg->tx_request_body, ppWritePackedMsg, end, &pack_tx_request_body_value);
-+        int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-+
-+        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() x:%d y:%d z:%d\n", __FUNCTION__, x, y, z);
-+
-+        return x && y && z;
- }
- 
- static uint8_t pack_rx_ue_information_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
-@@ -1844,6 +1884,8 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP
- {
- 	nfapi_rx_indication_body_t* value = (nfapi_rx_indication_body_t*)tlv;
- 
-+        //printf("RX ULSCH BODY\n");
-+
- 	if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
- 		return 0;
- 
-@@ -1851,21 +1893,26 @@ static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWriteP
- 	uint16_t i = 0;
- 	uint16_t offset = 2; // taking into account the number_of_pdus
- 	uint16_t total_number_of_pdus = value->number_of_pdus;
-+        //printf("ULSCH:pdus:%d\n", total_number_of_pdus);
-+
- 	for(i = 0; i < total_number_of_pdus; ++i)
- 	{
- 		nfapi_rx_indication_pdu_t* pdu = &(value->rx_pdu_list[i]);
- 		if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG)
- 		{
-+                  //printf("NFAPI_RX_UE_INFORMATION_TAG\n");
- 			offset += 4 + 6; 
- 		}
- 				
- 		if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG)
- 		{
-+                  //printf("NFAPI_RX_INDICATION_REL8_TAG\n");
- 			offset += 4 + 7;
- 		}
- 
- 		if(pdu->rx_indication_rel9.tl.tag == NFAPI_RX_INDICATION_REL9_TAG)
- 		{
-+                  //printf("NFAPI_RX_INDICATION_REL9_TAG\n");
- 			offset += 4 + 2;
- 		}
- 	}
-@@ -2592,11 +2639,16 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
- 		return -1;
- 	}
- 
-+        if (pMessageHeader->message_id != NFAPI_TIMING_INFO)
-+        {
-+          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() message_id:0x%04x phy_id:%u m_segment_sequence:%u timestamp:%u\n", __FUNCTION__, pMessageHeader->message_id, pMessageHeader->phy_id, pMessageHeader->m_segment_sequence, pMessageHeader->transmit_timestamp);
-+        }
- 	// look for the specific message
- 	uint8_t result = 0;
- 	switch (pMessageHeader->message_id)
- 	{
- 		case NFAPI_DL_CONFIG_REQUEST:
-+                  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_DL_CONFIG_REQUEST\n", __FUNCTION__);
- 			result = pack_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
- 			break;
- 
-@@ -2609,6 +2661,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
- 			break;
- 
- 		case NFAPI_TX_REQUEST:
-+                        //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() NFAPI_TX_REQUEST\n", __FUNCTION__);
- 			result = pack_tx_request(pMessageHeader, &pWritePackedMessage, end, config);
- 			break;
- 
-@@ -2621,6 +2674,7 @@ int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBu
- 			break;
- 
- 		case NFAPI_RX_ULSCH_INDICATION:
-+                        //printf("RX ULSCH\n");
- 			result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
- 			break;
- 
-@@ -3482,9 +3536,10 @@ static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppRe
- 					if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
- 						return 0;
- 
--					if(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size > 0)
-+                                        uint8_t j;
-+                                        for(j = 0; j < 8; ++j)
- 					{
--						if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size, end) == 0)
-+						if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].dl_cqi_pmi_size[j], end) == 0)
- 							return 0;
- 					}
- 				}
-@@ -4394,6 +4449,14 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
- 					{
- 						if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
- 							return 0;
-+                                                if (0 && pdu->segments[0].segment_length == 3)
-+                                                {
-+                                                  NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() BCH? segment_data:%x %x %x\n", __FUNCTION__, 
-+                                                      pdu->segments[0].segment_data[0], 
-+                                                      pdu->segments[0].segment_data[1], 
-+                                                      pdu->segments[0].segment_data[2]
-+                                                      );
-+                                                }
- 					}
- 					else
- 					{
-diff --git a/pnf/public_inc/nfapi_pnf_interface.h b/pnf/public_inc/nfapi_pnf_interface.h
-index f93624d..b25caf2 100644
---- a/pnf/public_inc/nfapi_pnf_interface.h
-+++ b/pnf/public_inc/nfapi_pnf_interface.h
-@@ -319,10 +319,10 @@ typedef struct nfapi_pnf_config
-  *  0 will be returned if it fails.
-  * 
-  * \code
-- * nfapi_pnf_config_t* config = nfapi_pnf_config_create();
-+ * nfapi_pnf_config_t* config = nfapi_pnf_config_create(void);
-  * \endcode
-  */
--nfapi_pnf_config_t* nfapi_pnf_config_create();
-+nfapi_pnf_config_t* nfapi_pnf_config_create(void);
- 
- /*! Delete a pnf configuration 
-  * \param config A pointer to a pnf configuraiton
-@@ -681,7 +681,7 @@ typedef struct nfapi_pnf_p7_config
- /*! Create and initialise a nfapi_pnf_p7_config structure
-  * \return A pointer to a PNF P7 config structure
-  */
--nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create();
-+nfapi_pnf_p7_config_t* nfapi_pnf_p7_config_create(void);
- 
- /*! Delete an nfapi_pnf_p7_config structure
-  * \param config 
-diff --git a/pnf/src/pnf.c b/pnf/src/pnf.c
-index d6cf364..d0a7fa6 100644
---- a/pnf/src/pnf.c
-+++ b/pnf/src/pnf.c
-@@ -412,10 +412,10 @@ void pnf_handle_start_request(pnf_t* pnf, void *pRecvMsg, int recvMsgLen)
- 	{
- 		nfapi_start_request_t req;
- 	
--		NFAPI_TRACE(NFAPI_TRACE_INFO, "START.request received\n");
--	
- 		nfapi_pnf_config_t* config = &(pnf->_public);
- 	
-+		NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() START.request received state:%d\n", __FUNCTION__, config->state);
-+	
- 		// unpack the message
- 		if (nfapi_p5_message_unpack(pRecvMsg, recvMsgLen, &req, sizeof(req), &config->codec_config) >= 0)
- 		{
-diff --git a/pnf/src/pnf_interface.c b/pnf/src/pnf_interface.c
-index 74f29a0..7310fc0 100644
---- a/pnf/src/pnf_interface.c
-+++ b/pnf/src/pnf_interface.c
-@@ -76,6 +76,7 @@ int nfapi_pnf_start(nfapi_pnf_config_t* config)
- 
- 		sleep(1);
- 	}
-+	NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() terminate=1 - EXITTING............\n", __FUNCTION__);
- 
- 	return 0;
- }
-@@ -227,7 +228,7 @@ int nfapi_pnf_start_resp(nfapi_pnf_config_t* config, nfapi_start_response_t* res
- 	}
- 	else
- 	{
--		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknow phy id %d\n", __FUNCTION__, resp->header.phy_id);
-+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: unknown phy id %d\n", __FUNCTION__, resp->header.phy_id);
- 		return -1;
- 	}
- 
-diff --git a/pnf/src/pnf_p7.c b/pnf/src/pnf_p7.c
-index 0fd7828..02b828d 100644
---- a/pnf/src/pnf_p7.c
-+++ b/pnf/src/pnf_p7.c
-@@ -25,12 +25,64 @@
- #include <unistd.h>
- #include <errno.h>
- #include <pthread.h>
-+#include <stdio.h>
- 
- #include "pnf_p7.h"
- 
- #define FAPI2_IP_DSCP	0
- 
--uint32_t get_current_time_hr()
-+extern uint16_t sf_ahead;
-+//uint16_t sf_ahead=4;
-+
-+void add_sf(uint16_t *frameP, uint16_t *subframeP, int offset)
-+{
-+    *frameP    = *frameP + ((*subframeP + offset) / 10);
-+
-+    *subframeP = ((*subframeP + offset) % 10);
-+}
-+
-+void subtract_sf(uint16_t *frameP, uint16_t *subframeP, int offset)
-+{
-+  if (*subframeP < offset)
-+  {
-+    *frameP = (*frameP+1024-1)%1024;
-+  }
-+  *subframeP = (*subframeP+10-offset)%10;
-+}
-+
-+uint16_t sfnsf_add_sf(uint16_t sfnsf, int offset)
-+{
-+  uint16_t new_sfnsf;
-+  uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf);
-+  uint16_t sf  = NFAPI_SFNSF2SF(sfnsf);
-+
-+  //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf);
-+  add_sf(&sfn, &sf, offset);
-+
-+  new_sfnsf = sfn<<4|sf;
-+
-+  //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf));
-+
-+  return new_sfnsf;
-+}
-+
-+uint16_t sfnsf_subtract_sf(uint16_t sfnsf, int offset)
-+{
-+  uint16_t new_sfnsf;
-+  uint16_t sfn = NFAPI_SFNSF2SFN(sfnsf);
-+  uint16_t sf  = NFAPI_SFNSF2SF(sfnsf);
-+
-+  //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf);
-+  subtract_sf(&sfn, &sf, offset);
-+
-+  new_sfnsf = sfn<<4|sf;
-+
-+  //printf("%s() offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf));
-+
-+  return new_sfnsf;
-+}
-+
-+uint32_t pnf_get_current_time_hr(void)
- {
- 	struct timeval now;
- 	(void)gettimeofday(&now, NULL);
-@@ -64,11 +116,14 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr)
- // todo : for now these just malloc/free need to move to a memory cache
- nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) 
- { 
--	return pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t));
-+	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t));
-+        //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
-+        return ptr;
- }
- 
- void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t* pnf_p7) 
- { 
-+  //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->dl_config_request_body.dl_config_pdu_list);
- 	if(pnf_p7->_public.codec_config.deallocate)
- 	{
- 		(pnf_p7->_public.codec_config.deallocate)(req->dl_config_request_body.dl_config_pdu_list);
-@@ -77,17 +132,21 @@ void deallocate_nfapi_dl_config_request(nfapi_dl_config_request_t* req, pnf_p7_t
- 	{
- 		free(req->dl_config_request_body.dl_config_pdu_list);
- 	}
-+        req->dl_config_request_body.dl_config_pdu_list=0;
- 
- 	pnf_p7_free(pnf_p7, req);
- }
- 
- nfapi_ul_config_request_t* allocate_nfapi_ul_config_request(pnf_p7_t* pnf_p7) 
- { 
--	return pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t));
-+	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_ul_config_request_t));
-+        //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
-+        return ptr;
- }
- 
- void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t* pnf_p7) 
- { 
-+  //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->ul_config_request_body.ul_config_pdu_list);
- 	if(pnf_p7->_public.codec_config.deallocate)
- 	{
- 		(pnf_p7->_public.codec_config.deallocate)(req->ul_config_request_body.ul_config_pdu_list);
-@@ -96,6 +155,7 @@ void deallocate_nfapi_ul_config_request(nfapi_ul_config_request_t* req, pnf_p7_t
- 	{
- 		free(req->ul_config_request_body.ul_config_pdu_list);
- 	}
-+        req->ul_config_request_body.ul_config_pdu_list=0;
- 
- 	pnf_p7_free(pnf_p7, req);
- }
-@@ -107,6 +167,7 @@ nfapi_hi_dci0_request_t* allocate_nfapi_hi_dci0_request(pnf_p7_t* pnf_p7)
- 
- void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pnf_p7) 
- { 
-+  //printf("%s() SFN/SF:%d %s req:%p pdu_list:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->hi_dci0_request_body.hi_dci0_pdu_list);
- 	if(pnf_p7->_public.codec_config.deallocate)
- 	{
- 		(pnf_p7->_public.codec_config.deallocate)(req->hi_dci0_request_body.hi_dci0_pdu_list);
-@@ -115,6 +176,7 @@ void deallocate_nfapi_hi_dci0_request(nfapi_hi_dci0_request_t* req, pnf_p7_t* pn
- 	{
- 		free(req->hi_dci0_request_body.hi_dci0_pdu_list);
- 	}
-+        req->hi_dci0_request_body.hi_dci0_pdu_list=0;
- 
- 	pnf_p7_free(pnf_p7, req);
- }
-@@ -127,6 +189,9 @@ nfapi_tx_request_t* allocate_nfapi_tx_request(pnf_p7_t* pnf_p7)
- void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7) 
- { 
- 	int i = 0;
-+
-+  //printf("%s() SFN/SF:%d %s req:%p pdu[0]:data:%p\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pnf_p7->_public.codec_config.deallocate ? "DEALLOCATE" : "FREE", req, req->tx_request_body.tx_pdu_list[i].segments[0].segment_data);
-+
- 	for(i = 0; i < req->tx_request_body.number_of_pdus; ++i)
- 	{
- 		void* data = req->tx_request_body.tx_pdu_list[i].segments[0].segment_data;
-@@ -139,6 +204,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7)
- 		{
- 			free(data);
- 		}
-+                data=0;
- 	}
- 
- 
-@@ -150,6 +216,7 @@ void deallocate_nfapi_tx_request(nfapi_tx_request_t* req, pnf_p7_t* pnf_p7)
- 	{
- 		free(req->tx_request_body.tx_pdu_list);
- 	}
-+        req->tx_request_body.tx_pdu_list=0;
- 
- 	pnf_p7_free(pnf_p7, req);
- }
-@@ -169,6 +236,7 @@ void deallocate_nfapi_lbt_dl_config_request(nfapi_lbt_dl_config_request_t* req,
- 	{
- 		free(req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list);
- 	}
-+        req->lbt_dl_config_request_body.lbt_dl_config_req_pdu_list=0;
- 
- 	pnf_p7_free(pnf_p7, req);
- }
-@@ -307,11 +375,11 @@ void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reas
- }
- 
- 
--uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr)
-+static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr)
- {
- 	if(now_hr < sf_start_hr)
- 	{
--		NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier that start of subframe\n");
-+		NFAPI_TRACE(NFAPI_TRACE_INFO, "now is earlier than start of subframe now_hr:%u sf_start_hr:%u\n", now_hr, sf_start_hr);
- 		return 0;
- 	}
- 	else
-@@ -482,29 +550,41 @@ void pnf_pack_and_send_timing_info(pnf_p7_t* pnf_p7)
- 
- void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf)
- {
-+  struct timespec t;
-+  clock_gettime( CLOCK_MONOTONIC, &t);
-+
-+  //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(sfn_sf:%d) t:%ld.%09ld\n", __FUNCTION__, NFAPI_SFNSF2DEC(sfn_sf), t.tv_sec, t.tv_nsec);
-+
-+	if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req)
-+	{
-+		pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf;
-+		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - enter\n");
-+		(pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req);
-+		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy tx_req - exit\n");
-+	}
- 	if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req)
- 	{
- 		pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf;
-+		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - enter\n");
- 		(pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req);
-+		//NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy dl_config_req - exit\n");
- 	}
- 	if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req)
- 	{
- 		pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf;
-+		NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy ul_config_req - enter\n");
- 		(pnf_p7->_public.ul_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.ul_config_req);
- 	}
- 	if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req)
- 	{
- 		pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf;
-+		NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy hi_dci0 - enter\n");
- 		(pnf_p7->_public.hi_dci0_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.hi_dci0_req);
- 	}
--	if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req)
--	{
--		pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf;
--		(pnf_p7->_public.tx_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.tx_req);
--	}
- 	if(pnf_p7->_public.lbt_dl_config_req && pnf_p7->_public.dummy_subframe.lbt_dl_config_req)
- 	{
- 		pnf_p7->_public.dummy_subframe.lbt_dl_config_req->sfn_sf = sfn_sf;
-+		NFAPI_TRACE(NFAPI_TRACE_INFO, "Dummy lbt - enter\n");
- 		(pnf_p7->_public.lbt_dl_config_req)(&pnf_p7->_public, pnf_p7->_public.dummy_subframe.lbt_dl_config_req);
- 	}
- }
-@@ -526,10 +606,14 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 		return -1;
- 	}
- 
-+#if 1
- 	// save the curren time and sfn_sf
--	pnf_p7->sf_start_time_hr = get_current_time_hr();
-+	pnf_p7->sf_start_time_hr = pnf_get_current_time_hr();
- 	pnf_p7->sfn_sf = sfn_sf;
- 
-+        uint32_t sfn_sf_tx = sfnsf_add_sf(sfn_sf, sf_ahead);
-+        uint32_t tx_sfn_sf_dec = NFAPI_SFNSF2DEC(sfn_sf_tx);
-+
- 	// If the subframe_buffer has been configured
- 	if(pnf_p7->_public.subframe_buffer_size != 0)
- 	{
-@@ -550,6 +634,10 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 			NFAPI_TRACE(NFAPI_TRACE_INFO, "Applying shift %d to sfn/sf (%d -> %d)\n", pnf_p7->sfn_sf_shift, NFAPI_SFNSF2DEC(sfn_sf), shifted_sfn_sf);
- 			sfn_sf = shifted_sfn_sf;
- 
-+                        //
-+                        // DJP - why does the shift not apply to pnf_p7->sfn_sf???
-+                        //
-+
- 			pnf_p7->sfn_sf_shift = 0;
- 		}
- 
-@@ -558,77 +646,119 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 
- 		nfapi_pnf_p7_subframe_buffer_t* subframe_buffer = &(pnf_p7->subframe_buffer[buffer_index]);
- 
-+		uint8_t tx_buffer_index = tx_sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
-+		nfapi_pnf_p7_subframe_buffer_t* tx_subframe_buffer = &(pnf_p7->subframe_buffer[tx_buffer_index]);
-+
-+                //printf("sfn_sf_dec:%d tx_sfn_sf_dec:%d\n", sfn_sf_dec, tx_sfn_sf_dec);
-+
-+                if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d subframe_buffer->sfn_sf:%d tx_subframe_buffer->sfn_sf:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] "
-+                    "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", 
-+                    __FUNCTION__, 
-+                    pnf_p7->sfn_sf_shift, 
-+                    NFAPI_SFNSF2DEC(subframe_buffer->sfn_sf), 
-+                    NFAPI_SFNSF2DEC(tx_subframe_buffer->sfn_sf), 
-+                       sfn_sf_dec,    buffer_index,    subframe_buffer->dl_config_req,    subframe_buffer->tx_req, 
-+                    tx_sfn_sf_dec, tx_buffer_index, tx_subframe_buffer->dl_config_req, tx_subframe_buffer->tx_req);
-+
- 		// if the subframe buffer sfn sf is set then we have atlease 1 message
- 		// from the vnf. 
- 		// todo : how to handle the messages we don't have, send dummies for
- 		// now
--		if(subframe_buffer->sfn_sf == sfn_sf)
-+
-+                //printf("tx_subframe_buffer->sfn_sf:%d sfn_sf_tx:%d\n", tx_subframe_buffer->sfn_sf, sfn_sf_tx);
-+                //printf("subframe_buffer->sfn_sf:%d sfn_sf:%d\n", subframe_buffer->sfn_sf, sfn_sf);
-+		if(tx_subframe_buffer->sfn_sf == sfn_sf_tx)
- 		{
--			if(subframe_buffer->dl_config_req != 0)
-+			if(tx_subframe_buffer->tx_req != 0)
- 			{
--				if(pnf_p7->_public.dl_config_req)
--					(pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), subframe_buffer->dl_config_req);
-+				if(pnf_p7->_public.tx_req)
-+					(pnf_p7->_public.tx_req)(&(pnf_p7->_public), tx_subframe_buffer->tx_req);
- 
--				deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7);
-+				//deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7);
- 			}
- 			else
- 			{
- 				// send dummy
--				if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req)
-+				if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req)
- 				{
--					pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf;
--					(pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req);
-+					pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf_tx;
-+					(pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req);
- 				}
- 			}
- 
--			if(subframe_buffer->ul_config_req != 0)
-+			if(tx_subframe_buffer->dl_config_req != 0)
- 			{
--				if(pnf_p7->_public.ul_config_req)
--					(pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req);
-+				if(pnf_p7->_public.dl_config_req)
-+					(pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), tx_subframe_buffer->dl_config_req);
- 
--				deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7);
-+				//deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7);
- 			}
- 			else
- 			{
- 				// send dummy
--				if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req)
-+				if(pnf_p7->_public.dl_config_req && pnf_p7->_public.dummy_subframe.dl_config_req)
- 				{
--					pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf;
--					(pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req);
-+					pnf_p7->_public.dummy_subframe.dl_config_req->sfn_sf = sfn_sf_tx;
-+					(pnf_p7->_public.dl_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.dl_config_req);
- 				}
- 			}
- 
--			if(subframe_buffer->hi_dci0_req != 0)
-+			if(tx_subframe_buffer->hi_dci0_req != 0)
- 			{
- 				if(pnf_p7->_public.hi_dci0_req)
--					(pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), subframe_buffer->hi_dci0_req);
-+					(pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), tx_subframe_buffer->hi_dci0_req);
- 
--				deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7);
-+				//deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7);
- 			}
- 			else
- 			{
- 				//send dummy
- 				if(pnf_p7->_public.hi_dci0_req && pnf_p7->_public.dummy_subframe.hi_dci0_req)
- 				{
--					pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf;
-+					pnf_p7->_public.dummy_subframe.hi_dci0_req->sfn_sf = sfn_sf_tx;
- 					(pnf_p7->_public.hi_dci0_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.hi_dci0_req);
- 				}
- 			}
- 
--			if(subframe_buffer->tx_req != 0)
-+                        if(tx_subframe_buffer->dl_config_req != 0)
-+                        {
-+                          deallocate_nfapi_dl_config_request(tx_subframe_buffer->dl_config_req, pnf_p7);
-+                          tx_subframe_buffer->dl_config_req = 0;
-+                        }
-+			if(tx_subframe_buffer->tx_req != 0)
-+                        {
-+                          deallocate_nfapi_tx_request(tx_subframe_buffer->tx_req, pnf_p7);
-+                          tx_subframe_buffer->tx_req = 0;
-+                        }
-+                        if(tx_subframe_buffer->hi_dci0_req != 0)
-+                        {
-+                          deallocate_nfapi_hi_dci0_request(tx_subframe_buffer->hi_dci0_req, pnf_p7);
-+                          tx_subframe_buffer->hi_dci0_req = 0;
-+                        }
-+                }
-+		else
-+		{
-+                  // If we ever need to "send" a dummy ul_config this won't work!!!
-+                  send_dummy_subframe(pnf_p7, sfn_sf_tx);
-+		}
-+
-+                if(subframe_buffer->sfn_sf == sfn_sf)
-+		{
-+
-+			if(subframe_buffer->ul_config_req != 0)
- 			{
--				if(pnf_p7->_public.tx_req)
--					(pnf_p7->_public.tx_req)(&(pnf_p7->_public), subframe_buffer->tx_req);
-+				if(pnf_p7->_public.ul_config_req)
-+					(pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), subframe_buffer->ul_config_req);
- 
--				deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7);
-+				//deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7);
- 			}
- 			else
- 			{
- 				// send dummy
--				if(pnf_p7->_public.tx_req && pnf_p7->_public.dummy_subframe.tx_req)
-+				if(pnf_p7->_public.ul_config_req && pnf_p7->_public.dummy_subframe.ul_config_req)
- 				{
--					pnf_p7->_public.dummy_subframe.tx_req->sfn_sf = sfn_sf;
--					(pnf_p7->_public.tx_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.tx_req);
-+					pnf_p7->_public.dummy_subframe.ul_config_req->sfn_sf = sfn_sf;
-+					(pnf_p7->_public.ul_config_req)(&(pnf_p7->_public), pnf_p7->_public.dummy_subframe.ul_config_req);
- 				}
- 			}
- 
-@@ -637,7 +767,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 				if(pnf_p7->_public.lbt_dl_config_req)
- 					(pnf_p7->_public.lbt_dl_config_req)(&(pnf_p7->_public), subframe_buffer->lbt_dl_config_req);
- 
--				deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7);
-+				//deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7);
- 			}
- 			else
- 			{
-@@ -650,14 +780,35 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 
- 			}
- 
--			memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t));
--			pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1;
--		}
--		else
--		{
--			send_dummy_subframe(pnf_p7, sfn_sf);
-+                        //if(subframe_buffer->dl_config_req != 0)
-+                          //deallocate_nfapi_dl_config_request(subframe_buffer->dl_config_req, pnf_p7);
-+			//if(subframe_buffer->tx_req != 0)
-+                          //deallocate_nfapi_tx_request(subframe_buffer->tx_req, pnf_p7);
-+                        if(subframe_buffer->ul_config_req != 0)
-+                        {
-+                          deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7);
-+                          subframe_buffer->ul_config_req = 0;
-+
-+                        }
-+                        //if(subframe_buffer->hi_dci0_req != 0)
-+                          //deallocate_nfapi_hi_dci0_request(subframe_buffer->hi_dci0_req, pnf_p7);
-+			if(subframe_buffer->lbt_dl_config_req != 0)
-+                        {
-+                          deallocate_nfapi_lbt_dl_config_request(subframe_buffer->lbt_dl_config_req, pnf_p7);
-+                          subframe_buffer->lbt_dl_config_req = 0;
-+                        }
-+                } // sfn_sf match
-+
-+                if (subframe_buffer->dl_config_req == 0 && subframe_buffer->tx_req == 0 && subframe_buffer->ul_config_req == 0 && subframe_buffer->lbt_dl_config_req == 0)
-+                {
-+                  memset(&(pnf_p7->subframe_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_subframe_buffer_t));
-+                  pnf_p7->subframe_buffer[buffer_index].sfn_sf = -1;
- 		}
- 
-+                //printf("pnf_p7->_public.timing_info_mode_periodic:%d pnf_p7->timing_info_period_counter:%d pnf_p7->_public.timing_info_period:%d\n", pnf_p7->_public.timing_info_mode_periodic, pnf_p7->timing_info_period_counter, pnf_p7->_public.timing_info_period);
-+                //printf("pnf_p7->_public.timing_info_mode_aperiodic:%d pnf_p7->timing_info_aperiodic_send:%d\n", pnf_p7->_public.timing_info_mode_aperiodic, pnf_p7->timing_info_aperiodic_send);
-+                //printf("pnf_p7->timing_info_ms_counter:%d\n", pnf_p7->timing_info_ms_counter);
-+
- 		// send the periodic timing info if configured
- 		if(pnf_p7->_public.timing_info_mode_periodic && (pnf_p7->timing_info_period_counter++) == pnf_p7->_public.timing_info_period)
- 		{
-@@ -678,14 +829,15 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 	}
- 	else
- 	{
--		send_dummy_subframe(pnf_p7, sfn_sf);
-+		//send_dummy_subframe(pnf_p7, sfn_sf_tx);
- 	}
- 
- 
-+        //printf("pnf_p7->tick:%d\n", pnf_p7->tick);
- 	if(pnf_p7->tick == 1000)
- 	{
- 
--		NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id,
-+		NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF P7:%d] (ONTIME/LATE) DL:(%d/%d) UL:(%d/%d) HI:(%d/%d) TX:(%d/%d)\n", pnf_p7->_public.phy_id,
- 					pnf_p7->stats.dl_conf_ontime, pnf_p7->stats.dl_conf_late, 
- 					pnf_p7->stats.ul_conf_ontime, pnf_p7->stats.ul_conf_late, 
- 					pnf_p7->stats.hi_dci0_ontime, pnf_p7->stats.hi_dci0_late, 
-@@ -694,6 +846,7 @@ int pnf_p7_subframe_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn_sf)
- 		memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats));
- 	}
- 	pnf_p7->tick++;
-+#endif
- 
- 	if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
- 	{
-@@ -724,7 +877,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
- 			if(recv_sfn_sf_dec > ((current_sfn_sf_dec + timing_window) % NFAPI_MAX_SFNSFDEC))
- 			{
- 				// out of window
--				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec);
-+				NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is late %d (with wrap)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec);
- 			}
- 			else
- 			{
-@@ -736,7 +889,7 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
- 		else
- 		{
- 			// too late
--			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec));
-+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in late %d (delta:%d)\n", current_sfn_sf_dec, name, recv_sfn_sf_dec, (current_sfn_sf_dec - recv_sfn_sf_dec));
- 		}
- 
- 	}
-@@ -751,8 +904,8 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
- 		}
- 		else
- 		{
--			// to far in the future
--			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (%d) [%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec,  (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window);
-+			// too far in the future
-+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is out of window %d (delta:%d) [max:%d]\n", current_sfn_sf_dec, name, recv_sfn_sf_dec,  (recv_sfn_sf_dec - current_sfn_sf_dec), timing_window);
- 		}
- 
- 	}
-@@ -785,15 +938,35 @@ void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
- 			return;
- 		}
- 
--		if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7))
--		{
--			uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
--			uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
-+                if (
-+                    0 && 
-+                    (NFAPI_SFNSF2DEC(req->sfn_sf) % 100 ==0 ||
-+                     NFAPI_SFNSF2DEC(req->sfn_sf) % 105 ==0 
-+                    )
-+                )
-+                  NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req sfn_sf:%d pdcch:%u dci:%u pdu:%u pdsch_rnti:%u pcfich:%u\n", 
-+                      NFAPI_SFNSF2DEC(req->sfn_sf),
-+                      req->dl_config_request_body.number_pdcch_ofdm_symbols,
-+                      req->dl_config_request_body.number_dci,
-+                      req->dl_config_request_body.number_pdu,
-+                      req->dl_config_request_body.number_pdsch_rnti,
-+                      req->dl_config_request_body.transmission_power_pcfich
-+                      );
-+
-+                if(is_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7))
-+                {
-+                  uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
-+                  uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
-+
-+                        struct timespec t;
-+                        clock_gettime(CLOCK_MONOTONIC, &t);
-+
-+                  NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index);
- 
- 			// if there is already an dl_config_req make sure we free it.
- 			if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0)
- 			{
--				NFAPI_TRACE(NFAPI_TRACE_NOTE, "HERE HERE HERE\n");
-+				NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_sf:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), buffer_index);
- 				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", 
- 				//			pMyPhyInfo->sfnSf, bufferIdx,
- 				//			SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
-@@ -860,6 +1033,11 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
- 			uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
- 			uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
- 
-+                        struct timespec t;
-+                        clock_gettime(CLOCK_MONOTONIC, &t);
-+
-+                        NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE UL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index);
-+
- 			if(pnf_p7->subframe_buffer[buffer_index].ul_config_req != 0)
- 			{
- 				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing ul_config_req at index %d (%d/%d)", 
-@@ -876,7 +1054,7 @@ void pnf_handle_ul_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_
- 		}
- 		else
- 		{
--			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req SFN/SF %d/%d\n", pMyPhyInfo->sfnSf, SFNSF2SFN(req->sfn_sf), SFNSF2SF(req->sfn_sf));
-+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] NOT storing ul_config_req OUTSIDE OF TRANSMIT BUFFER WINDOW SFN/SF %d\n", NFAPI_SFNSF2DEC(pnf_p7->sfn_sf), NFAPI_SFNSF2DEC(req->sfn_sf));
- 			deallocate_nfapi_ul_config_request(req, pnf_p7);
- 
- 			if(pnf_p7->_public.timing_info_mode_aperiodic)
-@@ -994,6 +1172,16 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
- 			uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
- 			uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
- 
-+                        struct timespec t;
-+                        clock_gettime(CLOCK_MONOTONIC, &t);
-+
-+                        NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE TX_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index);
-+
-+                        if (0 && NFAPI_SFNSF2DEC(req->sfn_sf)%100==0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() TX_REQ.req sfn_sf:%d pdus:%d - TX_REQ is within window\n",
-+                            __FUNCTION__,
-+                            NFAPI_SFNSF2DEC(req->sfn_sf),
-+                            req->tx_request_body.number_of_pdus);
-+
- 			if(pnf_p7->subframe_buffer[buffer_index].tx_req != 0)
- 			{
- 				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing tx_req at index %d (%d/%d)", 
-@@ -1010,6 +1198,8 @@ void pnf_handle_tx_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
- 		}
- 		else
- 		{
-+                  NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() TX_REQUEST Request is outside of window REQ:SFN_SF:%d CURR:SFN_SF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), NFAPI_SFNSF2DEC(pnf_p7->sfn_sf));
-+
- 			deallocate_nfapi_tx_request(req, pnf_p7);
- 
- 			if(pnf_p7->_public.timing_info_mode_aperiodic)
-@@ -1126,12 +1316,27 @@ uint32_t calculate_t2(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t
- 	uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr);
- 	uint32_t t2 = (NFAPI_SFNSF2DEC(sfn_sf) * 1000) + sf_time_us;
- 
-+        if (0)
-+        {
-+          static uint32_t prev_t2 = 0;
-+
-+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s(now_time_hr:%u sfn_sf:%d sf_start_time_Hr:%u) sf_time_us:%u t2:%u prev_t2:%u diff:%u\n",
-+              __FUNCTION__,
-+              now_time_hr, NFAPI_SFNSF2DEC(sfn_sf), sf_start_time_hr,
-+              sf_time_us,
-+              t2,
-+              prev_t2,
-+              t2-prev_t2);
-+
-+          prev_t2 = t2;
-+        }
-+
- 	return t2;
- }
- 
- uint32_t calculate_t3(uint16_t sfn_sf, uint32_t sf_start_time_hr)
- {
--	uint32_t now_time_hr = get_current_time_hr();
-+	uint32_t now_time_hr = pnf_get_current_time_hr();
- 
- 	uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr);
- 
-@@ -1391,6 +1596,8 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
- 			// read the segment
- 			recvfrom_result = recvfrom(pnf_p7->p7_sock, pnf_p7->rx_message_buffer, header.message_length, MSG_DONTWAIT, (struct sockaddr*)&remote_addr, &remote_addr_size);
- 
-+		now_hr_time = pnf_get_current_time_hr(); //DJP - moved to here - get closer timestamp???
-+
- 			if(recvfrom_result > 0)
- 			{
- 				pnf_handle_p7_message(pnf_p7->rx_message_buffer, recvfrom_result, pnf_p7, now_hr_time);
-@@ -1417,7 +1624,10 @@ void pnf_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_time)
- 
- 		// need to update the time as we would only use the value from the
- 		// select
--		now_hr_time = get_current_time_hr();
-+#if 0
-+// DJP - why do this here and not on return from recv???
-+		now_hr_time = pnf_get_current_time_hr();
-+#endif
- 	}
- 	while(recvfrom_result > 0);
- }
-@@ -1512,7 +1722,7 @@ int pnf_p7_message_pump(pnf_p7_t* pnf_p7)
- 
- 		selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout);
- 
--		uint32_t now_hr_time = get_current_time_hr();
-+		uint32_t now_hr_time = pnf_get_current_time_hr();
- 
- 		if(selectRetval == 0)
- 		{	
-diff --git a/pnf_sim/src/main.cpp b/pnf_sim/src/main.cpp
-index 38767d8..e2622cf 100644
---- a/pnf_sim/src/main.cpp
-+++ b/pnf_sim/src/main.cpp
-@@ -1124,16 +1124,18 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind)
- 	rx_ind.header.phy_id = data->p7_config->phy_id;
- 	rx_ind.sfn_sf = ind->sfn_sf;
- 	
--	if(((pnf_info*)(data->config->user_data))->wireshark_test_mode)
-+	if(1)//((pnf_info*)(data->config->user_data))->wireshark_test_mode)
- 	{
- 		rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
--		rx_ind.rx_indication_body.number_of_pdus = 8;
-+		rx_ind.rx_indication_body.number_of_pdus = 1;
- 		
- 		uint8_t rx_data[1024];
- 		
- 		nfapi_rx_indication_pdu_t pdus[rx_ind.rx_indication_body.number_of_pdus];
- 		memset(&pdus, 0, sizeof(pdus));
- 		
-+                strcpy((char*)rx_data, (char*)"123456789");
-+
- 		for(int i = 0; i < rx_ind.rx_indication_body.number_of_pdus;++i)
- 		{
- 		
-@@ -1142,13 +1144,13 @@ int fapi_rx_ulsch_ind(fapi_t* fapi, fapi_rx_ulsch_ind_t* ind)
- 			pdus[i].rx_ue_information.rnti = rand_range(1, 65535);
- 			
- 			pdus[i].rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG;
--			pdus[i].rx_indication_rel8.length = rand_range(0, 1024);
--			pdus[i].rx_indication_rel8.offset = 1;
-+			pdus[i].rx_indication_rel8.length = 10;//rand_range(0, 1024);
-+			pdus[i].rx_indication_rel8.offset = 0;//djp - 1;
- 			pdus[i].rx_indication_rel8.ul_cqi = rand_range(0, 255);
- 			pdus[i].rx_indication_rel8.timing_advance = rand_range(0, 63);
- 			
--			pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG;
--			pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690);
-+			//pdus[i].rx_indication_rel9.tl.tag = NFAPI_RX_INDICATION_REL9_TAG;
-+			//pdus[i].rx_indication_rel9.timing_advance_r9 = rand_range(0, 7690);
- 			
- 			pdus[i].data = &rx_data[0];
- 		}
-diff --git a/vnf/inc/vnf_p7.h b/vnf/inc/vnf_p7.h
-index ab9a335..fc2ab4e 100644
---- a/vnf/inc/vnf_p7.h
-+++ b/vnf/inc/vnf_p7.h
-@@ -116,7 +116,8 @@ typedef struct {
- 	
- } vnf_p7_t;
- 
--uint32_t get_current_time_hr();
-+uint32_t vnf_get_current_time_hr(void);
-+
- uint16_t increment_sfn_sf(uint16_t sfn_sf);
- int vnf_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info);
- int send_mac_subframe_indications(vnf_p7_t* config);
-diff --git a/vnf/public_inc/nfapi_vnf_interface.h b/vnf/public_inc/nfapi_vnf_interface.h
-index 6659e5d..4629013 100644
---- a/vnf/public_inc/nfapi_vnf_interface.h
-+++ b/vnf/public_inc/nfapi_vnf_interface.h
-@@ -450,7 +450,7 @@ typedef struct nfapi_vnf_config
- /*! Creates and initialise the vnf config structure before use
-  * \return A pointer to a vnf config structure
-  */
--nfapi_vnf_config_t* nfapi_vnf_config_create();
-+nfapi_vnf_config_t* nfapi_vnf_config_create(void);
- 
- /*! Delete an vnf config
-  */
-@@ -864,7 +864,7 @@ typedef struct nfapi_vnf_p7_config
- /*! Creates and initializes the nfapi_vnf_p7_config structure before use
-  *  \return A pointer to an allocated vnf p7 configuration
-  */
--nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create();
-+nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create(void);
- 
- /*! Cleanup and delete nfapi_vnf_p7_config structure
-  *  \param config A pointer to an vnf p7 configuration structure
-diff --git a/vnf/src/vnf.c b/vnf/src/vnf.c
-index fea3cf7..6800ee2 100644
---- a/vnf/src/vnf.c
-+++ b/vnf/src/vnf.c
-@@ -82,11 +82,18 @@ void nfapi_vnf_pnf_list_add(nfapi_vnf_config_t* config, nfapi_vnf_pnf_info_t* no
- 
- nfapi_vnf_pnf_info_t* nfapi_vnf_pnf_list_find(nfapi_vnf_config_t* config, int p5_idx)
- {
-+	NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : config->pnf_list:%p\n", __FUNCTION__, config->pnf_list);
-+
- 	nfapi_vnf_pnf_info_t* curr = config->pnf_list;
- 	while(curr != 0)
- 	{
- 		if(curr->p5_idx == p5_idx)
-+                {
-+                  NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->p5_idx:%d p5_idx:%d\n", __FUNCTION__, curr->p5_idx, p5_idx);
- 			return curr;
-+                        }
-+
-+                NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s : curr->next:%p\n", __FUNCTION__, curr->next);
- 
- 		curr = curr->next;
- 	}
-diff --git a/vnf/src/vnf_interface.c b/vnf/src/vnf_interface.c
-index e559730..0aba0a2 100644
---- a/vnf/src/vnf_interface.c
-+++ b/vnf/src/vnf_interface.c
-@@ -342,6 +342,7 @@ int nfapi_vnf_start(nfapi_vnf_config_t* config)
- 				{
- 					NFAPI_TRACE(NFAPI_TRACE_INFO, "PNF connection (fd:%d) accepted from %s:%d \n", p5Sock,  inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
- 					nfapi_vnf_pnf_info_t* pnf = (nfapi_vnf_pnf_info_t*)malloc(sizeof(nfapi_vnf_pnf_info_t));
-+					NFAPI_TRACE(NFAPI_TRACE_INFO, "MALLOC nfapi_vnf_pnf_info_t for pnf_list pnf:%p\n", pnf);
- 					memset(pnf, 0, sizeof(nfapi_vnf_pnf_info_t));
- 					pnf->p5_sock = p5Sock;
- 					pnf->p5_idx = p5_idx++;
-@@ -663,7 +664,7 @@ int nfapi_vnf_allocate_phy(nfapi_vnf_config_t* config, int p5_idx, uint16_t* phy
- 	info->p5_idx = p5_idx;
- 	info->phy_id = vnf->next_phy_id++;
- 
--	info->timing_window = 10;
-+	info->timing_window = 30;       // This seems to override what gets set by the user - why???
- 	info->timing_info_mode = 0x03;
- 	info->timing_info_period = 128;
- 
-diff --git a/vnf/src/vnf_p7.c b/vnf/src/vnf_p7.c
-index 8630385..1304176 100644
---- a/vnf/src/vnf_p7.c
-+++ b/vnf/src/vnf_p7.c
-@@ -15,6 +15,8 @@
-  */
- 
- 
-+#include <time.h>
-+
- #include <sys/time.h>
- #include <stdlib.h>
- #include <string.h>
-@@ -159,7 +161,7 @@ vnf_p7_rx_message_t* vnf_p7_rx_reassembly_queue_add_segment(vnf_p7_t* vnf_p7, vn
- 		msg->sequence_number = sequence_number;
- 		msg->num_segments_expected = m ? 255 : segment_number + 1;
- 		msg->num_segments_received = 1;
--		msg->rx_hr_time = get_current_time_hr();
-+		msg->rx_hr_time = vnf_get_current_time_hr();
- 
- 		msg->segments[segment_number].buffer = (uint8_t*)vnf_p7_malloc(vnf_p7, data_len);
- 		memcpy(msg->segments[segment_number].buffer, data, data_len);
-@@ -216,7 +218,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas
- 	vnf_p7_rx_message_t* iterator = queue->msg_queue;
- 	vnf_p7_rx_message_t* previous = 0;
- 
--	uint32_t rx_hr_time = get_current_time_hr();
-+	uint32_t rx_hr_time = vnf_get_current_time_hr();
- 
- 	while(iterator != 0)
- 	{
-@@ -254,7 +256,7 @@ void vnf_p7_rx_reassembly_queue_remove_old_msgs(vnf_p7_t* vnf_p7, vnf_p7_rx_reas
- 	}
- }
- 
--uint32_t get_current_time_hr()
-+uint32_t vnf_get_current_time_hr()
- {
- 	struct timeval now;
- 	(void)gettimeofday(&now, NULL);
-@@ -297,7 +299,7 @@ struct timespec timespec_delta(struct timespec start, struct timespec end)
- 	return temp;
- }
- 
--uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr)
-+static uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr)
- {
- 	if(now_hr < sf_start_hr)
- 	{
-@@ -321,7 +323,7 @@ uint32_t get_sf_time(uint32_t now_hr, uint32_t sf_start_hr)
- 
- uint32_t calculate_t1(uint16_t sfn_sf, uint32_t sf_start_time_hr)
- {
--	uint32_t now_time_hr = get_current_time_hr();
-+	uint32_t now_time_hr = vnf_get_current_time_hr();
- 
- 	uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr);
- 
-@@ -344,7 +346,7 @@ uint32_t calculate_t4(uint32_t now_time_hr, uint16_t sfn_sf, uint32_t sf_start_t
- 
- uint32_t calculate_transmit_timestamp(uint16_t sfn_sf, uint32_t sf_start_time_hr)
- {
--	uint32_t now_time_hr = get_current_time_hr();
-+	uint32_t now_time_hr = vnf_get_current_time_hr();
- 
- 	uint32_t sf_time_us = get_sf_time(now_time_hr, sf_start_time_hr);
- 
-@@ -410,6 +412,8 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
- 		
- 		int len = nfapi_p7_message_pack(header, buffer, sizeof(buffer), &vnf_p7->_public.codec_config);
- 		
-+                //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size);
-+
- 		if(len < 0) 
- 		{
- 			NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() failed to pack p7 message phy_id:%d\n", __FUNCTION__, header->phy_id);
-@@ -429,6 +433,7 @@ int vnf_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t* hea
- 			int segment = 0;
- 			int offset = NFAPI_P7_HEADER_LENGTH;
- 			uint8_t tx_buffer[vnf_p7->_public.segment_size];
-+                        NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() MORE THAN ONE SEGMENT phy_id:%d nfapi_p7_message_pack()=len=%d vnf_p7->_public.segment_size:%u\n", __FUNCTION__, header->phy_id, len, vnf_p7->_public.segment_size);
- 			for(segment = 0; segment < segment_count; ++segment)
- 			{
- 				uint8_t last = 0;
-@@ -851,7 +856,7 @@ void vnf_handle_p7_vendor_extension(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vn
- 
- void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- {
--	uint32_t now_time_hr = get_current_time_hr();
-+	uint32_t now_time_hr = vnf_get_current_time_hr();
- 
- 	if (pRecvMsg == NULL || vnf_p7  == NULL)
- 	{
-@@ -871,7 +876,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 	nfapi_vnf_p7_connection_info_t* phy = vnf_p7_connection_info_list_find(vnf_p7, ind.header.phy_id);
- 	uint32_t t4 = calculate_t4(now_time_hr, phy->sfn_sf, vnf_p7->sf_start_time_hr);
- 
--	uint32_t tx_2_rx = t4 - ind.t1;
-+	uint32_t tx_2_rx = t4>ind.t1 ? t4 - ind.t1 : t4 + NFAPI_MAX_SFNSFDEC - ind.t1 ;
- 	uint32_t pnf_proc_time = ind.t3 - ind.t2;
- 
- 	// divide by 2 using shift operator
-@@ -881,7 +886,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 	{
- 		phy->latency[phy->min_sync_cycle_count] = latency;
- 
--		NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n",
-+		NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) PNF to VNF !sync phy_id:%d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d\n",
- 				NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id, ind.t1, ind.t2, ind.t3, t4, 
- 				tx_2_rx, pnf_proc_time, latency);
- 	}
-@@ -923,15 +928,27 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 
- 		if(1)
- 		{
--			NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", 
--					NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
-+                  struct timespec ts;
-+                  clock_gettime(CLOCK_MONOTONIC, &ts);
-+
-+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%1d) %d.%d PNF to VNF phy_id:%2d (t1/2/3/4:%8u, %8u, %8u, %8u) txrx:%4u procT:%3u latency(us):%4d(avg:%4d) offset(us):%8d filtered(us):%8d wrap[t1:%u t2:%u]\n", 
-+					NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ts.tv_sec, ts.tv_nsec, ind.header.phy_id,
- 					ind.t1, ind.t2, ind.t3, t4, 
--					tx_2_rx, pnf_proc_time, latency, phy->sf_offset, phy->sf_offset_filtered,
-+					tx_2_rx, pnf_proc_time, latency, phy->average_latency, phy->sf_offset, phy->sf_offset_filtered,
- 					(ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
- 		}
- 
- 	}
- 
-+        if (phy->filtered_adjust && (phy->sf_offset_filtered > 1e6 || phy->sf_offset_filtered < -1e6))
-+        {
-+          phy->filtered_adjust = 0;
-+          phy->zero_count=0;
-+          phy->min_sync_cycle_count = 2;
-+          phy->in_sync = 0;
-+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s - ADJUST TOO BAD - go out of filtered phy->sf_offset_filtered:%d\n", __FUNCTION__, phy->sf_offset_filtered);
-+        }
-+
- 	if(phy->min_sync_cycle_count)
- 		phy->min_sync_cycle_count--;
- 
-@@ -954,7 +971,6 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 			phy->sf_offset = ind.t2 - (ind.t1 - phy->average_latency);
- 
- 			sfn_sf_dec += (phy->sf_offset / 1000);
--
- 		}
- 		else
- 		{
-@@ -976,12 +992,11 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 		{
- 			phy->adjustment = NFAPI_SFNSF2DEC(new_sfn_sf) - NFAPI_SFNSF2DEC(curr_sfn_sf);
- 
--			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d\n", ind.header.phy_id, phy->adjustment);
-+			NFAPI_TRACE(NFAPI_TRACE_NOTE, "PNF to VNF phy_id:%d adjustment%d phy->previous_sf_offset_filtered:%d phy->previous_sf_offset_filtered:%d phy->sf_offset_trend:%d\n", ind.header.phy_id, phy->adjustment, phy->previous_sf_offset_filtered, phy->previous_sf_offset_filtered, phy->sf_offset_trend);
- 
- 			phy->previous_t1 = 0;
- 			phy->previous_t2 = 0;
- 
--
- 			if(phy->previous_sf_offset_filtered > 0)
- 			{
- 				if( phy->sf_offset_filtered > phy->previous_sf_offset_filtered)
-@@ -1083,9 +1098,14 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 
- 						if(phy->insync_minor_adjustment != 0)
- 						{
--							NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (sf_offset_filtered:%d) %d %d %d\n", 
-+							NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adjustment:%d\n", 
- 										NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
--										phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->sf_offset_filtered, insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); 
-+										phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, 
-+                                                                                phy->sf_offset_filtered, 
-+                                                                                insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend,
-+                                                                                NFAPI_SFNSF2DEC(new_sfn_sf),
-+                                                                                NFAPI_SFNSF2DEC(curr_sfn_sf),
-+                                                                                phy->adjustment); 
- 						}
- 					}
- 				}
-@@ -1121,10 +1141,13 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 								// out of sync?
- 							}
- 							
--							NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", 
-+							NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%4d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d NEW:%d CURR:%d adj:%d\n", 
- 										NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
- 										phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered,
--										insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); 
-+										insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend,
-+                                                                                NFAPI_SFNSF2DEC(new_sfn_sf),
-+                                                                                NFAPI_SFNSF2DEC(curr_sfn_sf),
-+                                                                                phy->adjustment); 
- 							
- 						}
- 						else if(phy->adjustment < 0)
-@@ -1151,7 +1174,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 								// out of sync?
- 							}
- 
--							NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d suframes (adjusment:%d sf_offset_filtered:%d) %d %d %d\n", 
-+							NFAPI_TRACE(NFAPI_TRACE_NOTE, "(%d/%d) VNF phy_id:%d Apply minor insync adjustment %dus for %d subframes (adjustment:%d sf_offset_filtered:%d) %d %d %d\n", 
- 										NFAPI_SFNSF2SFN(phy->sfn_sf), NFAPI_SFNSF2SF(phy->sfn_sf), ind.header.phy_id,
- 										phy->insync_minor_adjustment, phy->insync_minor_adjustment_duration, phy->adjustment, phy->sf_offset_filtered,
- 										insync_minor_adjustment_1, insync_minor_adjustment_2, phy->sf_offset_trend); 
-@@ -1219,7 +1242,16 @@ void vnf_handle_timing_info(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
- 		return;
- 	}
- 
--	// todo : how to use this?
-+        if (vnf_p7 && vnf_p7->p7_connections)
-+        {
-+          int16_t vnf_pnf_sfnsf_delta = NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf) - NFAPI_SFNSF2DEC(ind.last_sfn_sf);
-+
-+          //NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() PNF:SFN/SF:%d VNF:SFN/SF:%d deltaSFNSF:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(ind.last_sfn_sf), NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), vnf_pnf_sfnsf_delta);
-+          if (vnf_pnf_sfnsf_delta>1 || vnf_pnf_sfnsf_delta < -1)
-+          {
-+            NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() LARGE SFN/SF DELTA between PNF and VNF delta:%d VNF:%d PNF:%d\n\n\n\n\n\n\n\n\n", __FUNCTION__, vnf_pnf_sfnsf_delta, NFAPI_SFNSF2DEC(vnf_p7->p7_connections[0].sfn_sf), NFAPI_SFNSF2DEC(ind.last_sfn_sf));
-+          }
-+        }
- }
- 
- void vnf_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
-diff --git a/vnf/src/vnf_p7_interface.c b/vnf/src/vnf_p7_interface.c
-index ab4f00c..a35d8e3 100644
---- a/vnf/src/vnf_p7_interface.c
-+++ b/vnf/src/vnf_p7_interface.c
-@@ -142,6 +142,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 	NFAPI_TRACE(NFAPI_TRACE_INFO, "VNF P7 bind succeeded...\n");
- 
- 
-+	//struct timespec original_pselect_timeout;
- 	struct timespec pselect_timeout;
- 	pselect_timeout.tv_sec = 0;
- 	pselect_timeout.tv_nsec = 1000000; // ns in a 1 us
-@@ -157,13 +158,13 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 
- 	struct timespec sf_duration;
- 	sf_duration.tv_sec = 0;
--	sf_duration.tv_nsec = 1000000; // ns in a 1 us
-+	sf_duration.tv_nsec = 1e6; // We want 1ms pause
- 
- 	struct timespec sf_start;
- 	clock_gettime(CLOCK_MONOTONIC, &sf_start);
- 	long millisecond = sf_start.tv_nsec / 1e6;
- 	sf_start = timespec_add(sf_start, sf_duration);
--	//NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec);
-+	NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec);
- 
- 	while(vnf_p7->terminate == 0)
- 	{
-@@ -181,6 +182,8 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 
- 		if((last_millisecond == -1) || (millisecond == last_millisecond) || (millisecond == (last_millisecond + 1) % 1000) )
- 		{
-+                  //NFAPI_TRACE(NFAPI_TRACE_INFO, "pselect_start:%d.%d sf_start:%d.%d\n", pselect_start.tv_sec, pselect_start.tv_nsec, sf_start.tv_sec, sf_start.tv_nsec);
-+
- 
- 			if((pselect_start.tv_sec > sf_start.tv_sec) || 
- 			   ((pselect_start.tv_sec == sf_start.tv_sec) && (pselect_start.tv_nsec > sf_start.tv_nsec)))
-@@ -196,16 +199,26 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 			{
- 				// still time before the end of the subframe wait
- 				pselect_timeout = timespec_sub(sf_start, pselect_start);
-+
-+#if 0
-+                                NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sf_start:%d.%ld pselect_start:%d.%ld pseclect_timeout:%d.%ld\n",
-+                                    __FUNCTION__,
-+                                    sf_start.tv_sec, sf_start.tv_nsec,
-+                                    pselect_start.tv_sec, pselect_start.tv_nsec,
-+                                    pselect_timeout.tv_sec, pselect_timeout.tv_nsec);
-+#endif
- 			}
- 
-+//original_pselect_timeout = pselect_timeout;
-+
- 			// detemine how long to sleep in ns before the start of the next 1ms
- 			//pselect_timeout.tv_nsec = 1e6 - (pselect_start.tv_nsec % 1000000);
- 
--			//uint8_t underun_possiable =0;
-+			//uint8_t underrun_possible =0;
- 			
- 			// if we are not sleeping until the next milisecond due to the
- 			// insycn minor adjment flag it so we don't consider it an error
--			//uint8_t underun_possiable =0;
-+			//uint8_t underrun_possible =0;
- 			/*
- 			{
- 				nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
-@@ -222,7 +235,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 							pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
- 
- 
--						//underun_possiable = 1;
-+						//underrun_possible = 1;
- 					}
- 					else if(phy->insync_minor_adjustment < 0)
- 					{
-@@ -237,41 +250,98 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 			*/
- 			
- 
-+//long wraps = pselect_timeout.tv_nsec % 1e9;
-+
-+
- 			selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
- 
- 			clock_gettime(CLOCK_MONOTONIC, &pselect_stop);
- 
-+                        nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
-+
-+if (selectRetval==-1 && errno == 22)
-+{
-+  NFAPI_TRACE(NFAPI_TRACE_ERROR, "INVAL: pselect_timeout:%d.%ld adj[dur:%d adj:%d], sf_dur:%d.%ld\n", 
-+  pselect_timeout.tv_sec, pselect_timeout.tv_nsec, 
-+  phy->insync_minor_adjustment_duration, phy->insync_minor_adjustment, 
-+  sf_duration.tv_sec, sf_duration.tv_nsec);
-+}
-+#if 0
-+                        if (selectRetval != 0 || phy->insync_minor_adjustment_duration != 0)
-+                          NFAPI_TRACE(NFAPI_TRACE_NOTE, "pselect()=%d maxSock:%d vnf_p7->socket:%d pselect_timeout:%u.%u original_pselect_timeout:%u.%u\n", 
-+                              selectRetval, maxSock, vnf_p7->socket, pselect_timeout.tv_sec, pselect_timeout.tv_nsec,
-+                              original_pselect_timeout.tv_sec, original_pselect_timeout.tv_nsec);
-+#endif
-+
- 			if(selectRetval == 0)
- 			{
--				// calcualte the start of the next subframe
-+				// calculate the start of the next subframe
- 				sf_start = timespec_add(sf_start, sf_duration);
- 				//NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec);
- 
--				nfapi_vnf_p7_connection_info_t* phy = vnf_p7->p7_connections;
- 				if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0)
- 				{
--					NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %dus\n", phy->insync_minor_adjustment);
-+                                        long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000);
-+
-+                                        sf_start.tv_nsec -= insync_minor_adjustment_ns;
-+
-+#if 1
-+                                        if (sf_start.tv_nsec > 1e9)
-+                                        {
-+                                          sf_start.tv_sec++;
-+                                          sf_start.tv_nsec-=1e9;
-+                                        }
-+                                        else if (sf_start.tv_nsec < 0)
-+                                        {
-+                                          sf_start.tv_sec--;
-+                                          sf_start.tv_nsec+=1e9;
-+                                        }
-+#else
-+                                        //NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] BEFORE adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d\n", phy->insync_minor_adjustment, sf_start.tv_nsec);
- 					if(phy->insync_minor_adjustment > 0)
- 					{
- 						// decrease the subframe duration a little
--						sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000);
-+                                                if (sf_start.tv_nsec > insync_minor_adjustment_ns)
-+                                                  sf_start.tv_nsec -= insync_minor_adjustment_ns;
-+                                                else
-+                                                {
-+                                                  NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] Adjustment would make it negative sf:%d.%ld adjust:%ld\n\n\n", sf_start.tv_sec, sf_start.tv_nsec, insync_minor_adjustment_ns);
-+                                                  sf_start.tv_sec--;
-+                                                  sf_start.tv_nsec += 1e9 - insync_minor_adjustment_ns;
-+                                                }
- 					}
- 					else if(phy->insync_minor_adjustment < 0)
- 					{
- 						// todo check we don't go below 0
- 						// increase the subframe duration a little
--						sf_start.tv_nsec = sf_start.tv_nsec - (phy->insync_minor_adjustment * 1000);
-+						sf_start.tv_nsec += insync_minor_adjustment_ns;
-+
-+                                                if (sf_start.tv_nsec < 0)
-+                                                {
-+                                                  NFAPI_TRACE(NFAPI_TRACE_ERROR, "[VNF] OVERFLOW %d.%ld\n\n\n\n", sf_start.tv_sec, sf_start.tv_nsec);
-+                                                  sf_start.tv_sec++;
-+                                                  sf_start.tv_nsec += 1e9;
-+                                                }
- 					}
-+#endif
- 
- 					//phy->insync_minor_adjustment = 0;
--					phy->insync_minor_adjustment_duration--;
-+                                        phy->insync_minor_adjustment_duration--;
-+
-+                                        NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Subframe minor adjustment %dus sf_start.tv_nsec:%d duration:%u\n", 
-+                                            phy->insync_minor_adjustment, sf_start.tv_nsec, phy->insync_minor_adjustment_duration);
-+
-+                                        if (phy->insync_minor_adjustment_duration==0)
-+                                        {
-+                                          phy->insync_minor_adjustment = 0;
-+                                        }
- 				}
- 				/*
- 				long pselect_stop_millisecond = pselect_stop.tv_nsec / 1e6;
- 				if(millisecond == pselect_stop_millisecond)
- 				{
- 					// we have woke up in the same subframe
--					if(underun_possiable == 0)
-+					if(underrun_possible == 0)
- 						NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect underrun %ld (%d.%d)\n", millisecond, pselect_stop.tv_sec, pselect_stop.tv_nsec);
- 				}
- 				else if(((millisecond + 1) % 1000) != pselect_stop_millisecond)
-@@ -298,7 +368,7 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 
- 		if(selectRetval == 0)
- 		{
--			vnf_p7->sf_start_time_hr = get_current_time_hr();
-+			vnf_p7->sf_start_time_hr = vnf_get_current_time_hr();
- 
- 			// pselect timed out
- 			nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections;
-@@ -326,14 +396,18 @@ int nfapi_vnf_p7_start(nfapi_vnf_p7_config_t* config)
- 		else
- 		{
- 			// pselect error
--			if(selectRetval == EINTR)
-+			if(selectRetval == -1 && errno == EINTR)
- 			{
- 				// a sigal was received.
- 			}
- 			else
- 			{
--				NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec);
-+				NFAPI_TRACE(NFAPI_TRACE_INFO, "P7 select failed result %d errno %d timeout:%d.%d orginal:%d.%d last_ms:%ld ms:%ld\n", selectRetval, errno, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, pselect_timeout.tv_sec, pselect_timeout.tv_nsec, last_millisecond, millisecond);
- 				// should we exit now?
-+                                if (selectRetval == -1 && errno == 22) // invalid argument??? not sure about timeout duration
-+                                {
-+                                  usleep(100000);
-+                                }
- 			}
- 		}
- 
-@@ -360,10 +434,12 @@ int nfapi_vnf_p7_stop(nfapi_vnf_p7_config_t* config)
- 
- int nfapi_vnf_p7_add_pnf(nfapi_vnf_p7_config_t* config, const char* pnf_p7_addr, int pnf_p7_port, int phy_id)
- {
--	NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(phy_id:%d pnf_addr:%s:%d)\n", __FUNCTION__, phy_id,  pnf_p7_addr, pnf_p7_port);
-+	NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p phy_id:%d pnf_addr:%s pnf_p7_port:%d)\n", __FUNCTION__, config, phy_id,  pnf_p7_addr, pnf_p7_port);
- 
- 	if(config == 0)
--		return -1;
-+        {
-+          return -1;
-+        }
- 
- 	vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
- 
-@@ -411,6 +487,8 @@ int nfapi_vnf_p7_del_pnf(nfapi_vnf_p7_config_t* config, int phy_id)
- }
- int nfapi_vnf_p7_dl_config_req(nfapi_vnf_p7_config_t* config, nfapi_dl_config_request_t* req)
- {
-+	//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(config:%p req:%p)\n", __FUNCTION__, config, req);
-+
- 	if(config == 0 || req == 0)
- 		return -1;
- 
-diff --git a/vnf_sim/src/mac.cpp b/vnf_sim/src/mac.cpp
-index aa97f72..fa6f487 100644
---- a/vnf_sim/src/mac.cpp
-+++ b/vnf_sim/src/mac.cpp
-@@ -743,7 +743,7 @@ extern "C"
- 			{
- 				cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.number_of_cc = 1;
- 				cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].ri_size = rand_range(0, 3);
--				cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size = rand_range(0, 255);
-+				cqi_ri_information.cqi_ri_information_rel9.aperiodic_cqi_pmi_ri_report.cc[0].dl_cqi_pmi_size[0] = rand_range(0, 255);
- 			}
- 			
- 			cqi_ri_information.cqi_ri_information_rel13.tl.tag = NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG;
-diff --git a/vnf_sim/src/main.cpp b/vnf_sim/src/main.cpp
-index b79ac40..5dc7161 100644
---- a/vnf_sim/src/main.cpp
-+++ b/vnf_sim/src/main.cpp
-@@ -428,6 +428,20 @@ void phy_deallocate_p7_vendor_ext(nfapi_p7_message_header_t* header)
- 	free(header);
- }
- 
-+//static pthread_t vnf_start_pthread;
-+static pthread_t vnf_p7_start_pthread;
-+void* vnf_p7_start_thread(void *ptr)
-+{
-+  printf("%s()\n", __FUNCTION__);
-+
-+  //std::shared_ptr<nfapi_vnf_p7_config> config = std::shared_ptr<nfapi_vnf_p7_config>(ptr);
-+  nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr;
-+
-+  nfapi_vnf_p7_start(config);
-+
-+  return 0;
-+}
-+
- void set_thread_priority(int priority)
- {
- 	//printf("%s(priority:%d)\n", __FUNCTION__, priority);
-@@ -458,6 +472,8 @@ void set_thread_priority(int priority)
- 
- void* vnf_p7_thread_start(void* ptr)
- {
-+  printf("%s()\n", __FUNCTION__);
-+
- 	set_thread_priority(79);
- 
- 	vnf_p7_info* p7_vnf = (vnf_p7_info*)ptr;
-@@ -494,10 +510,10 @@ void* vnf_p7_thread_start(void* ptr)
- 	p7_vnf->config->allocate_p7_vendor_ext = &phy_allocate_p7_vendor_ext;
- 	p7_vnf->config->deallocate_p7_vendor_ext = &phy_deallocate_p7_vendor_ext;
- 
--	nfapi_vnf_p7_start(p7_vnf->config.get());
-+        printf("[VNF] Creating VNF NFAPI start thread %s\n", __FUNCTION__);
-+        pthread_create(&vnf_p7_start_pthread, NULL, &vnf_p7_start_thread, p7_vnf->config.get());
- 
- 	return 0;
--
- }
- 
- int pnf_connection_indication_cb(nfapi_vnf_config_t* config, int p5_idx)
-diff --git a/wireshark/packet-nfapi.c b/wireshark/packet-nfapi.c
-index da0edb0..7e0f23f 100755
---- a/wireshark/packet-nfapi.c
-+++ b/wireshark/packet-nfapi.c
-@@ -1,6069 +1,12284 @@
--/*
-+/* packet-nfapi.c
-+* Routines for Network Function Application Platform Interface (nFAPI) dissection
- * Copyright 2017 Cisco Systems, Inc.
- *
--* Licensed under the Apache License, Version 2.0 (the "License");
--* you may not use this file except in compliance with the License.
--* You may obtain a copy of the License at
-+* Wireshark - Network traffic analyzer
-+* By Gerald Combs <gerald@wireshark.org>
-+* Copyright 1998 Gerald Combs
-+*
-+* This program is free software; you can redistribute it and/or
-+* modify it under the terms of the GNU General Public License
-+* as published by the Free Software Foundation; either version 2
-+* of the License, or (at your option) any later version.
-+*
-+* This program is distributed in the hope that it will be useful,
-+* but WITHOUT ANY WARRANTY; without even the implied warranty of
-+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+* GNU General Public License for more details.
-+*
-+* You should have received a copy of the GNU General Public License
-+* along with this program; if not, write to the Free Software
-+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
--* http://www.apache.org/licenses/LICENSE-2.0
-+* References:
-+* SCF082.09.04  http://scf.io/en/documents/082_-_nFAPI_and_FAPI_specifications.php
- *
--* Unless required by applicable law or agreed to in writing, software
--* distributed under the License is distributed on an "AS IS" BASIS,
--* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--* See the License for the specific language governing permissions and
--* limitations under the License.
- */
--
--
--#include "config.h" 
--
--#include <windows.h>
--#include <stdio.h>
--#include <stdint.h>
--
--#include <epan/packet.h>
--#include <epan/exceptions.h>
--#include <epan/prefs.h>
--#include <epan/expert.h>
--#include <epan/reassemble.h>
--
-+
-+#include "config.h"
-+
-+#include <epan/packet.h>
-+#include <epan/exceptions.h>
-+#include <epan/expert.h>
-+#include <epan/reassemble.h>
-+#include <epan/wmem/wmem.h>
-+
-+#include <ptvcursor.h>
-+
-+void proto_register_nfapi(void);
-+void proto_reg_handoff_nfapi(void);
-+
- #define NFAPI_HEADER_LENGTH 8
--#define NFAPI_P7_HEADER_LENGTH 16
--
--typedef int(*Decode_operation)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset);
--
--static const value_string nfapi_error_vals[] = {
--	{ 0x0, "MSG_OK" },
--	{ 0x1, "MSG_INVALID_STATE" },
--	{ 0x2, "MSG_INVALID_CONFIG" },
--	{ 0x3, "SFN_OUT_OF_SYNC" },
--	{ 0x4, "MSG_SUBFRAME_ERR" },
--	{ 0x5, "MSG_BCH_MISSING" },
--	{ 0x6, "MSG_BCH_MISSING" },
--	{ 0x7, "MSG_HI_ERR" },
--	{ 0x8, "MSG_TX_ERR" },
--	{ 0, NULL },
--};
--
--static const value_string nfapi_p4_error_vals[] = {
--	{ 100, "MSG_OK" },
--	{ 101, "MSG_INVALID_STATE" },
--	{ 102, "MSG_INVALID_CONFIG" },
--	{ 103, "MSG_RAT_NOT_SUPPORTED" },
--	{ 200, "MSG_NMM_STOP_OK" },
--	{ 201, "MSG_NMM_STOP_IGNORED" },
--	{ 202, "MSG_NMM_STOP_INVALID_STATE" },
--	{ 300, "MSG_PROCEDURE_COMPLETE" },
--	{ 301, "MSG_PROCEDURE_STOPPED" },
--	{ 302, "MSG_PARTIAL_RESULTS" },
--	{ 303, "MSG_TIMEOUT" },
--	{ 0, NULL },
--};
--
--static const value_string nfapi_rat_type_vals[] = {
--	{ 0, "LTE" },
--	{ 1, "UTRAN" },
--	{ 2, "GERAN" },
--	{ 0, NULL },
--};
--
--typedef enum{
--	UN_ALIGNED_SYNCHRONIZATION = 0,
--	INTERNAL_PNF_FRAME_ALIGNMENT,
--	ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION
--} nfapi_sync_mode_e;
--
--static const value_string nfapi_sync_mode_vals[] = {
--	{ UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" },
--	{ INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" },
--	{ ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" }
--};
--
--typedef enum {
--	NONE = 0,
--	GPS,
--	GLONASS,
--	BEIDOU
--} location_mode_e;
--
--static const value_string location_mode_vals[] = {
--	{ NONE, "NONE" },
--	{ GPS, "GPS" },
--	{ GLONASS, "GLONASS" },
--	{ BEIDOU, "BeiDou" },
--	{ 0, NULL }
--};
--
--static const value_string nfapi_uplink_rs_hopping_vals[] = {
--	{ 0, "RS_NO_HOPPING" },
--	{ 1, "RS_GROUP_HOPPING" },
--	{ 2, "RS_SEQUENCE_HOPPING" },
--	{ 0, NULL }
--};
--
--static const value_string nfapi_laa_carrier_type_vals[] = {
--	{ 0, "No multi carrier support" },
--	{ 1, "Mode A1" },
--	{ 2, "Mode A12" },
--	{ 3, "Mode B1" },
--	{ 4, "Mode B2" },
--	{ 0, NULL }
--};
--
--static const value_string nfapi_mutli_carrier_lbt_support_vals[] = {
--	{ 0, "Multi carrier Mode A1" },
--	{ 1, "Multi carrier Mode A2" },
--	{ 2, "Multi carrier Mode B1" },
--	{ 3, "Multi carrier Mode B2" },
--	{ 0, NULL }
--};
--
--static const value_string nfapi_lbt_dl_req_pdu_type[] = {
--	{ 0, "LBT_PDSCH_REQ PDU" },
--	{ 1, "LBT_DRS_REQ PDU" },
--	{ 0, NULL }
--};
--
--
--static const value_string nfapi_lbt_dl_ind_pdu_type[] = {
--	{ 0, "LBT_PDSCH_RSP PDU" },
--	{ 1, "LBT_DRS_RSP PDU" },
--
--	{ 0, NULL }
--};
--
--
--
--
--/* These are definitions where data 0 & 1 represent/provide a string name*/
--
--static const true_false_string true_false_strname = {
--	"TRUE",
--	"FALSE"
--};
--
--static const true_false_string  nfapi_csi_report_type_strname = {
--	"Periodic",
--	"Aperiodic",
--};
--
--static const true_false_string nfapi_control_type_string_name = {
--	"CQI/PMI",
--	"RI",
--};
--
--static const true_false_string transport_block_to_codeword_swap_flag = {
--	"NO_SWAPPING",
--	"SWAPPED"
--};
--
--static const true_false_string virtual_resource_block_assignment_flag = {
--	"LOCALIZED",
--	"DISTRIBUTED"
--};
--
--static const true_false_string ngap_string_name = {
--	"N-GAP 1",
--	"N-GAP 2"
--};
--
--static const true_false_string  nprb_strname = {
--	"= 2",
--	"= 3",
--};
--
--static const true_false_string cyclic_prefix_type_strname = {
--	"CP_NORMAL",
--	"CP_EXTENDED"
--};
--
--static const true_false_string support_strname = {
--	"No Support",
--	"Support"
--};
--
--static const true_false_string partial_sf_support_strname =
--{
--	"Start partial SF support",
--	"End partial SF support"
--};
--
--static const true_false_string phich_duration_strname = {
--	"PHICH_D_NORMAL",
--	"PHICH_D_EXTENDED"
--};
--
--static const true_false_string high_speed_flag_strname = {
--	"HS_UNRESTRICTED_SET",
--	"HS_RESTRICTED_SET"
--};
--
--static const true_false_string hopping_mode_strname = {
--	"HM_INTER_SF",
--	"HM_INTRA_INTER_SF"
--};
--
--static const true_false_string enabled_disabled_strname = {
--	"Enabled",
--	"Disabled"
--};
--
--static const true_false_string srs_simult_tx_strname = {
--	"No Simultaneous Transmission",
--	"Simultaneous Transmission"
--};
--
--static const true_false_string crc_flag_strname = {
--	"CRC_CORRECT",
--	"CRC_ERROR"
--};
--
--static const true_false_string hi_value_strname = {
--	"HI_NACK",
--	"HI_ACK"
--};
--
--static const true_false_string flag_tb2_strname = {
--	"HI_NOT_PRESENT",
--	"HI_PRESENT"
--};
--
--static const true_false_string nfapi_multi_carrier_tx_strname = {
--	"Mutual transmission (self-deferral support for current carrier)",
--	"Transmit on channel access win (no self-deferral)"
--};
--
--static const true_false_string nfapi_multi_carrier_freeze_strname = {
--	"Absence of other technology isn’t guaranteed",
--	"Absence of other technology is guaranteed"
--};
--
--static const value_string nfapi_dl_config_pdu_type_vals[] = {
--	{ 0, "DL_CONFIG_DCI_DL_PDU" },
--	{ 1, "DL_CONFIG_BCH_PDU" },
--	{ 2, "DL_CONFIG_MCH_PDU" },
--	{ 3, "DL_CONFIG_DLSCH_PDU" },
--	{ 4, "DL_CONFIG_PCH_PDU" },
--	{ 5, "DL_CONFIG_PRS_PDU" },
--	{ 6, "DL_CONFIG_CSI_RS_PDU" },
--	{ 7, "DL_CONFIG_EPDCCH_DL_PDU" },
--	{ 8, "DL_CONFIG_EPDCCH_DL_PDU" },
--	{ 0, NULL }
--};
--
--static const value_string nfapi_duplex_mode_vals[] = {
--	{ 0, "TDD" },
--	{ 1, "FDD" },
--	{ 2, "HD-FDD" },
--	{ 0, NULL }
--};
--
--static const value_string modulation_vals[] = {
--	{ 2, "QPSK" },
--	{ 4, "16QAM" },
--	{ 6, "64QAM" },
--	{ 8, "256QAM" },
--	{ 0, NULL }
--};
--
--static const value_string pch_modulation_vals[] = {
--	{ 0, "QPSK" },
--	{ 0, NULL }
--};
--
--static const value_string ue_mode_vals[] = {
--	{ 0, "non LC/CE UE" },
--	{ 1, "LC/CE UE" },
--	{ 0, NULL }
--};
--
--static const value_string csi_rs_class_vals[] = {
--	{ 0, "not used" },
--	{ 1, "Class A" },
--	{ 1, "Class B" },
--	{ 0, NULL }
--};
--
--static const value_string csi_rs_cdm_type_vals[] = {
--	{ 0, "cdm 2" },
--	{ 1, "cdm 4" },
--	{ 0, NULL }
--};
--
--static const value_string antenna_ports_vals[] = {
--	{ 0, "1 antenna ports" },
--	{ 1, "2 antenna ports" },
--	{ 2, "4 antenna ports" },
--	{ 0, NULL }
--};
--
--static const value_string combs_vals[] = {
--	{ 0, "2 TC" },
--	{ 1, "4 TC" },
--	{ 0, NULL }
--};
--
--static const value_string resource_allocation_type_vals[] = {
--	{ 0, "type 0" },
--	{ 1, "type 1" },
--	{ 2, "type 2 1A/1B/1D" },
--	{ 3, "type 2 1C" },
--	{ 4, "type 2 6-1A" },
--	{ 5, "type UEModeB" },
--	{ 0, NULL }
--};
--
--static const value_string transmission_scheme_vals[] = {
--	{ 0, "SINGLE_ANTENNA_PORT_0" },
--	{ 1, "TX_DIVERSITY" },
--	{ 2, "LARGE_DELAY_CDD" },
--	{ 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" },
--	{ 4, "MULTI_USER_MIMO" },
--	{ 5, "CLOSED_LOOP_RANK_1_PRECODING" },
--	{ 6, "SINGLE_ANTENNA_PORT_5" },
--	{ 7, "SINGLE_ANTENNA_PORT_7" },
--	{ 8, "SINGLE_ANTENNA_PORT_8" },
--	{ 9, "DUAL_LAYER_TX_PORT_7_AND_8" },
--	{ 10, "UP_TO_8_LAYER_TX" },
--	{ 11, "SINGLE_ANTENNA_PORT_11" },
--	{ 12, "SINGLE_ANTENNA_PORT_13" },
--	{ 13, "SINGLE_ANTENNA_PORT_11_13" },
--	{ 0, NULL }
--};
--
--static const value_string ul_transmission_scheme_vals[] = {
--	{ 0, "SINGLE_ANTENNA_PORT_10" },
--	{ 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" },
--};
--
--static const value_string dci_format_vals[] = {
--	{ 0, "1" },
--	{ 1, "1A" },
--	{ 2, "1B" },
--	{ 3, "1C" },
--	{ 4, "1D" },
--	{ 5, "2" },
--	{ 6, "2A" },
--	{ 7, "2B" },
--	{ 8, "2C" },
--	{ 9, "2D" },
--	{ 0, NULL }
--};
--
--static const value_string pa_vals[] = {
--	{ 0, "-6dB" },
--	{ 1, "-4.77dB" },
--	{ 2, "-3dB" },
--	{ 3, "-1.77dB" },
--	{ 4, "0dB" },
--	{ 5, "1dB" },
--	{ 6, "2dB" },
--	{ 7, "3dB" },
--	{ 0, NULL }
--};
--
--static const value_string transmission_mode_vals[] = {
--	{ 1, "Mode 1" },
--	{ 2, "Mode 2" },
--	{ 3, "Mode 3" },
--	{ 4, "Mode 4" },
--	{ 5, "Mode 5" },
--	{ 6, "Mode 6" },
--	{ 7, "Mode 7" },
--	{ 8, "Mode 8" },
--	{ 9, "Mode 9" },
--	{ 10, "Mode 10" },
--	{ 0, NULL }
--};
--
--static const value_string nfapi_ul_config_pdu_type_vals[] = {
--	{ 0, "ULSCH" },
--	{ 1, "ULSCH_CQI_RI" },
--	{ 2, "ULSCH_HARQ" },
--	{ 3, "ULSCH_CQI_HARQ_RI" },
--	{ 4, "UCI_CQI" },
--	{ 5, "UCI_SR" },
--	{ 6, "UCI_HARQ" },
--	{ 7, "UCI_SR_HARQ" },
--	{ 8, "UCI_CQI_HARQ" },
--	{ 9, "UCI_CQI_SR" },
--	{ 10, "UCI_CQI_SR_HARQ" },
--	{ 11, "SRS" },
--	{ 12, "HARQ_BUFFER" },
--	{ 13, "ULSCH_UCI_CSI" },
--	{ 14, "ULSCH_UCI_HARQ" },
--	{ 15, "ULSCH_CSI_UCI_HARQ" },
--	{ 0, NULL }
--};
--
--typedef enum {
--	NFAPI_ACK_NACK_MODE_BUNDLING = 0,
--	NFAPI_ACK_NACK_MODE_MULTIPLEXING,
--	NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL,
--	NFAPI_ACK_NACK_MODE_FORMAT_3,
--} nfapi_ack_nack_mode_e;
--
--static const value_string nfapi_ack_nack_mode_vals[] = {
--	{ NFAPI_ACK_NACK_MODE_BUNDLING, "Bundling" },
--	{ NFAPI_ACK_NACK_MODE_MULTIPLEXING, "Multiplexing" },
--	{ NFAPI_ACK_NACK_MODE_FORMAT_1B_WITH_CHAN_SEL, "Format 1b with channel selection" },
--	{ NFAPI_ACK_NACK_MODE_FORMAT_3, "Format 3" },
--	{ 0, NULL }
--};
--
--typedef enum {
--	NFAPI_ANTENNA_PORT1 = 0,
--	NFAPI_ANTENNA_PORT2,
--	NFAPI_ANTENNA_PORT4,
--} nfapi_ack_nack_mode_e;
--
--static const value_string nfapi_antenna_port_vals[] = {
--	{ NFAPI_ANTENNA_PORT1, "1 " },
--	{ NFAPI_ANTENNA_PORT2, "2 " },
--	{ NFAPI_ANTENNA_PORT4, "4 " },
--	{ 0, NULL }
--};
--
--typedef enum{
--	PHICH_R_ONE_SIXTH = 0,
--	PHICH_R_HALF,
--	PHICH_R_ONE,
--	PHICH_R_TWO
--} nfapi_phich_resource_e;
--
--static const value_string nfapi_phich_resource_vals[] = {
--	{ PHICH_R_ONE_SIXTH, "PHICH_R_ONE_SIXTH " },
--	{ PHICH_R_HALF, "PHICH_R_HALF" },
--	{ PHICH_R_ONE, "PHICH_R_ONE" },
--	{ PHICH_R_TWO, "PHICH_R_TWO" },
--	{ 0, NULL }
--};
--
--static const value_string local_distributed_vals[] = {
--	{ 0, "localized" },
--	{ 1, "distributed" },
--	{ 0, NULL }
--};
--
--static const value_string transport_block_to_codeword_swap_flag_vals[] = {
--	{ 0, "no swapping" },
--	{ 1, "swapped" },
--	{ 0, NULL }
--};
--
--static const value_string ngap_vals[] = {
--	{ 0, "Ngap1" },
--	{ 1, "Ngap2" },
--	{ 0, NULL }
--};
--
--static const value_string true_false_vals[] = {
--	{ 0, "false" },
--	{ 1, "true" },
--	{ 0, NULL }
--};
--
--static const value_string exhustive_search_vals[] = {
--	{ 0, "non-exhaustive search" },
--	{ 1, "exhaustive search" },
--	{ 0, NULL }
--};
--
--static const value_string not_used_enabled_vals[] = {
--	{ 0, "not used" },
--	{ 1, "enabled" },
--	{ 0, NULL }
--};
--
--static const value_string hopping_vals[] = {
--	{ 0, "no hopping" },
--	{ 1, "hopping enabled" },
--	{ 0, NULL }
--};
--
--
--static const value_string rnti_type_vals[] = {
--	{ 1, "C-RNTI" },
--	{ 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" },
--	{ 3, "SPS-CRNTI" },
--	{ 0, NULL }
--};
--
--static const value_string primary_cells_type_vals[] = {
--	{ 1, "TDD" },
--	{ 2, "FDD" },
--	{ 3, "HD_FDD" },
--	{ 0, NULL }
--};
--
--static const value_string ul_rssi_supported_vals[] = {
--	{ 0, "Uplink RSSI not supported" },
--	{ 1, "Uplink RSSI supported" },
--	{ 0, NULL}
--};
--
--
--typedef enum
--{
--	NMM_NONE = 0,
--	NMM_ONLY,
--	NMM_IN_CONFIGURED_STATE,
--	NMM_IN_RUNNING_STATE,
--	NMM_IN_CONFIGURED_AND_RUNNING_STATE
--} nmm_modes_supported_e;
--
--static const value_string nmm_modes_supported_vals[] =
--{
--	{ NMM_NONE, "NONE" },
--	{ NMM_ONLY, "NMM_ONLY" },
--	{ NMM_IN_CONFIGURED_STATE, "NMM_IN_CONFIGURED_STATE" },
--	{ NMM_IN_RUNNING_STATE, "NMM_IN_RUNNING_STATE" },
--	{ NMM_IN_CONFIGURED_AND_RUNNING_STATE, "NMM_IN_CONFIGURED_AND_RUNNING_STAT" },
--	{ 0, NULL }
--};
--
--
--
--
--
--static int proto_nfapi = -1;
--
--/* These are for the subtrees */
--static gint ett_nfapi_message_tree = -1;
--static gint ett_nfapi_p4_p5_message_header = -1;
--static gint ett_nfapi_p7_message_header = -1;
--static gint ett_nfapi_tlv_tree = -1;
--static gint ett_nfapi_tl = -1;
--static gint ett_nfapi_pnf_param_response = -1;
--static gint ett_nfapi_pnf_phy = -1;
--static gint ett_nfapi_pnf_phy_rel10 = -1;
--static gint ett_nfapi_pnf_phy_rel11 = -1;
--static gint ett_nfapi_pnf_phy_rel12 = -1;
--static gint ett_nfapi_pnf_phy_rel13 = -1;
--static gint ett_nfapi_pnf_rf = -1;
--static gint ett_nfapi_phy_rf_config_info = -1;
--static gint ett_nfapi_pnf_phy_rf_config = -1;
--static gint ett_nfapi_pnf_phy_rf_config_instance = -1;
--static gint ett_nfapi_phy_state = -1;
--static gint ett_nfapi_l1_status = -1;
--static gint ett_nfapi_rf_bands = -1;
--static gint ett_nfapi_tx_antenna_ports = -1;
--static gint ett_nfapi_harq_ack_nack_data = -1;
--static gint ett_nfapi_harq_data = -1;
--static gint ett_nfapi_cc = -1;
--static gint ett_nfapi_rbs = -1;
--static gint ett_nfapi_antennas = -1;
--static gint ett_nfapi_dl_config_dci_dl_pdu_rel8 = -1;
--static gint ett_nfapi_dl_config_dci_dl_pdu_rel9 = -1;
--static gint ett_nfapi_dl_config_dci_dl_pdu_rel10 = -1;
--static gint ett_nfapi_dl_config_dci_dl_pdu = -1;
--static gint ett_nfapi_dl_config_request_pdu = -1;
--static gint ett_nfapi_dl_config_request_body = -1;
--static gint ett_nfapi_dl_config_request_pdu_list = -1;
--static gint ett_nfapi_ul_config_request_pdu_list = -1;
--static gint ett_nfapi_hi_dci0_request_pdu_list = -1;
--static gint ett_nfapi_tx_request_pdu_list = -1;
--static gint ett_nfapi_rx_indication_pdu_list = -1;
--static gint ett_nfapi_harq_indication_pdu_list = -1;
--static gint ett_nfapi_crc_indication_pdu_list = -1;
--static gint ett_nfapi_sr_indication_pdu_list = -1;
--static gint ett_nfapi_cqi_indication_pdu_list = -1;
--static gint ett_nfapi_preamble_indication_pdu_list = -1;
--static gint ett_nfapi_srs_indication_pdu_list = -1;
--static gint ett_nfapi_lbt_dl_config_pdu_list = -1;
--static gint ett_nfapi_lbt_dl_indication_pdu_list = -1;
--static gint ett_nfapi_dl_node_sync = -1;
--static gint ett_nfapi_ul_node_sync = -1;
--static gint ett_nfapi_timing_info = -1;
--static gint ett_nfapi_dl_config_request_dlsch_pdu_rel8 = -1;
--static gint ett_nfapi_subbands = -1;
--static gint ett_nfapi_dl_config_request_dlsch_pdu_rel9 = -1;
--static gint ett_nfapi_dl_config_request_dlsch_pdu_rel10 = -1;
--static gint ett_nfapi_dl_config_bch_pdu_rel8 = -1;
--static gint ett_nfapi_dl_config_mch_pdu_rel8 = -1;
--static gint ett_nfapi_dl_config_pch_pdu_rel8 = -1;
--static gint ett_nfapi_dl_config_prs_pdu_rel9 = -1;
--static gint ett_nfapi_dl_config_csi_rs_pdu_rel10 = -1;
--static gint ett_nfapi_ul_config_request_body = -1;
--static gint ett_nfapi_ul_config_harq_buffer_pdu = -1;
--static gint ett_nfapi_ul_config_ue_information_rel8 = -1;
--static gint ett_nfapi_ul_config_sr_information_pdu_rel8 = -1;
--static gint ett_nfapi_ul_config_ulsch_pdu_rel8 = -1;
--static gint ett_nfapi_ul_config_ulsch_pdu_rel10 = -1;
--static gint ett_nfapi_ul_config_cqi_ri_information_rel8 = -1;
--static gint ett_nfapi_ul_config_cqi_ri_information_rel9 = -1;
--static gint ett_nfapi_ul_config_ulsch_harq_information_rel10 = -1;
--static gint ett_nfapi_ul_config_initial_transmission_parameters_rel8 = -1;
--static gint ett_nfapi_ul_config_cqi_information_rel8 = -1;
--static gint ett_nfapi_ul_config_cqi_information_rel10 = -1;
--static gint ett_nfapi_ul_config_sr_information_rel8 = -1;
--static gint ett_nfapi_ul_config_sr_information_rel10 = -1;
--static gint ett_nfapi_ul_config_harq_information_rel10_tdd = -1;
--static gint ett_nfapi_ul_config_harq_information_rel8_fdd = -1;
--static gint ett_nfapi_ul_config_harq_information_rel9_fdd = -1;
--static gint ett_nfapi_ul_config_srs_pdu_rel8 = -1;
--static gint ett_nfapi_ul_config_srs_pdu_rel10 = -1;
--static gint ett_nfapi_crc_indication_body = -1;
--static gint ett_nfapi_bf_vector_antennas = -1;
--static gint ett_nfapi_bf_vectors = -1;
--static gint ett_nfapi_csi_rs_resource_configs = -1;
--static gint ett_nfapi_csi_rs_bf_vector = -1;
--static gint ett_nfapi_epdcch_prbs = -1;
--static gint ett_nfapi_precoding = -1;
--static gint ett_nfapi_earfcn_list = -1;
--static gint ett_nfapi_uarfcn_list = -1;
--static gint ett_nfapi_arfcn_list = -1;
--static gint ett_nfapi_rssi_list = -1;
--static gint ett_nfapi_pci_list = -1;
--static gint ett_nfapi_psc_list = -1;
--static gint ett_nfapi_lte_cells_found_list = -1;
--static gint ett_nfapi_utran_cells_found_list = -1;
--static gint ett_nfapi_geran_cells_found_list = -1;
--static gint ett_nfapi_si_periodicity_list = -1;
--
--static expert_field ei_invalid_range = EI_INIT;
--static expert_field ei_power_invalid = EI_INIT;
--static expert_field ei_ref_sig_power_invalid = EI_INIT;
--
--
--static int hf_nfapi_message_tree = -1;
--
--static int hf_nfapi_p4_p5_message_header = -1;
--static int hf_nfapi_p4_p5_message_header_phy_id = -1;
--static int hf_nfapi_p4_p5_message_header_message_id = -1;
--static int hf_nfapi_p4_p5_message_header_message_length = -1;
--static int hf_nfapi_p4_p5_message_header_spare = -1;
--
--static int hf_nfapi_p7_message_header = -1;
--static int hf_nfapi_p7_message_header_phy_id = -1;
--static int hf_nfapi_p7_message_header_message_id = -1;
--static int hf_nfapi_p7_message_header_message_length = -1;
--static int hf_nfapi_p7_message_header_m = -1;
--static int hf_nfapi_p7_message_header_segment = -1;
--static int hf_nfapi_p7_message_header_sequence_number = -1;
--static int hf_nfapi_p7_message_header_checksum = -1;
--static int hf_nfapi_p7_message_header_transmit_timestamp = -1;
--
--static int hf_nfapi_tlv_tree = -1;
--
--static int hf_nfapi_tl = -1;
--static int hf_nfapi_tl_tag = -1;
--static int hf_nfapi_tl_length = -1;
--static int hf_nfapi_tag_uint8_value = -1;
--static int hf_nfapi_tag_uint16_value = -1;
--
--static int hf_nfapi_pnf_param_general = -1;
--static int hf_nfapi_sync_mode = -1;
--static int hf_nfapi_location_mode = -1;
--static int hf_nfapi_location_coordinates = -1;
--static int hf_nfapi_location_coordinates_length = -1;
--static int hf_nfapi_dl_config_timing = -1;
--static int hf_nfapi_tx_timing = -1;
--static int hf_nfapi_ul_config_timing = -1;
--static int hf_nfapi_hi_dci0_timing = -1;
--static int hf_nfapi_maximum_number_phys = -1;
--static int hf_nfapi_maximum_total_bandwidth = -1;
--static int hf_nfapi_maximum_total_number_dl_layers = -1;
--static int hf_nfapi_maximum_total_number_ul_layers = -1;
--static int hf_nfapi_shared_bands = -1;
--static int hf_nfapi_shared_pa = -1;
--static int hf_nfapi_maximum_total_power = -1;
--static int hf_nfapi_oui= -1;
--
--static int hf_nfapi_pdu = -1;
--
--static int hf_nfapi_pnf_phy = -1;
--static int hf_nfapi_pnf_phy_nfapi_tl = -1; /* structure hf_nfapi_tl*/
--static int hf_nfapi_pnf_phy_number_phy = -1;
--static int hf_nfapi_pnf_phy_config_index = -1;
--static int hf_nfapi_number_of_rf_exclusions = -1;
--static int hf_nfapi_dl_bandwidth_support = -1;
--static int hf_nfapi_ul_bandwidth_support = -1;
--static int hf_nfapi_downlink_channel_bandwidth_supported = -1;
--static int hf_nfapi_uplink_channel_bandwidth_supported = -1;
--static int hf_nfapi_number_of_dl_layers_supported = -1;
--static int hf_nfapi_number_of_ul_layers_supported = -1;
--static int hf_nfapi_maximum_3gpp_release_supported = -1;
--static int hf_nfapi_nmm_modes_supported = -1;
--
--
--static int hf_nfapi_pnf_rf = -1;
--static int hf_nfapi_pnf_rf_nfapi_tl = -1;
--static int hf_nfapi_number_of_rfs = -1;
--static int hf_nfapi_rf_config_index = -1;
--static int hf_nfapi_band = -1;
--static int hf_nfapi_maximum_transmit_power = -1;
--static int hf_nfapi_earfcn = -1;
--static int hf_nfapi_minimum_transmit_power = -1;
--static int hf_nfapi_number_of_antennas_suppported = -1;
--static int hf_nfapi_minimum_downlink_frequency = -1;
--static int hf_nfapi_maximum_downlink_frequency = -1;
--static int hf_nfapi_minimum_uplink_frequency = -1;
--static int hf_nfapi_maximum_uplink_frequency = -1;
--
--static int hf_nfapi_number_of_rf_bands = -1;
--static int hf_nfapi_nmm_uplink_rssi_supported = -1;
--
--static int hf_nfapi_phy_rf_config_info = -1;
--static int hf_nfapi_phy_rf_config_info_phy_id = -1;
--static int hf_nfapi_phy_rf_config_info_band = -1;
--
--static int hf_nfapi_pnf_phy_rf_config = -1;
--static int hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info = -1;
--static int hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info = -1;
--
--static int hf_nfapi_pnf_phy_rel10 = -1;
--static int hf_nfapi_transmission_mode7_supported = -1;
--static int hi_nfapi_transmission_mode8_supported = -1;
--static int hi_nfapi_two_antennas_ports_for_pucch = -1;
--static int hi_nfapi_transmission_mode_9_supported = -1;
--static int hi_nfapi_simultaneous_pucch_pusch = -1;
--static int hi_nfapi_for_layer_tx_with_tm3_and_tm4 = -1;
--
--static int hf_nfapi_pnf_phy_rel11 = -1;
--static int hf_nfapi_epdcch_supported = -1;
--static int hi_nfapi_multi_ack_csi_reporting = -1;
--static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1;
--static int hi_nfapi_ul_comp_supported = -1;
--static int hi_nfapi_transmission_mode_5_supported = -1;
--
--static int hf_nfapi_pnf_phy_rel12 = -1;
--static int hf_nfapi_csi_subframe_set = -1;
--static int hi_nfapi_enhanced_4tx_codebook = -1;
--static int hi_nfapi_drs_supported = -1;
--static int hi_nfapi_ul_64qam_supported = -1;
--static int hi_nfapi_transmission_mode_10_supported = -1;
--static int hi_nfapi_alternative_tbs_indices = -1;
--
--static int hf_nfapi_pnf_phy_rel13 = -1;
--static int hf_nfapi_pucch_format_4_supported = -1;
--static int hf_nfapi_pucch_format_5_supported = -1;
--static int hf_nfapi_more_than_5_ca_supported = -1;
--static int hf_nfapi_laa_supported = -1;
--static int hf_nfapi_laa_ending_in_dwpts_supported = -1;
--static int hf_nfapi_laa_starting_in_second_slot_supported = -1;
--static int hf_nfapi_beamforming_supported = -1;
--static int hf_nfapi_csi_rs_enhancements_supported = -1;
--static int hf_nfapi_drms_enhancements_supported = -1;
--static int hf_nfapi_srs_enhancements_supported = -1;
--
--
--// P5 Message Structures
--static int hf_nfapi_pnf_param_response_pnf_param_general = -1;
--static int hf_nfapi_pnf_param_response_pnf_phy = -1;
--static int hf_nfapi_pnf_param_response_pnf_rf = -1;
--
--static int hf_nfapi_pnf_param_request = -1;
--static int hf_nfapi_pnf_param_response = -1;
--static int hf_nfapi_pnf_config_request = -1;
--static int hf_nfapi_pnf_config_response = -1;
--static int hf_nfapi_pnf_start_request = -1;
--static int hf_nfapi_pnf_start_response = -1;
--static int hf_nfapi_pnf_stop_request = -1;
--static int hf_nfapi_pnf_stop_response = -1;
--static int hf_nfapi_param_response = -1;
--static int hf_nfapi_start_request = -1;
--static int hf_nfapi_start_response = -1;
--static int hf_nfapi_stop_request = -1;
--static int hf_nfapi_stop_response = -1;
--
--static int hf_nfapi_uint8_tag = -1;
--static int hf_nfapi_uint16_tag = -1;
--
--static int hf_nfapi_error_code = -1;
--static int hf_nfapi_p4_error_code = -1;
--static int hf_nfapi_rat_type = -1;
--static int hf_nfapi_num_tlv = -1;
--static int hf_nfapi_phy_state = -1;
--//	static int hf_nfapi_bandwidth_support = -1;
--	
--static int hf_nfapi_modulation_support = -1;
--static int hf_nfapi_phy_antenna_capability = -1;
--static int hf_nfapi_release_capability = -1;
--static int hf_nfapi_mbsfn_capability = -1;
--
--static int hf_nfapi_laa_capability = -1;
--static int hf_nfapi_pd_sensing_lbt_support = -1;
--static int hf_nfapi_multi_carrier_lbt_support = -1;
--static int hf_nfapi_partial_sf_support = -1;
--	
--/* nfapi nfapi */
--static int hf_nfapi_pnf_address = -1;
--static int hf_nfapi_pnf_address_ipv4 = -1;
--static int hf_nfapi_pnf_address_ipv6 = -1;
--
--static int hf_nfapi_vnf_address = -1;
--static int hf_nfapi_vnf_address_ipv4 = -1;
--static int hf_nfapi_vnf_address_ipv6 = -1;
--	
--static int hf_nfapi_pnf_port = -1;
--static int hf_nfapi_vnf_port = -1;
--static int hf_nfapi_dl_ue_per_sf = -1;
--static int hf_nfapi_ul_ue_per_sf = -1;
--
--static int hf_nfapi_rf_bands = -1;
--static int hf_nfapi_rf_bands_nfapi_tl = -1;
--static int hf_nfapi_rf_bands_count = -1;
--static int hf_nfapi_rf_bands_value = -1;
--
--static int hf_nfapi_timing_window = -1;
--static int hf_nfapi_timing_info_mode = -1;
--static int hf_nfapi_timing_info_period = -1;
--static int hf_nfapi_max_transmit_power = -1;
--	
--/* subframe config */
--static int hf_nfapi_duplex_mode = -1;
--static int hf_nfapi_pcfich_power_offset = -1;
--static int hf_nfapi_pb = -1;
--static int hf_nfapi_dl_cyclic_prefix_type = -1;
--static int hf_nfapi_ul_cyclic_prefix_type = -1;
--
--static int hf_nfapi_tx_antenna_ports = -1;
--static int hf_nfapi_rx_antenna_ports = -1;
--
--
--
--/* RF Config */
--static int hf_nfapi_downlink_channel_bandwidth = -1;
--static int hf_nfapi_uplink_channel_bandwidth = -1;
--static int hf_nfapi_reference_signal_power = -1;
--
--/* PHICH config*/
--static int hf_nfapi_phich_resource = -1;
--static int hf_nfapi_phich_duration = -1;
--static int hf_nfapi_phich_power_offset = -1;
--
--static int hf_nfapi_value_float = -1;
--
--/* SCH Config */
--static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1;
--static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1;
--static int hf_nfapi_physical_cell_id = -1;
--
--/* PRACH config */
--static int hf_nfapi_configuration_index = -1;
--static int hf_nfapi_root_sequence_index = -1;
--static int hf_nfapi_zero_correlation_zone_configuration = -1;
--static int hf_nfapi_high_speed_flag = -1;
--static int hf_nfapi_frequency_offset = -1;
--
--/* PUSCH config */
--static int hf_nfapi_hopping_mode = -1;
--static int hf_nfapi_hopping_offset = -1;
--
--/* PUCCH config */
--static int hf_nfapi_delta_pucch_shift = -1;
--static int hf_nfapi_n_cqi_rb = -1;
--static int hf_nfapi_n_an_cs = -1;
--static int hf_nfapi_n1_pucch_an = -1;
--
--/* SRS config */
--static int hf_nfapi_bandwidth_configuration = -1;
--static int hf_nfapi_max_up_pts = -1;
--static int hf_nfapi_srs_subframe_configuration = -1;
--static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1;
--
--/* uplink reference signal config */
--static int hf_nfapi_uplink_rs_hopping = -1;
--static int hf_nfapi_group_assignment = -1;
--static int hf_nfapi_cyclic_shift_1_for_drms = -1;
--
--/* tdd frame structure */
--static int hf_nfapi_subframe_assignment = -1;
--static int hf_nfapi_special_subframe_patterns = -1;
--
--/* laa config */
--static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1;
--static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1;
--static int hf_nfapi_pd_threshold = -1;
--static int hf_nfapi_multi_carrier_type = -1;
--static int hf_nfapi_multi_carrier_tx = -1;
--static int hf_nfapi_multi_carrier_freeze = -1;
--static int hf_nfapi_tx_antenna_ports_for_drs = -1;
--static int hf_nfapi_transmission_power_for_drs = -1;
--
--/* eMTC config */
--static int hf_nfapi_pbch_repetitions_enabled_r13 = -1;
--static int hf_nfapi_prach_cat_m_root_sequence_index = -1;
--static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1;
--static int hf_nfapi_prach_cat_m_high_speed_flag = -1;
--
--static int hf_nfapi_prach_ce_level_0_enable = -1;
--static int hf_nfapi_prach_ce_level_0_configuration_index = -1;
--static int hf_nfapi_prach_ce_level_0_frequency_offset = -1;
--static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1;
--static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1;
--static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1;
--static int hf_nfapi_prach_ce_level_0_hopping_offset = -1;
--
--static int hf_nfapi_prach_ce_level_1_enable = -1;
--static int hf_nfapi_prach_ce_level_1_configuration_index = -1;
--static int hf_nfapi_prach_ce_level_1_frequency_offset = -1;
--static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1;
--static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1;
--static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1;
--static int hf_nfapi_prach_ce_level_1_hopping_offset = -1;
--
--static int hf_nfapi_prach_ce_level_2_enable = -1;
--static int hf_nfapi_prach_ce_level_2_configuration_index = -1;
--static int hf_nfapi_prach_ce_level_2_frequency_offset = -1;
--static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1;
--static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1;
--static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1;
--static int hf_nfapi_prach_ce_level_2_hopping_offset = -1;
--
--static int hf_nfapi_prach_ce_level_3_enable = -1;
--static int hf_nfapi_prach_ce_level_3_configuration_index = -1;
--static int hf_nfapi_prach_ce_level_3_frequency_offset = -1;
--static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1;
--static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1;
--static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1;
--static int hf_nfapi_prach_ce_level_3_hopping_offset = -1;
--static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1;
--static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1;
--
--static int hf_nfapi_dl_modulation_support = -1;
--static int hf_nfapi_ul_modulation_support = -1;
--
--/* 123 config */
--static int hf_nfapi_data_report_mode = -1;
--static int hf_nfapi_sfnsf = -1;
--
--// P7 Sub Structures
--static int hf_nfapi_dl_config_dci_dl_pdu_rel8 = -1;
--static int hf_nfapi_dci_format = -1;
--static int hf_nfapi_cce_idx = -1;
--static int hf_nfapi_aggregation_level = -1;
--static int hf_nfapi_mcs_1 = -1;
--static int hf_nfapi_redundancy_version_1 = -1;
--static int hf_nfapi_new_data_indicator_1 = -1;
--static int hf_nfapi_mcs_2 = -1;
--static int hf_nfapi_redundancy_version_2 = -1;
--static int hf_nfapi_new_data_indicator_2 = -1;
--static int hf_nfapi_harq_process = -1;
--static int hf_nfapi_tpmi = -1;
--static int hf_nfapi_pmi = -1;
--static int hf_nfapi_precoding_information = -1;
--static int hf_nfapi_tpc = -1;
--static int hf_nfapi_downlink_assignment_index = -1;
--static int hf_nfapi_transport_block_size_index = -1;
--static int hf_nfapi_downlink_power_offset = -1;
--static int hf_nfapi_allocate_prach_flag = -1;
--static int hf_nfapi_preamble_index = -1;
--static int hf_nfapi_prach_mask_index = -1;
--static int hf_nfapi_rnti_type = -1;
--
--static int hf_nfapi_dl_config_dci_dl_pdu_rel9 = -1;
--static int hf_nfapi_mcch_flag = -1;
--static int hf_nfapi_mcch_change_notification = -1;
--static int hf_nfapi_scrambling_identity = -1;
--
--static int hf_nfapi_dl_config_dci_dl_pdu_rel10 = -1;
--static int hf_nfapi_cross_carrier_scheduling_flag = -1;
--static int hf_nfapi_carrier_indicator = -1;
--static int hf_nfapi_srs_flag = -1;
--static int hf_nfapi_srs_request = -1;
--static int hf_nfapi_antenna_ports_scrambling_and_layers = -1;
--static int hf_nfapi_total_dci_length_including_padding = -1;
--static int hf_nfapi_n_dl_rb = -1;
--
--static int hf_nfapi_dl_config_dci_dl_pdu_rel11 = -1;
--static int hf_nfapi_harq_ack_resource_offset = -1;
--static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1;
--static int hf_nfapi_dl_config_dci_dl_pdu_rel12 = -1;
--static int hf_nfapi_primary_cell_type = -1;
--static int hf_nfapi_ul_dl_configuration_flag = -1;
--static int hf_nfapi_number_of_ul_dl_configurations = -1;
--static int hf_nfapi_ul_dl_configuration_index = -1;
--static int hf_nfapi_dl_config_dci_dl_pdu_rel13 = -1;
--static int hf_nfapi_laa_end_partial_sf_flag = -1;
--static int hf_nfapi_laa_end_partial_sf_configuration = -1;
--static int hf_nfapi_initial_lbt_sf = -1;
--static int hf_nfapi_codebooksize_determination_r13 = -1;
--static int hf_nfapi_rel13_drms_table_flag = -1;
--
--
--static int hf_nfapi_dl_config_dci_dl_pdu = -1;
--static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel8 = -1;
--static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel9 = -1;
--static int hf_nfapi_dl_config_dci_dl_pdu_nfapi_dl_config_dci_dl_pdu_rel10 = -1;
--
--static int hf_nfapi_bf_vector_antennas = -1;
--static int hf_nfapi_subbands = -1;
--static int hf_nfapi_bf_vectors = -1;
--static int hf_nfapi_csi_rs_resource_config = -1;
--static int hf_nfapi_csi_rs_number_if_nzp_configurations = -1;
--static int hf_nfapi_csi_rs_resource_configs = -1;
--static int hf_nfapi_pdsch_start = -1;
--static int hf_nfapi_drms_config_flag = -1;
--static int hf_nfapi_drms_scrambling = -1;
--static int hf_nfapi_csi_config_flag = -1;
--static int hf_nfapi_csi_scrambling = -1;
--static int hf_nfapi_pdsch_re_mapping_flag = -1;
--static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1;
--static int hf_nfapi_pdsch_re_mapping_freq_shift = -1;
--static int hf_nfapi_alt_cqi_table_r12 = -1;
--static int hf_nfapi_max_layers = -1;
--static int hf_nfapi_n_dl_harq = -1;
--static int hf_nfapi_dwpts_symbols = -1;
--static int hf_nfapi_ue_type = -1;
--static int hf_nfapi_pdsch_payload_type = -1;
--static int hf_nfapi_initial_transmission_sf = -1;
--static int hf_nfapi_req13_drms_table_flag = -1;
--static int hf_nfapi_prnti = -1;
--static int hf_nfapi_mcs = -1;
--static int hf_nfapi_number_of_transport_blocks = -1;
--static int hf_nfapi_ue_mode = -1;
--static int hf_prs_bandwidth = -1;
--static int hf_prs_cyclic_prefix_type = -1;
--static int hf_prs_muting = -1;
--static int hf_nfapi_csi_rs_number_of_nzp_configuration = -1;
--static int hf_nfapi_csi_rs_resource_index = -1;
--static int hf_nfapi_csi_rs_class = -1;
--static int hf_nfapi_cdm_type = -1;
--static int hf_nfapi_csi_rs_bf_vector = -1;
--static int hf_nfapi_edpcch_prb_index = -1;
--static int hf_nfapi_epdcch_resource_assignment_flag = -1;
--static int hf_nfapi_epdcch_id = -1;
--static int hf_nfapi_epdcch_start_symbol = -1;
--static int hf_nfapi_epdcch_num_prb = -1;
--static int hf_nfapi_epdcch_prbs = -1;
--static int hf_nfapi_precoding_value = -1;
--static int hf_nfapi_mpdcch_narrowband = -1;
--static int hf_nfapi_number_of_prb_pairs = -1;
--static int hf_nfapi_resource_block_assignment = -1;
--static int hf_nfapi_start_symbol = -1;
--static int hf_nfapi_ecce_index = -1;
--static int hf_nfapi_ce_mode = -1;
--static int hf_nfapi_drms_scrabmling_init = -1;
--static int hf_nfapi_pdsch_reception_levels = -1;
--static int hf_nfapi_new_data_indicator = -1;
--static int hf_nfapi_tpmi_length = -1;
--static int hf_nfapi_pmi_flag = -1;
--static int hf_nfapi_harq_resource_offset = -1;
--static int hf_nfapi_dci_subframe_repetition_number = -1;
--static int hf_nfapi_downlink_assignment_index_length = -1;
--static int hf_nfapi_starting_ce_level = -1;
--static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1;
--static int hf_nfapi_antenna_ports_and_scrambling_identity = -1;
--static int hf_nfapi_paging_direct_indication_differentiation_flag = -1;
--static int hf_nfapi_direct_indication = -1;
--static int hf_nfapi_number_of_tx_antenna_ports = -1;
--static int hf_nfapi_precoding = -1;
--
--
--
--// P7 Message Structures
--static int hf_nfapi_dl_node_sync = -1;
--static int hf_nfapi_dl_node_sync_nfapi_p7_message_header = -1;
--static int hf_nfapi_dl_node_sync_t1 = -1;
--static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1;
--
--static int hf_nfapi_ul_node_sync = -1;
--static int hf_nfapi_ul_node_sync_nfapi_p7_message_header = -1;
--static int hf_nfapi_ul_node_sync_t1 = -1;
--static int hf_nfapi_ul_node_sync_t2 = -1;
--static int hf_nfapi_ul_node_sync_t3 = -1;
--
--static int hf_nfapi_timing_info = -1;
--static int hf_nfapi_timing_info_nfapi_p7_message_header = -1;
--static int hf_nfapi_timing_info_last_sfn_sf = -1;
--static int hf_nfapi_timing_info_time_since_last_timing_info = -1;
--static int hf_nfapi_timing_info_dl_config_jitter = -1;
--static int hf_nfapi_timing_info_tx_request_jitter = -1;
--static int hf_nfapi_timing_info_ul_config_jitter = -1;
--static int hf_nfapi_timing_info_hi_dci0_jitter = -1;
--static int hf_nfapi_timing_info_dl_config_latest_delay = -1;
--static int hf_nfapi_timing_info_tx_request_latest_delay = -1;
--static int hf_nfapi_timing_info_ul_config_latest_delay = -1;
--static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1;
--static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1;
--static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1;
--static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1;
--static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1;
--
--static int hf_nfapi_dl_config_request = -1;
--static int hf_nfapi_sfn_sf = -1;
--
--static int hf_nfapi_dl_config_request_body = -1;
--static int hf_nfapi_number_pdcch_ofdm_symbols = -1;
--static int hf_nfapi_number_dci = -1;
--static int hf_nfapi_number_pdus = -1;
--static int hf_nfapi_number_pdsch_rnti = -1;
--static int hf_nfapi_transmission_power_pcfich = -1;
--
--static int hf_nfapi_number_of_harqs = -1;
--static int hf_nfapi_number_of_crcs = -1;
--static int hf_nfapi_number_of_srs = -1;
--static int hf_nfapi_number_of_cqi = -1;
--static int hf_nfapi_number_of_preambles = -1;
--static int hf_nfapi_number_of_srss = -1;
--static int hf_nfapi_lbt_dl_req_pdu_type = -1;
--static int hf_nfapi_lbt_dl_ind_pdu_type = -1;
--
--static int hf_nfapi_dl_config_request_pdu_list = -1;
--static int hf_nfapi_ul_config_request_pdu_list = -1;
--static int hf_nfapi_hi_dci0_request_pdu_list = -1;
--static int hf_nfapi_tx_request_pdu_list = -1;
--static int hf_nfapi_rx_indication_pdu_list = -1;
--static int hf_nfapi_harq_indication_pdu_list = -1;
--static int hf_nfapi_crc_indication_pdu_list = -1;
--static int hf_nfapi_sr_indication_pdu_list = -1;
--static int hf_nfapi_cqi_indication_pdu_list = -1;
--static int hf_nfapi_preamble_indication_pdu_list = -1;
--static int hf_nfapi_srs_indication_pdu_list = -1;
--static int hf_nfapi_lbt_dl_config_pdu_list = -1;
--static int hf_nfapi_lbt_dl_indication_pdu_list = -1;
--
--
--static int hf_nfapi_dl_config_pdu_type = -1;
--static int hf_nfapi_pdu_size = -1;
--static int hf_nfapi_instance_length = -1;
--
--static int hf_nfapi_dl_config_dlsch_pdu_rel8 = -1;
--static int hf_nfapi_length;
--static int hf_nfapi_pdu_index = -1;
--static int hf_nfapi_rnti = -1;
--static int hf_nfapi_resource_allocation_type = -1;
--static int hf_nfapi_virtual_resource_block_assignment_flag = -1;
--static int hf_nfapi_resource_block_coding = -1;
--static int hf_nfapi_modulation = -1;
--static int hf_nfapi_redundancy_version = -1;
--static int hf_nfapi_transport_blocks = -1;
--static int hf_nfapi_transport_block_to_codeword_swap_flag = -1;
--static int hf_nfapi_transmission_scheme = -1;
--static int hf_nfapi_ul_transmission_scheme = -1;
--static int hf_nfapi_number_of_layers = -1;
--static int hf_nfapi_number_of_subbands = -1;
--static int hf_nfapi_codebook_index = -1;
--static int hf_nfapi_ue_category_capacity = -1;
--static int hf_nfapi_pa = -1;
--static int hf_nfapi_delta_power_offset_index = -1;
--static int hf_nfapi_ngap = -1;
--static int hf_nfapi_nprb = -1;
--static int hf_nfapi_transmission_mode = -1;
--static int hf_nfapi_num_bf_prb_per_subband = -1;
--
--static int hf_nfapi_num_bf_vector = -1;
--static int hf_nfapi_bf_vector_subband_index = -1;
--static int hf_nfapi_bf_vector_num_antennas = -1;
--static int hf_nfapi_bf_vector_bf_value = -1;
--
--static int hf_nfapi_dl_config_dlsch_pdu_rel9 = -1;
--static int hf_nfapi_nscid = -1;
--
--static int hf_nfapi_dl_config_dlsch_pdu_rel10 = -1;
--static int hf_nfapi_csi_rs_flag = -1;
--static int hf_nfapi_csi_rs_resource_config_r10 = -1;
--static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1;
--
--static int hf_nfapi_dl_config_bch_pdu_rel8 = -1;
--static int hf_nfapi_transmission_power = -1;
--
--static int hf_nfapi_dl_config_mch_pdu_rel8 = -1;
--static int hf_nfapi_mbsfn_area_id = -1;
--
--static int hf_nfapi_dl_config_pch_pdu_rel8 = -1;
--
--static int hf_nfapi_dl_config_prs_pdu_rel9 = -1;
--static int hf_nfapi_prs_bandwidth = -1;
--static int hf_nfapi_prs_cyclic_prefix_type = -1;
--		
--static int hf_nfapi_dl_config_csi_rs_pdu_rel10 = -1;
--static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1;
--
--static int hf_nfapi_ul_config_request = -1;
--static int hf_nfapi_ul_config_request_body = -1;
--static int hf_nfapi_ul_config_pdu_type = -1;
--
--static int hf_nfapi_rach_prach_frequency_resources = -1;
--static int hf_nfapi_srs_present = -1;
--static int hf_nfapi_ul_config_harq_buffer_pdu = -1;
--
--static int hf_nfapi_ul_config_ue_information_rel8 = -1;
--static int hf_nfapi_handle = -1;
--static int hf_nfapi_ul_config_sr_information_pdu_rel8 = -1;
--static int hf_nfapi_pucch_index = -1;
--static int hf_nfapi_size = -1;
--static int hf_nfapi_resource_block_start = -1;
--static int hf_nfapi_number_of_resource_blocks = -1;
--static int hf_nfapi_cyclic_shift_2_for_drms = -1;
--static int hf_nfapi_frequency_hopping_enabled_flag = -1;
--static int hf_nfapi_frequency_hopping_bits = -1;
--static int hf_nfapi_new_data_indication = -1;
--static int hf_nfapi_harq_process_number = -1;
--static int hf_nfapi_ul_tx_mode = -1;
--static int hf_nfapi_current_tx_nb = -1;
--static int hf_nfapi_n_srs = -1;
--static int hf_nfapi_disable_sequence_hopping_flag = -1;
--static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1;
--static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1;
--static int hf_nfapi_ri_size = -1;
--static int hf_nfapi_delta_offset_cqi = -1;
--static int hf_nfapi_delta_offset_ri = -1;
--static int hf_nfapi_harq_size = -1;
--static int hf_nfapi_delta_offset_harq = -1;
--static int hf_nfapi_ack_nack_mode = -1;
--static int hf_nfapi_n_srs_initial = -1;
--static int hf_nfapi_initial_number_of_resource_blocks = -1;
--static int hf_nfapi_dl_cqi_pmi_size = -1;
--static int hf_nfapi_report_type = -1;
--static int hf_nfapi_dl_cqi_ri_pmi_size = -1;
--static int hf_nfapi_control_type = -1;
--static int hf_nfapi_number_of_cc = -1;
--static int hf_nfapi_virtual_cell_id_enabled_flag = -1;
--static int hf_nfapi_npusch_identity = -1;
--static int hf_nfapi_ndrms_csh_identity = -1;
--static int hf_nfapi_total_number_of_repetitions = -1;
--static int hf_nfapi_repetition_number = -1;
--static int hf_nfapi_initial_sf_io = -1;
--static int hf_nfapi_empty_symbols_due_to_retunning = -1;
--static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1;
--static int hf_nfapi_npucch_identity = -1;
--static int hf_nfapi_harq_size_2 = -1;
--static int hf_nfapi_delta_offset_harq_2 = -1;
--static int hf_nfapi_empty_symbols = -1;
--static int hf_nfapi_total_number_of_repetitons = -1;
--static int hf_nfapi_csi_mode = -1;
--static int hf_nfapi_dl_cqi_pmi_size_2 = -1;
--static int hf_nfapi_statring_prb = -1;
--static int hf_nfapi_cdm_index = -1;
--static int hf_nfapi_nsrs = -1;
--static int hf_nfapi_num_ant_ports = -1;
--static int hf_nfapi_n_pucch_2_0 = -1;
--static int hf_nfapi_n_pucch_2_1 = -1;
--static int hf_nfapi_n_pucch_2_2 = -1;
--static int hf_nfapi_n_pucch_2_3 = -1;
--static int hf_nfapi_starting_prb = -1;
--static int hf_nfapi_antenna_port = -1;
--static int hf_nfapi_number_of_combs = -1;
--
--
--
--static int hf_nfapi_number_of_pucch_resource = -1;
--static int hf_nfapi_pucch_index_p1 = -1;
--static int hf_nfapi_n_pucch_1_0 = -1;
--static int hf_nfapi_n_pucch_1_1 = -1;
--static int hf_nfapi_n_pucch_1_2 = -1;
--static int hf_nfapi_n_pucch_1_3 = -1;
--static int hf_nfapi_srs_bandwidth = -1;
--static int hf_nfapi_frequency_domain_position = -1;
--static int hf_nfapi_srs_hopping_bandwidth = -1;
--static int hf_nfapi_transmission_comb = -1;
--static int hf_nfapi_i_srs = -1;
--static int hf_nfapi_sounding_reference_cyclic_shift = -1;
--static int hf_nfapi_antenna_ports = -1;
--static int hf_nfapi_ul_config_srs_pdu_rel10 = -1;
--static int hf_nfapi_ul_config_srs_pdu_rel8 = -1;
--static int hf_nfapi_ul_config_harq_information_rel9_fdd = -1;
--static int hf_nfapi_ul_config_harq_information_rel8_fdd = -1;
--static int hf_nfapi_ul_config_harq_information_rel10_tdd = -1;
--static int hf_nfapi_ul_config_sr_information_rel10 = -1;
--static int hf_nfapi_ul_config_sr_information_rel8 = -1;
--static int hf_nfapi_ul_config_cqi_information_rel10 = -1;
--static int hf_nfapi_ul_config_cqi_information_rel8 = -1;
--static int hf_nfapi_ul_config_initial_transmission_parameters_rel8 = -1;
--static int hf_nfapi_ul_config_ulsch_harq_information_rel10 = -1;
--
--/* Tx request */
--static int hf_nfapi_pdu_length = -1;
--static int hf_nfapi_num_segments = -1;
--static int hf_nfapi_segment_length = -1;
--static int hf_nfapi_segment_data = -1;
--
--/* CRC Indication */
--static int hf_nfapi_crc_indication_body = -1;
--static int hf_nfapi_crc_flag = -1;
--
--static int hf_nfapi_number_of_hi_pdus = -1;
--static int hf_nfapi_number_of_dci_pdus = -1;
--static int hf_nfapi_pdu_type = -1;
--static int hf_nfapi_hi_value = -1;
--static int hf_nfapi_i_phich = -1;
--static int hf_nfapi_flag_tb2 = -1;
--static int hf_nfapi_hi_value_2 = -1;
--static int hf_nfapi_ue_tx_antenna_selection = -1;
--static int hf_nfapi_cqi_csi_request = -1;
--static int hf_nfapi_ul_index = -1;
--static int hf_nfapi_dl_assignment_index = -1;
--static int hf_nfapi_tpc_bitmap = -1;
--static int hf_nfapi_new_data_indication_two = -1;
--static int hf_nfapi_size_of_cqi_csi_feild = -1;
--static int hf_nfapi_resource_allocation_flag = -1;
--static int hf_nfapi_number_of_antenna_ports =-1 ;
--
--static int hf_nfapi_n_ul_rb = -1;
--static int hf_nfapi_pscch_resource = -1;
--static int hf_nfapi_time_resource_pattern = -1;
--static int hf_nfapi_mpdcch_transmission_type = -1;
--static int hf_nfapi_drms_scrambling_init = -1;
--static int hf_nfapi_pusch_repetition_levels = -1;
--static int hf_nfapi_frequency_hopping_flag = -1;
--static int hf_nfapi_csi_request = -1;
--static int hf_nfapi_dai_presence_flag = -1;
--static int hf_nfapi_total_dci_length_include_padding = -1;
--static int hf_nfapi_data_offset = -1;
--static int hf_nfapi_ul_cqi = -1;
--static int hf_nfapi_timing_advance_r9 = -1;
--static int hf_nfapi_timing_advance = -1;
--static int hf_nfapi_harq_data_value_0 = -1;
--static int hf_nfapi_harq_data_value_1 = -1;
--static int hf_nfapi_harq_data_value_2 = -1;
--static int hf_nfapi_harq_data_value_3 = -1;
--static int hf_nfapi_harq_mode = -1;
--static int hf_nfapi_number_of_ack_nack = -1;
--static int hf_nfapi_harq_ack_nack_data = -1;
--static int hf_nfapi_harq_tb_1 = -1;
--static int hf_nfapi_harq_tb_2 = -1;
--static int hf_nfapi_harq_tb_n = -1;
--static int hf_nfapi_harq_data = -1;
--static int hf_nfapi_channel = -1;
--static int hf_nfapi_ri = -1;
--static int hf_nfapi_number_of_cc_reported = -1;
--static int hf_nfapi_cc = -1;
--static int hf_nfapi_preamble = -1;
--static int hf_nfapi_rach_resource_type = -1;
--static int hf_nfapi_snr = -1;
--static int hf_nfapi_doppler_estimation = -1;
--static int hf_nfapi_rb_start = -1;
--static int hf_nfapi_rbs = -1;
--static int hf_nfapi_up_pts_symbol = -1;
--static int hf_nfapi_number_prb_per_subband = -1;
--static int hf_nfapi_number_antennas = -1;
--static int hf_nfapi_subband_index = -1;
--static int hf_nfapi_antennas = -1;
--static int hf_nfapi_channel_coefficient = -1;
--static int hf_nfapi_ul_rtoa = -1;
--static int hf_nfapi_mp_cca = -1;
--static int hf_nfapi_n_cca = -1;
--static int hf_nfapi_offset = -1;
--static int hf_nfapi_lte_txop_sf = -1;
--static int hf_nfapi_txop_sfn_sf_end = -1;
--static int hf_nfapi_lbt_mode = -1;
--static int hf_nfapi_sfn_sf_end = -1;
--static int hf_nfapi_result = -1;
--static int hf_nfapi_txop_symbols = -1;
--static int hf_nfapi_initial_partial_sf = -1;
--
--
--static int hf_nfapi_frequency_band_indicator = -1;
--static int hf_nfapi_measurement_period = -1;
--static int hf_nfapi_bandwidth = -1;
--static int hf_nfapi_timeout = -1;
--static int hf_nfapi_number_of_earfcns = -1;
--static int hf_nfapi_earfcn_list = -1;
--static int hf_nfapi_uarfcn = -1;
--static int hf_nfapi_number_of_uarfcns = -1;
--static int hf_nfapi_uarfcn_list = -1;
--static int hf_nfapi_arfcn = -1;
--static int hf_nfapi_arfcn_direction = -1;
--static int hf_nfapi_number_of_arfcns = -1;
--static int hf_nfapi_arfcn_list = -1;
--static int hf_nfapi_rssi = -1;
--static int hf_nfapi_number_of_rssi = -1;
--static int hf_nfapi_rssi_list = -1;
--static int hf_nfapi_pci = -1;
--static int hf_nfapi_measurement_bandwidth = -1;
--static int hf_nfapi_exhaustive_search = -1;
--static int hf_nfapi_number_of_pci = -1;
--static int hf_nfapi_pci_list = -1;
--static int hf_nfapi_psc = -1;
--static int hf_nfapi_number_of_psc = -1;
--static int hf_nfapi_psc_list = -1;
--static int hf_nfapi_rsrp = -1;
--static int hf_nfapi_rsrq = -1;
--static int hf_nfapi_number_of_lte_cells_found = -1;
--static int hf_nfapi_lte_cells_found_list = -1;
--static int hf_nfapi_rscp = -1;
--static int hf_nfapi_enco = -1;
--static int hf_nfapi_number_of_utran_cells_found = -1;
--static int hf_nfapi_utran_cells_found_list = -1;
--static int hf_nfapi_bsic = -1;
--static int hf_nfapi_rxlev = -1;
--static int hf_nfapi_rxqual = -1;
--static int hf_nfapi_sfn_offset = -1;
--static int hf_nfapi_number_of_geran_cells_found = -1;
--static int hf_nfapi_geran_cells_found_list = -1;
--static int hf_nfapi_number_of_tx_antenna = -1;
--static int hf_nfapi_mib_length = -1;
--static int hf_nfapi_mib = -1;
--static int hf_nfapi_phich_configuration = -1;
--static int hf_nfapi_retry_count = -1;
--static int hf_nfapi_sib1 = -1;
--static int hf_nfapi_si_periodicity = -1;
--static int hf_nfapi_si_index = -1;
--static int hf_nfapi_number_of_si_periodicity = -1;
--static int hf_nfapi_si_periodicity_list = -1;
--static int hf_nfapi_si_window_length = -1;
--static int hf_nfapi_sib_type = -1;
--static int hf_nfapi_sib_len = -1;
--static int hf_nfapi_sib = -1;
--static int hf_nfapi_si_len = -1;
--static int hf_nfapi_si = -1;
--
--static int hf_nfapi_pnf_search_state = -1;
--static int hf_nfapi_pnf_broadcast_state = -1;
--
--static const value_string message_id_vals[]	= {	{ 0x80, "DL_CONFIG.request"},
--												{ 0x81, "UL_CONFIG.request"},
--												{ 0x82, "SUBFRAME_INDICATION"},
--												{ 0x83, "HI_DCI0.request"},
--												{ 0x84, "TX.request"},
--												{ 0x85, "HARQ.indication"},
--												{ 0x86, "CRC.indication"},
--												{ 0x87, "RX_ULSCH.indication"},
--												{ 0x88, "RACH.indication" },
--												{ 0x89, "SRS.indication" },
--												{ 0x8A, "RX_SR.indication" },
--												{ 0x8B, "RX_CQI.indication" },
--												{ 0x8C,	"LBT_DL_CONFIG.request" } ,
--												{ 0x8D,	"LBT_DL.indication" } , 
--
--												{ 0x0100, "PNF_PARAM.request" },
--												{ 0x0101, "PNF_PARAM.response" },
--												{ 0x0102, "PNF_CONFIG.request" },
--												{ 0x0103, "PNF_CONFIG.response" },
--												{ 0x0104, "PNF_START.request" },
--												{ 0x0105, "PNF_START.response" },
--												{ 0x0106, "PNF_STOP.request" },
--												{ 0x0107, "PNF_STOP.response" },
--												{ 0x0108, "PARAM.request" },
--												{ 0x0109, "PARAM.response" },
--												{ 0x010A, "CONFIG.request" },
--												{ 0x010B, "CONFIG.response" },
--												{ 0x010C, "START.request" },
--												{ 0x010D, "START.response" },
--												{ 0x010E, "STOP.request" },
--												{ 0x010F, "STOP.response" },
--												{ 0x0110, "MEASUREMENT.request" },
--												{ 0x0111, "MEASUREMENT.response" },
--
--												{ 0x0180, "UL_NODE_SYNC" },
--												{ 0x0181, "DL_NODE_SYNC" },
--												{ 0x0182, "TIMING_INFO" },
--
--												{ 0x0200, "RSSI.request" },
--												{ 0x0201, "RSSI.response" },
--												{ 0x0202, "RSSI.indication" },
--												{ 0x0203, "CELL_SEARCH.request" },
--												{ 0x0204, "CELL_SEARCH.response" },
--												{ 0x0205, "CELL_SEARCH.indication" },
--												{ 0x0206, "BROADCAST_DETECT.request" },
--												{ 0x0207, "BROADCAST_DETECT.response" },
--												{ 0x0208, "BROADCAST_DETECT.indication" },
--												{ 0x0209, "SYSTEM_INFORMATION_SCHEDULE.request" },
--												{ 0x020A, "SYSTEM_INFORMATION_SCHEDULE.response" },
--												{ 0x020B, "SYSTEM_INFORMATION_SCHEDULE.indication" },
--												{ 0x020C, "SYSTEM_INFORMATION.request" },
--												{ 0x020D, "SYSTEM_INFORMATION.response" },
--												{ 0x020E, "SYSTEM_INFORMATION.indication" },
--												{ 0x020F, "NMM_STOP.request" },
--												{ 0x0210, "NMM_STOP.response" },
--
--												{ 0 , NULL },	
--};
--
--
--typedef int(*tlv_decode)(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end);
--
--typedef struct
--{
--	uint16_t tag_id;
--	char* name;
--	tlv_decode decode;
--} tlv_t;
--
--static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint end);
--
--
--
--
--static guint8 proto_tree_add_uint8(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units)
--{
--	guint8 value = tvb_get_guint8(tvb, *offset);
--	proto_item * item =  proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA);
--
--	if (units != NULL)
--	{
--		proto_item_append_text(item, " ");
--		proto_item_append_text(item, units);
--	}
--
--	*offset += 1;
--
--	return value;
--}
--
--static guint8 proto_tree_add_uint8_with_range(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, packet_info *pinfo, guint8 min, guint8 max, char* units)
--{
--	guint8 value = tvb_get_guint8(tvb, *offset);
--	proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 1, ENC_NA);
--
--	if (units != NULL)
--	{
--		proto_item_append_text(item, " ");
--		proto_item_append_text(item, units);
--	}
--
--	*offset += 1;
--
--	if (value < min || value > max)
--	{
--		expert_add_info(pinfo, tree, &ei_invalid_range);
--	}
--
--
--	return value;
--}
--
--static guint16 proto_tree_add_uint16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units)
--{
--	guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA);
--	proto_item * item =  proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA);
--
--	if (units != NULL)
--	{
--		proto_item_append_text(item, " ");
--		proto_item_append_text(item, units);
--	}
--
--	*offset += 2;
--
--	return value;
--}
--
--static void proto_tree_add_int16(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units)
--{
--	proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 2, ENC_NA);
--
--	if (units != NULL)
--	{
--		proto_item_append_text(item, " ");
--		proto_item_append_text(item, units);
--	}
--
--	*offset += 2;
--}
--
--typedef int(*uint8_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value);
--
--static guint8 proto_tree_add_uint8_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint8_value_conversion conversion)
--{
--	guint8 value = tvb_get_guint8(tvb, *offset);
--
--	conversion(tree, hfindex, tvb, offset, value);
--
--	*offset += 1;
--
--	return value;
--}
--
--typedef int(*uint16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value);
--
--static guint16 proto_tree_add_uint16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, uint16_value_conversion conversion)
--{
--	guint16 value = tvb_get_guint16(tvb, *offset, ENC_NA);
--
--	conversion(tree, hfindex, tvb, offset, value);
--
--	*offset += 2;
--
--	return value;
--}
--
--typedef int(*int16_value_conversion)(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value);
--
--static gint16 proto_tree_add_int16_with_conversion(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, int16_value_conversion conversion)
--{
--	gint16 value = (gint16)(tvb_get_guint16(tvb, *offset, ENC_NA));
--
--	conversion(tree, hfindex, tvb, offset, value);
--
--	*offset += 2;
--
--	return value;
--}
--
--
--static void proto_tree_add_uint32(proto_tree *tree, int hfindex, tvbuff_t *tvb, guint* offset, char* units)
--{
--	proto_item * item = proto_tree_add_item(tree, hfindex, tvb, *offset, 4, ENC_NA);
--
--	if (units != NULL)
--	{
--		proto_item_append_text(item, " ");
--		proto_item_append_text(item, units);
--	}
--
--	*offset += 4;
--}
--
--static void proto_tree_add_uint8_array(proto_tree *tree, int hfindex, guint len, tvbuff_t *tvb, guint* offset)
--{
--	proto_tree_add_item(tree, hfindex, tvb, *offset, len, ENC_NA);
--
--	*offset += len;
--}
--
--
--
--
--
--int dissect_array_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end, const char* name, guint32 hf_idx, guint32 ett_idx, guint32 count, tlv_decode decode)
--{
--	guint16 i = 0;
--
--	if (count > 0)
--	{
--		proto_item *list_ti = proto_tree_add_string_format(tree, hf_idx, tvb, *offset, 2, "", name);
--		proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_idx);
--
--		gint start_of_list = *offset;
--
--		for (i = 0; i < count; ++i)
--		{
--			proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_idx, tvb, *offset, 2, "", "[%d]", i);
--			proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_idx);
--
--			gint start_of_item = *offset;
--
--			decode(tvb, pinfo, item_tree, data, offset, end);
--
--			if (item_ti != NULL)
--				item_ti->finfo->length = *offset - start_of_item;
--		}
--
--		if (list_ti != NULL)
--			list_ti->finfo->length = *offset - start_of_list;
--	}
--
--	return 0;
--}
--
--int dissect_pnf_param_general_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_sync_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_location_mode, tvb, offset, 0);
--	guint16 len = proto_tree_add_uint16(tree, hf_nfapi_location_coordinates_length, tvb, offset, 0);
--	if (len > 0)
--		proto_tree_add_uint8_array(tree, hf_nfapi_location_coordinates, len, tvb, offset);
--	proto_tree_add_uint32(tree, hf_nfapi_dl_config_timing, tvb, offset, "milliseconds");
--	proto_tree_add_uint32(tree, hf_nfapi_tx_timing, tvb, offset, "milliseconds");
--	proto_tree_add_uint32(tree, hf_nfapi_ul_config_timing, tvb, offset, "milliseconds");
--	proto_tree_add_uint32(tree, hf_nfapi_hi_dci0_timing, tvb, offset, "milliseconds");
--	proto_tree_add_uint16(tree, hf_nfapi_maximum_number_phys, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_maximum_total_bandwidth, tvb, offset, "(100 khz)");
--	proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_dl_layers, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_maximum_total_number_ul_layers, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_shared_bands, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_shared_pa, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_maximum_total_power, tvb, offset, 0);
--	proto_tree_add_uint8_array(tree, hf_nfapi_oui, 3, tvb, offset);
--	
--	return 0;
--}
--
--int dissect_pnf_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_pnf_phy_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0);
--	guint16 num_rf_configs = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Config List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value);
--	guint16 num_rf_exclusions = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_exclusions, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Exclustion List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value);
--	proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_uplink_channel_bandwidth_supported, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_dl_layers_supported, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_layers_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_maximum_3gpp_release_supported, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_nmm_modes_supported, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_pnf_phy_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value);
--
--
--	return 0;
--
--}
--
--
--int dissect_pnf_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_minimum_transmit_power, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_antennas_suppported, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_minimum_downlink_frequency, tvb, offset, "(100 khz)");
--	proto_tree_add_uint32(tree, hf_nfapi_maximum_downlink_frequency, tvb, offset, "(100 khz)");
--	proto_tree_add_uint32(tree, hf_nfapi_minimum_uplink_frequency, tvb, offset, "(100 khz)");
--	proto_tree_add_uint32(tree, hf_nfapi_maximum_uplink_frequency, tvb, offset, "(100 khz)");
--
--	return 0;
--}
--
--
--int dissect_pnf_rf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_rf = proto_tree_add_uint16(tree, hf_nfapi_number_of_rfs, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF List", hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info, ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value);
--
--	return 0;
--
--}
--
--int dissect_pnf_phy_rel10_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_transmission_mode7_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_transmission_mode8_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_two_antennas_ports_for_pucch, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_9_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_simultaneous_pucch_pusch, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_for_layer_tx_with_tm3_and_tm4, tvb, offset, 0);
--
--	return 0;
--}
--
--int dissect_pnf_phy_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 10 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value);
--
--	return 0;
--}
--
--int dissect_pnf_phy_rel11_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_epdcch_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_multi_ack_csi_reporting, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_pucch_tx_diversity_with_channel_selection, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_ul_comp_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_5_supported, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_pnf_phy_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 11 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value);
--	return 0;
--}
--
--int dissect_pnf_phy_rel12_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_csi_subframe_set, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_enhanced_4tx_codebook, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_drs_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_ul_64qam_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_transmission_mode_10_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hi_nfapi_alternative_tbs_indices, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_pnf_phy_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 12 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value);
--	return 0;
--}
--
--int dissect_pnf_phy_rel13_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_format_4_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_format_5_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_more_than_5_ca_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_laa_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_laa_ending_in_dwpts_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_laa_starting_in_second_slot_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_beamforming_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_csi_rs_enhancements_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_drms_enhancements_supported, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_srs_enhancements_supported, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_pnf_phy_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_phy = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY Rel 13 List", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value);
--	return 0;
--}
--
--int dissect_pnf_phy_rf_config_instance_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_phy_rf_config_info_phy_id, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_config_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rf_config_index, tvb, offset, 0);
--	return 0;
--}
--
--
--int dissect_pnf_phy_rf_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_configs = proto_tree_add_uint16(tree, hf_nfapi_pnf_phy_number_phy, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PHY RF Config List", hf_nfapi_pnf_phy_rf_config, ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value);
--	return 0;
--}
--
--int bandwidth_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	/*
--	guint8 comma = 0;
--
--	proto_item_append_text(item, "(");
--
--	if (value & 0x1)
--	{
--		proto_item_append_text(item, "6 Mhz");
--		comma = 1;
--	}
--
--	if (comma)
--		proto_item_append_text(item, ", ");
--
--	if (value & 0x2)
--	{
--		proto_item_append_text(item, "15 Mhz");
--		comma = 1;
--	}
--
--	if (comma)
--		proto_item_append_text(item, ", ");
--
--	if (value & 0x4)
--	{
--		proto_item_append_text(item, "25 Mhz");
--		comma = 1;
--	}
--
--	if (comma)
--		proto_item_append_text(item, ", ");
--
--	if (value & 0x8)
--	{
--		proto_item_append_text(item, "50 Mhz");
--		comma = 1;
--	}
--
--	if (comma)
--		proto_item_append_text(item, ", ");
--
--	if (value & 0x10)
--	{
--		proto_item_append_text(item, "75 Mhz");
--		comma = 1;
--	}
--
--	if (comma)
--		proto_item_append_text(item, ", ");
--
--	if (value & 0x20)
--	{
--		proto_item_append_text(item, "100 Mhz");
--		comma = 1;
--	}
--
--	proto_item_append_text(item, ")");
--	*/
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value);
--	return 0;
--
--}
--
--int sfn_sf_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%d/%d (%d)", value >> 3, value & 0x0007, value);
--	return 0;
--}
--
--
--int dissect_duplex_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_duplex_mode, tvb, offset, 0);
--	return 0;
--}
--
--int power_offset_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.001) - 6.0), value);
--	return 0;
--}
--
--int dissect_pcfich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 value = proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pcfich_power_offset, tvb, offset, power_offset_conversion);
--
--	if (value > 10000)
--	{
--		expert_add_info(pinfo, tree, &ei_power_invalid);
--	}
--
--	return 0;
--}
--
--int dissect_pb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 value = proto_tree_add_uint16(tree, hf_nfapi_pb, tvb, offset, 0);
--
--	if (value > 3)
--	{
--		expert_add_info(pinfo, tree, &ei_power_invalid);
--	}
--	return 0;
--}
--
--int dissect_dl_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_dl_cyclic_prefix_type, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_cyclic_prefix_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_ul_cyclic_prefix_type, tvb, offset, 0);
--	return 0;
--}
--int dissect_dl_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, bandwidth_conversion);
--	return 0;
--}
--int dissect_ul_channel_bandwidth_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_uplink_channel_bandwidth, tvb, offset, bandwidth_conversion);
--	return 0;
--}
--
--
--int reference_signal_power_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (((float)value * 0.25) - 63.75), value);
--	return 0;
--}
--
--int dissect_reference_signal_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_reference_signal_power, tvb, offset, reference_signal_power_conversion);
--	return 0;
--}
--int dissect_tx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports, tvb, offset, 0);
--	return 0;
--}
--int dissect_rx_antenna_ports_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_rx_antenna_ports, tvb, offset, 0);
--	return 0;
--}
--int dissect_phich_resource_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_phich_resource, tvb, offset, 0);
--	return 0;
--}
--int dissect_phich_duration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_phich_duration, tvb, offset, 0);
--	return 0;
--}
--int dissect_phich_power_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_phich_power_offset, tvb, offset, power_offset_conversion);
--	return 0;
--}
--int dissect_psch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_primary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion);
--	return 0;
--}
--int dissect_physical_cell_id_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_physical_cell_id, tvb, offset, 0);
--	return 0;
--}
--int dissect_ssch_synch_signal_epre_eprers_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_secondary_synchronization_signal_epre_eprers, tvb, offset, power_offset_conversion);
--	return 0;
--}
--int dissect_prach_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_configuration_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_prach_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_root_sequence_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_prach_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_zero_correlation_zone_configuration, tvb, offset, 0);
--	return 0;
--}
--int dissect_prach_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_high_speed_flag, tvb, offset, 0);
--	return 0;
--}
--int dissect_prach_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--int dissect_pusch_hopping_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_hopping_mode, tvb, offset, 0);
--	return 0;
--}
--int dissect_pusch_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_hopping_offset, tvb, offset, 0);
--	return 0;
--}
--int dissect_pusch_number_of_subbands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_number_of_subbands, tvb, offset, 0);
--	return 0;
--}
--int dissect_pucch_delta_pucch_shift_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_delta_pucch_shift, tvb, offset, 0);
--	return 0;
--}
--int dissect_pucch_n_cqi_rb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_n_cqi_rb, tvb, offset, 0);
--	return 0;
--}
--int dissect_pucch_n_an_cs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_n_an_cs, tvb, offset, 0);
--	return 0;
--}
--int dissect_pucch_n1_pucch_an_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_n1_pucch_an, tvb, offset, 0);
--	return 0;
--}
--int dissect_srs_bandwidth_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_bandwidth_configuration, tvb, offset, 0);
--	return 0;
--}
--int dissect_srs_max_uppts_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_max_up_pts, tvb, offset, 0);
--	return 0;
--}
--int dissect_srs_subframe_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_srs_subframe_configuration, tvb, offset, 0);
--	return 0;
--}
--int dissect_srs_acknack_srs_sim_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_srs_acknack_srs_simultaneous_transmission, tvb, offset, 0);
--	return 0;
--}
--int dissect_uplink_rs_hopping_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_uplink_rs_hopping, tvb, offset, 0);
--	return 0;
--}
--int dissect_group_assignment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_group_assignment, tvb, offset, 0);
--	return 0;
--}
--int dissect_cyclic_shift_1_for_drms_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_cyclic_shift_1_for_drms, tvb, offset, 0);
--	return 0;
--}
--int dissect_tdd_subframe_assignement_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_subframe_assignment, tvb, offset, 0);
--	return 0;
--}
--int dissect_tdd_subframe_patterns_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_special_subframe_patterns, tvb, offset, 0);
--	return 0;
--}
--
--int laa_threshold_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", (float)(value * -100.00), value);
--	return 0;
--}
--
--int dissect_laa_ed_threashold_for_lbt_for_pdsch_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_pdsch, tvb, offset, laa_threshold_conversion);
--	return 0;
--}
--int dissect_laa_ed_threashold_for_lbt_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ed_threshold_for_lbt_for_drs, tvb, offset, laa_threshold_conversion);
--	return 0;
--}
--int dissect_laa_pd_threshold_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_pd_threshold, tvb, offset, laa_threshold_conversion);
--	return 0;
--}
--int dissect_laa_multi_carrier_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_type, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_multi_carrier_tx_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_tx, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_multi_carrier_freeze_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_freeze, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_tx_antenna_port_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_tx_antenna_ports_for_drs, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_transmission_power_for_drs_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_for_drs, tvb, offset, power_offset_conversion);
--	return 0;
--}
--
--int dissect_emtc_pbch_repeitions_enabled_r13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pbch_repetitions_enabled_r13, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_cat_m_root_sequence_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_root_sequence_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_cat_m_high_speed_flag_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_cat_m_high_speed_flag, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_emtc_prach_ce_level_0_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_enable, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_0_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_configuration_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_0_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_ce_level_0_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_0_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_enabled, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_0_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_0_hopping_offset, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_emtc_prach_ce_level_1_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_enable, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_1_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_configuration_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_1_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_ce_level_1_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_1_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_enabled, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_1_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_1_hopping_offset, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_emtc_prach_ce_level_2_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_enable, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_2_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_configuration_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_2_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_ce_level_2_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_2_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_enabled, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_2_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_2_hopping_offset, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_emtc_prach_ce_level_3_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_enable, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_3_configuration_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_configuration_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_prach_ce_level_3_frequency_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_ce_level_3_starting_subframe_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_3_hopping_enabled_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_enabled, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_preach_ce_level_3_hopping_offset_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_prach_ce_level_3_hopping_offset, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, tvb, offset, 0);
--	return 0;
--}
--int dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, tvb, offset, 0);
--	return 0;
--}
--
--
--int dissect_dl_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_bandwidth_support, tvb, offset, bandwidth_conversion);
--	return 0;
--}
--
--int dissect_ul_bandwidth_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_bandwidth_support, tvb, offset, bandwidth_conversion);
--	return 0;
--}
--
--int dl_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value);
--	return 0;
--}
--
--int dissect_dl_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_dl_modulation_support, tvb, offset, dl_modulation_conversion);
--	return 0;
--}
--
--int ul_modulation_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value);
--	return 0;
--}
--int dissect_ul_modulation_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_ul_modulation_support, tvb, offset, ul_modulation_conversion);
--	return 0;
--}
--int dissect_phy_antenna_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_phy_antenna_capability, tvb, offset, 0);
--	return 0;
--}
--
--int release_capability_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint16 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 2, value, "?? (%d)", value);
--	return 0;
--}
--int dissect_release_capability_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_release_capability, tvb, offset, release_capability_conversion);
--	return 0;
--}
--int dissect_mbsfn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_mbsfn_capability, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_laa_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_laa_capability, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_pd_sensing_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pd_sensing_lbt_support, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_multi_carrier_lbt_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_multi_carrier_lbt_support, tvb, offset, 0);
--	return 0;
--}
--int dissect_laa_partial_sf_support_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_partial_sf_support, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_data_report_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_data_report_mode, tvb, offset, 0);
--	return 0;
--}
--int dissect_sfn_sf_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_sfnsf, tvb, offset, 0);
--	return 0;
--}
--int dissect_phy_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_phy_state, tvb, offset, 0);
--	return 0;
--}
--
--
--
--int dissect_p7_vnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 4, tvb, offset);
--	return 0;
--}
--int dissect_p7_vnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8_array(tree, hf_nfapi_vnf_address_ipv4, 16, tvb, offset);
--	return 0;
--}
--int dissect_p7_vnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_vnf_port, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_p7_pnf_address_ipv4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 4, tvb, offset);
--	return 0;
--}
--int dissect_p7_pnf_address_ipv6_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8_array(tree, hf_nfapi_pnf_address_ipv4, 16, tvb, offset);
--	return 0;
--}
--int dissect_p7_pnf_port_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pnf_port, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_downlink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dl_ue_per_sf, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_uplink_ues_per_subframe_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ul_ue_per_sf, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_rf_band_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_band, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_rf_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value);
--	return 0;
--}
--
--int dissect_timing_window_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_timing_window, tvb, offset, 0);
--	return 0;
--}
--int dissect_timing_info_mode_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_timing_info_mode, tvb, offset, 0);
--	return 0;
--}
--int dissect_timing_info_period_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_timing_info_period, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_maximum_transmit_power_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_maximum_transmit_power, tvb, offset, 0);
--	return 0;
--}
--int dissect_earfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_nmm_gsm_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value);
--	return 0;
--}
--int dissect_nmm_umts_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value);
--	return 0;
--}
--int dissect_nmm_lte_frequency_bands_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_of_rf_bands, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RF Band List", hf_nfapi_rf_bands, ett_nfapi_rf_bands, count, dissect_rf_band_value);
--	return 0;
--}
--int dissect_nmm_uplink_rssi_supported_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_nmm_uplink_rssi_supported, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dl_config_pdu_type, tvb, offset, 0);
--	guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0);
--
--	guint pdu_end = (*offset + size - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--
--	return 0;
--}
--
--
--static int dissect_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_number_pdcch_ofdm_symbols, tvb, offset, 0);
--	guint16 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_dci, tvb, offset, 0);
--	num_pdu += proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_pdsch_rnti, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power_pcfich, tvb, offset, power_offset_conversion);
--
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "DL Config PDU List", hf_nfapi_dl_config_request_pdu_list, ett_nfapi_dl_config_request_pdu_list, num_pdu, dissect_dl_config_pdu);
--
--
--	return 0;
--}
--
--static int dissect_dl_config_request_bch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	return 0;
--}
--
--static int dissect_dl_config_request_dl_dci_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator_2, tvb, offset, 0);
--	proto_tree_add_uint8_with_range(tree, hf_nfapi_harq_process, tvb, offset, pinfo, 0, 15, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_precoding_information, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transport_block_size_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_downlink_power_offset, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	return 0;
--}
--static int dissect_dl_config_request_dl_dci_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_mcch_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcch_change_notification, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_scrambling_identity, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_dl_dci_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_scrambling_and_layers, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_n_dl_rb, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_dl_dci_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_ack_resource_offset, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_ul_dl_configuration_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_index, tvb, offset, 0);
--	return 0;
--}
--
--
--static int dissect_dl_config_request_dl_dci_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_primary_cell_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_dl_configuration_flag, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ul_dl_configurations, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL/DL Configurations", hf_nfapi_pnf_phy, ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value);
--
--	return 0;
--}
--static int dissect_dl_config_request_dl_dci_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_laa_end_partial_sf_configuration, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_codebooksize_determination_r13, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rel13_drms_table_flag, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_dl_config_request_mch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	proto_tree_add_uint16(tree, hf_nfapi_mbsfn_area_id, tvb, offset, 0);
--
--	return 0;
--}
--
--int dissect_codebook_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_bf_vector_bf_value, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_bf_vector_type_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_bf_vector_subband_index, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_bf_vector_num_antennas, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Antennas", hf_nfapi_bf_vector_antennas, ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value);
--	return 0;
--}
--
--static int dissect_dl_config_request_dlsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);		
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0);
--	guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Subbands", hf_nfapi_subbands, ett_nfapi_subbands, num_subbands, dissect_codebook_index_value);
--	proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_power_offset_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transmission_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_num_bf_prb_per_subband, tvb, offset, 0);
--	guint8 num_vectors = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vectors", hf_nfapi_bf_vectors, ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value);
--
--	
--	return 0;
--}
--
--int dissect_csi_rs_resource_config_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_dl_config_request_dlsch_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_nscid, tvb, offset, 0);
--
--	return 0;
--}
--static int dissect_dl_config_request_dlsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_start, tvb, offset, 0);
--
--	return 0;
--}
--static int dissect_dl_config_request_dlsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_csi_config_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_csi_scrambling, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_antenna_ports, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_re_mapping_freq_shift, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_dlsch_pdu_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_alt_cqi_table_r12, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_max_layers, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_n_dl_harq, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_dlsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_payload_type, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_req13_drms_table_flag, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_pch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_prnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_virtual_resource_block_assignment_flag, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_transport_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transport_block_to_codeword_swap_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transmission_scheme, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ue_category_capacity, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pa, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ngap, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_pch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ue_mode, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_prs_pdu_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	proto_tree_add_uint8(tree, hf_prs_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_prs_cyclic_prefix_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_prs_muting, tvb, offset, 0);
--	return 0;
--}
--static int dissect_dl_config_request_csi_rs_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_antenna_port_count_r10, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config_r10, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	proto_tree_add_uint16(tree, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_csi_rs_number_if_nzp_configurations, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "CSI-RS Resource Configs", hf_nfapi_csi_rs_resource_configs, ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value);
--	return 0;
--}
--
--
--int dissect_csi_rs_bf_vector_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_index, tvb, offset, 0);
--	//proto_tree_add_uint8(tree, hf_nfapi_csi_rs_resource_config, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_dl_config_request_csi_rs_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_csi_rs_class, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cdm_type, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_num_bf_vector, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Beamforming Vector", hf_nfapi_csi_rs_bf_vector, ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value);
--	return 0;
--}
--
--int dissect_epdcch_prb_index_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_edpcch_prb_index, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_dl_config_request_edpcch_params_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value);
--	dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end);
--
--	return 0;
--}
--static int dissect_dl_config_request_edpcch_params_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dwpts_symbols, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_initial_lbt_sf, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_precoding_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_precoding_value, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_dl_config_request_mpdpcch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_drms_scrabmling_init, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_initial_transmission_sf, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_transmission_power, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_resource_block_coding	, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pdsch_reception_levels , tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indicator, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpmi_length, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pmi_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_resource_offset, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index_length, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_downlink_assignment_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_allocate_prach_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_preamble_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_prach_mask_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_starting_ce_level, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_antenna_ports_and_scrambling_identity, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag , tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_paging_direct_indication_differentiation_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_direct_indication, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Precoding", hf_nfapi_precoding, ett_nfapi_precoding, count, dissect_precoding_value);
--	
--	return 0;
--}
--
--int dissect_ul_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ul_config_pdu_type, tvb, offset, 0);
--	guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0);
--
--	guint pdu_end = (*offset + size - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--
--	return 0;
--}
--
--static int  dissect_ul_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rach_prach_frequency_resources, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_present, tvb, offset, 0);
--
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "UL Config PDU List", hf_nfapi_ul_config_request_pdu_list, ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu);
--
--	return 0;
--}
--
--
--int dissect_ul_config_ulsch_pdu_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_modulation, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_process_number, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_tx_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_current_tx_nb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_n_srs, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_ulsch_pdu_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transport_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_transmission_scheme, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_layers, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_codebook_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_disable_sequence_hopping_flag, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_ulsch_pdu_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_npusch_identity, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_drms_config_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_ndrms_csh_identity, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_ulsch_pdu_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_initial_sf_io, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_empty_symbols_due_to_retunning, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_init_tx_params_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_n_srs_initial, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_initial_number_of_resource_blocks, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_cqi_ri_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ri_size, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_cqi_ri_info_rel9_later_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 type = proto_tree_add_uint8(tree, hf_nfapi_report_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_offset_cqi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_offset_ri, tvb, offset, 0);
--
--	switch (type)
--	{
--		case 0:
--		{
--			proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_ri_pmi_size, tvb, offset, 0);
--			proto_tree_add_uint8(tree, hf_nfapi_control_type, tvb, offset, 0);
--			break;
--		}
--		case 1:
--		{
--			/*guint8 num_cc = */proto_tree_add_uint8(tree, hf_nfapi_number_of_cc, tvb, offset, 0);
--
--			// todo ...
--
--			break;
--		}
--	}
--	return 0;
--}
--int dissect_ul_config_cqi_ri_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_ri_pmi_size_2, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_harq_info_ulsch_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0);
--
--	return 0;
--}
--int dissect_ul_config_harq_info_ulsch_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_delta_offset_harq_2, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_ue_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_ue_info_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_virtual_cell_id_enabled_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_npucch_identity, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_ue_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ue_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_empty_symbols, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_total_number_of_repetitions, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_repetition_number, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_cqi_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dl_cqi_pmi_size, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_cqi_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_cqi_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_csi_mode, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_dl_cqi_pmi_size_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_statring_prb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_sr_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_pucch_index, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_sr_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pucch_index_p1, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_harq_info_uci_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_harq_info_uci_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_harq_info_uci_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_size, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ack_nack_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_pucch_resource, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_0, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_1, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_2, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_1_3, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_num_ant_ports, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_0, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_1, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_2, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_n_pucch_2_3, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_harq_size_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_starting_prb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_nprb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cdm_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_nsrs, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_srs_info_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_size, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_domain_position, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_hopping_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_transmission_comb, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_i_srs, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_sounding_reference_cyclic_shift, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_srs_info_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_antenna_port, tvb, offset, 0);
--	return 0;
--}
--int dissect_ul_config_srs_info_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_combs, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_hi_dci0_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_pdu_type, tvb, offset, 0);
--	guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0);
--
--	guint pdu_end = (*offset + size - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--
--	return 0;
--}
--
--static int dissect_hi_dci0_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_sfn_sf, tvb, offset, 0);
--	guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_dci_pdus, tvb, offset, 0);
--	num_pdu += proto_tree_add_uint8(tree, hf_nfapi_number_of_hi_pdus, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "HI DCI0 PDU List", hf_nfapi_hi_dci0_request_pdu_list, ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu);
--	return 0;
--}
--
--static int dissect_hi_dci0_hi_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_hi_value, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_i_phich, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	return 0;
--}
--static int dissect_hi_dci0_hi_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_flag_tb2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_hi_value_2, tvb, offset, 0);
--	return 0;
--}
--static int dissect_hi_dci0_dci_ul_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cce_idx, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_block_start, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cyclic_shift_2_for_drms, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_enabled_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_bits, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ue_tx_antenna_selection, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_cqi_csi_request, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	return 0;
--}
--static int dissect_hi_dci0_dci_ul_rel10_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_cross_carrier_scheduling_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_carrier_indicator, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_size_of_cqi_csi_feild, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_resource_allocation_type, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_coding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indication_two, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_antenna_ports, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpmi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_including_padding, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_n_ul_rb, tvb, offset, 0);
--	return 0;
--}
--static int dissect_hi_dci0_dci_ul_rel12_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_pscch_resource, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_time_resource_pattern, tvb, offset, 0);
--	return 0;
--}
--static int dissect_hi_dci0_edpcch_dci_ul_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_epdcch_resource_assignment_flag, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_epdcch_id, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_epdcch_start_symbol, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_epdcch_num_prb, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PRBs", hf_nfapi_epdcch_prbs, ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value);
--	dissect_bf_vector_type_value(tvb, pinfo, tree, data, offset, end);
--	return 0;
--}
--
--static int dissect_hi_dci0_mdpcch_dci_ul_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_mpdcch_narrowband, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_prb_pairs, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_resource_block_assignment, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mpdcch_transmission_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_start_symbol, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ecce_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_aggregation_level, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rnti_type, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ce_mode, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_drms_scrambling_init, tvb, offset, 0);
--	proto_tree_add_uint16_with_conversion(tree, hf_nfapi_transmission_power, tvb, offset, power_offset_conversion);
--	proto_tree_add_uint8(tree, hf_nfapi_dci_format, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_mcs, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_pusch_repetition_levels, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_hopping_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_new_data_indication, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_process, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_redundancy_version, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_tpc, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_csi_request, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dai_presence_flag, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dl_assignment_index, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_srs_request, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_dci_subframe_repetition_number, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_tpc_bitmap, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_total_dci_length_include_padding, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna_ports, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX Antenna Ports", hf_nfapi_tx_antenna_ports, ett_nfapi_tx_antenna_ports, count, dissect_precoding_value);
--
--
--	return 0;
--}
--static int dissect_rx_ue_info_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	return 0;
--}
--static int dissect_rx_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	int data_offset = proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0);
--	return data_offset;
--}
--static int dissect_rx_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_harq_indication_data_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_harq_indication_data_multplexing_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_2, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_3, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_harq_indication_data_special_bundling_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_harq_indication_data_channel_selection_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_harq_indication_data_format_3_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_harq_indication_data_format_4_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	return 0;
--}
--
--
--static int dissect_harq_indication_data_format_5_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_data_value_0, tvb, offset, 0);
--	return 0;
--}
--
--
--
--static int dissect_harq_indication_rel8_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0);
--
--	switch (mode)
--	{
--		case 0:
--		{
--			dissect_harq_indication_data_bundling_value(tvb, pinfo, tree, data, offset, end);
--			break;
--		}
--		case 1:
--		{
--			dissect_harq_indication_data_multplexing_value(tvb, pinfo, tree, data, offset, end);
--			break;
--		}
--		case 2:
--		{
--			dissect_harq_indication_data_special_bundling_value(tvb, pinfo, tree, data, offset, end);
--			break;
--		}
--	};
--
--	return 0;
--}
--static int dissect_harq_indication_rel9_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0);
--
--	// Have to do this as the mode value is need to decode the value
--	guint16 i = 0;
--
--	proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data");
--	proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data);
--
--	for (i = 0; i < count; ++i)
--	{
--
--		proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i);
--		proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data);
--
--		switch (mode)
--		{
--			case 0:
--			{
--				dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end);
--				break;
--			}
--			case 1:
--			{
--				dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end);
--				break;
--			}
--			case 2:
--			{
--				dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end);
--				break;
--			}
--			case 3:
--			{
--				dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end);
--				break;
--			}
--			case 4:
--			{
--				dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end);
--				break;
--			}
--		};
--	}
--
--	return 0;
--}
--static int dissect_harq_indication_rel13_later_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 mode = proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0);
--
--	// Have to do this as the mode value is need to decode the value
--	guint16 i = 0;
--
--	proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "ACK/NACK Data");
--	proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_harq_ack_nack_data);
--
--	for (i = 0; i < count; ++i)
--	{
--		proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_harq_ack_nack_data, tvb, *offset, 2, "", "[%d]", i);
--		proto_tree *item_tree = proto_item_add_subtree(item_ti, ett_nfapi_harq_ack_nack_data);
--
--		switch (mode)
--		{
--		case 0:
--		{
--			dissect_harq_indication_data_bundling_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		case 1:
--		{
--			dissect_harq_indication_data_multplexing_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		case 2:
--		{
--			dissect_harq_indication_data_special_bundling_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		case 3:
--		{
--			dissect_harq_indication_data_channel_selection_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		case 4:
--		{
--			dissect_harq_indication_data_format_3_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		case 5:
--		{
--			dissect_harq_indication_data_format_4_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		case 6:
--		{
--			dissect_harq_indication_data_format_5_value(tvb, pinfo, item_tree, data, offset, end);
--			break;
--		}
--		};
--	}
--
--	return 0;
--}
--static int dissect_harq_indication_rel8_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_tb_1, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_harq_tb_2, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_harq_tb_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_harq_tb_n, tvb, offset, 0);
--	return 0;
--}
--
--
--static int dissect_harq_indication_rel9_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value);
--	return 0;
--}
--static int dissect_harq_indication_rel13_later_fdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_harq_mode, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_ack_nack, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ TB List", hf_nfapi_harq_data, ett_nfapi_harq_data, count, dissect_harq_tb_value);
--	return 0;
--}
--static int dissect_ul_cqi_information_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_channel, tvb, offset, 0);
--	return 0;
--}
--static int dissect_crc_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_crc_flag, tvb, offset, 0);
--	return 0;
--}
--static int dissect_rx_cqi_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_ri_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_ri, tvb, offset, 0);
--	return 0;
--}
--static int dissect_rx_cqi_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_data_offset, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_ul_cqi, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_cc_reported, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "CC List", hf_nfapi_cc, ett_nfapi_cc, count, dissect_ri_value);
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0);
--
--	return 0;
--}
--static int dissect_rach_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_rnti, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_preamble, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0);
--	return 0;
--}
--static int dissect_rach_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0);
--	return 0;
--}
--static int dissect_rach_indication_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_rach_resource_type, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_snr_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_snr, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_srs_indication_rel8_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_doppler_estimation, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance, tvb, offset, 0);
--	guint8 count = proto_tree_add_uint8(tree, hf_nfapi_number_of_resource_blocks, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rb_start, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "RB List", hf_nfapi_rbs, ett_nfapi_rbs, count, dissect_snr_value);
--
--
--	return 0;
--}
--static int dissect_srs_indication_rel9_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_timing_advance_r9, tvb, offset, 0);
--	return 0;
--}
--static int dissect_srs_indication_rel10_tdd_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_up_pts_symbol, tvb, offset, 0);
--	return 0;
--}
--static int dissect_tdd_channel_measuerment_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_number_prb_per_subband, tvb, offset, 0);
--	guint8 num_subbands = proto_tree_add_uint8(tree, hf_nfapi_number_of_subbands, tvb, offset, 0);
--	guint8 num_phy_ant = proto_tree_add_uint8(tree, hf_nfapi_number_antennas, tvb, offset, 0);
--
--	guint16 i = 0;
--	guint16 j = 0;
--
--	proto_item *sb_list_ti = proto_tree_add_string_format(tree, hf_nfapi_subbands, tvb, *offset, 2, "", "Subbands");
--	proto_tree *sb_list_tree = proto_item_add_subtree(sb_list_ti, ett_nfapi_subbands);
--
--	for (i = 0; i < num_subbands; ++i)
--	{
--		proto_item *sb_item_ti = proto_tree_add_string_format(sb_list_tree, hf_nfapi_subbands, tvb, *offset, 2, "", "[%d]", i);
--		proto_tree *sb_item_tree = proto_item_add_subtree(sb_item_ti, ett_nfapi_subbands);
--
--		proto_tree_add_uint8(sb_item_ti, hf_nfapi_subband_index, tvb, offset, 0);
--
--
--		proto_item *ant_list_ti = proto_tree_add_string_format(sb_item_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "Physical Antennas");
--		proto_tree *ant_list_tree = proto_item_add_subtree(ant_list_ti, ett_nfapi_antennas);
--
--		for (j = 0; j < num_phy_ant; ++j)
--		{
--			proto_item *ant_item_ti = proto_tree_add_string_format(ant_list_tree, hf_nfapi_antennas, tvb, *offset, 2, "", "[%d]", j);
--			proto_tree *ant_item_tree = proto_item_add_subtree(ant_item_ti, ett_nfapi_antennas);
--
--			proto_tree_add_uint16(ant_item_tree, hf_nfapi_channel_coefficient, tvb, offset, 0);
--		}
--	}
--
--	return 0;
--}
--
--static int dissect_srs_indication_rel11_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_ul_rtoa, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_lbt_dl_config_request_pdsch_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_mp_cca, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_n_cca, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_lte_txop_sf, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_txop_sfn_sf_end, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0);
--	return 0;
--}
--static int dissect_lbt_dl_config_request_drs_req_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_offset, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_sfn_sf_end, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_lbt_mode, tvb, offset, 0);
--	return 0;
--}
--static int dissect_lbt_dl_config_request_pdsch_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_txop_symbols, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_initial_partial_sf, tvb, offset, 0);
--	return 0;
--}
--static int dissect_lbt_dl_config_request_drs_resp_rel13_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_handle, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_result, tvb, offset, 0);
--	return 0;
--}
--
--int dissect_tx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 len = proto_tree_add_uint16(tree, hf_nfapi_pdu_length, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pdu_index, tvb, offset, 0);
--
--	proto_tree_add_uint8_array(tree, hf_nfapi_pdu, len, tvb, offset);
--
--	return 0;
--}
--
--static int dissect_tx_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "TX PDU List", hf_nfapi_tx_request_pdu_list, ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu);
--	return 0;
--
--}
--
--int dissect_rx_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	//guint end = (*offset + size - 2);
--	//dissect_tlv_list(tvb, pinfo, tree, data, offset, end);
--	return 0;
--}
--
--
--
--int dissect_harq_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0);
--	guint pdu_end = (*offset + pdu_len - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--
--static int dissect_harq_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_harqs, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "HARQ PDU List", hf_nfapi_harq_indication_pdu_list, ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu);
--	return 0;
--}
--
--int dissect_crc_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0);
--	guint pdu_end = (*offset + pdu_len - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--
--
--static int dissect_crc_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_crcs, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "CRC PDU List", hf_nfapi_crc_indication_pdu_list, ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu);
--	return 0;
--}
--int dissect_sr_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0);
--	guint pdu_end = (*offset + pdu_len - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--
--static int dissect_rx_sr_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_srs, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "SR PDU List", hf_nfapi_sr_indication_pdu_list, ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu);
--	return 0;
--}
--int dissect_cqi_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0);
--	guint pdu_end = (*offset + pdu_len - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--static int dissect_rx_cqi_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_cqi, tvb, offset, 0);
--
--	guint16* lengths = malloc(num_pdu * 2);
--	memset(lengths, 0, num_pdu * 2);
--
--	guint8 tmp_offset = *offset;
--
--	int i = 0;
--	for (i = 0; i < num_pdu; ++i)
--	{
--		guint16 instance_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA);
--		tmp_offset += 2;
--		guint8 pdu_end = tmp_offset + instance_len;
--
--		while (tmp_offset < pdu_end)
--		{
--			guint16 tlv_id = tvb_get_guint16(tvb, tmp_offset, ENC_NA);
--			tmp_offset += 2;
--			guint16 tlv_len = tvb_get_guint16(tvb, tmp_offset, ENC_NA);
--			tmp_offset += 2;
--
--			if (tlv_id == 0x202F)
--			{
--				lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA);
--			}
--			else if (tlv_id == 0x2030)
--			{
--				lengths[i] = tvb_get_guint16(tvb, tmp_offset, ENC_NA);
--			}
--
--			tmp_offset += tlv_len;
--		}
--
--	}
--
--
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "CQI PDU List", hf_nfapi_cqi_indication_pdu_list, ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu);
--
--
--	for (i = 0; i < num_pdu; ++i)
--	{
--		proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset);
--	}
--
--	free(lengths);
--
--	return 0;
--}
--int dissect_preamble_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0);
--	guint pdu_end = (*offset + pdu_len - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--static int dissect_rach_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_pdu = proto_tree_add_uint16(tree, hf_nfapi_number_of_preambles, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Preamble PDU List", hf_nfapi_preamble_indication_pdu_list, ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu);
--	return 0;
--}
--int dissect_srs_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 pdu_len = proto_tree_add_uint16(tree, hf_nfapi_instance_length, tvb, offset, 0);
--	guint pdu_end = (*offset + pdu_len - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--static int dissect_srs_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--
--	guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_of_srss, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "SRS PDU List", hf_nfapi_srs_indication_pdu_list, ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu);
--	return 0;
--}
--int dissect_lbt_dl_config_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_req_pdu_type, tvb, offset, 0);
--	guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0);
--	guint pdu_end = (*offset + size - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--static int dissect_lbt_dl_config_request_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_config_pdu_list, ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu);
--
--	return 0;
--}
--int dissect_lbt_dl_indication_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_lbt_dl_ind_pdu_type, tvb, offset, 0);
--	guint8 size = proto_tree_add_uint8(tree, hf_nfapi_pdu_size, tvb, offset, 0);
--	guint pdu_end = (*offset + size - 2);
--	dissect_tlv_list(tvb, pinfo, tree, data, offset, pdu_end);
--	return 0;
--}
--static int dissect_lbt_indication_message_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint8 num_pdu = proto_tree_add_uint8(tree, hf_nfapi_number_pdus, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "LBT DL PDU List", hf_nfapi_lbt_dl_indication_pdu_list, ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu);
--	return 0;
--}
--
--static int dissect_lte_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms");
--	proto_tree_add_uint8(tree, hf_nfapi_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	guint8 num_earfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_earfcns, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "EARFCNs", hf_nfapi_earfcn_list, ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value);
--	return 0;
--}
--
--int dissect_uarfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0);
--	return 0;
--}
--static int dissect_utran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms");
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	guint8 num_uarfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_uarfcns, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "UARFCNs", hf_nfapi_uarfcn_list, ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value);
--	return 0;
--}
--
--int dissect_arfcn_dir_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_arfcn_direction, tvb, offset, 0);
--	return 0;
--}
--static int dissect_geran_rssi_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_frequency_band_indicator, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_measurement_period, tvb, offset, "ms");
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	guint8 num_arfcns = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value);
--	return 0;
--}
--
--
--int rssi_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, gint16 value)
--{
--	proto_tree_add_int_format_value(tree, hfindex, tvb, *offset, 2, value, "%.2f dB (%d)", ((float)value * 0.1), value);
--	return 0;
--}
--int dissect_rssi_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_int16_with_conversion(tree, hf_nfapi_rssi, tvb, offset, rssi_conversion);
--	return 0;
--}
--static int dissect_rssi_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_rssi = proto_tree_add_uint16(tree, hf_nfapi_number_of_rssi, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_rssi_list, ett_nfapi_rssi_list, num_rssi, dissect_rssi_value);
--	return 0;
--}
--
--int dissect_pci_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0);
--	return 0;
--}
--static int dissect_lte_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_measurement_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	guint8 num_pci = proto_tree_add_uint8(tree, hf_nfapi_number_of_pci, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PCIs", hf_nfapi_pci_list, ett_nfapi_pci_list, num_pci, dissect_pci_value);
--	return 0;
--}
--
--int dissect_psc_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0);
--	return 0;
--}
--static int dissect_utran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_exhaustive_search, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	guint8 num_psc = proto_tree_add_uint8(tree, hf_nfapi_number_of_psc, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "PSCs", hf_nfapi_psc_list, ett_nfapi_psc_list, num_psc, dissect_psc_value);
--	return 0;
--}
--
--int dissect_arfcn_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_geran_cell_search_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	guint8 num_arfcn = proto_tree_add_uint8(tree, hf_nfapi_number_of_arfcns, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "ARFCNs", hf_nfapi_arfcn_list, ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value);
--	return 0;
--}
--
--int neg_pow_conversion(proto_item* tree, int hfindex, tvbuff_t *tvb, guint* offset, guint8 value)
--{
--	proto_tree_add_uint_format_value(tree, hfindex, tvb, *offset, 1, value, "%d dB (%d)", ((gint16)value * (-1)), value);
--	return 0;
--}
--
--int dissect_lte_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0);
--	proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrp, tvb, offset, neg_pow_conversion);
--	proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rsrq, tvb, offset, neg_pow_conversion);
--	proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--static int dissect_lte_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_lte_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_lte_cells_found, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "LTE Cells Found", hf_nfapi_lte_cells_found_list, ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value);
--	return 0;
--}
--int dissect_utran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0);
--	proto_tree_add_uint8_with_conversion(tree, hf_nfapi_rscp, tvb, offset, neg_pow_conversion);
--	proto_tree_add_uint8_with_conversion(tree, hf_nfapi_enco, tvb, offset, neg_pow_conversion);
--	proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0);
--	return 0;
--}
--static int dissect_utran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_utran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_utran_cells_found, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "UTRAN Cells Found", hf_nfapi_utran_cells_found_list, ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value);
--	return 0;
--}
--
--int dissect_geran_cell_found_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rxlev, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_rxqual, tvb, offset, 0);
--	proto_tree_add_int16(tree, hf_nfapi_frequency_offset, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0);
--	return 0;
--}
--static int dissect_geran_cell_search_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 num_geran_cells = proto_tree_add_uint16(tree, hf_nfapi_number_of_geran_cells_found, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "GERAN Cells Found", hf_nfapi_geran_cells_found_list, ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value);
--
--	return 0;
--}
--static int dissect_pnf_cell_search_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8_array(tree, hf_nfapi_pnf_search_state, *end - *offset, tvb, offset);
--	return 0;
--}
--
--static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8_array(tree, hf_nfapi_pnf_broadcast_state, *end - *offset, tvb, offset);
--	return 0;
--}
--static int dissect_lte_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	return 0;
--}
--static int dissect_utran_broadcast_detect_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, "ms");
--	return 0;
--}
--
--static int dissect_lte_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0);
--	guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0);
--	proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset);
--	proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0);
--	return 0;
--}
--static int dissect_utran_broadcast_detect_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 mib_len = proto_tree_add_uint16(tree, hf_nfapi_mib_length, tvb, offset, 0);
--	proto_tree_add_uint8_array(tree, hf_nfapi_mib, mib_len, tvb, offset);
--	proto_tree_add_uint32(tree, hf_nfapi_sfn_offset, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_lte_system_information_schedule_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_retry_count, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0);
--	return 0;
--}
--//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--//{
--//	return 0;
--//}
--static int dissect_lte_system_information_schedule_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	// this needs to be SIB 1
--	proto_tree_add_uint8_array(tree, hf_nfapi_sib1, (*end - *offset), tvb, offset);
--	return 0;
--}
--
--int dissect_si_periodicity_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_si_periodicity, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_si_index, tvb, offset, 0);
--	return 0;
--}
--
--static int dissect_lte_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_earfcn, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_pci, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_downlink_channel_bandwidth, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_phich_configuration, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_number_of_tx_antenna, tvb, offset, 0);
--	guint8 si_priodicity = proto_tree_add_uint8(tree, hf_nfapi_number_of_si_periodicity, tvb, offset, 0);
--	dissect_array_value(tvb, pinfo, tree, data, offset, end, "Number SI Periodicity", hf_nfapi_si_periodicity_list, ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value);
--	proto_tree_add_uint8(tree, hf_nfapi_si_window_length, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0);
--
--	return 0;
--}
--static int dissect_utran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_uarfcn, tvb, offset, 0);
--	proto_tree_add_uint16(tree, hf_nfapi_psc, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0);
--	return 0;
--}
--static int dissect_geran_system_information_request_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint16(tree, hf_nfapi_arfcn, tvb, offset, 0);
--	proto_tree_add_uint8(tree, hf_nfapi_bsic, tvb, offset, 0);
--	proto_tree_add_uint32(tree, hf_nfapi_timeout, tvb, offset, 0);
--	return 0;
--}
--//static int dissect_pnf_cell_broadcast_state_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--//{
--//	return 0;
--//}
--static int dissect_lte_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	proto_tree_add_uint8(tree, hf_nfapi_sib_type, tvb, offset, 0);
--	guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0);
--	proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset);
--	return 0;
--}
--static int dissect_utran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 sib_len = proto_tree_add_uint16(tree, hf_nfapi_sib_len, tvb, offset, 0);
--	proto_tree_add_uint8_array(tree, hf_nfapi_sib, sib_len, tvb, offset);
--	return 0;
--}
--static int dissect_geran_system_information_indication_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint16 si_len = proto_tree_add_uint16(tree, hf_nfapi_si_len, tvb, offset, 0);
--	proto_tree_add_uint8_array(tree, hf_nfapi_si, si_len, tvb, offset);
--	return 0;
--}
--
--static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end);
--
--const tlv_t tags[] =
--{
--	{ 0x1000, "PNF Param General", dissect_pnf_param_general_value },
--	{ 0x1001, "PNF PHY", dissect_pnf_phy_value },
--	{ 0x1002, "PNF RF", dissect_pnf_rf_value },
--	{ 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value },
--	{ 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value },
--	{ 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value },
--	{ 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value },
--	{ 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value },
--
--	{ 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value },
--	{ 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value },
--	{ 0x0003, "Subframe config - P-B", dissect_pb_value },
--	{ 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value },
--	{ 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value },
--	{ 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value },
--	{ 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value },
--	{ 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value },
--	{ 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value },
--	{ 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value },
--	{ 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value },
--	{ 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value },
--	{ 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value },
--	{ 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value },
--	{ 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value },
--	{ 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value },
--	{ 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value },
--	{ 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value },
--	{ 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value },
--	{ 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value },
--	{ 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value },
--	{ 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value },
--	{ 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value },
--	{ 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value },
--	{ 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value },
--	{ 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value },
--	{ 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value },
--	{ 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value },
--	{ 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value },
--	{ 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value },
--	{ 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value },
--	{ 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value },
--	{ 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value },
--	{ 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value },
--	{ 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value },
--	{ 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value },
--	{ 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value },
--	{ 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value },
--	{ 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value },
--	{ 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value },
--	{ 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value },
--	{ 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value },
--	{ 0x0069, "LAA config - Multi carrier freeze ", dissect_laa_multi_carrier_freeze_value },
--	{ 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value },
--	{ 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value },
--
--	{ 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value },
--	{ 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value },
--	{ 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value },
--	{ 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value },
--	{ 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value },
--	{ 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value },
--	{ 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value },
--	{ 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value },
--	{ 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value },
--	{ 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value },
--	{ 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value },
--	{ 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value },
--	{ 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value },
--	{ 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value },
--	{ 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value },
--	{ 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value },
--	{ 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value },
--	{ 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value },
--	{ 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value },
--	{ 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value },
--	{ 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value },
--	{ 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value },
--	{ 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value },
--	{ 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value },
--	{ 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value },
--	{ 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value },
--	{ 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value },
--	{ 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value },
--	{ 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value },
--	{ 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value },
--	{ 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value },
--	{ 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value },
--	{ 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value },
--	{ 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value },
--	
--	{ 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value },
--	{ 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value },
--	{ 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value },
--	{ 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value },
--	{ 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value },
--	{ 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value },
--	{ 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value },
--
--	{ 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value },
--	{ 0x00D1, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value },
--	{ 0x00D1, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value },
--	{ 0x00D1, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value },
--
--	{ 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value },
--	{ 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value },
--	{ 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value },
--
--	{ 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value },
--	{ 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value },
--	{ 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value },
--	{ 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value },
--	{ 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value },
--	{ 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value },
--	{ 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value },
--	{ 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value },
--
--	{ 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value },
--
--	{ 0x011E, "NFAPI - Timing window", dissect_timing_window_value },
--	{ 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value },
--	{ 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value },
--	{ 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value },
--	{ 0x0129, "NFAPI - EARFCN", dissect_earfcn_value },
--	{ 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value },
--	{ 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value },
--	{ 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value },
--	{ 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value },
--
--	{ 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value },
--
--	{ 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value },
--	{ 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value },
--	{ 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value },
--	{ 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value },
--	{ 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value },
--	{ 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value },
--
--
--	{ 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value },
--
--	{ 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value },
--
--	{ 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value },
--	{ 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value },
--	{ 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value },
--	{ 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value },
--	{ 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value },
--	{ 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value },
--
--	{ 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value },
--	{ 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value },
--
--	{ 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value },
--
--	{ 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value },
--	{ 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value },
--
--	//{ 0x2001, "EDPCCH PDU Release 8", ?? },
--	//{ 0x2002, "EDPCCH PDU Release 8", ?? },
--	//{ 0x2003, "EDPCCH PDU Release 8", ?? },
--	//{ 0x2039, "EDPCCH PDU Release 11", ?? },
--	//{ 0x203A, "EDPCCH PDU Release 12", ?? },
--	//{ 0x203B, "EDPCCH PDU Release 13", ?? },
--	{ 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value },
--	{ 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value },
--
--	{ 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value },
--
--
--	{ 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value },
--	{ 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value },
--	{ 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value },
--	{ 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value },
--	{ 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value },
--	{ 0x200F, "Initial Transmission Paramters Release 8", dissect_ul_config_init_tx_params_rel8_value },
--	{ 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value },
--	{ 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value },
--	{ 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value },
--	{ 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value },
--	{ 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value },
--	{ 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value },
--	{ 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value },
--	{ 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value },
--	{ 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value },
--	{ 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value },
--	{ 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value },
--	{ 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value },
--	{ 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value },
--	{ 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value },
--	{ 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value },
--	{ 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value },
--	{ 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value },
--	{ 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value },
--	{ 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value },
--	{ 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value },
--	{ 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value },
--
--	{ 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value },
--	{ 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value },
--	{ 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value },
--	{ 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value },
--	{ 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value },
--	{ 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value },
--	//{ 0x2041, "EDPCCH DCI UL PDU Release 11", dissect_hi_dci0_edpcch_dci_ul_rel11_value },
--	{ 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value },
--
--	{ 0x2022, "Tx Request Body", dissect_tx_request_body_value },
--
--	{ 0x2038, "RX UE Information", dissect_rx_ue_info_value },
--
--	{ 0x2023, "RX Indication Body", dissect_rx_indication_body_value },
--	{ 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value },
--	{ 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value },
--
--	{ 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value },
--	{ 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value },
--	{ 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value },
--	{ 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value },
--	{ 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value },
--	{ 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value },
--	{ 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value },
--	{ 0x2052, "UL CQI Information", dissect_ul_cqi_information_value },
--
--	{ 0x202B, "CRC Indication Body", dissect_crc_indication_body_value },
--	{ 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value },
--
--	{ 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value },
--
--	{ 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value },
--	{ 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value },
--	{ 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value },
--
--	{ 0x2031, "RACH Indication Body", dissect_rach_indication_body_value },
--	{ 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value },
--	{ 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value },
--	{ 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value },
--
--	{ 0x2034, "SRS Indication Body", dissect_srs_indication_body_value },
--	{ 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value },
--	{ 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value },
--	{ 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value },
--	{ 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measuerment_value },
--	{ 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value },
--
--
--	{ 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value },
--	{ 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value },
--	{ 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value },
--
--	{ 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value },
--	{ 0x2056, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value },
--	{ 0x2057, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value },
--
--	{ 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value },
--	{ 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value },
--	{ 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value },
--	{ 0x3003, "RSSI Indication", dissect_rssi_indication_value },
--	{ 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value },
--	{ 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value },
--	{ 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value },
--	{ 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value },
--	{ 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value },
--	{ 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value },
--	{ 0x300a, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value },
--	{ 0x300b, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value },
--	{ 0x300c, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value },
--	{ 0x300d, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value },
--	{ 0x300e, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value },
--	{ 0x300f, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value },
--	{ 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value },
--	{ 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value },
--	{ 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value },
--	{ 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value },
--	{ 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value },
--	{ 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value },
--	{ 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value },
--	{ 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value },
--	{ 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value },
--	{ 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value },
--	{ 0x301a, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value },
--
--
--
--
--};
--
--int look_up_tlv(int tag_id)
--{
--	int i;
--	int num_tags = sizeof(tags) / sizeof(tlv_t);
--
--	for (i = 0; i < num_tags; i++)
--	{
--		if (tag_id == tags[i].tag_id)
--			return i;
--	}
--	return -1;
--}
--
--static int dissect_tl_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset)
--{
--	proto_item *tl_ti = proto_tree_add_string_format(tree, hf_nfapi_tl, tvb, *offset, 4, "", "TL");
--	proto_tree *tl_tree = proto_item_add_subtree(tl_ti, ett_nfapi_tl);
--
--	proto_tree_add_uint16(tl_tree, hf_nfapi_tl_tag, tvb, offset, 0);
--	proto_tree_add_uint16(tl_tree, hf_nfapi_tl_length, tvb, offset, "bytes");
--
--	return 0;
--
--}
--
--static int dissect_tlv_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint len)
--{	
--	while (*offset < len)
--	{
--		guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA);
--		guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA);
--
--		int tlv_index = look_up_tlv(tlv_id);
--
--		char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown";
--
--		proto_item *tlv_ti = proto_tree_add_string_format(tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name);
--		proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree);
--
--		dissect_tl_header(tvb, pinfo, tlv_tree, data, offset);
--
--		if (tags[tlv_index].decode != NULL)
--		{
--			guint tmp = *offset;
--			guint end = *offset + tlv_len;
--			tags[tlv_index].decode(tvb, pinfo, tlv_tree, data, &tmp, &end);
--			*offset += tlv_len;
--		}
--		else
--		{
--			*offset += tlv_len;
--		}
--	}
--
--	return 0;
--}
--
--static int dissect_rx_indication_body_value(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint* end)
--{
--	guint number_of_pdu_addr = *offset;
--	guint16 count = proto_tree_add_uint16(tree, hf_nfapi_number_pdus, tvb, offset, 0);
--	//dissect_array_value(tvb, pinfo, tree, data, offset, "RX PDU List", hf_nfapi_rx_indication_pdu_list, ett_nfapi_rx_indication_pdu_list, num_pdu, dissect_rx_pdu);
--
--	guint16* lengths = malloc(count * 2);
--	memset(lengths, 0, count * 2);
--
--	guint16 i = 0;
--
--	if (count > 0)
--	{
--		proto_item *list_ti = proto_tree_add_string_format(tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "RX PDU List");
--		proto_tree *list_tree = proto_item_add_subtree(list_ti, ett_nfapi_rx_indication_pdu_list);
--
--		//for (i = 0; i < count; ++i)
--		proto_tree *item_tree = 0;
--
--		guint pdu_end = *end;
--		while (*offset < *end && *offset < pdu_end)
--		{
--
--			guint16 tlv_id = tvb_get_guint16(tvb, *offset, ENC_NA);
--			guint16 tlv_len = tvb_get_guint16(tvb, *offset + 2, ENC_NA);
--
--			if (tlv_id == 0x2038)
--			{
--				proto_item *item_ti = proto_tree_add_string_format(list_tree, hf_nfapi_rx_indication_pdu_list, tvb, *offset, 2, "", "[%d]", i);
--				item_tree = proto_item_add_subtree(item_ti, ett_nfapi_rx_indication_pdu_list);
--
--				i++;
--			}
--
--			int tlv_index = look_up_tlv(tlv_id);
--
--			char* tlv_name = tlv_index != -1 ? tags[tlv_index].name : "Unknown";
--
--			proto_item *tlv_ti = proto_tree_add_string_format(item_tree, hf_nfapi_tlv_tree, tvb, *offset, tlv_len + 4, "", tlv_name);
--			proto_tree *tlv_tree = proto_item_add_subtree(tlv_ti, ett_nfapi_tlv_tree);
--
--
--	
--
--			dissect_tl_header(tvb, pinfo, tlv_tree, data, offset);
--
--			guint tmp_offset = *offset;
--
--			if (tlv_id == 0x2038)
--			{
--				dissect_rx_ue_info_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end);
--			}
--
--			else if (tlv_id == 0x2024)
--			{
--				//int data_offset = dissect_rx_indication_rel8_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end);
--
--				lengths[i-1] = proto_tree_add_uint16(tlv_tree, hf_nfapi_length, tvb, &tmp_offset, 0);
--				int data_offset = proto_tree_add_uint16(tlv_tree, hf_nfapi_data_offset, tvb, &tmp_offset, 0);
--				proto_tree_add_uint8(tlv_tree, hf_nfapi_ul_cqi, tvb, &tmp_offset, 0);
--				proto_tree_add_uint16(tlv_tree, hf_nfapi_timing_advance, tvb, &tmp_offset, 0);
--				
--				if ((data_offset > 0) && (pdu_end == *end))
--				{
--					pdu_end = number_of_pdu_addr + data_offset;
--				}
--
--			}
--			else if (tlv_id == 0x2025)
--			{
--				dissect_rx_indication_rel9_value(tvb, pinfo, tlv_tree, data, &tmp_offset, end);
--			}
--
--
--			*offset += tlv_len;
--		}
--
--	}
--
--	for (i = 0; i < count; ++i)
--	{
--		proto_tree_add_uint8_array(tree, hf_nfapi_pdu, lengths[i], tvb, offset);
--	}
--
--	free(lengths);
--
--	// more to follow here ??
--	return 0;
--
--}
--
--
--// ----------------------------------------------------------------------------|
--
--
--static int dissect_p45_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset)
--{
--	proto_item *p4_p5_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p4_p5_message_header, tvb, *offset, NFAPI_HEADER_LENGTH, "", "P4 P5 Header");
--	proto_tree *p4_p5_header_tree = proto_item_add_subtree(p4_p5_header_ti, ett_nfapi_p4_p5_message_header);
--
--	proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_phy_id, tvb, offset, 0);
--	proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_id, tvb, offset, 0);
--	proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_message_length, tvb, offset, 0);
--	proto_tree_add_uint16(p4_p5_header_tree, hf_nfapi_p4_p5_message_header_spare, tvb, offset, 0);
--
--	return 0;
--}
--
--static int dissect_p7_header_new(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset, guint8* m, guint8* seg, guint8* seq)
--{
--	proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header");
--	proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header);
--
--	proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0);
--	proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0);
--	proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes");
--
--	// decoding bits for p7 header
--
--	guint8 m_seg = tvb_get_guint8(tvb, *offset);
--	*m = (m_seg & 0x80) >> 7;
--	*seg = m_seg & 0x7F;
--
--
--	proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA);
--	proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA);
--	*offset += 1;
--
--	*seq = tvb_get_guint8(tvb, *offset);
--	proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0);
--
--
--	proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0);
--	proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds");
--
--	return 0;
--
--}
--
--
--
--
--static int dissect_p7_header(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data, guint* offset)
--{
--	proto_item *p7_header_ti = proto_tree_add_string_format(tree, hf_nfapi_p7_message_header, tvb, *offset, NFAPI_P7_HEADER_LENGTH, "", "P7 Header");
--	proto_tree *p7_header_tree = proto_item_add_subtree(p7_header_ti, ett_nfapi_p7_message_header);
--
--	proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_phy_id, tvb, offset, 0);
--	proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_id, tvb, offset, 0);
--	proto_tree_add_uint16(p7_header_tree, hf_nfapi_p7_message_header_message_length, tvb, offset, "bytes");
--
--
--	proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_m, tvb, (*offset) * 8, 1, ENC_NA);
--	proto_tree_add_bits_item(p7_header_tree, hf_nfapi_p7_message_header_segment, tvb, ((*offset) * 8) + 1, 7, ENC_NA);
--	*offset += 1;
--
--	proto_tree_add_uint8(p7_header_tree, hf_nfapi_p7_message_header_sequence_number, tvb, offset, 0);
--	
--
--	proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_checksum, tvb, offset, 0);
--	proto_tree_add_uint32(p7_header_tree, hf_nfapi_p7_message_header_transmit_timestamp, tvb, offset, "microseconds");
--
--	return 0;
--
--}
--
--static reassembly_table ul_p7_reassemble_table;
--static reassembly_table dl_p7_reassemble_table;
--
--
--
--static int hf_msg_fragments = -1;
--static int hf_msg_fragment = -1;
--static int hf_msg_fragment_overlap = -1;
--static int hf_msg_fragment_overlap_conflicts = -1;
--static int hf_msg_fragment_multiple_tails = -1;
--static int hf_msg_fragment_too_long_fragment = -1;
--static int hf_msg_fragment_error = -1;
--static int hf_msg_fragment_count = -1;
--static int hf_msg_reassembled_in = -1;
--static int hf_msg_reassembled_length = -1;
--static int hf_msg_reassembled_data = -1;
--static gint ett_msg_fragment = -1;
--static gint ett_msg_fragments = -1;
--
--static const fragment_items msg_frag_items = {
--	/* Fragment subtrees */
--	&ett_msg_fragment,
--	&ett_msg_fragments,
--	/* Fragment fields */
--	&hf_msg_fragments,
--	&hf_msg_fragment,
--	&hf_msg_fragment_overlap,
--	&hf_msg_fragment_overlap_conflicts,
--	&hf_msg_fragment_multiple_tails,
--	&hf_msg_fragment_too_long_fragment,
--	&hf_msg_fragment_error,
--	&hf_msg_fragment_count,
--	/* Reassembled in field */
--	&hf_msg_reassembled_in,
--	/* Reassembled length field */
--	&hf_msg_reassembled_length,
--	NULL,
--	/* Tag */
--	"Message fragments"
--};
--
--static int dissect_nfapi_ul_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
--{
--	guint8 m;
--	guint8 seg;
--	guint8 seq;
--	guint offset = 0;
--
--	guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA);
--	guint16 msg_len	= tvb_get_guint16(tvb, 4, ENC_NA);
--
--	dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq);
--	
--	guint8 save_fragmented = pinfo->fragmented;
--
--	// not sure why I need to do this, but if I don't it does not reasses the protocol
--	pinfo->fd->flags.visited = 0;
--
--	if (m == 1 || (m == 0 && seg > 0))
--	{
--		pinfo->fragmented = TRUE;
--
--		fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1));
--
--		guint8 reassembled = 0;
--		if (fd_head)
--		{
--			tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree);
--
--			if (new_tvb)
--			{ 
--				// set the tvb to the new reassembled buffer.
--				tvb = new_tvb;
--				reassembled = 1;
--				col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg);
--
--				// reset the offset for the new tvb
--				offset = 0;
--			}
--			else
--			{
--				// Is this a failure to reassemble the data
--				return 0;
--			}
--		}
--		else
--		{
--			// this is a segement skip the body
--			col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg);
--			return 0;
--		}
--	}
--		
--	pinfo->fragmented = save_fragmented;
--	
--	{
--		switch (msg_id)
--		{
--			//HARQ.indication
--			case 0x85: 
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--			//CRC.indication
--			case 0x86:
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--			//RX_ULSCH.indication
--			case 0x87:
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--			//RACH.indication
--			case 0x88:
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--			//SRS.indication
--			case 0x89:
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--			//RX_SR.indication
--			case 0x8A:
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--			//RX_CQI.indication
--			case 0x8B:
--			{
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--			}
--			break;
--		};
--	}
--	
--	return 0;
--}
--
--static int dissect_nfapi_dl_p7(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
--{
--	guint8 m;
--	guint8 seg;
--	guint8 seq;
--	guint offset = 0;
--
--	guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA);
--	guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA);
--
--	dissect_p7_header_new(tvb, pinfo, tree, data, &offset, &m, &seg, &seq);
--
--	guint8 save_fragmented = pinfo->fragmented;
--
--	// not sure why I need to do this, but if I don't it does not reasses the protocol
--	pinfo->fd->flags.visited = 0;
--
--	if (m == 1 || (m == 0 && seg > 0))
--	{
--		pinfo->fragmented = TRUE;
--
--		fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvb, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1));
--
--		guint8 reassembled = 0;
--		if (fd_head)
--		{
--			tvbuff_t * new_tvb = process_reassembled_data(tvb, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree);
--
--			if (new_tvb)
--			{
--				// set the tvb to the new reassembled buffer.
--				tvb = new_tvb;
--				reassembled = 1;
--				col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg);
--
--				// reset the offset for the new tvb
--				offset = 0;
--			}
--			else
--			{
--				// Is this a failure to reassemble the data
--				return 0;
--			}
--		}
--		else
--		{
--			// this is a segement skip the body
--			col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg);
--			return 0;
--		}
--	}
--
--	pinfo->fragmented = save_fragmented;
--
--	{
--		switch (msg_id)
--		{
--			// DL_CONFIG.request
--			case 0x80:
--			{
--				//dissect_p7_header(tvb, pinfo, tree, data, &offset);
--				proto_tree_add_uint16_with_conversion(tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--				dissect_tlv_list(tvb, pinfo, tree, data, &offset, tvb_reported_length(tvb));
--				break;
--			}
--	
--		};
--	}
--
--	return 0;
--}
--
--
--static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
--{
--	col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI");
--
--	guint16 msg_id = tvb_get_guint16(tvb, 2, ENC_NA);
--	guint16 msg_len = tvb_get_guint16(tvb, 4, ENC_NA);
--
--	const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown");
--
--	col_clear(pinfo->cinfo,COL_INFO);
--	col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str);
--
--	proto_item *msg_tree_ti = proto_tree_add_string_format(tree, hf_nfapi_message_tree,
--															tvb, 0, msg_len,
--															"", message_str);
--
--	proto_tree *msg_tree = proto_item_add_subtree(msg_tree_ti, ett_nfapi_message_tree);
--
--	guint offset = 0;
--
--
--	switch (msg_id)
--	{
--		// HARQ.indication
--		case 0x85:
--		// CRC.indication
--		case 0x86:
--		// RX_ULSCH.indicatoin
--		case 0x87:
--		// RACH.indication
--		case 0x88:
--		// SRS.indication
--		case 0x89:
--		// RX_SR.indication
--		case 0x8A:
--		// RX_CQI.indication
--		case 0x8B:
--		{
--			dissect_nfapi_ul_p7(tvb, pinfo, msg_tree, data);
--		}
--		break;
--
--		// DL_CONFIG.request
--		case 0x80:
--		{
--			dissect_nfapi_dl_p7(tvb, pinfo, msg_tree, data);
--			//dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			//proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--			//dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--	
--		// UL_CONFIG.request
--		case 0x81:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--		}
--		break;
--		// HI_DCI0.request
--		case 0x83:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--		}
--		break;
--		// TX.request
--		case 0x84:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--		}
--		break;
--
--		// LBT_DL_CONFIG.request
--		case 0x8C:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--		}
-+#define NFAPI_P7_HEADER_LENGTH 16
-+
-+static const unit_name_string khz_100_units_db = { " (100)khz", NULL };
-+
-+typedef enum{
-+	NFAPI_DL_CONFIG_REQUEST_MSG_ID = 0x0080,
-+	NFAPI_UL_CONFIG_REQUEST_MSG_ID,
-+	NFAPI_SUBFRAME_INDICATION_MSG_ID,
-+	NFAPI_HI_DCI0_REQUEST_MSG_ID,
-+	NFAPI_TX_REQUEST_MSG_ID,
-+	NFAPI_HARQ_INDICATION_MSG_ID,
-+	NFAPI_CRC_INDICATION_MSG_ID,
-+	NFAPI_RX_ULSCH_INDICATION_MSG_ID,
-+	NFAPI_RACH_INDICATION_MSG_ID,
-+	NFAPI_SRS_INDICATION_MSG_ID,
-+	NFAPI_RX_SR_INDICATION_MSG_ID,
-+	NFAPI_RX_CQI_INDICATION_MSG_ID,
-+	NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID,
-+	NFAPI_LBT_DL_INDICATION_MSG_ID,
-+
-+	NFAPI_PNF_PARAM_REQUEST_MSG_ID = 0x0100,
-+	NFAPI_PNF_PARAM_RESPONSE_MSG_ID,
-+	NFAPI_PNF_CONFIG_REQUEST_MSG_ID,
-+	NFAPI_PNF_CONFIG_RESPONSE_MSG_ID,
-+	NFAPI_PNF_START_REQUEST_MSG_ID,
-+	NFAPI_PNF_START_RESPONSE_MSG_ID,
-+	NFAPI_PNF_STOP_REQUEST_MSG_ID,
-+	NFAPI_PNF_STOP_RESPONSE_MSG_ID,
-+	NFAPI_PARAM_REQUEST_MSG_ID,
-+	NFAPI_PARAM_RESPONSE_MSG_ID,
-+	NFAPI_CONFIG_REQUEST_MSG_ID,
-+	NFAPI_CONFIG_RESPONSE_MSG_ID,
-+	NFAPI_START_REQUEST_MSG_ID,
-+	NFAPI_START_RESPONSE_MSG_ID,
-+	NFAPI_STOP_REQUEST_MSG_ID,
-+	NFAPI_STOP_RESPONSE_MSG_ID,
-+	NFAPI_MEASUREMENT_REQUEST_MSG_ID,
-+	NFAPI_MEASUREMENT_RESPONSE_MSG_ID,
-+
-+	NFAPI_DL_NODE_SYNC_MSG_ID = 0x0180,
-+	NFAPI_UL_NODE_SYNC_MSG_ID,
-+	NFAPI_TIMING_INFO_MSG_ID,
-+
-+	NFAPI_RSSI_REQUEST_MSG_ID = 0x0200,
-+	NFAPI_RSSI_RESPONSE_MSG_ID,
-+	NFAPI_RSSI_INDICATION_MSG_ID,
-+	NFAPI_CELL_SEARCH_REQUEST_MSG_ID,
-+	NFAPI_CELL_SEARCH_RESPONSE_MSG_ID,
-+	NFAPI_CELL_SEARCH_INDICATION_MSG_ID,
-+	NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID,
-+	NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID,
-+	NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID,
-+	NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID,
-+	NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID,
-+	NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID,
-+	NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID,
-+	NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID,
-+	NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID,
-+	NFAPI_NMM_STOP_REQUEST_MSG_ID,
-+	NFAPI_NMM_STOP_RESPONSE_MSG_ID,
-+} nfapi_message_id_e;
-+
-+static const value_string nfapi_error_vals[] = {
-+	{ 0x0, "MSG_OK" },
-+	{ 0x1, "MSG_INVALID_STATE" },
-+	{ 0x2, "MSG_INVALID_CONFIG" },
-+	{ 0x3, "SFN_OUT_OF_SYNC" },
-+	{ 0x4, "MSG_SUBFRAME_ERR" },
-+	{ 0x5, "MSG_BCH_MISSING" },
-+	{ 0x6, "MSG_BCH_MISSING" },
-+	{ 0x7, "MSG_HI_ERR" },
-+	{ 0x8, "MSG_TX_ERR" },
-+	{ 0, NULL },
-+};
-+
-+static const value_string nfapi_p4_error_vals[] = {
-+	{ 100, "MSG_OK" },
-+	{ 101, "MSG_INVALID_STATE" },
-+	{ 102, "MSG_INVALID_CONFIG" },
-+	{ 103, "MSG_RAT_NOT_SUPPORTED" },
-+	{ 200, "MSG_NMM_STOP_OK" },
-+	{ 201, "MSG_NMM_STOP_IGNORED" },
-+	{ 202, "MSG_NMM_STOP_INVALID_STATE" },
-+	{ 300, "MSG_PROCEDURE_COMPLETE" },
-+	{ 301, "MSG_PROCEDURE_STOPPED" },
-+	{ 302, "MSG_PARTIAL_RESULTS" },
-+	{ 303, "MSG_TIMEOUT" },
-+	{ 0, NULL },
-+};
-+
-+static const value_string nfapi_rat_type_vals[] = {
-+	{ 0, "LTE" },
-+	{ 1, "UTRAN" },
-+	{ 2, "GERAN" },
-+	{ 0, NULL },
-+};
-+
-+typedef enum{
-+	UN_ALIGNED_SYNCHRONIZATION = 0,
-+	INTERNAL_PNF_FRAME_ALIGNMENT,
-+	ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION
-+} nfapi_sync_mode_e;
-+
-+static const value_string nfapi_sync_mode_vals[] = {
-+	{ UN_ALIGNED_SYNCHRONIZATION, "UN-ALIGNED SYNCHRONIZATION" },
-+	{ INTERNAL_PNF_FRAME_ALIGNMENT, "INTERNAL PNF FRAME ALIGNMENT" },
-+	{ ABSOLUTE_TIME_ALIGNED_SYNCHRONIZATION, "ABSOLUTE TIME ALIGNED SYNCHRONIZATION" },
-+	{ 0, NULL },
-+};
-+
-+typedef enum {
-+	NONE = 0,
-+	GPS,
-+	GLONASS,
-+	BEIDOU
-+} location_mode_e;
-+
-+static const value_string location_mode_vals[] = {
-+	{ NONE, "NONE" },
-+	{ GPS, "GPS" },
-+	{ GLONASS, "GLONASS" },
-+	{ BEIDOU, "BeiDou" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_uplink_rs_hopping_vals[] = {
-+	{ 0, "RS_NO_HOPPING" },
-+	{ 1, "RS_GROUP_HOPPING" },
-+	{ 2, "RS_SEQUENCE_HOPPING" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_laa_carrier_type_vals[] = {
-+	{ 0, "No multi carrier support" },
-+	{ 1, "Mode A1" },
-+	{ 2, "Mode A12" },
-+	{ 3, "Mode B1" },
-+	{ 4, "Mode B2" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_mutli_carrier_lbt_support_vals[] = {
-+	{ 0, "Multi carrier Mode A1" },
-+	{ 1, "Multi carrier Mode A2" },
-+	{ 2, "Multi carrier Mode B1" },
-+	{ 3, "Multi carrier Mode B2" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_lbt_dl_req_pdu_type[] = {
-+	{ 0, "LBT_PDSCH_REQ PDU" },
-+	{ 1, "LBT_DRS_REQ PDU" },
-+	{ 0, NULL }
-+};
-+
-+
-+static const value_string nfapi_lbt_dl_ind_pdu_type[] = {
-+	{ 0, "LBT_PDSCH_RSP PDU" },
-+	{ 1, "LBT_DRS_RSP PDU" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_phy_state_vals[] = {
-+	{ 0, "IDLE" },
-+	{ 1, "CONFIGURED" },
-+	{ 2, "RUNNING" },
-+	{ 0, NULL },
-+};
-+
-+
-+/* These are definitions where data 0 & 1 represent/provide a string name*/
-+static const true_false_string  nfapi_csi_report_type_strname = {
-+	"Periodic",
-+	"Aperiodic",
-+};
-+
-+static const true_false_string nfapi_control_type_string_name = {
-+	"CQI/PMI",
-+	"RI",
-+};
-+
-+static const true_false_string cyclic_prefix_type_strname = {
-+	"CP_NORMAL",
-+	"CP_EXTENDED"
-+};
-+
-+static const true_false_string support_strname = {
-+	"No Support",
-+	"Support"
-+};
-+
-+static const true_false_string partial_sf_support_strname =
-+{
-+	"Start partial SF support",
-+	"End partial SF support"
-+};
-+
-+static const true_false_string phich_duration_strname = {
-+	"PHICH_D_NORMAL",
-+	"PHICH_D_EXTENDED"
-+};
-+
-+static const true_false_string high_speed_flag_strname = {
-+	"HS_UNRESTRICTED_SET",
-+	"HS_RESTRICTED_SET"
-+};
-+
-+static const true_false_string hopping_mode_strname = {
-+	"HM_INTER_SF",
-+	"HM_INTRA_INTER_SF"
-+};
-+
-+static const true_false_string srs_simult_tx_strname = {
-+	"No Simultaneous Transmission",
-+	"Simultaneous Transmission"
-+};
-+
-+static const true_false_string crc_flag_strname = {
-+	"CRC_ERROR",
-+	"CRC_CORRECT"
-+};
-+
-+static const true_false_string hi_value_strname = {
-+	"HI_ACK",
-+	"HI_NACK"
-+};
-+
-+static const true_false_string flag_tb2_strname = {
-+	"HI_NOT_PRESENT",
-+	"HI_PRESENT"
-+};
-+
-+static const true_false_string nfapi_multi_carrier_tx_strname = {
-+	"Mutual transmission (self-deferral support for current carrier)",
-+	"Transmit on channel access win (no self-deferral)"
-+};
-+
-+static const true_false_string nfapi_multi_carrier_freeze_strname = {
-+	"Absence of other technology is not guaranteed",
-+	"Absence of other technology is guaranteed"
-+};
-+
-+static const true_false_string initial_partial_sf_strname = {
-+	"Full SF",
-+	"Partial SF"
-+};
-+
-+static const true_false_string lbt_mode_strname = {
-+	"Full LBT",
-+	"Partial LBT"
-+};
-+
-+static const true_false_string data_report_mode_vals = {
-+	"Crc reported in CRC.indication",
-+	"Crc reported in RX.indication"
-+};
-+
-+static const true_false_string mcch_flag_string_name = {
-+	"MCCH or SC-MCCH change notification field is not valid",
-+	"MCCH or SC-MCCH change notification field is valid"
-+};
-+
-+static const true_false_string cross_carrier_scheduling_flag_strname = {
-+	"Carrier indicator field is not valid",
-+	"Carrier indicator field is valid"
-+};
-+
-+static const true_false_string srs_flag_strname = {
-+	"SRS request field is not valid",
-+	"SRS request field is valid"
-+};
-+static const true_false_string srs_request_strname = {
-+	"SRS not requested",
-+	"SRS requested"
-+};
-+
-+static const true_false_string ul_dl_configuration_flag_strname = {
-+	"UL/DL configuration field is not valid",
-+	"UL/DL configuration field is valid"
-+};
-+
-+static const true_false_string prs_cyclic_prefix_type_strname = {
-+	"normal cyclic prefix",
-+	"extended cyclic prefix"
-+};
-+
-+static const true_false_string prs_muting_strname = {
-+	"no muting",
-+	"muting"
-+};
-+
-+
-+static const value_string nfapi_dl_config_pdu_type_vals[] = {
-+	{ 0, "DL_CONFIG_DCI_DL_PDU" },
-+	{ 1, "DL_CONFIG_BCH_PDU" },
-+	{ 2, "DL_CONFIG_MCH_PDU" },
-+	{ 3, "DL_CONFIG_DLSCH_PDU" },
-+	{ 4, "DL_CONFIG_PCH_PDU" },
-+	{ 5, "DL_CONFIG_PRS_PDU" },
-+	{ 6, "DL_CONFIG_CSI_RS_PDU" },
-+	{ 7, "DL_CONFIG_EPDCCH_DL_PDU" },
-+	{ 8, "DL_CONFIG_EPDCCH_DL_PDU" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_duplex_mode_vals[] = {
-+	{ 0, "TDD" },
-+	{ 1, "FDD" },
-+	{ 2, "HD-FDD" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string modulation_vals[] = {
-+	{ 2, "QPSK" },
-+	{ 4, "16QAM" },
-+	{ 6, "64QAM" },
-+	{ 8, "256QAM" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string pch_modulation_vals[] = {
-+	{ 0, "QPSK" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ue_mode_vals[] = {
-+	{ 0, "non LC/CE UE" },
-+	{ 1, "LC/CE UE" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string csi_rs_class_vals[] = {
-+	{ 0, "not used" },
-+	{ 1, "Class A" },
-+	{ 1, "Class B" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string csi_rs_cdm_type_vals[] = {
-+	{ 0, "cdm 2" },
-+	{ 1, "cdm 4" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string antenna_ports_vals[] = {
-+	{ 0, "1 antenna ports" },
-+	{ 1, "2 antenna ports" },
-+	{ 2, "4 antenna ports" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string combs_vals[] = {
-+	{ 0, "2 TC" },
-+	{ 1, "4 TC" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string resource_allocation_type_vals[] = {
-+	{ 0, "type 0" },
-+	{ 1, "type 1" },
-+	{ 2, "type 2 1A/1B/1D" },
-+	{ 3, "type 2 1C" },
-+	{ 4, "type 2 6-1A" },
-+	{ 5, "type UEModeB" },
-+	{ 6, "NB index" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string transmission_scheme_vals[] = {
-+	{ 0, "SINGLE_ANTENNA_PORT_0" },
-+	{ 1, "TX_DIVERSITY" },
-+	{ 2, "LARGE_DELAY_CDD" },
-+	{ 3, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" },
-+	{ 4, "MULTI_USER_MIMO" },
-+	{ 5, "CLOSED_LOOP_RANK_1_PRECODING" },
-+	{ 6, "SINGLE_ANTENNA_PORT_5" },
-+	{ 7, "SINGLE_ANTENNA_PORT_7" },
-+	{ 8, "SINGLE_ANTENNA_PORT_8" },
-+	{ 9, "DUAL_LAYER_TX_PORT_7_AND_8" },
-+	{ 10, "UP_TO_8_LAYER_TX" },
-+	{ 11, "SINGLE_ANTENNA_PORT_11" },
-+	{ 12, "SINGLE_ANTENNA_PORT_13" },
-+	{ 13, "DUAL_LAYER_TX_PORT_11_13" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ul_transmission_scheme_vals[] = {
-+	{ 0, "SINGLE_ANTENNA_PORT_10" },
-+	{ 1, "CLOSED_LOOP_SPATIAL_MULTIPLEXING" },
-+	{ 0, NULL },
-+};
-+
-+static const value_string dl_dci_format_vals[] = {
-+	{ 0, "1" },
-+	{ 1, "1A" },
-+	{ 2, "1B" },
-+	{ 3, "1C" },
-+	{ 4, "1D" },
-+	{ 5, "2" },
-+	{ 6, "2A" },
-+	{ 7, "2B" },
-+	{ 8, "2C" },
-+	{ 9, "2D" },
-+	{ 10, "6-1A" },
-+	{ 11, "6-1B" },
-+	{ 12, "6-2" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ul_dci_format_vals[] = {
-+	{ 0, "0" },
-+	{ 1, "3" },
-+	{ 2, "3A" },
-+	{ 3, "4" },
-+	{ 4, "5" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string mpdcch_ul_dci_format_vals[] = {
-+	{ 1, "3" },
-+	{ 2, "3A" },
-+	{ 4, "6-0A" },
-+	{ 5, "6-0B" },
-+	{ 0, NULL }
-+};
-+
-+
-+static const value_string pa_vals[] = {
-+	{ 0, "-6dB" },
-+	{ 1, "-4.77dB" },
-+	{ 2, "-3dB" },
-+	{ 3, "-1.77dB" },
-+	{ 4, "0dB" },
-+	{ 5, "1dB" },
-+	{ 6, "2dB" },
-+	{ 7, "3dB" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string transmission_mode_vals[] = {
-+	{ 1, "Mode 1" },
-+	{ 2, "Mode 2" },
-+	{ 3, "Mode 3" },
-+	{ 4, "Mode 4" },
-+	{ 5, "Mode 5" },
-+	{ 6, "Mode 6" },
-+	{ 7, "Mode 7" },
-+	{ 8, "Mode 8" },
-+	{ 9, "Mode 9" },
-+	{ 10, "Mode 10" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_ul_config_pdu_type_vals[] = {
-+	{ 0, "ULSCH" },
-+	{ 1, "ULSCH_CQI_RI" },
-+	{ 2, "ULSCH_HARQ" },
-+	{ 3, "ULSCH_CQI_HARQ_RI" },
-+	{ 4, "UCI_CQI" },
-+	{ 5, "UCI_SR" },
-+	{ 6, "UCI_HARQ" },
-+	{ 7, "UCI_SR_HARQ" },
-+	{ 8, "UCI_CQI_HARQ" },
-+	{ 9, "UCI_CQI_SR" },
-+	{ 10, "UCI_CQI_SR_HARQ" },
-+	{ 11, "SRS" },
-+	{ 12, "HARQ_BUFFER" },
-+	{ 13, "ULSCH_UCI_CSI" },
-+	{ 14, "ULSCH_UCI_HARQ" },
-+	{ 15, "ULSCH_CSI_UCI_HARQ" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_tdd_ack_nack_mode_vals[] = {
-+	{ 0, "Bundling" },
-+	{ 1, "Multiplexing" },
-+	{ 2, "Format 1b with channel selection" },
-+	{ 3, "Format 3" },
-+	{ 4, "Format 4" },
-+	{ 5, "Format 5" },
-+	{ 0, NULL }
-+};
-+static const value_string nfapi_fdd_ack_nack_mode_vals[] = {
-+	{ 0, "Format 1a/1b" },
-+	{ 1, "Channel selection" },
-+	{ 2, "Format 3" },
-+	{ 3, "Format 4" },
-+	{ 4, "Format 5" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nfapi_phich_resource_vals[] = {
-+	{ 0, "PHICH_R_ONE_SIXTH " },
-+	{ 1, "PHICH_R_HALF" },
-+	{ 2, "PHICH_R_ONE" },
-+	{ 3, "PHICH_R_TWO" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string local_distributed_vals[] = {
-+	{ 0, "localized" },
-+	{ 1, "distributed" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string transport_block_to_codeword_swap_flag_vals[] = {
-+	{ 0, "no swapping" },
-+	{ 1, "swapped" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ngap_vals[] = {
-+	{ 0, "Ngap1" },
-+	{ 1, "Ngap2" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string pmi_vals[] = {
-+	{ 0, "Use precoding indicated in TPMI field" },
-+	{ 1, "Use precoding indicated in last PMI report on PUSCH" },
-+	{ 2, "use precoding indicated in TPM field" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string true_false_vals[] = {
-+	{ 0, "false" },
-+	{ 1, "true" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string exhustive_search_vals[] = {
-+	{ 0, "non-exhaustive search" },
-+	{ 1, "exhaustive search" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string not_used_enabled_vals[] = {
-+	{ 0, "not used" },
-+	{ 1, "enabled" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string hopping_vals[] = {
-+	{ 0, "no hopping" },
-+	{ 1, "hopping enabled" },
-+	{ 0, NULL }
-+};
-+
-+
-+static const value_string mpdcch_rnti_type_vals[] = {
-+	{ 1, "Temporary C-RNTI" },
-+	{ 2, "RA-RNTI" },
-+	{ 3, "P-RNTI" },
-+	{ 4, "other" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string rnti_type_vals[] = {
-+	{ 1, "C-RNTI" },
-+	{ 2, "RA-RNTI, P-RNTI, SI-RNTI, SC-RNTI, G-RNTI" },
-+	{ 3, "SPS-CRNTI" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string primary_cells_type_vals[] = {
-+	{ 1, "TDD" },
-+	{ 2, "FDD" },
-+	{ 3, "HD_FDD" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ul_rssi_supported_vals[] = {
-+	{ 0, "Uplink RSSI not supported" },
-+	{ 1, "Uplink RSSI supported" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nprb_vals[] = {
-+	{ 0, "2" },
-+	{ 1, "3" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string nmm_modes_supported_vals[] =
-+{
-+	{ 0, "NONE" },
-+	{ 1, "NMM_ONLY" },
-+	{ 2, "NMM_IN_CONFIGURED_STATE" },
-+	{ 3, "NMM_IN_RUNNING_STATE" },
-+	{ 4, "NMM_IN_CONFIGURED_AND_RUNNING_STATE" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string dlsch_re13_ue_type_vals[] = {
-+	{ 0, "non LC/CE UE" },
-+	{ 1, "LC/CE CEModeA UE" },
-+	{ 2, "LC/CE CEModeB UE" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string dlsch_re13_pdsch_payload_type_vals[] = {
-+	{ 0, "PDSCH carrying SIB1-BR " },
-+	{ 1, "PDSCH carrying SI message (except for SIB1-BR or PCH)" },
-+	{ 2, "PDSCH carrying other" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string csi_rs_flags_strname[] = {
-+	{ 0, "CSI - RS parameters are not valid" },
-+	{ 1, "CSI - RS parameters are valid" },
-+	{ 0, NULL}
-+};
-+
-+
-+static const value_string paging_direct_indication_differtiation_flag_vals[] = {
-+	{ 0, "Direct Information" },
-+	{ 1, "Paging" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ul_tx_mode_vals[] = {
-+	{ 0, "SISO/MIMO" },
-+	{ 1, "MIMO" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string n_srs_vals[] = {
-+	{ 0, "No overlap" },
-+	{ 1, "Overlap" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string n_srs_initial_vals[] = {
-+	{ 0, "Last OFDM symbol is not punctured" },
-+	{ 1, "Last OFDM symbol is punctured." },
-+	{ 0, NULL }
-+};
-+
-+
-+static const value_string csi_mode_vals[] = {
-+	{ 0, "PUCCH format 2/2a/2b/3" },
-+	{ 1, "PUCCH format 4" },
-+	{ 2, "PUCCH format 5" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string hi_dci0_pdu_type_vals[] = {
-+	{ 0, "HI" },
-+	{ 1, "DCI UL" },
-+	{ 2, "EDPCCH DCI UL" },
-+	{ 3, "MDPCCH DCI UL" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ue_tx_antenna_selection_vals[] = {
-+	{ 0, "Not Configured" },
-+	{ 1, "Configured and using UE port 0" },
-+	{ 2, "Configured and using UE port 1" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string size_of_cqi_csi_feild_vals[] = {
-+	{ 0, "1 bit" },
-+	{ 1, "2 bits" },
-+	{ 2, "3 bits" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string number_of_antenna_port_vals[] = {
-+	{ 0, "1 antenna port" },
-+	{ 1, "2 antenna ports" },
-+	{ 2, "4 antenna ports" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string ce_mode_vals[] = {
-+	{ 1, "CEModeA" },
-+	{ 2, "CEModeB" },
-+	{ 0, NULL }
-+};
-+
-+
-+static const value_string csi_request_vals[] = {
-+	{ 0, "Aperiodic CSI not requested" },
-+	{ 1, "Aperiodic CSI requested" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string tdd_harq_mode_vals[] = {
-+	{ 0, "Format 1a/1b BUNDLING" },
-+	{ 1, "Format 1a/1b MULTIPLEXING" },
-+	{ 2, "Format 1a/1b  SPECIAL BUNDLING" },
-+	{ 3, "Channel Selection" },
-+	{ 4, "Format 3" },
-+	{ 5, "Format 4" },
-+	{ 6, "Format 5" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string fdd_harq_mode_vals[] = {
-+	{ 0, "Format 1a/1b" },
-+	{ 1, "Channel Selection" },
-+	{ 2, "Format 3" },
-+	{ 3, "Format 4" },
-+	{ 4, "Format 5" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string harq_value_vals[] = {
-+	{ 1, "ACK" },
-+	{ 2, "NACK" },
-+	{ 3, "ACK or NACK" },
-+	{ 4, "DTX" },
-+	{ 5, "ACK or DTX" },
-+	{ 6, "NACK or DTX" },
-+	{ 7, "ACK or NACK or DTX" },
-+	{ 0, NULL }
-+};
-+
-+
-+static const value_string harq_special_value_vals[] = {
-+	{ 0, "0 or None" },
-+	{ 1, "1 or 4 or 7 ACKs reported" },
-+	{ 2, "2 or 5 or 8 ACKs reported" },
-+	{ 3, "3 or 6 or 9 ACKs reported" },
-+	{ 4, "DTX (UE did not transmit anything)" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string channel_vals[] = {
-+	{ 0, "PUCCH" },
-+	{ 1, "PUSCH" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string rach_resource_type_vals[] = {
-+	{ 0, "Non LC / CE RACH" },
-+	{ 1, "LC / CE RACH CE level 0" },
-+	{ 2, "LC / CE RACH CE level 1" },
-+	{ 3, "LC / CE RACH CE level 2" },
-+	{ 4, "LC / CE RACH CE level 3" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string up_pts_symbol_vals[] = {
-+	{ 0, "Symbol 0" },
-+	{ 1, "Symbol 1" },
-+	{ 0, NULL }
-+};
-+
-+static const value_string arfcn_direction_vals[] = {
-+	{ 0, "DL" },
-+	{ 1, "UL" },
-+	{ 0, NULL }
-+};
-+
-+static int proto_nfapi = -1;
-+
-+/* These are for the subtrees */
-+static gint ett_nfapi_message_tree = -1;
-+static gint ett_nfapi_p4_p5_message_header = -1;
-+static gint ett_nfapi_p7_message_header = -1;
-+static gint ett_nfapi_tlv_tree = -1;
-+static gint ett_nfapi_tl = -1;
-+static gint ett_nfapi_pnf_phy = -1;
-+static gint ett_nfapi_pnf_phy_rel10 = -1;
-+static gint ett_nfapi_pnf_phy_rel11 = -1;
-+static gint ett_nfapi_pnf_phy_rel12 = -1;
-+static gint ett_nfapi_pnf_phy_rel13 = -1;
-+static gint ett_nfapi_pnf_phy_rf_config = -1;
-+static gint ett_nfapi_rf_bands = -1;
-+static gint ett_nfapi_tx_antenna_ports = -1;
-+static gint ett_nfapi_harq_ack_nack_data = -1;
-+static gint ett_nfapi_harq_data = -1;
-+static gint ett_nfapi_cqi_pmi_size = -1;
-+static gint ett_nfapi_cc = -1;
-+static gint ett_nfapi_rbs = -1;
-+static gint ett_nfapi_antennas = -1;
-+static gint ett_nfapi_dl_config_request_pdu_list = -1;
-+static gint ett_nfapi_ul_config_request_pdu_list = -1;
-+static gint ett_nfapi_hi_dci0_request_pdu_list = -1;
-+static gint ett_nfapi_tx_request_pdu_list = -1;
-+static gint ett_nfapi_rx_indication_pdu_list = -1;
-+static gint ett_nfapi_harq_indication_pdu_list = -1;
-+static gint ett_nfapi_crc_indication_pdu_list = -1;
-+static gint ett_nfapi_sr_indication_pdu_list = -1;
-+static gint ett_nfapi_cqi_indication_pdu_list = -1;
-+static gint ett_nfapi_preamble_indication_pdu_list = -1;
-+static gint ett_nfapi_srs_indication_pdu_list = -1;
-+static gint ett_nfapi_lbt_dl_config_pdu_list = -1;
-+static gint ett_nfapi_lbt_dl_indication_pdu_list = -1;
-+static gint ett_nfapi_subbands = -1;
-+static gint ett_nfapi_bf_vector_antennas = -1;
-+static gint ett_nfapi_bf_vectors = -1;
-+static gint ett_nfapi_csi_rs_resource_configs = -1;
-+static gint ett_nfapi_csi_rs_bf_vector = -1;
-+static gint ett_nfapi_epdcch_prbs = -1;
-+static gint ett_nfapi_precoding = -1;
-+static gint ett_nfapi_earfcn_list = -1;
-+static gint ett_nfapi_uarfcn_list = -1;
-+static gint ett_nfapi_arfcn_list = -1;
-+static gint ett_nfapi_rssi_list = -1;
-+static gint ett_nfapi_pci_list = -1;
-+static gint ett_nfapi_psc_list = -1;
-+static gint ett_nfapi_lte_cells_found_list = -1;
-+static gint ett_nfapi_utran_cells_found_list = -1;
-+static gint ett_nfapi_geran_cells_found_list = -1;
-+static gint ett_nfapi_si_periodicity_list = -1;
-+static gint ett_nfapi_downlink_bandwidth_support = -1;
-+static gint ett_nfapi_uplink_bandwidth_support = -1;
-+static gint ett_nfapi_downlink_modulation_support = -1;
-+static gint ett_nfapi_uplink_modulation_support = -1;
-+static gint ett_nfapi_received_interference_power_mesurement_results = -1;
-+static gint ett_nfapi_release_support = -1;
-+static expert_field ei_invalid_range = EI_INIT;
-+static expert_field ei_invalid_tlv_length = EI_INIT;
-+
-+static int hf_nfapi_p4_p5_message_header_phy_id = -1;
-+static int hf_nfapi_p4_p5_message_header_message_id = -1;
-+static int hf_nfapi_p4_p5_message_header_message_length = -1;
-+static int hf_nfapi_p4_p5_message_header_spare = -1;
-+static int hf_nfapi_p7_message_header_phy_id = -1;
-+static int hf_nfapi_p7_message_header_message_id = -1;
-+static int hf_nfapi_p7_message_header_message_length = -1;
-+static int hf_nfapi_p7_message_header_m = -1;
-+static int hf_nfapi_p7_message_header_segment = -1;
-+static int hf_nfapi_p7_message_header_sequence_number = -1;
-+static int hf_nfapi_p7_message_header_checksum = -1;
-+static int hf_nfapi_p7_message_header_transmit_timestamp = -1;
-+static int hf_nfapi_tl_tag = -1;
-+static int hf_nfapi_tl_length = -1;
-+static int hf_nfapi_sync_mode = -1;
-+static int hf_nfapi_location_mode = -1;
-+static int hf_nfapi_location_coordinates = -1;
-+static int hf_nfapi_location_coordinates_length = -1;
-+static int hf_nfapi_dl_config_timing = -1;
-+static int hf_nfapi_tx_timing = -1;
-+static int hf_nfapi_ul_config_timing = -1;
-+static int hf_nfapi_hi_dci0_timing = -1;
-+static int hf_nfapi_maximum_number_phys = -1;
-+static int hf_nfapi_maximum_total_bandwidth = -1;
-+static int hf_nfapi_maximum_total_number_dl_layers = -1;
-+static int hf_nfapi_maximum_total_number_ul_layers = -1;
-+static int hf_nfapi_shared_bands = -1;
-+static int hf_nfapi_shared_pa = -1;
-+static int hf_nfapi_maximum_total_power = -1;
-+static int hf_nfapi_oui = -1;
-+static int hf_nfapi_pdu = -1;
-+static int hf_nfapi_pnf_phy_number_phy = -1;
-+static int hf_nfapi_pnf_phy_config_index = -1;
-+static int hf_nfapi_number_of_rf_exclusions = -1;
-+static int hf_nfapi_dl_bandwidth_support = -1;
-+static int hf_nfapi_dl_bandwidth_support_6 = -1;
-+static int hf_nfapi_dl_bandwidth_support_15 = -1;
-+static int hf_nfapi_dl_bandwidth_support_25 = -1;
-+static int hf_nfapi_dl_bandwidth_support_50 = -1;
-+static int hf_nfapi_dl_bandwidth_support_75 = -1;
-+static int hf_nfapi_dl_bandwidth_support_100 = -1;
-+static int hf_nfapi_ul_bandwidth_support = -1;
-+static int hf_nfapi_ul_bandwidth_support_6 = -1;
-+static int hf_nfapi_ul_bandwidth_support_15= -1;
-+static int hf_nfapi_ul_bandwidth_support_25 = -1;
-+static int hf_nfapi_ul_bandwidth_support_50 = -1;
-+static int hf_nfapi_ul_bandwidth_support_75 = -1;
-+static int hf_nfapi_ul_bandwidth_support_100 = -1;
-+static int hf_nfapi_downlink_channel_bandwidth_supported = -1;
-+static int hf_nfapi_uplink_channel_bandwidth_supported = -1;
-+static int hf_nfapi_number_of_dl_layers_supported = -1;
-+static int hf_nfapi_number_of_ul_layers_supported = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported_rel8 = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported_rel9 = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported_rel10 = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported_rel11 = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported_rel12 = -1;
-+static int hf_nfapi_maximum_3gpp_release_supported_rel13 = -1;
-+static int hf_nfapi_nmm_modes_supported = -1;
-+static int hf_nfapi_number_of_rfs = -1;
-+static int hf_nfapi_rf_config_index = -1;
-+static int hf_nfapi_band = -1;
-+static int hf_nfapi_maximum_transmit_power = -1;
-+static int hf_nfapi_maximum_transmit_power_2 = -1;
-+static int hf_nfapi_earfcn = -1;
-+static int hf_nfapi_minimum_transmit_power = -1;
-+static int hf_nfapi_number_of_antennas_suppported = -1;
-+static int hf_nfapi_minimum_downlink_frequency = -1;
-+static int hf_nfapi_maximum_downlink_frequency = -1;
-+static int hf_nfapi_minimum_uplink_frequency = -1;
-+static int hf_nfapi_maximum_uplink_frequency = -1;
-+static int hf_nfapi_number_of_rf_bands = -1;
-+static int hf_nfapi_nmm_uplink_rssi_supported = -1;
-+static int hf_nfapi_phy_rf_config_info_phy_id = -1;
-+static int hf_nfapi_transmission_mode7_supported = -1;
-+static int hi_nfapi_transmission_mode8_supported = -1;
-+static int hi_nfapi_two_antennas_ports_for_pucch = -1;
-+static int hi_nfapi_transmission_mode_9_supported = -1;
-+static int hi_nfapi_simultaneous_pucch_pusch = -1;
-+static int hi_nfapi_four_layer_tx_with_tm3_and_tm4 = -1;
-+static int hf_nfapi_epdcch_supported = -1;
-+static int hi_nfapi_multi_ack_csi_reporting = -1;
-+static int hi_nfapi_pucch_tx_diversity_with_channel_selection = -1;
-+static int hi_nfapi_ul_comp_supported = -1;
-+static int hi_nfapi_transmission_mode_5_supported = -1;
-+static int hf_nfapi_csi_subframe_set = -1;
-+static int hi_nfapi_enhanced_4tx_codebook = -1;
-+static int hi_nfapi_drs_supported = -1;
-+static int hi_nfapi_ul_64qam_supported = -1;
-+static int hi_nfapi_transmission_mode_10_supported = -1;
-+static int hi_nfapi_alternative_tbs_indices = -1;
-+static int hf_nfapi_pucch_format_4_supported = -1;
-+static int hf_nfapi_pucch_format_5_supported = -1;
-+static int hf_nfapi_more_than_5_ca_supported = -1;
-+static int hf_nfapi_laa_supported = -1;
-+static int hf_nfapi_laa_ending_in_dwpts_supported = -1;
-+static int hf_nfapi_laa_starting_in_second_slot_supported = -1;
-+static int hf_nfapi_beamforming_supported = -1;
-+static int hf_nfapi_csi_rs_enhancements_supported = -1;
-+static int hf_nfapi_drms_enhancements_supported = -1;
-+static int hf_nfapi_srs_enhancements_supported = -1;
-+static int hf_nfapi_dl_rs_tx_power = -1;
-+static int hf_nfapi_received_interference_power = -1;
-+static int hf_nfapi_thermal_noise_power = -1;
-+static int hf_nfapi_dl_rs_tx_power_measurement = -1;
-+static int hf_nfapi_received_interference_power_measurement = -1;
-+static int hf_nfapi_thermal_noise_power_measurement = -1;
-+
-+// P5 Message Structures
-+static int hf_nfapi_error_code = -1;
-+static int hf_nfapi_p4_error_code = -1;
-+static int hf_nfapi_rat_type = -1;
-+static int hf_nfapi_num_tlv = -1;
-+static int hf_nfapi_phy_state = -1;
-+static int hf_nfapi_phy_antenna_capability = -1;
-+static int hf_nfapi_release_capability = -1;
-+static int hf_nfapi_mbsfn_capability = -1;
-+static int hf_nfapi_laa_capability = -1;
-+static int hf_nfapi_pd_sensing_lbt_support = -1;
-+static int hf_nfapi_multi_carrier_lbt_support = -1;
-+static int hf_nfapi_partial_sf_support = -1;
-+
-+static int hf_nfapi_pnf_address_ipv4 = -1;
-+static int hf_nfapi_pnf_address_ipv6 = -1;
-+static int hf_nfapi_vnf_address_ipv4 = -1;
-+static int hf_nfapi_vnf_address_ipv6 = -1;
-+static int hf_nfapi_pnf_port = -1;
-+static int hf_nfapi_vnf_port = -1;
-+static int hf_nfapi_dl_ue_per_sf = -1;
-+static int hf_nfapi_ul_ue_per_sf = -1;
-+static int hf_nfapi_timing_window = -1;
-+static int hf_nfapi_timing_info_mode = -1;
-+static int hf_nfapi_timing_info_period = -1;
-+static int hf_nfapi_duplex_mode = -1;
-+static int hf_nfapi_pcfich_power_offset = -1;
-+static int hf_nfapi_pb = -1;
-+static int hf_nfapi_dl_cyclic_prefix_type = -1;
-+static int hf_nfapi_ul_cyclic_prefix_type = -1;
-+static int hf_nfapi_tx_antenna_ports = -1;
-+static int hf_nfapi_rx_antenna_ports = -1;
-+static int hf_nfapi_downlink_channel_bandwidth = -1;
-+static int hf_nfapi_uplink_channel_bandwidth = -1;
-+static int hf_nfapi_reference_signal_power = -1;
-+static int hf_nfapi_phich_resource = -1;
-+static int hf_nfapi_phich_duration = -1;
-+static int hf_nfapi_phich_power_offset = -1;
-+static int hf_nfapi_primary_synchronization_signal_epre_eprers = -1;
-+static int hf_nfapi_secondary_synchronization_signal_epre_eprers = -1;
-+static int hf_nfapi_physical_cell_id = -1;
-+static int hf_nfapi_configuration_index = -1;
-+static int hf_nfapi_root_sequence_index = -1;
-+static int hf_nfapi_zero_correlation_zone_configuration = -1;
-+static int hf_nfapi_high_speed_flag = -1;
-+static int hf_nfapi_frequency_offset = -1;
-+static int hf_nfapi_hopping_mode = -1;
-+static int hf_nfapi_hopping_offset = -1;
-+static int hf_nfapi_delta_pucch_shift = -1;
-+static int hf_nfapi_n_cqi_rb = -1;
-+static int hf_nfapi_n_an_cs = -1;
-+static int hf_nfapi_n1_pucch_an = -1;
-+static int hf_nfapi_bandwidth_configuration = -1;
-+static int hf_nfapi_max_up_pts = -1;
-+static int hf_nfapi_srs_subframe_configuration = -1;
-+static int hf_nfapi_srs_acknack_srs_simultaneous_transmission = -1;
-+static int hf_nfapi_uplink_rs_hopping = -1;
-+static int hf_nfapi_group_assignment = -1;
-+static int hf_nfapi_cyclic_shift_1_for_drms = -1;
-+static int hf_nfapi_subframe_assignment = -1;
-+static int hf_nfapi_special_subframe_patterns = -1;
-+static int hf_nfapi_ed_threshold_for_lbt_for_pdsch = -1;
-+static int hf_nfapi_ed_threshold_for_lbt_for_drs = -1;
-+static int hf_nfapi_pd_threshold = -1;
-+static int hf_nfapi_multi_carrier_type = -1;
-+static int hf_nfapi_multi_carrier_tx = -1;
-+static int hf_nfapi_multi_carrier_freeze = -1;
-+static int hf_nfapi_tx_antenna_ports_for_drs = -1;
-+static int hf_nfapi_transmission_power_for_drs = -1;
-+static int hf_nfapi_pbch_repetitions_enabled_r13 = -1;
-+static int hf_nfapi_prach_cat_m_root_sequence_index = -1;
-+static int hf_nfapi_prach_cat_m_zero_correlation_zone_configuration = -1;
-+static int hf_nfapi_prach_cat_m_high_speed_flag = -1;
-+static int hf_nfapi_prach_ce_level_0_enable = -1;
-+static int hf_nfapi_prach_ce_level_0_configuration_index = -1;
-+static int hf_nfapi_prach_ce_level_0_frequency_offset = -1;
-+static int hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt = -1;
-+static int hf_nfapi_prach_ce_level_0_starting_subframe_periodicity = -1;
-+static int hf_nfapi_prach_ce_level_0_hopping_enabled = -1;
-+static int hf_nfapi_prach_ce_level_0_hopping_offset = -1;
-+static int hf_nfapi_prach_ce_level_1_enable = -1;
-+static int hf_nfapi_prach_ce_level_1_configuration_index = -1;
-+static int hf_nfapi_prach_ce_level_1_frequency_offset = -1;
-+static int hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt = -1;
-+static int hf_nfapi_prach_ce_level_1_starting_subframe_periodicity = -1;
-+static int hf_nfapi_prach_ce_level_1_hopping_enabled = -1;
-+static int hf_nfapi_prach_ce_level_1_hopping_offset = -1;
-+static int hf_nfapi_prach_ce_level_2_enable = -1;
-+static int hf_nfapi_prach_ce_level_2_configuration_index = -1;
-+static int hf_nfapi_prach_ce_level_2_frequency_offset = -1;
-+static int hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt = -1;
-+static int hf_nfapi_prach_ce_level_2_starting_subframe_periodicity = -1;
-+static int hf_nfapi_prach_ce_level_2_hopping_enabled = -1;
-+static int hf_nfapi_prach_ce_level_2_hopping_offset = -1;
-+static int hf_nfapi_prach_ce_level_3_enable = -1;
-+static int hf_nfapi_prach_ce_level_3_configuration_index = -1;
-+static int hf_nfapi_prach_ce_level_3_frequency_offset = -1;
-+static int hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt = -1;
-+static int hf_nfapi_prach_ce_level_3_starting_subframe_periodicity = -1;
-+static int hf_nfapi_prach_ce_level_3_hopping_enabled = -1;
-+static int hf_nfapi_prach_ce_level_3_hopping_offset = -1;
-+static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b = -1;
-+static int hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a = -1;
-+static int hf_nfapi_dl_modulation_support = -1;
-+static int hf_nfapi_dl_modulation_support_qpsk = -1;
-+static int hf_nfapi_dl_modulation_support_16qam = -1;
-+static int hf_nfapi_dl_modulation_support_64qam = -1;
-+static int hf_nfapi_dl_modulation_support_256qam = -1;
-+static int hf_nfapi_ul_modulation_support = -1;
-+static int hf_nfapi_ul_modulation_support_qpsk = -1;
-+static int hf_nfapi_ul_modulation_support_16qam = -1;
-+static int hf_nfapi_ul_modulation_support_64qam = -1;
-+static int hf_nfapi_data_report_mode = -1;
-+static int hf_nfapi_sfnsf = -1;
-+
-+// P7 Sub Structures
-+static int hf_nfapi_dl_dci_format = -1;
-+static int hf_nfapi_ul_dci_format = -1;
-+static int hf_nfapi_mpdcch_ul_dci_format = -1;
-+static int hf_nfapi_cce_idx = -1;
-+static int hf_nfapi_aggregation_level = -1;
-+static int hf_nfapi_mcs_1 = -1;
-+static int hf_nfapi_redundancy_version_1 = -1;
-+static int hf_nfapi_new_data_indicator_1 = -1;
-+static int hf_nfapi_mcs_2 = -1;
-+static int hf_nfapi_redundancy_version_2 = -1;
-+static int hf_nfapi_new_data_indicator_2 = -1;
-+static int hf_nfapi_harq_process = -1;
-+static int hf_nfapi_tpmi = -1;
-+static int hf_nfapi_pmi = -1;
-+static int hf_nfapi_precoding_information = -1;
-+static int hf_nfapi_tpc = -1;
-+static int hf_nfapi_downlink_assignment_index = -1;
-+static int hf_nfapi_transport_block_size_index = -1;
-+static int hf_nfapi_downlink_power_offset = -1;
-+static int hf_nfapi_allocate_prach_flag = -1;
-+static int hf_nfapi_preamble_index = -1;
-+static int hf_nfapi_prach_mask_index = -1;
-+static int hf_nfapi_rnti_type = -1;
-+static int hf_nfapi_mpdcch_rnti_type = -1;
-+static int hf_nfapi_mcch_flag = -1;
-+static int hf_nfapi_mcch_change_notification = -1;
-+static int hf_nfapi_scrambling_identity = -1;
-+static int hf_nfapi_cross_carrier_scheduling_flag = -1;
-+static int hf_nfapi_carrier_indicator = -1;
-+static int hf_nfapi_srs_flag = -1;
-+static int hf_nfapi_srs_request = -1;
-+static int hf_nfapi_antenna_ports_scrambling_and_layers = -1;
-+static int hf_nfapi_total_dci_length_including_padding = -1;
-+static int hf_nfapi_harq_ack_resource_offset = -1;
-+static int hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator = -1;
-+static int hf_nfapi_primary_cell_type = -1;
-+static int hf_nfapi_ul_dl_configuration_flag = -1;
-+static int hf_nfapi_number_of_ul_dl_configurations = -1;
-+static int hf_nfapi_ul_dl_configuration_index = -1;
-+static int hf_nfapi_laa_end_partial_sf_flag = -1;
-+static int hf_nfapi_laa_end_partial_sf_configuration = -1;
-+static int hf_nfapi_initial_lbt_sf = -1;
-+static int hf_nfapi_codebooksize_determination_r13 = -1;
-+static int hf_nfapi_rel13_drms_table_flag = -1;
-+static int hf_nfapi_csi_rs_resource_config = -1;
-+static int hf_nfapi_csi_rs_number_of_nzp_configurations = -1;
-+static int hf_nfapi_pdsch_start = -1;
-+static int hf_nfapi_drms_config_flag = -1;
-+static int hf_nfapi_drms_scrambling = -1;
-+static int hf_nfapi_csi_config_flag = -1;
-+static int hf_nfapi_csi_scrambling = -1;
-+static int hf_nfapi_pdsch_re_mapping_flag = -1;
-+static int hf_nfapi_pdsch_re_mapping_antenna_ports = -1;
-+static int hf_nfapi_pdsch_re_mapping_freq_shift = -1;
-+static int hf_nfapi_alt_cqi_table_r12 = -1;
-+static int hf_nfapi_max_layers = -1;
-+static int hf_nfapi_n_dl_harq = -1;
-+static int hf_nfapi_dwpts_symbols = -1;
-+static int hf_nfapi_ue_type = -1;
-+static int hf_nfapi_pdsch_payload_type = -1;
-+static int hf_nfapi_initial_transmission_sf = -1;
-+static int hf_nfapi_req13_drms_table_flag = -1;
-+static int hf_nfapi_prnti = -1;
-+static int hf_nfapi_mcs = -1;
-+static int hf_nfapi_number_of_transport_blocks = -1;
-+static int hf_nfapi_ue_mode = -1;
-+static int hf_prs_bandwidth = -1;
-+static int hf_prs_cyclic_prefix_type = -1;
-+static int hf_prs_muting = -1;
-+static int hf_nfapi_csi_rs_resource_index = -1;
-+static int hf_nfapi_csi_rs_class = -1;
-+static int hf_nfapi_cdm_type = -1;
-+static int hf_nfapi_edpcch_prb_index = -1;
-+static int hf_nfapi_epdcch_resource_assignment_flag = -1;
-+static int hf_nfapi_epdcch_id = -1;
-+static int hf_nfapi_epdcch_start_symbol = -1;
-+static int hf_nfapi_epdcch_num_prb = -1;
-+static int hf_nfapi_precoding_value = -1;
-+static int hf_nfapi_mpdcch_narrowband = -1;
-+static int hf_nfapi_number_of_prb_pairs = -1;
-+static int hf_nfapi_resource_block_assignment = -1;
-+static int hf_nfapi_start_symbol = -1;
-+static int hf_nfapi_ecce_index = -1;
-+static int hf_nfapi_ce_mode = -1;
-+static int hf_nfapi_drms_scrabmling_init = -1;
-+static int hf_nfapi_pdsch_reception_levels = -1;
-+static int hf_nfapi_new_data_indicator = -1;
-+static int hf_nfapi_tpmi_length = -1;
-+static int hf_nfapi_pmi_flag = -1;
-+static int hf_nfapi_harq_resource_offset = -1;
-+static int hf_nfapi_dci_subframe_repetition_number = -1;
-+static int hf_nfapi_downlink_assignment_index_length = -1;
-+static int hf_nfapi_starting_ce_level = -1;
-+static int hf_nfapi_antenna_ports_and_scrambling_identity_flag = -1;
-+static int hf_nfapi_antenna_ports_and_scrambling_identity = -1;
-+static int hf_nfapi_paging_direct_indication_differentiation_flag = -1;
-+static int hf_nfapi_direct_indication = -1;
-+static int hf_nfapi_number_of_tx_antenna_ports = -1;
-+
-+// P7 Message Structures
-+static int hf_nfapi_dl_node_sync_t1 = -1;
-+static int hf_nfapi_dl_node_sync_delta_sfn_sf = -1;
-+static int hf_nfapi_ul_node_sync_t1 = -1;
-+static int hf_nfapi_ul_node_sync_t2 = -1;
-+static int hf_nfapi_ul_node_sync_t3 = -1;
-+static int hf_nfapi_timing_info_last_sfn_sf = -1;
-+static int hf_nfapi_timing_info_time_since_last_timing_info = -1;
-+static int hf_nfapi_timing_info_dl_config_jitter = -1;
-+static int hf_nfapi_timing_info_tx_request_jitter = -1;
-+static int hf_nfapi_timing_info_ul_config_jitter = -1;
-+static int hf_nfapi_timing_info_hi_dci0_jitter = -1;
-+static int hf_nfapi_timing_info_dl_config_latest_delay = -1;
-+static int hf_nfapi_timing_info_tx_request_latest_delay = -1;
-+static int hf_nfapi_timing_info_ul_config_latest_delay = -1;
-+static int hf_nfapi_timing_info_hi_dci0_latest_delay = -1;
-+static int hf_nfapi_timing_info_dl_config_earliest_arrival = -1;
-+static int hf_nfapi_timing_info_tx_request_earliest_arrival = -1;
-+static int hf_nfapi_timing_info_ul_config_earliest_arrival = -1;
-+static int hf_nfapi_timing_info_hi_dci0_earliest_arrival = -1;
-+static int hf_nfapi_sfn_sf = -1;
-+static int hf_nfapi_number_pdcch_ofdm_symbols = -1;
-+static int hf_nfapi_number_dci = -1;
-+static int hf_nfapi_number_pdus = -1;
-+static int hf_nfapi_number_pdsch_rnti = -1;
-+static int hf_nfapi_transmission_power_pcfich = -1;
-+static int hf_nfapi_number_of_harqs = -1;
-+static int hf_nfapi_number_of_crcs = -1;
-+static int hf_nfapi_number_of_srs = -1;
-+static int hf_nfapi_number_of_cqi = -1;
-+static int hf_nfapi_number_of_preambles = -1;
-+static int hf_nfapi_number_of_srss = -1;
-+static int hf_nfapi_lbt_dl_req_pdu_type = -1;
-+static int hf_nfapi_lbt_dl_ind_pdu_type = -1;
-+static int hf_nfapi_dl_config_pdu_type = -1;
-+static int hf_nfapi_pdu_size = -1;
-+static int hf_nfapi_instance_length = -1;
-+static int hf_nfapi_length;
-+static int hf_nfapi_pdu_index = -1;
-+static int hf_nfapi_rnti = -1;
-+static int hf_nfapi_resource_allocation_type = -1;
-+static int hf_nfapi_virtual_resource_block_assignment_flag = -1;
-+static int hf_nfapi_resource_block_coding = -1;
-+static int hf_nfapi_modulation = -1;
-+static int hf_nfapi_redundancy_version = -1;
-+static int hf_nfapi_transport_blocks = -1;
-+static int hf_nfapi_transport_block_to_codeword_swap_flag = -1;
-+static int hf_nfapi_transmission_scheme = -1;
-+static int hf_nfapi_ul_transmission_scheme = -1;
-+static int hf_nfapi_number_of_layers = -1;
-+static int hf_nfapi_number_of_subbands = -1;
-+static int hf_nfapi_codebook_index = -1;
-+static int hf_nfapi_ue_category_capacity = -1;
-+static int hf_nfapi_pa = -1;
-+static int hf_nfapi_delta_power_offset_index = -1;
-+static int hf_nfapi_ngap = -1;
-+static int hf_nfapi_nprb = -1;
-+static int hf_nfapi_transmission_mode = -1;
-+static int hf_nfapi_num_bf_prb_per_subband = -1;
-+static int hf_nfapi_num_bf_vector = -1;
-+static int hf_nfapi_bf_vector_subband_index = -1;
-+static int hf_nfapi_bf_vector_num_antennas = -1;
-+static int hf_nfapi_bf_vector_bf_value = -1;
-+static int hf_nfapi_nscid = -1;
-+static int hf_nfapi_csi_rs_flag = -1;
-+static int hf_nfapi_csi_rs_resource_config_r10 = -1;
-+static int hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10 = -1;
-+static int hf_nfapi_transmission_power = -1;
-+static int hf_nfapi_mbsfn_area_id = -1;
-+static int hf_nfapi_csi_rs_antenna_port_count_r10 = -1;
-+static int hf_nfapi_ul_config_pdu_type = -1;
-+static int hf_nfapi_rach_prach_frequency_resources = -1;
-+static int hf_nfapi_srs_present = -1;
-+static int hf_nfapi_handle = -1;
-+static int hf_nfapi_pucch_index = -1;
-+static int hf_nfapi_size = -1;
-+static int hf_nfapi_resource_block_start = -1;
-+static int hf_nfapi_number_of_resource_blocks = -1;
-+static int hf_nfapi_cyclic_shift_2_for_drms = -1;
-+static int hf_nfapi_frequency_hopping_enabled_flag = -1;
-+static int hf_nfapi_frequency_hopping_bits = -1;
-+static int hf_nfapi_new_data_indication = -1;
-+static int hf_nfapi_harq_process_number = -1;
-+static int hf_nfapi_ul_tx_mode = -1;
-+static int hf_nfapi_current_tx_nb = -1;
-+static int hf_nfapi_n_srs = -1;
-+static int hf_nfapi_disable_sequence_hopping_flag = -1;
-+static int hf_nfapi_dl_cqi_pmi_size_rank_1 = -1;
-+static int hf_nfapi_dl_cqi_pmi_size_rank_greater_1 = -1;
-+static int hf_nfapi_ri_size = -1;
-+static int hf_nfapi_delta_offset_cqi = -1;
-+static int hf_nfapi_delta_offset_ri = -1;
-+static int hf_nfapi_harq_size = -1;
-+static int hf_nfapi_delta_offset_harq = -1;
-+static int hf_nfapi_tdd_ack_nack_mode = -1;
-+static int hf_nfapi_fdd_ack_nack_mode = -1;
-+static int hf_nfapi_n_srs_initial = -1;
-+static int hf_nfapi_initial_number_of_resource_blocks = -1;
-+static int hf_nfapi_dl_cqi_pmi_size = -1;
-+static int hf_nfapi_report_type = -1;
-+static int hf_nfapi_dl_cqi_ri_pmi_size = -1;
-+static int hf_nfapi_control_type = -1;
-+static int hf_nfapi_number_of_cc = -1;
-+static int hf_nfapi_virtual_cell_id_enabled_flag = -1;
-+static int hf_nfapi_npusch_identity = -1;
-+static int hf_nfapi_ndrms_csh_identity = -1;
-+static int hf_nfapi_total_number_of_repetitions = -1;
-+static int hf_nfapi_repetition_number = -1;
-+static int hf_nfapi_initial_sf_io = -1;
-+static int hf_nfapi_empty_symbols_due_to_retunning = -1;
-+static int hf_nfapi_dl_cqi_ri_pmi_size_2 = -1;
-+static int hf_nfapi_npucch_identity = -1;
-+static int hf_nfapi_harq_size_2 = -1;
-+static int hf_nfapi_delta_offset_harq_2 = -1;
-+static int hf_nfapi_empty_symbols = -1;
-+static int hf_nfapi_csi_mode = -1;
-+static int hf_nfapi_dl_cqi_pmi_size_2 = -1;
-+static int hf_nfapi_statring_prb = -1;
-+static int hf_nfapi_cdm_index = -1;
-+static int hf_nfapi_nsrs = -1;
-+static int hf_nfapi_num_ant_ports = -1;
-+static int hf_nfapi_n_pucch_2_0 = -1;
-+static int hf_nfapi_n_pucch_2_1 = -1;
-+static int hf_nfapi_n_pucch_2_2 = -1;
-+static int hf_nfapi_n_pucch_2_3 = -1;
-+static int hf_nfapi_starting_prb = -1;
-+static int hf_nfapi_antenna_port = -1;
-+static int hf_nfapi_number_of_combs = -1;
-+static int hf_nfapi_number_of_pucch_resource = -1;
-+static int hf_nfapi_pucch_index_p1 = -1;
-+static int hf_nfapi_n_pucch_1_0 = -1;
-+static int hf_nfapi_n_pucch_1_1 = -1;
-+static int hf_nfapi_n_pucch_1_2 = -1;
-+static int hf_nfapi_n_pucch_1_3 = -1;
-+static int hf_nfapi_srs_bandwidth = -1;
-+static int hf_nfapi_frequency_domain_position = -1;
-+static int hf_nfapi_srs_hopping_bandwidth = -1;
-+static int hf_nfapi_transmission_comb = -1;
-+static int hf_nfapi_i_srs = -1;
-+static int hf_nfapi_sounding_reference_cyclic_shift = -1;
-+static int hf_nfapi_pdu_length = -1;
-+static int hf_nfapi_crc_flag = -1;
-+static int hf_nfapi_number_of_hi_pdus = -1;
-+static int hf_nfapi_number_of_dci_pdus = -1;
-+static int hf_nfapi_hi_dci0_pdu_type = -1;
-+static int hf_nfapi_hi_value = -1;
-+static int hf_nfapi_i_phich = -1;
-+static int hf_nfapi_flag_tb2 = -1;
-+static int hf_nfapi_hi_value_2 = -1;
-+static int hf_nfapi_ue_tx_antenna_selection = -1;
-+static int hf_nfapi_cqi_csi_request = -1;
-+static int hf_nfapi_ul_index = -1;
-+static int hf_nfapi_dl_assignment_index = -1;
-+static int hf_nfapi_tpc_bitmap = -1;
-+static int hf_nfapi_new_data_indication_two = -1;
-+static int hf_nfapi_size_of_cqi_csi_feild = -1;
-+static int hf_nfapi_resource_allocation_flag = -1;
-+static int hf_nfapi_number_of_antenna_ports = -1;
-+static int hf_nfapi_n_ul_rb = -1;
-+static int hf_nfapi_pscch_resource = -1;
-+static int hf_nfapi_time_resource_pattern = -1;
-+static int hf_nfapi_mpdcch_transmission_type = -1;
-+static int hf_nfapi_drms_scrambling_init = -1;
-+static int hf_nfapi_pusch_repetition_levels = -1;
-+static int hf_nfapi_frequency_hopping_flag = -1;
-+static int hf_nfapi_csi_request = -1;
-+static int hf_nfapi_dai_presence_flag = -1;
-+static int hf_nfapi_total_dci_length_include_padding = -1;
-+static int hf_nfapi_data_offset = -1;
-+static int hf_nfapi_ul_cqi = -1;
-+static int hf_nfapi_timing_advance_r9 = -1;
-+static int hf_nfapi_timing_advance = -1;
-+static int hf_nfapi_harq_data_value_0 = -1;
-+static int hf_nfapi_harq_data_value_0_special = -1;
-+static int hf_nfapi_harq_data_value_1 = -1;
-+static int hf_nfapi_harq_data_value_2 = -1;
-+static int hf_nfapi_harq_data_value_3 = -1;
-+static int hf_nfapi_tdd_harq_mode = -1;
-+static int hf_nfapi_fdd_harq_mode = -1;
-+static int hf_nfapi_number_of_ack_nack = -1;
-+static int hf_nfapi_harq_tb_1 = -1;
-+static int hf_nfapi_harq_tb_2 = -1;
-+static int hf_nfapi_harq_tb_n = -1;
-+static int hf_nfapi_channel = -1;
-+static int hf_nfapi_ri = -1;
-+static int hf_nfapi_number_of_cc_reported = -1;
-+static int hf_nfapi_preamble = -1;
-+static int hf_nfapi_rach_resource_type = -1;
-+static int hf_nfapi_snr = -1;
-+static int hf_nfapi_doppler_estimation = -1;
-+static int hf_nfapi_rb_start = -1;
-+static int hf_nfapi_up_pts_symbol = -1;
-+static int hf_nfapi_number_prb_per_subband = -1;
-+static int hf_nfapi_number_antennas = -1;
-+static int hf_nfapi_subband_index = -1;
-+static int hf_nfapi_channel_coefficient = -1;
-+static int hf_nfapi_ul_rtoa = -1;
-+static int hf_nfapi_mp_cca = -1;
-+static int hf_nfapi_n_cca = -1;
-+static int hf_nfapi_offset = -1;
-+static int hf_nfapi_lte_txop_sf = -1;
-+static int hf_nfapi_txop_sfn_sf_end = -1;
-+static int hf_nfapi_lbt_mode = -1;
-+static int hf_nfapi_sfn_sf_end = -1;
-+static int hf_nfapi_result = -1;
-+static int hf_nfapi_txop_symbols = -1;
-+static int hf_nfapi_initial_partial_sf = -1;
-+static int hf_nfapi_frequency_band_indicator = -1;
-+static int hf_nfapi_measurement_period = -1;
-+static int hf_nfapi_bandwidth = -1;
-+static int hf_nfapi_timeout = -1;
-+static int hf_nfapi_number_of_earfcns = -1;
-+static int hf_nfapi_uarfcn = -1;
-+static int hf_nfapi_number_of_uarfcns = -1;
-+static int hf_nfapi_arfcn = -1;
-+static int hf_nfapi_arfcn_direction = -1;
-+static int hf_nfapi_number_of_arfcns = -1;
-+static int hf_nfapi_rssi = -1;
-+static int hf_nfapi_number_of_rssi = -1;
-+static int hf_nfapi_pci = -1;
-+static int hf_nfapi_measurement_bandwidth = -1;
-+static int hf_nfapi_exhaustive_search = -1;
-+static int hf_nfapi_number_of_pci = -1;
-+static int hf_nfapi_psc = -1;
-+static int hf_nfapi_number_of_psc = -1;
-+static int hf_nfapi_rsrp = -1;
-+static int hf_nfapi_rsrq = -1;
-+static int hf_nfapi_number_of_lte_cells_found = -1;
-+static int hf_nfapi_rscp = -1;
-+static int hf_nfapi_enco = -1;
-+static int hf_nfapi_number_of_utran_cells_found = -1;
-+static int hf_nfapi_bsic = -1;
-+static int hf_nfapi_rxlev = -1;
-+static int hf_nfapi_rxqual = -1;
-+static int hf_nfapi_sfn_offset = -1;
-+static int hf_nfapi_number_of_geran_cells_found = -1;
-+static int hf_nfapi_number_of_tx_antenna = -1;
-+static int hf_nfapi_mib_length = -1;
-+static int hf_nfapi_mib = -1;
-+static int hf_nfapi_phich_configuration = -1;
-+static int hf_nfapi_retry_count = -1;
-+static int hf_nfapi_sib1 = -1;
-+static int hf_nfapi_si_periodicity = -1;
-+static int hf_nfapi_si_index = -1;
-+static int hf_nfapi_number_of_si_periodicity = -1;
-+static int hf_nfapi_si_window_length = -1;
-+static int hf_nfapi_sib_type = -1;
-+static int hf_nfapi_sib_len = -1;
-+static int hf_nfapi_sib = -1;
-+static int hf_nfapi_si_len = -1;
-+static int hf_nfapi_si = -1;
-+static int hf_nfapi_pnf_search_state = -1;
-+static int hf_nfapi_pnf_broadcast_state = -1;
-+
-+static const value_string message_id_vals[] =
-+{
-+	{ NFAPI_DL_CONFIG_REQUEST_MSG_ID, "DL_CONFIG.request" },
-+	{ NFAPI_UL_CONFIG_REQUEST_MSG_ID, "UL_CONFIG.request" },
-+	{ NFAPI_SUBFRAME_INDICATION_MSG_ID, "SUBFRAME_INDICATION" },
-+	{ NFAPI_HI_DCI0_REQUEST_MSG_ID, "HI_DCI0.request" },
-+	{ NFAPI_TX_REQUEST_MSG_ID, "TX.request" },
-+	{ NFAPI_HARQ_INDICATION_MSG_ID, "HARQ.indication" },
-+	{ NFAPI_CRC_INDICATION_MSG_ID, "CRC.indication" },
-+	{ NFAPI_RX_ULSCH_INDICATION_MSG_ID, "RX_ULSCH.indication" },
-+	{ NFAPI_RACH_INDICATION_MSG_ID, "RACH.indication" },
-+	{ NFAPI_SRS_INDICATION_MSG_ID, "SRS.indication" },
-+	{ NFAPI_RX_SR_INDICATION_MSG_ID, "RX_SR.indication" },
-+	{ NFAPI_RX_CQI_INDICATION_MSG_ID, "RX_CQI.indication" },
-+	{ NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID, "LBT_DL_CONFIG.request" },
-+	{ NFAPI_LBT_DL_INDICATION_MSG_ID, "LBT_DL.indication" },
-+
-+	{ NFAPI_PNF_PARAM_REQUEST_MSG_ID, "PNF_PARAM.request" },
-+	{ NFAPI_PNF_PARAM_RESPONSE_MSG_ID, "PNF_PARAM.response" },
-+	{ NFAPI_PNF_CONFIG_REQUEST_MSG_ID, "PNF_CONFIG.request" },
-+	{ NFAPI_PNF_CONFIG_RESPONSE_MSG_ID, "PNF_CONFIG.response" },
-+	{ NFAPI_PNF_START_REQUEST_MSG_ID, "PNF_START.request" },
-+	{ NFAPI_PNF_START_RESPONSE_MSG_ID, "PNF_START.response" },
-+	{ NFAPI_PNF_STOP_REQUEST_MSG_ID, "PNF_STOP.request" },
-+	{ NFAPI_PNF_STOP_RESPONSE_MSG_ID, "PNF_STOP.response" },
-+	{ NFAPI_PARAM_REQUEST_MSG_ID, "PARAM.request" },
-+	{ NFAPI_PARAM_RESPONSE_MSG_ID, "PARAM.response" },
-+	{ NFAPI_CONFIG_REQUEST_MSG_ID, "CONFIG.request" },
-+	{ NFAPI_CONFIG_RESPONSE_MSG_ID, "CONFIG.response" },
-+	{ NFAPI_START_REQUEST_MSG_ID, "START.request" },
-+	{ NFAPI_START_RESPONSE_MSG_ID, "START.response" },
-+	{ NFAPI_STOP_REQUEST_MSG_ID, "STOP.request" },
-+	{ NFAPI_STOP_RESPONSE_MSG_ID, "STOP.response" },
-+	{ NFAPI_MEASUREMENT_REQUEST_MSG_ID, "MEASUREMENT.request" },
-+	{ NFAPI_MEASUREMENT_RESPONSE_MSG_ID, "MEASUREMENT.response" },
-+
-+	{ NFAPI_DL_NODE_SYNC_MSG_ID, "UL_NODE_SYNC" },
-+	{ NFAPI_UL_NODE_SYNC_MSG_ID, "DL_NODE_SYNC" },
-+	{ NFAPI_TIMING_INFO_MSG_ID, "TIMING_INFO" },
-+
-+	{ NFAPI_RSSI_REQUEST_MSG_ID, "RSSI.request" },
-+	{ NFAPI_RSSI_RESPONSE_MSG_ID, "RSSI.response" },
-+	{ NFAPI_RSSI_INDICATION_MSG_ID, "RSSI.indication" },
-+	{ NFAPI_CELL_SEARCH_REQUEST_MSG_ID, "CELL_SEARCH.request" },
-+	{ NFAPI_CELL_SEARCH_RESPONSE_MSG_ID, "CELL_SEARCH.response" },
-+	{ NFAPI_CELL_SEARCH_INDICATION_MSG_ID, "CELL_SEARCH.indication" },
-+	{ NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID, "BROADCAST_DETECT.request" },
-+	{ NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID, "BROADCAST_DETECT.response" },
-+	{ NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID, "BROADCAST_DETECT.indication" },
-+	{ NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.request" },
-+	{ NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.response" },
-+	{ NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID, "SYSTEM_INFORMATION_SCHEDULE.indication" },
-+	{ NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID, "SYSTEM_INFORMATION.request" },
-+	{ NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID, "SYSTEM_INFORMATION.response" },
-+	{ NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID, "SYSTEM_INFORMATION.indication" },
-+	{ NFAPI_NMM_STOP_REQUEST_MSG_ID, "NMM_STOP.request" },
-+	{ NFAPI_NMM_STOP_RESPONSE_MSG_ID, "NMM_STOP.response" },
-+
-+	{ 0, NULL },
-+};
-+
-+typedef void(*tlv_decode)(ptvcursor_t * ptvc, packet_info* pinfo);
-+
-+typedef struct
-+{
-+	guint16 tag_id;
-+	char* name;
-+	tlv_decode decode;
-+} tlv_t;
-+
-+static void dissect_tlv_list(ptvcursor_t * ptvc, packet_info* pinfo, gint len);
-+
-+static void dissect_array_value(ptvcursor_t * ptvc, packet_info* pinfo, const char* name, guint32 ett_idx, guint32 count, tlv_decode decode)
-+{
-+	guint16 i = 0;
-+
-+	if (count > 0)
-+	{
-+		ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "%s", name);
-+
-+		for (i = 0; i < count; ++i)
-+		{
-+			ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_idx, "[%d]", i);
-+			decode(ptvc, pinfo);
-+			ptvcursor_pop_subtree(ptvc);
-+		}
-+
-+		ptvcursor_pop_subtree(ptvc);
-+	}
-+}
-+
-+static void dissect_pnf_param_general_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// nFAPI Sync Mode
-+	guint8 nfapi_sync_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_sync_mode, 1, ENC_BIG_ENDIAN);
-+	if (nfapi_sync_mode_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nfapi sync mode value [0..2]");
-+	}
-+
-+	// Location Mode
-+	guint8 location_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_location_mode, 1, ENC_BIG_ENDIAN);
-+	if (location_mode_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid location mode value [0..3]");
-+	}
-+
-+	guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_location_coordinates_length, 2, ENC_BIG_ENDIAN);
-+	if (len > 0)
-+		ptvcursor_add(ptvc, hf_nfapi_location_coordinates, len, ENC_NA);
-+	ptvcursor_add(ptvc, hf_nfapi_dl_config_timing, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_tx_timing, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_ul_config_timing, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_hi_dci0_timing, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_number_phys, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_total_bandwidth, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_dl_layers, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_total_number_ul_layers, 1, ENC_BIG_ENDIAN);
-+
-+	// Shared Bands
-+	guint8 shared_bands_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_shared_bands, 1, ENC_BIG_ENDIAN);
-+	if (shared_bands_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared bands value [0..1]");
-+	}
-+
-+	// Shared PA
-+	guint8 shared_pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_shared_pa, 1, ENC_BIG_ENDIAN);
-+	if (shared_pa_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid shared pa value [0..1]");
-+	}
-+
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_total_power, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_oui, 3, ENC_HOST_ENDIAN);
-+}
-+static void dissect_pnf_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_pnf_phy_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
-+
-+	guint16 num_rf_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF Config List", ett_nfapi_pnf_phy, num_rf_configs, dissect_pnf_rf_config_instance_value);
-+
-+	guint16 num_rf_exclusions = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rf_exclusions, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF Exclustion List", ett_nfapi_pnf_phy, num_rf_exclusions, dissect_pnf_rf_config_instance_value);
-+
-+	// Downlink Channel Bandwidth Supported
-+	guint16 downlink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add_no_advance(ptvc, hf_nfapi_downlink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN);
-+	if (downlink_channel_bandwidth_supported_value > 0x3F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink channel bandwidht supported bits [0..0x3F]");
-+	}
-+
-+	proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support);
-+
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+
-+
-+
-+	// Uplink Channel Bandwidth Supported
-+	guint16 uplink_channel_bandwidth_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add_no_advance(ptvc, hf_nfapi_uplink_channel_bandwidth_supported, 2, ENC_BIG_ENDIAN);
-+	if (uplink_channel_bandwidth_supported_value > 0x3F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink channel bandwidht supported bits [0..0x3F]");
-+	}
-+
-+	proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support);
-+
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+
-+	// Number of DL layers supported
-+	guint8 number_of_dl_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_dl_layers_supported, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_dl_layer_supported_value == 1 || number_of_dl_layer_supported_value == 2 ||
-+		  number_of_dl_layer_supported_value == 4 || number_of_dl_layer_supported_value == 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of dl layers supported value [1, 2, 4, 8]");
-+	}
-+
-+	// Number of DL layers supported
-+	guint8 number_of_ul_layer_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_layers_supported, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_ul_layer_supported_value == 1 || number_of_ul_layer_supported_value == 2 ||
-+		  number_of_ul_layer_supported_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ul layers supported value [1, 2, 4]");
-+	}
-+
-+	// Maximum 3GPP Release Supported
-+	guint16 maximum_3gpp_release_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add_no_advance(ptvc, hf_nfapi_maximum_3gpp_release_supported, 2, ENC_BIG_ENDIAN);
-+	if (maximum_3gpp_release_supported_value > 0x3F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maximum 3GPP release supported value [0..0x3F]");
-+	}
-+
-+	proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support);
-+
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+
-+
-+	// NMM Modes Supported
-+	guint8 nmm_modes_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nmm_modes_supported, 1, ENC_BIG_ENDIAN);
-+	if (nmm_modes_supported_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm modes supported value [0..3]");
-+	}
-+}
-+
-+static void dissect_pnf_phy_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "PHY List", ett_nfapi_pnf_phy, num_phy, dissect_pnf_phy_instance_value);
-+}
-+
-+static void dissect_pnf_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_minimum_transmit_power, 2, ENC_BIG_ENDIAN);
-+
-+	guint8 number_of_antennas_supported_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_antennas_suppported, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_antennas_supported_value == 1 || number_of_antennas_supported_value == 2 ||
-+		  number_of_antennas_supported_value == 4 || number_of_antennas_supported_value == 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of supported antennas [1, 2, 4, 8]");
-+	}
-+
-+	ptvcursor_add(ptvc, hf_nfapi_minimum_downlink_frequency, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_downlink_frequency, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_minimum_uplink_frequency, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_maximum_uplink_frequency, 4, ENC_BIG_ENDIAN);
-+}
-+
-+
-+static void dissect_pnf_rf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_rf = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rfs, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF List", ett_nfapi_pnf_phy_rf_config, num_rf, dissect_pnf_rf_config_value);
-+}
-+
-+static void dissect_pnf_phy_rel10_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PHY Config Index
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
-+
-+	// Transmission mode 7 supported
-+	guint16 transmission_mode7_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode7_supported, 2, ENC_BIG_ENDIAN);
-+	if (transmission_mode7_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 7 supported value [0..1]");
-+	}
-+
-+	// Two antennas ports for PUCCH
-+	guint16 transmission_mode8_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode8_supported, 2, ENC_BIG_ENDIAN);
-+	if (transmission_mode8_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 8 supported value [0..1]");
-+	}
-+
-+	// Transmission mode 8 supported
-+	guint16 two_antennas_port_for_pucch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_two_antennas_ports_for_pucch, 2, ENC_BIG_ENDIAN);
-+	if (two_antennas_port_for_pucch_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid two antennas ports for pucch value [0..1]");
-+	}
-+
-+	// Transmission mode 9 supported
-+	guint16 transmission_mode9_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_9_supported, 2, ENC_BIG_ENDIAN);
-+	if (transmission_mode9_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 9 supported value [0..1]");
-+	}
-+
-+	// Simultaneous PUCCH PUSCH
-+	guint16 simultaenous_pucch_pusch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_simultaneous_pucch_pusch, 2, ENC_BIG_ENDIAN);
-+	if (simultaenous_pucch_pusch_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid simultaneous pucch pusch supported value [0..1]");
-+	}
-+
-+	// Four layer Tx with TM3 and TM4
-+	guint16 four_layer_tx_with_tm3_and_tm4_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_four_layer_tx_with_tm3_and_tm4, 2, ENC_BIG_ENDIAN);
-+	if (four_layer_tx_with_tm3_and_tm4_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid four layer tx with tm3 and tm4 value [0..1]");
-+	}
-+}
-+
-+static void dissect_pnf_phy_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "PHY Rel 10 List", ett_nfapi_pnf_phy_rel10, num_phy, dissect_pnf_phy_rel10_instance_value);
-+}
-+
-+static void dissect_pnf_phy_rel11_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PHY Config Index
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
-+
-+	// ePDCCH supported
-+	guint16 epdcch_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_epdcch_supported, 2, ENC_BIG_ENDIAN);
-+	if (epdcch_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid edpcch supported value [0..1]");
-+	}
-+
-+	// Multi ACK CSI reporting
-+	guint16 multi_ack_csi_reporting_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_multi_ack_csi_reporting, 2, ENC_BIG_ENDIAN);
-+	if (multi_ack_csi_reporting_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi ack csi reporting value [0..1]");
-+	}
-+
-+	// PUCCH Tx diversity with channel selection
-+	guint16 pucch_tx_diversity_with_channel_selection_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_pucch_tx_diversity_with_channel_selection, 2, ENC_BIG_ENDIAN);
-+	if (pucch_tx_diversity_with_channel_selection_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch tx diversity with channel selection value [0..1]");
-+	}
-+
-+	// UL CoMP supported
-+	guint16 ul_comp_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_ul_comp_supported, 2, ENC_BIG_ENDIAN);
-+	if (ul_comp_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul comp supported value [0..1]");
-+	}
-+
-+	// Transmission mode 5 supported
-+	guint16 transmission_mode_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_5_supported, 2, ENC_BIG_ENDIAN);
-+	if (transmission_mode_5_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 5 supported value [0..1]");
-+	}
-+}
-+
-+static void dissect_pnf_phy_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "PHY Rel 11 List", ett_nfapi_pnf_phy_rel11, num_phy, dissect_pnf_phy_rel11_instance_value);
-+}
-+
-+static void dissect_pnf_phy_rel12_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PHY Config Index
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
-+
-+	// CSI subframe set
-+	guint16 csi_subframe_set_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_subframe_set, 2, ENC_BIG_ENDIAN);
-+	if (csi_subframe_set_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi subframe set value [0..1]");
-+	}
-+
-+	// Enhanced 4TX codebook
-+	guint16 enhanced_4tx_codebook_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_enhanced_4tx_codebook, 2, ENC_BIG_ENDIAN);
-+	if (enhanced_4tx_codebook_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid enhanced 4TX codebook value [0..1]");
-+	}
-+
-+	// DRS supported
-+	guint16 drs_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_drs_supported, 2, ENC_BIG_ENDIAN);
-+	if (drs_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drs supported value [0..1]");
-+	}
-+
-+	// UL 64QAM supported
-+	guint16 ul_64qam_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_ul_64qam_supported, 2, ENC_BIG_ENDIAN);
-+	if (ul_64qam_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul 64 QAM supported value [0..1]");
-+	}
-+
-+	// Transmission mode 10 supported
-+	guint16 transmission_mode_10_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_transmission_mode_10_supported, 2, ENC_BIG_ENDIAN);
-+	if (transmission_mode_10_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode 10 supported value [0..1]");
-+	}
-+
-+	// Alternative TBS indices
-+	guint16 alternative_tbs_indices_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hi_nfapi_alternative_tbs_indices, 2, ENC_BIG_ENDIAN);
-+	if (alternative_tbs_indices_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alternative tbs indicies supported value [0..1]");
-+	}
-+}
-+
-+static void dissect_pnf_phy_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "PHY Rel 12 List", ett_nfapi_pnf_phy_rel12, num_phy, dissect_pnf_phy_rel12_instance_value);
-+}
-+
-+static void dissect_pnf_phy_rel13_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PHY Config Index
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
-+
-+	// PUCCH format 4 supported
-+	guint16 pucch_format_4_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_4_supported, 2, ENC_BIG_ENDIAN);
-+	if (pucch_format_4_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 4 supported value [0..1]");
-+	}
-+
-+	// PUCCH format 5 supported
-+	guint16 pucch_format_5_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pucch_format_5_supported, 2, ENC_BIG_ENDIAN);
-+	if (pucch_format_5_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch format 5 supported value [0..1]");
-+	}
-+
-+	// More than 5 CA support
-+	guint16 more_than_5_ca_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_more_than_5_ca_supported, 2, ENC_BIG_ENDIAN);
-+	if (more_than_5_ca_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid more than 5 ca supported value [0..1]");
-+	}
-+
-+	// LAA supported
-+	guint16 laa_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_laa_supported, 2, ENC_BIG_ENDIAN);
-+	if (laa_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa supported value [0..1]");
-+	}
-+
-+	// LAA ending in DwPTS supported
-+	guint16 laa_ending_in_dwpts_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_laa_ending_in_dwpts_supported, 2, ENC_BIG_ENDIAN);
-+	if (laa_ending_in_dwpts_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa ending in dwpts supported value [0..1]");
-+	}
-+
-+	// LAA starting in second slot Supported
-+	guint16 laa_starting_in_second_slot_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_laa_starting_in_second_slot_supported, 2, ENC_BIG_ENDIAN);
-+	if (laa_starting_in_second_slot_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa starting in second slot supported value [0..1]");
-+	}
-+
-+	// Beamforming Supported
-+	guint16 beamingforming_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_beamforming_supported, 2, ENC_BIG_ENDIAN);
-+	if (beamingforming_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid beamforming supported value [0..1]");
-+	}
-+
-+	// CSI-RS enhancements supported
-+	guint16 csi_rs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_enhancements_supported, 2, ENC_BIG_ENDIAN);
-+	if (csi_rs_enhancements_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs enhancements supported value [0..1]");
-+	}
-+
-+	// DMRS enhancements supported
-+	guint16 drms_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_drms_enhancements_supported, 2, ENC_BIG_ENDIAN);
-+	if (drms_enhancements_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms enhancements supported value [0..1]");
-+	}
-+
-+	// SRS enhancements supported
-+	guint16 srs_enhancements_supported_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_enhancements_supported, 2, ENC_BIG_ENDIAN);
-+	if (srs_enhancements_supported_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs enhancements supported value [0..1]");
-+	}
-+
-+}
-+
-+static void dissect_pnf_phy_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_phy = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "PHY Rel 13 List", ett_nfapi_pnf_phy_rel13, num_phy, dissect_pnf_phy_rel13_instance_value);
-+}
-+
-+static void dissect_pnf_phy_rf_config_instance_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_phy_rf_config_info_phy_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_config_index, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_rf_config_index, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_pnf_phy_rf_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_configs = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_phy_number_phy, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "PHY RF Config List", ett_nfapi_pnf_phy_rf_config, num_configs, dissect_pnf_phy_rf_config_instance_value);
-+}
-+
-+static void dissect_dl_rs_tx_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value >= 1 && value <= 255))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]");
-+	}
-+}
-+static void dissect_received_interference_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_received_interference_power, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value >= 1 && value <= 255))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value [1..255]");
-+	}
-+}
-+static void dissect_thermal_noise_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_dl_rs_tx_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_dl_rs_tx_power_measurement, 2, ENC_BIG_ENDIAN);
-+}
-+
-+static void dissect_received_interference_power_result_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_received_interference_power_measurement, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_received_interference_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 num_resource_block = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "Results", ett_nfapi_received_interference_power_mesurement_results, num_resource_block, dissect_received_interference_power_result_value);
-+}
-+static void dissect_thermal_noise_power_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_thermal_noise_power_measurement, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_duplex_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_duplex_mode, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid duplex mode [0..2]");
-+	}
-+}
-+static void dissect_pcfich_power_offset_value(ptvcursor_t* ptvc, packet_info *pinfo)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pcfich_power_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid power level [0..10000]");
-+	}
-+}
-+static void dissect_pb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pb, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power allocation index [0..3]");
-+	}
-+}
-+
-+static void dissect_dl_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cyclic_prefix_type, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cyclic prefix type [0..1]");
-+	}
-+}
-+static void dissect_ul_cyclic_prefix_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_cyclic_prefix_type, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul cyclic prefix type [0..1]");
-+	}
-+}
-+static void dissect_dl_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth value [6, 15, 25, 50, 75, 100]");
-+	}
-+}
-+static void dissect_ul_channel_bandwidth_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_channel_bandwidth, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 6 || value == 15 || value == 25 || value == 50 || value == 75 || value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth value [6, 15, 25, 50, 75, 100]");
-+	}
-+}
-+static void dissect_reference_signal_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_reference_signal_power, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid reference signal power [0..255]");
-+	}
-+
-+}
-+static void dissect_tx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports value [1, 2, 4, 8, 16]");
-+	}
-+}
-+static void dissect_rx_antenna_ports_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rx_antenna_ports, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rx antenna ports value [1, 2, 4, 8, 16]");
-+	}
-+}
-+static void dissect_phich_resource_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_resource, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich resource value [0..3]");
-+	}
-+}
-+static void dissect_phich_duration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_duration, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich duration value [0..1]");
-+	}
-+}
-+static void dissect_phich_power_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phich_power_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phich power offset value [0..10000]");
-+	}
-+}
-+static void dissect_psch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_primary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary synchronization signal epre/eprers value [0..10000]");
-+	}
-+}
-+static void dissect_physical_cell_id_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_physical_cell_id, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid physical cell id [0..503]");
-+	}
-+}
-+static void dissect_ssch_synch_signal_epre_eprers_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_secondary_synchronization_signal_epre_eprers, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid secondary synchronization signal epre/eprers value [0..10000]");
-+	}
-+}
-+static void dissect_prach_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_configuration_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach configuration index [0..63]");
-+	}
-+}
-+static void dissect_prach_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_root_sequence_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 837)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach root sequency index [0..837]");
-+	}
-+}
-+static void dissect_prach_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN);
-+
-+	// How do differentiate between fdd 0..6 and tdd 0..15 ranges?
-+	if (value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid zero correlation zone configuration [0..15]");
-+	}
-+}
-+static void dissect_prach_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_high_speed_flag, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid high speed flag value [0..1]");
-+	}
-+}
-+static void dissect_prach_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN);
-+
-+	// How to determine the ul channel bandiwdth?
-+	if (value > (100 -6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach frequency offset value [0..94]");
-+	}
-+}
-+static void dissect_pusch_hopping_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_mode, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping mode value [0..1]");
-+	}
-+}
-+static void dissect_pusch_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hopping_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 98)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch hopping offset value [0..98]");
-+	}
-+}
-+static void dissect_pusch_number_of_subbands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value >= 1 && value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of sub-bands [1..4]");
-+	}
-+}
-+static void dissect_pucch_delta_pucch_shift_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_pucch_shift, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value >= 1 && value <= 3))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta pucch shift [1..3]");
-+	}
-+}
-+static void dissect_pucch_n_cqi_rb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_cqi_rb, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 98)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n cqi rb value [0..98]");
-+	}
-+}
-+static void dissect_pucch_n_an_cs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n_an_cs, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n an cs value [0..7]");
-+	}
-+}
-+static void dissect_pucch_n1_pucch_an_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_n1_pucch_an, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n1pucch an value [0..2047]");
-+	}
-+}
-+static void dissect_srs_bandwidth_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth_configuration, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth configuration value [0..7]");
-+	}
-+}
-+static void dissect_srs_max_uppts_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_max_up_pts, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max up pts value [0..1]");
-+	}
-+}
-+static void dissect_srs_subframe_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_subframe_configuration, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs subframe configuration value [0..15]");
-+	}
-+}
-+static void dissect_srs_acknack_srs_sim_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_srs_acknack_srs_simultaneous_transmission, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs ack nack srs simultaneous transmission value [0..1]");
-+	}
-+}
-+static void dissect_uplink_rs_hopping_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_uplink_rs_hopping, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink rs hopping value [0..2]");
-+	}
-+}
-+static void dissect_group_assignment_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_group_assignment, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 29)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid group assignment value [0..29]");
-+	}
-+}
-+static void dissect_cyclic_shift_1_for_drms_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_1_for_drms, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 1 for drms value [0..7]");
-+	}
-+}
-+static void dissect_tdd_subframe_assignement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_subframe_assignment, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 6)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tdd subframe assignment value [0..6]");
-+	}
-+}
-+static void dissect_tdd_subframe_patterns_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_special_subframe_patterns, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 9)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid special subframe pattern value [0..9]");
-+	}
-+}
-+static void dissect_laa_ed_threashold_for_lbt_for_pdsch_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_pdsch, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 70)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for pdsch value [0..70]");
-+	}
-+}
-+static void dissect_laa_ed_threashold_for_lbt_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ed_threshold_for_lbt_for_drs, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 70)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ed threshold for ltb for drs value [0..70]");
-+	}
-+}
-+static void dissect_laa_pd_threshold_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_threshold, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 70 && value != 65535)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd threshold value [0..70, 65536]");
-+	}
-+}
-+static void dissect_laa_multi_carrier_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_type, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier type [0..4]");
-+	}
-+}
-+static void dissect_laa_multi_carrier_tx_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_tx, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier tx value [0..1]");
-+	}
-+}
-+static void dissect_laa_multi_carrier_freeze_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_freeze, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mutli carrier freeze value [0..1]");
-+	}
-+}
-+static void dissect_laa_tx_antenna_port_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tx_antenna_ports_for_drs, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tx antenna ports for drs value [1, 2, 4]");
-+	}
-+}
-+static void dissect_laa_transmission_power_for_drs_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_for_drs, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for drs [0..10000]");
-+	}
-+}
-+static void dissect_emtc_pbch_repeitions_enabled_r13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pbch_repetitions_enabled_r13, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pbch repetitions enabled r13 value [0..1]");
-+	}
-+}
-+static void dissect_emtc_prach_cat_m_root_sequence_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_root_sequence_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 837)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m root sequence index value [0..837]");
-+	}
-+}
-+static void dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m zero correlation zone configuration value [0..15]");
-+	}
-+}
-+static void dissect_emtc_prach_cat_m_high_speed_flag_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_cat_m_high_speed_flag, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach cat-m high speed flag value [0..1]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_0_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_enable, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 enable value [0..1]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_0_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_configuration_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 configuration index value [0..63]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_0_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_frequency_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > (100 - 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 frequency offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN);
-+
-+	if (!( value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		   value == 64 || value == 128))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
-+	}
-+}
-+static void dissect_emtc_ce_level_0_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		  value == 64 || value == 128 || value == 256))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_0_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_enabled, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping enabled value [0..1]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_0_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_0_hopping_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 94)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #0 hopping offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_1_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_enable, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 enable value [0..1]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_1_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_configuration_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 configuration index value [0..63]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_1_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_frequency_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > (100 - 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 frequency offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		value == 64 || value == 128))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
-+	}
-+}
-+static void dissect_emtc_ce_level_1_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		value == 64 || value == 128 || value == 256))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_1_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_enabled, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping enabled value [0..1]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_1_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_1_hopping_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 94)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #1 hopping offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_2_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_enable, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 enable value [0..1]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_2_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_configuration_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_2_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_frequency_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > (100 - 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 frequency offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		value == 64 || value == 128))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
-+	}
-+}
-+static void dissect_emtc_ce_level_2_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		value == 64 || value == 128 || value == 256))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_2_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_enabled, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping enabled value [0..1]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_2_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_2_hopping_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 94)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 hopping offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_3_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_enable, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 enable value [0..1]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_3_configuration_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_configuration_index, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #2 configuration index value [0..63]");
-+	}
-+}
-+static void dissect_emtc_prach_ce_level_3_frequency_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_frequency_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > (100 - 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 frequency offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		value == 64 || value == 128))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 number of repetitions per attempt value [1, 2, 4, 8, 16, 32, 64, 128]");
-+	}
-+}
-+static void dissect_emtc_ce_level_3_starting_subframe_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 0xFFF || value == 2 || value == 4 || value == 8 || value == 16 || value == 32 ||
-+		value == 64 || value == 128 || value == 256))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 starting subframe periodicity value [2, 4, 8, 16, 32, 64, 128, 256, 0xFFFF]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_3_hopping_enabled_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_enabled, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping enabled value [0..1]");
-+	}
-+}
-+static void dissect_emtc_preach_ce_level_3_hopping_offset_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_prach_ce_level_3_hopping_offset, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 94)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach ce level #3 hopping offset value [0..94]");
-+	}
-+}
-+static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 5 || value == 10 || value == 20))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [1, 2, 4, 8] or [1, 5, 10, 20]");
-+	}
-+}
-+static void dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 2 || value == 4 || value == 8 || value == 16 || value == 5 || value == 10 || value == 20 || value == 40))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch internal ul hopping config common mode a value [2, 4, 8, 16] or [5, 10, 20, 40]");
-+	}
-+}
-+static void dissect_dl_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_bandwidth_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x1F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink bandwidth support bit [0..0x1F]");
-+	}
-+
-+	proto_tree* dl_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_bandwidth_support);
-+
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_bw_support_tree, hf_nfapi_dl_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+}
-+static void dissect_ul_bandwidth_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_bandwidth_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x1F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink bandwidth support bit [0..0x1F]");
-+	}
-+
-+	proto_tree* ul_bw_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_bandwidth_support);
-+
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_6, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_15, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_25, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_50, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_75, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_bw_support_tree, hf_nfapi_ul_bandwidth_support_100, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+
-+}
-+static void dissect_dl_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_dl_modulation_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink modulation support bit [0..0x7]");
-+	}
-+
-+	proto_tree* dl_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_downlink_modulation_support);
-+
-+	proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(dl_mod_support_tree, hf_nfapi_dl_modulation_support_256qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+}
-+static void dissect_ul_modulation_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_ul_modulation_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid uplink modulation support bit [0..0x7]");
-+	}
-+
-+	proto_tree* ul_mod_support_tree = proto_item_add_subtree(item, ett_nfapi_uplink_modulation_support);
-+
-+	proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_qpsk, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_16qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(ul_mod_support_tree, hf_nfapi_ul_modulation_support_64qam, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+}
-+static void dissect_phy_antenna_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_antenna_capability, 2, ENC_BIG_ENDIAN);
-+
-+	if (!(value == 1 || value == 2 || value == 4 || value == 8 || value == 16))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy antenna capability [1, 2, 4, 8, 16]");
-+	}
-+}
-+static void dissect_release_capability_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add_no_advance(ptvc, hf_nfapi_release_capability, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x3F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid release capability value [0..0x3F]");
-+	}
-+
-+	proto_tree* release_support_tree = proto_item_add_subtree(item, ett_nfapi_release_support);
-+
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel8, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 15, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel9, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 14, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel10, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 13, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel11, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 12, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel12, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 11, 1, ENC_NA);
-+	proto_tree_add_bits_item(release_support_tree, hf_nfapi_maximum_3gpp_release_supported_rel13, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8 + 10, 1, ENC_NA);
-+
-+	ptvcursor_advance(ptvc, 2);
-+}
-+static void dissect_mbsfn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_mbsfn_capability, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mbsfn capability bit [0..0x1]");
-+	}
-+}
-+static void dissect_laa_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_laa_capability, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid laa support bit [0..0x1]");
-+	}
-+}
-+static void dissect_laa_pd_sensing_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pd_sensing_lbt_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pd sensing lbt support bit [0..0x1]");
-+	}
-+}
-+static void dissect_laa_multi_carrier_lbt_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_multi_carrier_lbt_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0xF)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid multi carrier LBT support bit [0..0xF]");
-+	}
-+}
-+static void dissect_laa_partial_sf_support_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_partial_sf_support, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid partial SF support bit [0..0x1]");
-+	}
-+}
-+static void dissect_data_report_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_data_report_mode, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid data report mode value [0..1]");
-+	}
-+}
-+static void dissect_sfn_sf_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_sfnsf, 2, ENC_BIG_ENDIAN);
-+
-+	guint16 sfn = value >> 0x4;
-+	guint16 sf = value & 0x000F;
-+	if (sfn > 1023 || sf > 9)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sfn/sf value sfn:%d [0..1023] sf:%d [0..9]", sfn, sf);
-+	}
-+}
-+static void dissect_phy_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_phy_state, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid phy state [0..2]");
-+	}
-+}
-+static void dissect_p7_vnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv4, 4, ENC_NA);
-+}
-+static void dissect_p7_vnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_vnf_address_ipv6, 16, ENC_NA);
-+}
-+static void dissect_p7_vnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_vnf_port, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_p7_pnf_address_ipv4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv4, 4, ENC_NA);
-+}
-+static void dissect_p7_pnf_address_ipv6_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_address_ipv6, 16, ENC_NA);
-+}
-+static void dissect_p7_pnf_port_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_port, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_downlink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_dl_ue_per_sf, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_uplink_ues_per_subframe_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_ul_ue_per_sf, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_rf_band_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_band, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_rf_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
-+}
-+static void dissect_timing_window_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_window, 1, ENC_BIG_ENDIAN);
-+
-+	if (value > 30)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing window value [0..30]");
-+	}
-+}
-+static void dissect_timing_info_mode_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_mode, 1, ENC_BIG_ENDIAN);
-+
-+	if (value > 0x3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info mode [0..0x3]");
-+	}
-+}
-+static void dissect_timing_info_period_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_info_period, 1, ENC_BIG_ENDIAN);
-+
-+	// Compiler throws an hissy fit that value <= 255 is always true... Yes, but I am trying to
-+	// follow the specification...
-+	if (!(value >= 1 /* && value <= 255*/))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing info period [1..255]");
-+	}
-+}
-+static void dissect_maximum_transmit_power_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_maximum_transmit_power_2, 2, ENC_BIG_ENDIAN);
-+
-+	if (value > 700)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid maxiumum transmit power [0..700]");
-+	}
-+}
-+static void dissect_earfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_nmm_gsm_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
-+}
-+static void dissect_nmm_umts_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
-+}
-+static void dissect_nmm_lte_frequency_bands_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rf_bands, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "RF Band List", ett_nfapi_rf_bands, count, dissect_rf_band_value);
-+}
-+static void dissect_nmm_uplink_rssi_supported_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nmm_uplink_rssi_supported, 1, ENC_BIG_ENDIAN);
-+
-+	if (value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nmm uplink rssi supported value [0..1]");
-+	}
-+}
-+static void dissect_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_dl_config_pdu_type, 1, ENC_BIG_ENDIAN);
-+	guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN);
-+
-+	guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
-+	dissect_tlv_list(ptvc, pinfo, pdu_end);
-+}
-+static void dissect_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Number of PDCCH OFDM symbols
-+	guint8 number_of_pdcch_ofdm_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item  = ptvcursor_add(ptvc, hf_nfapi_number_pdcch_ofdm_symbols, 1, ENC_BIG_ENDIAN);
-+	if (number_of_pdcch_ofdm_symbols_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdcch ofdm symbols value [0..4]");
-+	}
-+
-+	// Number of DCIs
-+	guint8 number_of_dcis_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_dci, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of  PDUs
-+	guint16 number_of_pdus_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN);
-+	if (number_of_pdus_value > 514)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [0..514]");
-+	}
-+
-+	// Number of PDSCH RNTIs
-+	ptvcursor_add(ptvc, hf_nfapi_number_pdsch_rnti, 1, ENC_BIG_ENDIAN);
-+
-+	// Transmission power for PCFICH
-+	guint16 transmission_power_for_pdsch_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power_pcfich, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_for_pdsch_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power for pcfich value [0..10000]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "DL Config PDU List", ett_nfapi_dl_config_request_pdu_list, number_of_dcis_value + number_of_pdus_value, dissect_dl_config_pdu);
-+}
-+static void dissect_dl_config_request_bch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Length
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+
-+	// PDU index
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+}
-+static void dissect_dl_config_request_dl_dci_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// DCI format
-+	guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN);
-+	if (dci_format_value > 9)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..9]");
-+	}
-+
-+	// CCE index
-+	guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN);
-+	if (cce_index_value > 88)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]");
-+	}
-+
-+	// Aggregation level
-+	guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN);
-+	if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 ||
-+		  aggregation_level_value == 8 || aggregation_level_value == 16 || aggregation_level_value == 32))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8, 16, 32]");
-+	}
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// Resource allocation type
-+	guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
-+	if (resource_allocation_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]");
-+	}
-+
-+	// Virtual resource block assignment flag
-+	guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN);
-+	if (virtual_resource_block_assignment_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]");
-+	}
-+
-+	// Resource block coding
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
-+
-+	// MCS_1
-+	guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN);
-+	if (mcs_1_value > 31)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]");
-+	}
-+
-+	// Redundancy version_1
-+	guint8 redundancy_version_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_1, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_version_1_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 1 value [0..3]");
-+	}
-+
-+	// New data indicator_1
-+	guint8 new_data_indicator_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_1, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indicator_1_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 1 value [0..1]");
-+	}
-+
-+	// Transport block to codeword swap flag
-+	guint8 transport_block_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN);
-+	if (transport_block_to_codeword_swap_flag_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]");
-+	}
-+
-+	// MCS_2
-+	guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN);
-+	if (mcs_2_value > 31)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]");
-+	}
-+
-+	// Redundancy version_2
-+	guint8 redundancy_version_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version_2, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_version_2_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version 2 value [0..3]");
-+	}
-+
-+	// New Data indicator_2
-+	guint8 new_data_indicator_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator_2, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indicator_2_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator 2 value [0..1]");
-+	}
-+
-+	// HARQ process
-+	guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN);
-+	if (harq_process_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]");
-+	}
-+
-+	// TPMI
-+	guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN);
-+	if (tpmi_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..3]");
-+	}
-+
-+	// PMI
-+	guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN);
-+	if (pmi_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..2]");
-+	}
-+
-+	// Precoding information
-+	guint8 precoding_information_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_precoding_information, 1, ENC_BIG_ENDIAN);
-+	if (precoding_information_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid precoding information value [0..15]");
-+	}
-+
-+	// TPC
-+	guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN);
-+	if (tpc_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]");
-+	}
-+
-+	// Downlink assignment index
-+	guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN);
-+	if (downlink_assignment_index_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment value [0..15]");
-+	}
-+
-+	// NGAP
-+	guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN);
-+	if (ngap_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]");
-+	}
-+
-+	// Transport block size index
-+	guint8 transport_block_size_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transport_block_size_index, 1, ENC_BIG_ENDIAN);
-+	if (transport_block_size_index_value > 31)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block size index value [0..31]");
-+	}
-+
-+	// Downlink power offset
-+	guint8 downlink_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_downlink_power_offset, 1, ENC_BIG_ENDIAN);
-+	if (downlink_power_offset_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink power offset value [0..1]");
-+	}
-+
-+	// Allocate PRACH flag
-+	guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN);
-+	if (allocate_prach_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]");
-+	}
-+
-+	// Preamble index
-+	guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN);
-+	if (preamble_index_value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]");
-+	}
-+
-+	// PRACH mask index
-+	guint8 prach_mask_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN);
-+	if (prach_mask_index_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]");
-+	}
-+
-+	// RNTI type
-+	guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti_type, 1, ENC_BIG_ENDIAN);
-+	if (!(rnti_type_value >= 1 && rnti_type_value <= 3))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [1..3]");
-+	}
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value value [0..10000]");
-+	}
-+
-+}
-+static void dissect_dl_config_request_dl_dci_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// MCCH flag
-+	guint8 mcch_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcch_flag, 1, ENC_BIG_ENDIAN);
-+	if (mcch_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcch flag value [0..1]");
-+	}
-+
-+	// MCCH change notification
-+	ptvcursor_add(ptvc, hf_nfapi_mcch_change_notification, 1, ENC_BIG_ENDIAN);
-+
-+	// Scrambling identity
-+	guint8 scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_scrambling_identity, 1, ENC_BIG_ENDIAN);
-+	if (scrambling_identity_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid scrambling identity value [0..1]");
-+	}
-+
-+}
-+static void dissect_dl_config_request_dl_dci_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Cross carrier scheduling flag
-+	guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN);
-+	if (cross_carrier_scheduling_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]");
-+	}
-+
-+	// Carrier indicator
-+	guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN);
-+	if (carrier_indicator_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]");
-+	}
-+
-+	// SRS flag
-+	guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN);
-+	if (srs_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs flag value [0..1]");
-+	}
-+
-+	// SRS request
-+	guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN);
-+	if (srs_request_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]");
-+	}
-+
-+	// Antenna ports, scrambling and layers
-+	guint8 antenna_ports_scrambling_and_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_scrambling_and_layers, 1, ENC_BIG_ENDIAN);
-+	if (antenna_ports_scrambling_and_layers_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports scrambling and layers value [0..15]");
-+	}
-+
-+	// Total DCI length including padding
-+	ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN);
-+
-+	// N_DL_RB
-+	// TODO : This is missing from the encoder....
-+	//ptvcursor_add(ptvc, hf_nfapi_n_dl_rb, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_dl_config_request_dl_dci_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// HARQ-ACK resource offset
-+	guint8 harq_ack_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_ack_resource_offset, 1, ENC_BIG_ENDIAN);
-+	if (harq_ack_resource_offset_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hack ack resource offset value [0..3]");
-+	}
-+
-+	// PDSCH RE Mapping and Quasi-Co-Location Indicator
-+	guint8 pdsch_re_mapping_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, 1, ENC_BIG_ENDIAN);
-+	if (pdsch_re_mapping_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping value [0..3]");
-+	}
-+
-+}
-+static void dissect_ul_dl_configuration_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// UL/DL configuration indication
-+	guint8 ul_dl_configuration_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_index, 1, ENC_BIG_ENDIAN);
-+	if (!(ul_dl_configuration_indication_value >= 1 && ul_dl_configuration_indication_value <= 5))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration indication value [1..5]");
-+	}
-+}
-+static void dissect_dl_config_request_dl_dci_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Primary cell type
-+	guint8 primary_cell_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_primary_cell_type, 1, ENC_BIG_ENDIAN);
-+	if (primary_cell_type_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid primary cell type value [0..2]");
-+	}
-+
-+	// UL/DL configuration flag
-+	guint8 ul_dl_configuration_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_dl_configuration_flag, 1, ENC_BIG_ENDIAN);
-+	if (ul_dl_configuration_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul/dl configuration flag value [0..1]");
-+	}
-+
-+	// Number of UL / DL configurations
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_ul_dl_configurations, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "UL/DL Configurations", ett_nfapi_pnf_phy, count, dissect_ul_dl_configuration_index_value);
-+}
-+static void dissect_dl_config_request_dl_dci_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_flag, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_laa_end_partial_sf_configuration, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_codebooksize_determination_r13, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_rel13_drms_table_flag, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_dl_config_request_mch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_mbsfn_area_id, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_codebook_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN);
-+	if (codebook_index_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..15]");
-+	}
-+}
-+static void dissect_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_bf_vector_bf_value, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_bf_vector_type_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_bf_vector_subband_index, 1, ENC_BIG_ENDIAN);
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_bf_vector_num_antennas, 1, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "Antennas",  ett_nfapi_bf_vector_antennas, count, dissect_bf_vector_value);
-+}
-+static void dissect_dl_config_request_dlsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Length
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+
-+	// PDU index
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (!(rnti_value >= 1 /* && rnti_value <= 65535)*/))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [1..65535]");
-+	}
-+
-+	// Resource allocation type
-+	guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
-+	if (resource_allocation_type_value > 5)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..5]");
-+	}
-+
-+	// Virtual resource block assignment flag
-+	guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN);
-+	if (virtual_resource_block_assignment_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block allocation assignment value [0..1]");
-+	}
-+
-+	// Resource block coding
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
-+
-+	// Modulation
-+	guint8 modulation_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN);
-+	if (!(modulation_value == 2 || modulation_value == 4 || modulation_value == 6 || modulation_value == 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation value [2, 4, 6, 8]");
-+	}
-+
-+	// Redundancy version
-+	guint8 redundancy_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0..3]");
-+	}
-+
-+	// Transport blocks
-+	guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN);
-+	if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]");
-+	}
-+
-+	// Transport block to codeword swap flag
-+	guint8 transport_blocks_to_codeword_swap_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN);
-+	if (transport_blocks_to_codeword_swap_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport block to codeword swap flag value [0..1]");
-+	}
-+
-+	// Transmission scheme
-+	guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN);
-+	if (transmission_scheme_value > 13)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..13]");
-+	}
-+
-+	// Number of layers
-+	guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_layers_value >= 1 && number_of_layers_value <= 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..8]");
-+	}
-+
-+	// Number of subbands
-+	guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN);
-+	if (num_subbands > 13)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of subbands value [0..13]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "Subbands", ett_nfapi_subbands, num_subbands, dissect_codebook_index_value);
-+
-+	// UE category capacity
-+	guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN);
-+	if (ue_category_capacity_value > 14)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]");
-+	}
-+
-+	// P-A
-+	guint8 pa_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN);
-+	if (pa_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value [0..7]");
-+	}
-+
-+	// Delta power offset index
-+	guint8 delta_power_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_power_offset_index, 1, ENC_BIG_ENDIAN);
-+	if (delta_power_offset_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta power offset value [0..1]");
-+	}
-+
-+	// NGAP
-+	guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN);
-+	if (ngap_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]");
-+	}
-+
-+	// NPRB
-+	guint8 nrpb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN);
-+	if (nrpb_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]");
-+	}
-+
-+	// Transmission mode
-+	guint8 transmission_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_mode, 1, ENC_BIG_ENDIAN);
-+	if (!(transmission_mode_value >= 1 && transmission_mode_value <= 10))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission mode value [1..10]");
-+	}
-+
-+	// numBfPRBperSubband
-+	ptvcursor_add(ptvc, hf_nfapi_num_bf_prb_per_subband, 1, ENC_BIG_ENDIAN);
-+
-+	// numBfVector
-+	guint8 num_vectors = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "Beamforming Vectors", ett_nfapi_bf_vectors, num_vectors, dissect_bf_vector_type_value);
-+}
-+static void dissect_csi_rs_resource_config_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 csi_rs_resource_config_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config, 1, ENC_BIG_ENDIAN);
-+	if (csi_rs_resource_config_value > 31)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource config value [0..31]");
-+	}
-+}
-+static void dissect_dl_config_request_dlsch_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 nscid_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_nscid, 1, ENC_BIG_ENDIAN);
-+	if (nscid_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nscid value [0..1]");
-+	}
-+}
-+static void dissect_dl_config_request_dlsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// CSI-RS flag
-+	guint8 csi_rs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_flag, 1, ENC_BIG_ENDIAN);
-+	if (csi_rs_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs flag value [0..1]");
-+	}
-+
-+	// CSI-RS resource config R10
-+	ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN);
-+
-+	// CSI-RS zero Tx power resource config bitmap R10
-+	ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN);
-+
-+	// CSI-RS Number of NZP configuration
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN);
-+	if (count > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..3]");
-+	}
-+
-+	// CSI-RS configuration
-+	dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value);
-+
-+	// PDSCH start
-+	guint8 pdsch_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdsch_start, 1, ENC_BIG_ENDIAN);
-+	if (pdsch_start_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch start value [0..4]");
-+	}
-+
-+}
-+static void dissect_dl_config_request_dlsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// DMRS Config flag
-+	guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN);
-+	if (drms_config_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]");
-+	}
-+
-+	// DMRS-Scrambling
-+	guint16 drms_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling, 2, ENC_BIG_ENDIAN);
-+	if (drms_scrambling_value > 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling value [0..503]");
-+	}
-+
-+	// CSI Config flag
-+	guint8 csi_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_config_flag, 1, ENC_BIG_ENDIAN);
-+	if (csi_config_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi config flag value [0..1]");
-+	}
-+
-+	// CSI- Scrambling
-+	guint16 csi_scrambling_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_scrambling, 2, ENC_BIG_ENDIAN);
-+	if (csi_scrambling_value > 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi scrambling value [0..503]");
-+	}
-+
-+	// PDSCH RE mapping flag
-+	guint8 pdsch_re_mapping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_flag, 1, ENC_BIG_ENDIAN);
-+	if (pdsch_re_mapping_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping flag value [0..1]");
-+	}
-+
-+	// PDSCH RE mapping antenna ports
-+	guint8 pdsch_re_mapping_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_antenna_ports, 1, ENC_BIG_ENDIAN);
-+	if (!(pdsch_re_mapping_antenna_ports_value == 1 || pdsch_re_mapping_antenna_ports_value == 2 ||
-+		  pdsch_re_mapping_antenna_ports_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping antenna ports value [1, 2, 4]");
-+	}
-+
-+	// PDSCH RE mapping freq shift
-+	guint8 pdsch_re_mapping_freq_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pdsch_re_mapping_freq_shift, 1, ENC_BIG_ENDIAN);
-+	if (pdsch_re_mapping_freq_shift_value > 5)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch re mapping freq shift value [0..5]");
-+	}
-+}
-+static void dissect_dl_config_request_dlsch_pdu_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// altCQI-Table-r12
-+	guint8 alt_cqi_table_r12_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_alt_cqi_table_r12, 1, ENC_BIG_ENDIAN);
-+	if (alt_cqi_table_r12_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid alt cqi table r12 value [0..1]");
-+	}
-+
-+	// MaxLayers
-+	guint8 max_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_max_layers, 1, ENC_BIG_ENDIAN);
-+	if (!(max_layers_value >= 1 && max_layers_value <= 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid max layers value [1..8]");
-+	}
-+
-+	ptvcursor_add(ptvc, hf_nfapi_n_dl_harq, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_dl_config_request_dlsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// DwPTS Symbols
-+	guint8 dwpts_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN);
-+	if (!(dwpts_symbols_value == 3 || dwpts_symbols_value == 6 || dwpts_symbols_value == 9 ||
-+		dwpts_symbols_value == 10 || dwpts_symbols_value == 11 || dwpts_symbols_value == 12 ||
-+		dwpts_symbols_value == 14))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]");
-+	}
-+
-+	// Initial LBT SF
-+	guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN);
-+	if (initial_lbt_sf_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]");
-+	}
-+
-+	// UE Type
-+	guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN);
-+	if (ue_type_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]");
-+	}
-+
-+	// PDSCH Payload Type
-+	guint8 pdsch_payload_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pdsch_payload_type, 1, ENC_BIG_ENDIAN);
-+	if (pdsch_payload_type_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch payload type value [0..2]");
-+	}
-+
-+	// Initial transmission SF (io)
-+	guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN);
-+	if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
-+	}
-+
-+	// Rel-13-DMRS-tabe flag
-+	guint8 rel13_drms_table_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_req13_drms_table_flag, 1, ENC_BIG_ENDIAN);
-+	if (rel13_drms_table_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rel13 drms table flag value [0..1]");
-+	}
-+}
-+static void dissect_dl_config_request_pch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Length
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+
-+	// PDU index
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
-+
-+	// P-RNTI
-+	guint16 prnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_prnti, 2, ENC_BIG_ENDIAN);
-+	if (prnti_value != 0xFFFE)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prnti value [0xFFFE]");
-+	}
-+
-+	// Resource allocation type
-+	guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
-+	if (!(resource_allocation_type_value == 2 || resource_allocation_type_value == 3 || resource_allocation_type_value == 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocate type value [2, 3, 6]");
-+	}
-+
-+	// Virtual resource block assignment flag
-+	guint8 virtual_resource_block_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_virtual_resource_block_assignment_flag, 1, ENC_BIG_ENDIAN);
-+	if (virtual_resource_block_assignment_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual resource block assignment flag value [0..1]");
-+	}
-+
-+	// Resource block coding
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
-+
-+	// MCS
-+	guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN);
-+	if (mcs_value != 0)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0]");
-+	}
-+
-+	// Redundancy version
-+	guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_version_value != 0)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy value [0]");
-+	}
-+
-+	// Number of transport blocks
-+	guint8 number_of_transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_transport_blocks, 1, ENC_BIG_ENDIAN);
-+	if (number_of_transport_blocks_value != 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1]");
-+	}
-+
-+	// Transport block to codeword swap flag
-+	ptvcursor_add(ptvc, hf_nfapi_transport_block_to_codeword_swap_flag, 1, ENC_BIG_ENDIAN);
-+
-+	// Transmission scheme
-+	guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_scheme, 1, ENC_BIG_ENDIAN);
-+	if (!(transmission_scheme_value == 0 || transmission_scheme_value == 1 || transmission_scheme_value == 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission schemes value [0, 1, 6]");
-+	}
-+
-+	// Number of layers
-+	guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_layers_value >= 1 && number_of_layers_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]");
-+	}
-+
-+	// Codebook index
-+	ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN);
-+
-+	// UE category capacity
-+	guint8 ue_category_capacity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_category_capacity, 1, ENC_BIG_ENDIAN);
-+	if (ue_category_capacity_value > 14)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue category capacity value [0..14]");
-+	}
-+
-+	// P-A
-+	guint8 p_a_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pa, 1, ENC_BIG_ENDIAN);
-+	if (p_a_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid p-a value value [0..7]");
-+	}
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+	// NPRB
-+	guint8 nprb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN);
-+	if (nprb_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid nprb value [0..1]");
-+	}
-+
-+	// NGAP
-+	guint8 ngap_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ngap, 1, ENC_BIG_ENDIAN);
-+	if (ngap_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ngap value [0..1]");
-+	}
-+
-+}
-+static void dissect_dl_config_request_pch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// UE mode
-+	guint8 ue_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_mode, 1, ENC_BIG_ENDIAN);
-+	if (ue_mode_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue mode value [0..1]");
-+	}
-+
-+	// Initial transmission SF (io)
-+	guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN);
-+	if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
-+	}
-+}
-+static void dissect_dl_config_request_prs_pdu_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+	// PRS bandwidth
-+	guint8 prs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_prs_bandwidth, 1, ENC_BIG_ENDIAN);
-+	if (!(prs_bandwidth_value == 6 || prs_bandwidth_value == 15 || prs_bandwidth_value == 25 ||
-+		  prs_bandwidth_value == 50 || prs_bandwidth_value == 75 || prs_bandwidth_value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs bandwidth value [6, 15, 25, 50, 75, 100]");
-+	}
-+
-+	// PRS cyclic prefix type
-+	guint8 prs_cyclic_prefix_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_prs_cyclic_prefix_type, 1, ENC_BIG_ENDIAN);
-+	if (prs_cyclic_prefix_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs cyclic prefix value [0..1]");
-+	}
-+
-+	// PRS muting
-+	guint8 prs_muting_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_prs_muting, 1, ENC_BIG_ENDIAN);
-+	if (prs_muting_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prs muting value [0..1]");
-+	}
-+}
-+static void dissect_dl_config_request_csi_rs_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// CSI-RS antenna port count R10
-+	guint8 csi_rs_antenna_port_count_r10_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_antenna_port_count_r10, 1, ENC_BIG_ENDIAN);
-+	if (!(csi_rs_antenna_port_count_r10_value == 1 || csi_rs_antenna_port_count_r10_value == 2 ||
-+		  csi_rs_antenna_port_count_r10_value == 4 || csi_rs_antenna_port_count_r10_value == 8 ||
-+		  csi_rs_antenna_port_count_r10_value == 12 || csi_rs_antenna_port_count_r10_value == 16))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi rs antenna port count r10 value [1, 2, 4, 6, 8, 10]");
-+	}
-+
-+	// CSI-RS resource config R10
-+	ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_config_r10, 1, ENC_BIG_ENDIAN);
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+	// CSI-RS zero Tx power resource config bitmap R10
-+	ptvcursor_add(ptvc, hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, 2, ENC_BIG_ENDIAN);
-+
-+	// CSI-RS Number of NZP configuration
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_number_of_nzp_configurations, 1, ENC_BIG_ENDIAN);
-+	if (count > 8)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs number of nzp configuration value [0..8]");
-+	}
-+
-+	// CSI-RS configuration
-+	dissect_array_value(ptvc, pinfo, "CSI-RS Resource Configs", ett_nfapi_csi_rs_resource_configs, count, dissect_csi_rs_resource_config_value);
-+}
-+static void dissect_csi_rs_bf_vector_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_resource_index, 1, ENC_BIG_ENDIAN);
-+	if (count > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi-rs resource index value [0..7]");
-+	}
-+
-+	// todo : how to work out the antenna port count for the bfValue
-+}
-+static void dissect_dl_config_request_csi_rs_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Class
-+	guint8 class_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_rs_class, 1, ENC_BIG_ENDIAN);
-+	if (class_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid class value [0..2]");
-+	}
-+
-+	// cdmType
-+	guint8 cdm_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cdm_type, 1, ENC_BIG_ENDIAN);
-+	if (cdm_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm type value [0..1]");
-+	}
-+
-+	// numBfVector
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_num_bf_vector, 1, ENC_BIG_ENDIAN);
-+	if (!((class_value == 1 && count == 0) || (class_value == 2 && count <= 8)))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num bf vector value [0] or [0..8]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "Beamforming Vector", ett_nfapi_csi_rs_bf_vector, count, dissect_csi_rs_bf_vector_value);
-+}
-+static void dissect_epdcch_prb_index_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// EPDCCH PRB index
-+	guint8 epdcch_prb_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_edpcch_prb_index, 1, ENC_BIG_ENDIAN);
-+	if (epdcch_prb_index_value > 99)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch prb_index value [0..99]");
-+	}
-+}
-+static void dissect_dl_config_request_edpcch_params_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// EPDCCH Resource assignment flag
-+	guint8 epdcch_resource_assignment_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_epdcch_resource_assignment_flag, 1, ENC_BIG_ENDIAN);
-+	if (epdcch_resource_assignment_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch resource assignment flag value [0..1]");
-+	}
-+
-+	// EPDCCH ID
-+	guint16 epdcch_id_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_epdcch_id, 2, ENC_BIG_ENDIAN);
-+	if (epdcch_id_value > 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch id value [0..503]");
-+	}
-+
-+	// EPDCCH Start Symbol
-+	guint8 epdcch_start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_epdcch_start_symbol, 1, ENC_BIG_ENDIAN);
-+	if (!(epdcch_start_symbol_value >= 1 && epdcch_start_symbol_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch start symbol value [1..4]");
-+	}
-+
-+	// EPDCCH NumPRB
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_epdcch_num_prb, 1, ENC_BIG_ENDIAN);
-+	if (!(count == 2 || count == 4 || count == 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid epdcch num prb value [2, 4, 8]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "PRBs", ett_nfapi_epdcch_prbs, count, dissect_epdcch_prb_index_value);
-+
-+	dissect_bf_vector_type_value(ptvc, pinfo);
-+}
-+static void dissect_dl_config_request_edpcch_params_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// DwPTS Symbols
-+	guint8 dwtps_symbols_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_lbt_sf, 1, ENC_BIG_ENDIAN);
-+	if (!(dwtps_symbols_value == 3 || dwtps_symbols_value == 6 || dwtps_symbols_value == 9 ||
-+		dwtps_symbols_value == 10 || dwtps_symbols_value == 11 || dwtps_symbols_value == 12 ||
-+		dwtps_symbols_value == 14))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dwpts symbols value [3, 6, 9, 10, 11, 12, 14]");
-+	}
-+
-+	// Initial LBT SF
-+	guint8 initial_lbt_sf_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dwpts_symbols, 1, ENC_BIG_ENDIAN);
-+	if (initial_lbt_sf_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial lbt sf value [0..1]");
-+	}
-+
-+}
-+static void dissect_precoding_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add(ptvc, hf_nfapi_precoding_value, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_dl_config_request_mpdpcch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// MPDCCH Narrowband
-+	guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN);
-+	if (mpdcch_narrowband_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]");
-+	}
-+
-+	// Number of PRB pairs
-+	guint8 number_of_prb_pair_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_prb_pair_value == 2 || number_of_prb_pair_value == 4 || number_of_prb_pair_value == 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pair value [2, 4, 6]");
-+	}
-+
-+	// Resource Block Assignment
-+	guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN);
-+	if (resource_block_assignment_value > 14)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]");
-+	}
-+
-+	// MPDCCH transmission type
-+	guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN);
-+	if (mpdcch_transmission_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]");
-+	}
-+
-+	// Start symbol
-+	guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN);
-+	if (!(start_symbol_value >= 1 && start_symbol_value <=4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [1..4]");
-+	}
-+
-+	// ECCE index
-+	guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN);
-+	if (ecce_index_value > 22)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]");
-+	}
-+
-+	// Aggregation level
-+	guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN);
-+	if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 ||
-+		aggregation_level_value == 16 || aggregation_level_value == 24))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]");
-+	}
-+
-+	// RNTI type
-+	guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN);
-+	if (rnti_type_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0..4]");
-+	}
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (!(rnti_value >= 1))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// CEMode
-+	guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN);
-+	if (!(cemode_value >= 1 && cemode_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1..2]");
-+	}
-+
-+	// DMRS scrambling init
-+	guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_drms_scrabmling_init, 2, ENC_BIG_ENDIAN);
-+	if (drms_scrambling_init_value > 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]");
-+	}
-+
-+	// Initial transmission SF (io)
-+	guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN);
-+	if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
-+	}
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+	// DCI format
-+	guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dl_dci_format, 1, ENC_BIG_ENDIAN);
-+	if (!(dci_format_value == 10 || dci_format_value == 11 || dci_format_value == 12))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [10, 11, 12]");
-+	}
-+
-+	// Resource block coding
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 2, ENC_BIG_ENDIAN);
-+
-+	// MCS
-+	guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN);
-+	if (mcs_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..15]");
-+	}
-+
-+	// PDSCH repetition levels
-+	guint8 pdsch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pdsch_reception_levels, 1, ENC_BIG_ENDIAN);
-+	if (!(pdsch_repetition_levels_value >= 1 && pdsch_repetition_levels_value <= 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdsch repetition levels value [1..8]");
-+	}
-+
-+	// Redundancy version
-+	guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_version_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]");
-+	}
-+
-+	// New data indicator
-+	guint8 new_data_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indicator, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indicator_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]");
-+	}
-+
-+	// HARQ process
-+	guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN);
-+	if (harq_process_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..15]");
-+	}
-+
-+	// TPMI length
-+	guint8 tpmi_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpmi_length, 1, ENC_BIG_ENDIAN);
-+	if (!(tpmi_length_value == 0 || tpmi_length_value == 2 || tpmi_length_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi length value [0, 2, 4]");
-+	}
-+
-+	// TPMI
-+	guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN);
-+	if (tpmi_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..15]");
-+	}
-+
-+	// PMI flag
-+	guint8 pmi_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pmi_flag, 1, ENC_BIG_ENDIAN);
-+	if (pmi_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi flag value [0..1]");
-+	}
-+
-+	// PMI
-+	guint8 pmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pmi, 1, ENC_BIG_ENDIAN);
-+	if (pmi_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pmi value [0..1]");
-+	}
-+
-+	// HARQ resource offset
-+	guint8 harq_resource_offset_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_resource_offset, 1, ENC_BIG_ENDIAN);
-+	if (harq_resource_offset_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq resource offset value [0..3]");
-+	}
-+
-+	// DCI subframe repetition number
-+	guint8 dci_subframe_reptition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN);
-+	if (!(dci_subframe_reptition_number_value >= 1 && dci_subframe_reptition_number_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]");
-+	}
-+
-+	// TPC
-+	guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN);
-+	if (tpc_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]");
-+	}
-+
-+	// Downlink assignment index Length
-+	guint8 downlink_assignment_index_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index_length, 1, ENC_BIG_ENDIAN);
-+	if (!(downlink_assignment_index_length_value == 0 || downlink_assignment_index_length_value == 2 ||
-+		downlink_assignment_index_length_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignmnet index value [0, 2, 4]");
-+	}
-+
-+	// Downlink assignment index
-+	guint8 downlink_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_downlink_assignment_index, 1, ENC_BIG_ENDIAN);
-+	if (downlink_assignment_index_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid downlink assignment index value [0..15]");
-+	}
-+
-+	// Allocate PRACH flag
-+	guint8 allocate_prach_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_allocate_prach_flag, 1, ENC_BIG_ENDIAN);
-+	if (allocate_prach_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid allocate prach flag value [0..1]");
-+	}
-+
-+	// Preamble index
-+	guint8 preamble_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_preamble_index, 1, ENC_BIG_ENDIAN);
-+	if (preamble_index_value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble index value [0..63]");
-+	}
-+
-+	// PRACH mask index
-+	guint8 prach_mask_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_prach_mask_index, 1, ENC_BIG_ENDIAN);
-+	if (prach_mask_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid prach mask index value [0..15]");
-+	}
-+
-+	// Starting CE Level
-+	guint8 starting_ce_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_starting_ce_level, 1, ENC_BIG_ENDIAN);
-+	if (starting_ce_level_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting ce level value [0..3]");
-+	}
-+
-+	// SRS request
-+	guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN);
-+	if (srs_request_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]");
-+	}
-+
-+	// Antenna ports and scrambling identity flag
-+	guint8 antenna_ports_and_scrambling_identity_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity_flag, 1, ENC_BIG_ENDIAN);
-+	if (antenna_ports_and_scrambling_identity_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity flag value [0..1]");
-+	}
-+
-+	// Antenna ports and scrambling identity
-+	guint8 antenna_ports_and_scrambling_identity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_antenna_ports_and_scrambling_identity, 1, ENC_BIG_ENDIAN);
-+	if (antenna_ports_and_scrambling_identity_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna ports and scrambling identity value [0..3]");
-+	}
-+
-+	// Frequency hopping enabled flag
-+	guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN);
-+	if (frequency_hopping_enabled_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]");
-+	}
-+
-+	// Paging/Direct indication differentiation flag
-+	guint8 paging_direct_indicaton_differentiation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_paging_direct_indication_differentiation_flag, 1, ENC_BIG_ENDIAN);
-+	if (paging_direct_indicaton_differentiation_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid paging/direct indication differentiation flag value [0..1]");
-+	}
-+
-+	// Direct indication
-+	ptvcursor_add(ptvc, hf_nfapi_direct_indication, 1, ENC_BIG_ENDIAN);
-+
-+	// Total DCI length including padding
-+	item = ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of TX Antenna ports
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "Precoding", ett_nfapi_precoding, count, dissect_precoding_value);
-+}
-+static void dissect_ul_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PDU Type
-+	guint8 ul_pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_config_pdu_type, 1, ENC_BIG_ENDIAN);
-+	if (ul_pdu_type_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul pdu type value [0..15]");
-+	}
-+
-+	guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN);
-+
-+	guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
-+	dissect_tlv_list(ptvc, pinfo, pdu_end);
-+}
-+static void  dissect_ul_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Number of PDUs
-+	guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_pdus, 1, ENC_BIG_ENDIAN);
-+
-+	// RACH/PRACH frequency resources
-+	guint8 rach_prach_frequency_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rach_prach_frequency_resources, 1, ENC_BIG_ENDIAN);
-+	if (rach_prach_frequency_resources_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach prach frequency resources value [0..1]");
-+	}
-+
-+	// SRS present
-+	guint8 srs_present_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_present, 1, ENC_BIG_ENDIAN);
-+	if (srs_present_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs present value [0..1]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "UL Config PDU List", ett_nfapi_ul_config_request_pdu_list, num_pdu, dissect_ul_config_pdu);
-+}
-+static void dissect_ul_config_ulsch_pdu_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// Size
-+	ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN);
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (!(rnti_value >= 1))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// Resource block start
-+	guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN);
-+	if (resource_block_start_value > 99)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]");
-+	}
-+
-+	// Number of resource blocks
-+	guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..100]");
-+	}
-+
-+	// Modulation type
-+	guint8 modulation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_modulation, 1, ENC_BIG_ENDIAN);
-+	if (!(modulation_type_value == 2 || modulation_type_value == 4 || modulation_type_value ==  6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid modulation type value [2, 4, 6]");
-+	}
-+
-+	// Cyclic Shift 2 for DMRS
-+	guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN);
-+	if (cyclic_shift_2_for_drms_value > 99)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]");
-+	}
-+
-+	// Frequency hopping enabled flag
-+	guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN);
-+	if (frequency_hopping_enabled_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]");
-+	}
-+
-+	// Frequency hopping bits
-+	guint8 frequency_hopping_bits_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN);
-+	if (frequency_hopping_bits_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]");
-+	}
-+
-+	// New data indication
-+	guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indication_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indicator value [0..1]");
-+	}
-+
-+	// Redundancy version
-+	guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_version_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]");
-+	}
-+
-+	// HARQ process number
-+	guint8 harq_process_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_process_number, 1, ENC_BIG_ENDIAN);
-+	if (harq_process_number_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process number value [0..15]");
-+	}
-+
-+	// UL Tx mode
-+	guint8 ul_tx_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_tx_mode, 1, ENC_BIG_ENDIAN);
-+	if (ul_tx_mode_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul tx mode value [0..1]");
-+	}
-+
-+	// Current TX NB
-+	ptvcursor_add(ptvc, hf_nfapi_current_tx_nb, 1, ENC_BIG_ENDIAN);
-+
-+	// N srs
-+	guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_srs, 1, ENC_BIG_ENDIAN);
-+	if (n_srs_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n_srs value [0..1]");
-+	}
-+}
-+static void dissect_ul_config_ulsch_pdu_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Resource allocation type
-+	guint8 resource_allocation_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
-+	if (resource_allocation_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]");
-+	}
-+
-+	// Resource block coding
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
-+
-+	// Transport blocks
-+	guint8 transport_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transport_blocks, 1, ENC_BIG_ENDIAN);
-+	if (!(transport_blocks_value >= 1 && transport_blocks_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transport blocks value [1..2]");
-+	}
-+
-+	// Transmission scheme
-+	guint8 transmission_scheme_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_transmission_scheme, 1, ENC_BIG_ENDIAN);
-+	if (transmission_scheme_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission scheme value [0..1]");
-+	}
-+
-+	// Number Of layers
-+	guint8 number_of_layers_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_layers, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_layers_value >= 1 && number_of_layers_value <=4 ))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of layers value [1..4]");
-+	}
-+
-+	// Codebook Index
-+	guint8 codebook_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_codebook_index, 1, ENC_BIG_ENDIAN);
-+	if (codebook_index_value > 23)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid codebook index value [0..23]");
-+	}
-+
-+	// Disable sequence hopping flag
-+	guint8 disable_sequence_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_disable_sequence_hopping_flag, 1, ENC_BIG_ENDIAN);
-+	if (disable_sequence_hopping_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid disable sequence hopping flag value [0..1]");
-+	}
-+}
-+static void dissect_ul_config_ulsch_pdu_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Virtual cell ID enabled flag
-+	guint8 virtual_cell_id_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN);
-+	if (virtual_cell_id_enabled_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]");
-+	}
-+
-+	// nPUSCH Identity
-+	guint16 npusch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_npusch_identity, 2, ENC_BIG_ENDIAN);
-+	if (npusch_identity_value > 509)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npusch identity value [0..509]");
-+	}
-+
-+	// DMRS Config flag
-+	guint8 drms_config_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_drms_config_flag, 1, ENC_BIG_ENDIAN);
-+	if (drms_config_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms config flag value [0..1]");
-+	}
-+
-+	// nDMRS-CSH Identity
-+	guint16 ndrms_csh_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ndrms_csh_identity, 2, ENC_BIG_ENDIAN);
-+	if (ndrms_csh_identity_value > 509)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ndrms-csh identity value [0..509]");
-+	}
-+
-+}
-+static void dissect_ul_config_ulsch_pdu_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// UE Type
-+	guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN);
-+	if (ue_type_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]");
-+	}
-+
-+	// Total Number of repetitions
-+	guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN);
-+	if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 2048))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..2048]");
-+	}
-+
-+	// Repetition Number
-+	guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN);
-+	if (!(repetition_number_value >= 1 && repetition_number_value <= 2048))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..2048]");
-+	}
-+
-+	// Initial transmission SF (io)
-+	guint16 intial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_sf_io, 2, ENC_BIG_ENDIAN);
-+	if (!(intial_transmission_sf_io_value <= 10239 || intial_transmission_sf_io_value == 0xFFFF))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [0..10239, 0xFFFF]");
-+	}
-+
-+	// Empy symbols due to re-tunning
-+	// todo : decode as a bitmap
-+	ptvcursor_add(ptvc, hf_nfapi_empty_symbols_due_to_retunning, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_ul_config_init_tx_params_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// N srs initial
-+	guint8 n_srs_initial_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_srs_initial, 1, ENC_BIG_ENDIAN);
-+	if (n_srs_initial_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs initial value [0..1]");
-+	}
-+
-+	// Initial number of resource blocks
-+	guint8 initial_number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_number_of_resource_blocks, 1, ENC_BIG_ENDIAN);
-+	if (!(initial_number_of_resource_blocks_value >= 1 && initial_number_of_resource_blocks_value <= 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial number of reosurce blocks value [1..100]");
-+	}
-+
-+}
-+static void dissect_ul_config_cqi_ri_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// DL CQI/PMI Size Rank = 1
-+	ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_1, 1, ENC_BIG_ENDIAN);
-+
-+	// DL CQI/PMI Size Rank>1
-+	ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_rank_greater_1, 1, ENC_BIG_ENDIAN);
-+
-+	// RI Size
-+	guint8 ri_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN);
-+	if (ri_size_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri size value [0..3]");
-+	}
-+
-+	// Delta Offset CQI
-+	guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN);
-+	if (delta_offset_cqi_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]");
-+	}
-+
-+	// Delta Offset RI
-+	guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN);
-+	if (delta_offset_ri_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]");
-+	}
-+}
-+static void dissect_ul_cqi_pmi_size(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Delta Offset RI
-+	guint8 dl_cqi_pmi_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN);
-+	if (dl_cqi_pmi_size_value > 255)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..255]");
-+	}
-+}
-+
-+static void dissect_ul_config_cqi_ri_info_rel9_later_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+	// Report type
-+	guint8 type = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_report_type, 1, ENC_BIG_ENDIAN);
-+	if (type > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid report type value [0..1]");
-+	}
-+
-+	// Delta offset CQI
-+	guint8 delta_offset_cqi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_cqi, 1, ENC_BIG_ENDIAN);
-+	if (delta_offset_cqi_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset cqi value [0..15]");
-+	}
-+
-+	// Delta offset RI
-+	guint8 delta_offset_ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_ri, 1, ENC_BIG_ENDIAN);
-+	if (delta_offset_ri_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset ri value [0..15]");
-+	}
-+
-+	switch (type)
-+	{
-+		case 0:
-+		{
-+			// DL CQI/PMI/RI size
-+			ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size, 1, ENC_BIG_ENDIAN);
-+
-+			// Control Type
-+			guint8 control_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+			ptvcursor_add(ptvc, hf_nfapi_control_type, 1, ENC_BIG_ENDIAN);
-+			if (control_type_value > 1)
-+			{
-+				expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid control type value [0..1]");
-+			}
-+			break;
-+		}
-+		case 1:
-+		{
-+			// todo : encoder not right for this case.
-+			gint8 num_cc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+			ptvcursor_add(ptvc, hf_nfapi_number_of_cc, 1, ENC_BIG_ENDIAN);
-+
-+			if (!(num_cc_value >= 1 && num_cc_value <= 32))
-+			{
-+				expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of cc value [1..32]");
-+			}
-+
-+                        // UL CONFIG CQI PMI SIZE
-+                        dissect_array_value(ptvc, pinfo, "CQI PMI SIZE", ett_nfapi_cqi_pmi_size, 8, dissect_ul_cqi_pmi_size);
-+
-+			/*
-+			ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "CCs");
-+
-+			for (int i = 0; i < num_cc; ++i)
-+			{
-+				ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", i);
-+
-+				guint8 ri_size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+				ptvcursor_add(ptvc, hf_nfapi_ri_size, 1, ENC_BIG_ENDIAN);
-+
-+				ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Rank");
-+
-+				for (int j = 0; j < ri_size; ++j)
-+				{
-+					ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "[%d]", j);
-+					ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN);
-+					ptvcursor_pop_subtree(ptvc);
-+				}
-+
-+				ptvcursor_pop_subtree(ptvc);
-+
-+				ptvcursor_pop_subtree(ptvc);
-+			}
-+
-+			ptvcursor_pop_subtree(ptvc);
-+			*/
-+
-+			break;
-+		}
-+	}
-+}
-+static void dissect_ul_config_cqi_ri_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// DL CQI/PMI/RI size 2
-+	guint16 dl_cqi_ri_pmi_size_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_dl_cqi_ri_pmi_size_2, 2, ENC_BIG_ENDIAN);
-+	if (dl_cqi_ri_pmi_size_2_value < 255)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl cqi ri pmi size 2 value [>= 255]");
-+	}
-+}
-+static void dissect_ul_config_harq_info_ulsch_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// HARQ Size
-+	guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN);
-+	if (harq_size_value > 21)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]");
-+	}
-+
-+	// Delta Offset HARQ
-+	guint8 delta_offset_harq_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq, 1, ENC_BIG_ENDIAN);
-+	if (delta_offset_harq_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq value [0..15]");
-+	}
-+
-+	// ACK_NACK mode
-+	guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value > 5)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]");
-+	}
-+}
-+static void dissect_ul_config_harq_info_ulsch_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// HARQ Size 2
-+	ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN);
-+
-+	// Delta Offset HARQ 2
-+	guint8 delta_offset_harq_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_delta_offset_harq_2, 1, ENC_BIG_ENDIAN);
-+	if (delta_offset_harq_2_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid delta offset harq 2 value [0..15]");
-+	}
-+}
-+static void dissect_ul_config_ue_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+}
-+static void dissect_ul_config_ue_info_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Virtual cell ID enabled flag
-+	guint8 virtual_cell_id_enabled_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_virtual_cell_id_enabled_flag, 1, ENC_BIG_ENDIAN);
-+	if (virtual_cell_id_enabled_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid virtual cell id enabled flag value [0..1]");
-+	}
-+
-+	// nPUCCH Identity
-+	guint16 npucch_identity_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_npucch_identity, 2, ENC_BIG_ENDIAN);
-+	if (npucch_identity_value > 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch identity value [0..503]");
-+	}
-+
-+}
-+static void dissect_ul_config_ue_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// UE Type
-+	guint8 ue_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_type, 1, ENC_BIG_ENDIAN);
-+	if (ue_type_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue type value [0..2]");
-+	}
-+
-+	// Empty symbols
-+	// todo : use bit map decoding
-+	ptvcursor_add(ptvc, hf_nfapi_empty_symbols, 1, ENC_BIG_ENDIAN);
-+
-+	// Total Number of repetitions
-+	guint16 total_number_of_repetitions_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_total_number_of_repetitions, 2, ENC_BIG_ENDIAN);
-+	if (!(total_number_of_repetitions_value >= 1 && total_number_of_repetitions_value <= 32))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid total number of repetitions value [1..32]");
-+	}
-+
-+	// Repetition Number
-+	guint16 repetition_number_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_repetition_number, 2, ENC_BIG_ENDIAN);
-+	if (!(repetition_number_value >= 1 && repetition_number_value <= 32))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid repetition number value [1..32]");
-+	}
-+
-+}
-+static void dissect_ul_config_cqi_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PUCCH index
-+	guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN);
-+	if (pucch_index_value > 1184)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..1184]");
-+	}
-+
-+	// DL CQI/PMI Size
-+	ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_ul_config_cqi_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Number of PUCCH Resources
-+	guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [1..2]");
-+	}
-+
-+	//PUCCH Index P1
-+	guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN);
-+	if (pucch_index_p1_value > 1184)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..1184]");
-+	}
-+}
-+static void dissect_ul_config_cqi_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// CSI_mode
-+	guint8 csi_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_mode, 1, ENC_BIG_ENDIAN);
-+	if (csi_mode_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi mode value [0..2]");
-+	}
-+
-+	// DL CQI/PMI Size 2
-+	ptvcursor_add(ptvc, hf_nfapi_dl_cqi_pmi_size_2, 2, ENC_BIG_ENDIAN);
-+
-+	// Starting PRB
-+	guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_statring_prb, 1, ENC_BIG_ENDIAN);
-+	if (starting_prb_value > 109)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]");
-+	}
-+
-+	// n_PRB
-+	guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN);
-+	if (n_prb_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]");
-+	}
-+
-+	// cdm_Index
-+	guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN);
-+	if (cdm_index_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]");
-+	}
-+
-+	// N srs
-+	guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN);
-+	if (n_srs_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]");
-+	}
-+
-+}
-+static void dissect_ul_config_sr_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 pucch_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_pucch_index, 2, ENC_BIG_ENDIAN);
-+	if (pucch_index_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index value [0..2047]");
-+	}
-+}
-+static void dissect_ul_config_sr_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Number of PUCCH Resources
-+	guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..2047]");
-+	}
-+
-+	// PUCCH Index P1
-+	guint16 pucch_index_p1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pucch_index_p1, 2, ENC_BIG_ENDIAN);
-+	if (pucch_index_p1_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pucch index p1 value [0..2047]");
-+	}
-+}
-+static void dissect_ul_config_harq_info_uci_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// HARQ size
-+	guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN);
-+	if (harq_size_value > 21)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0..21]");
-+	}
-+
-+	// ACK_NACK mode
-+	guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tdd_ack_nack_mode, 1, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value > 5)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..5]");
-+	}
-+
-+	// Number of PUCCH resources
-+	guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN);
-+	if (number_of_pucch_resources_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pucch resources value [0..4]");
-+	}
-+
-+	// n_PUCCH_1_0
-+	guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2)
-+	{
-+		if (npucch_1_0_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047] (All Format 1a/1b)");
-+		}
-+	}
-+	else if (ack_nack_mode_value == 3)
-+	{
-+		if (npucch_1_0_value > 549)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..549] (Format 3)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_1
-+	guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1 || ack_nack_mode_value == 2)
-+	{
-+		if (npucch_1_1_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 1 value [0..2047] (All Format 1a/1b)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_2
-+	guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 2)
-+	{
-+		if (npucch_1_2_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 2 value [0..2047] (All Format 1a/1b)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_3
-+	guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 2)
-+	{
-+		if (npucch_1_3_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 3 value [0..2047] (All Format 1a/1b)");
-+		}
-+	}
-+}
-+static void dissect_ul_config_harq_info_uci_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// n_PUCCH_1_0
-+	// todo : how to work out the ack_nack mode?
-+	guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN);
-+	if (npucch_1_0_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n pucch 1 0 value [0..2047]");
-+	}
-+
-+	// HARQ Size
-+	guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN);
-+	if (!(harq_size_value >= 1 && harq_size_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..2]");
-+	}
-+}
-+static void dissect_ul_config_harq_info_uci_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// HARQ Size
-+	guint8 harq_size_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* harq_size_item = ptvcursor_add(ptvc, hf_nfapi_harq_size, 1, ENC_BIG_ENDIAN);
-+
-+	// ACK_NAK mode
-+	guint8 ack_nack_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_fdd_ack_nack_mode, 1, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ack nack mode value [0..4]");
-+	}
-+
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 2)
-+	{
-+		if (!(harq_size_value >= 1 && harq_size_value <= 10))
-+		{
-+			expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [1..10] (Format 1a/1b/3)");
-+		}
-+	}
-+	else if (ack_nack_mode_value == 3 ||  ack_nack_mode_value == 4)
-+	{
-+		if (harq_size_value != 0)
-+		{
-+			expert_add_info_format(pinfo, harq_size_item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)");
-+		}
-+	}
-+
-+	// Number of PUCCH Resources
-+	guint8 number_of_pucch_resources_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_pucch_resource, 1, ENC_BIG_ENDIAN);
-+	if (number_of_pucch_resources_value == 0 || number_of_pucch_resources_value == 2)
-+	{
-+		if (!(number_of_pucch_resources_value >= 1 && number_of_pucch_resources_value <= 4))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [1..4] (Format 1a/1b/3)");
-+		}
-+	}
-+	else if (number_of_pucch_resources_value == 3 || number_of_pucch_resources_value == 4)
-+	{
-+		if (number_of_pucch_resources_value != 0)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq size value [0] (Format 4/5)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_0
-+	guint16 npucch_1_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_0, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
-+	{
-+		if (npucch_1_0_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..2047] (Format 1a/1b/channel selection)");
-+		}
-+	}
-+	else if (ack_nack_mode_value == 2)
-+	{
-+		if (npucch_1_0_value > 549)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 0 value [0..549] (Format 3)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_1
-+	guint16 npucch_1_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_1, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
-+	{
-+		if (npucch_1_1_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 1 value [0..2047] (Format 1a/1b/channel selection)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_2
-+	guint16 npucch_1_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_2, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
-+	{
-+		if (npucch_1_2_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 2 value [0..2047] (Format 1a/1b/channel selection)");
-+		}
-+	}
-+
-+	// n_PUCCH_1_3
-+	guint16 npucch_1_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_1_3, 2, ENC_BIG_ENDIAN);
-+	if (ack_nack_mode_value == 0 || ack_nack_mode_value == 1)
-+	{
-+		if (npucch_1_3_value > 2047)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 1 3 value [0..2047] (Format 1a/1b/channel selection)");
-+		}
-+	}
-+}
-+static void dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Num_ant_ports
-+	guint8 num_ant_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_num_ant_ports, 1, ENC_BIG_ENDIAN);
-+	if (!(num_ant_ports_value >= 1 && num_ant_ports_value <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid num ant ports value [1..2]");
-+	}
-+
-+	// n_PUCCH_2_0
-+	// todo : how to work out the ack nack mode
-+	guint16 npucch_2_0_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_0, 2, ENC_BIG_ENDIAN);
-+	if (npucch_2_0_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 0 value [0..2047]");
-+	}
-+
-+	// n_PUCCH_2_1
-+	guint16 npucch_2_1_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_1, 2, ENC_BIG_ENDIAN);
-+	if (npucch_2_1_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 1 value [0..2047]");
-+	}
-+
-+	// n_PUCCH_2_2
-+	guint16 npucch_2_2_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_2, 2, ENC_BIG_ENDIAN);
-+	if (npucch_2_2_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 2 value [0..2047]");
-+	}
-+
-+	// n_PUCCH_2_3
-+	guint16 npucch_2_3_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_pucch_2_3, 2, ENC_BIG_ENDIAN);
-+	if (npucch_2_3_value > 2047)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid npucch 2 3 value [0..2047]");
-+	}
-+
-+}
-+static void dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// HARQ Size 2
-+	ptvcursor_add(ptvc, hf_nfapi_harq_size_2, 2, ENC_BIG_ENDIAN);
-+
-+	// Starting PRB
-+	guint8 starting_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_starting_prb, 1, ENC_BIG_ENDIAN);
-+	if (starting_prb_value > 109)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid starting prb value [0..109]");
-+	}
-+
-+	// n_PRB
-+	guint8 n_prb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nprb, 1, ENC_BIG_ENDIAN);
-+	if (n_prb_value > 109)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n prb value [0..7]");
-+	}
-+
-+	// cdm_Index
-+	guint8 cdm_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cdm_index, 1, ENC_BIG_ENDIAN);
-+	if (cdm_index_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cdm index value [0..1]");
-+	}
-+
-+	// N srs
-+	guint8 n_srs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_nsrs, 1, ENC_BIG_ENDIAN);
-+	if (n_srs_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n srs value [0..1]");
-+	}
-+}
-+static void dissect_ul_config_srs_info_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// Size
-+	ptvcursor_add(ptvc, hf_nfapi_size, 2, ENC_BIG_ENDIAN);
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// SRS Bandwidth
-+	guint8 srs_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_bandwidth, 1, ENC_BIG_ENDIAN);
-+	if (srs_bandwidth_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs bandwidth value [0..3]");
-+	}
-+
-+	// Frequency Domain Position
-+	guint8 frequency_domain_position_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_domain_position, 1, ENC_BIG_ENDIAN);
-+	if (frequency_domain_position_value > 23)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency domain bandwidth value [0..23]");
-+	}
-+
-+	// SRS Hopping Bandwidth
-+	guint8 srs_hopping_bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_hopping_bandwidth, 1, ENC_BIG_ENDIAN);
-+	if (srs_hopping_bandwidth_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs hopping bandwidth value [0..3]");
-+	}
-+
-+	// Transmission Comb
-+	guint8 transmission_comb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_comb, 1, ENC_BIG_ENDIAN);
-+	if (transmission_comb_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission comb value [0..3]");
-+	}
-+
-+	// ISRS / SRS-ConfigIndex
-+	guint16 srs_config_index_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_i_srs, 2, ENC_BIG_ENDIAN);
-+	if (srs_config_index_value > 1023)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid isrs/srs-configindex value [0..1023]");
-+	}
-+
-+	// Sounding Reference Cyclic Shift
-+	guint8 sounding_reference_cyclic_shift_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_sounding_reference_cyclic_shift, 1, ENC_BIG_ENDIAN);
-+	if (sounding_reference_cyclic_shift_value > 11)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid sounding reference cyclic shift value [0..11]");
-+	}
-+}
-+static void dissect_ul_config_srs_info_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 antenna_port_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_antenna_port, 1, ENC_BIG_ENDIAN);
-+	if (antenna_port_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid antenna port value [0..2]");
-+	}
-+}
-+static void dissect_ul_config_srs_info_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 number_of_combs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_combs, 1, ENC_BIG_ENDIAN);
-+	if (number_of_combs_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of combs value [0..1]");
-+	}
-+}
-+static void dissect_hi_dci0_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+
-+	// PDU Type
-+	guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_hi_dci0_pdu_type, 1, ENC_BIG_ENDIAN);
-+	if (pdu_type_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..3]");
-+	}
-+
-+	// PDU Size
-+	guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN);
-+
-+	guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
-+	dissect_tlv_list(ptvc, pinfo, pdu_end);
-+}
-+static void dissect_hi_dci0_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// SFN/SF
-+	ptvcursor_add(ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+
-+	// Number of DCI
-+	guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_dci_pdus, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of  HI
-+	num_pdu += tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_hi_pdus, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "HI DCI0 PDU List", ett_nfapi_hi_dci0_request_pdu_list, num_pdu, dissect_hi_dci0_pdu);
-+}
-+static void dissect_hi_dci0_hi_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Resource block start
-+	guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN);
-+	if (resource_block_start_value > 100)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]");
-+	}
-+
-+	// Cyclic Shift 2 for DMRS
-+	guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN);
-+	if (cyclic_shift_2_for_drms_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]");
-+	}
-+
-+	// HI value
-+	guint8 hi_value_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_hi_value, 1, ENC_BIG_ENDIAN);
-+	if (hi_value_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi value [0..1]");
-+	}
-+
-+	// I_PHICH
-+	guint8 i_pich_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_i_phich, 1, ENC_BIG_ENDIAN);
-+	if (i_pich_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid i phich value [0..1]");
-+	}
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+}
-+static void dissect_hi_dci0_hi_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Flag TB2
-+	guint8 flag_tb2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_flag_tb2, 1, ENC_BIG_ENDIAN);
-+	if (flag_tb2_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid flag tb2 value [0..1]");
-+	}
-+
-+	// HI Value 2
-+	guint8 hi2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_hi_value_2, 1, ENC_BIG_ENDIAN);
-+	if (hi2_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid hi2 value [0..1]");
-+	}
-+
-+}
-+static void dissect_hi_dci0_dci_ul_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// DCI format
-+	guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_dci_format, 1, ENC_BIG_ENDIAN);
-+	if (dci_format_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [0..4]");
-+	}
-+
-+	// CCE index
-+	guint8 cce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cce_idx, 1, ENC_BIG_ENDIAN);
-+	if (cce_index_value > 88)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cce index value [0..88]");
-+	}
-+
-+	// Aggregation level
-+	guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN);
-+	if (!(aggregation_level_value == 1 || aggregation_level_value == 2 || aggregation_level_value == 4 ||
-+		  aggregation_level_value == 8))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [1, 2, 4, 8]");
-+	}
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// Resource block start
-+	guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN);
-+	if (resource_block_start_value > 100)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..100]");
-+	}
-+
-+	// Number of resource blocks
-+	guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN);
-+	if (number_of_resource_blocks_value > 100)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [0..100]");
-+	}
-+
-+	// MCS_1
-+	guint8 mcs_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs_1, 1, ENC_BIG_ENDIAN);
-+	if (mcs_1_value > 31)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 1 value [0..31]");
-+	}
-+
-+	// Cyclic Shift 2 for DMRS
-+	guint8 cyclic_shift_2_for_drms_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cyclic_shift_2_for_drms, 1, ENC_BIG_ENDIAN);
-+	if (cyclic_shift_2_for_drms_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cyclic shift 2 for drms value [0..7]");
-+	}
-+
-+	// Frequency hopping enabled flag
-+	guint8 frequency_hopping_enabled_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_enabled_flag, 1, ENC_BIG_ENDIAN);
-+	if (frequency_hopping_enabled_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping enabled flag value [0..1]");
-+	}
-+
-+	// Frequency hopping bits
-+	guint8 frequency_hopping_bit_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_bits, 1, ENC_BIG_ENDIAN);
-+	if (frequency_hopping_bit_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping bits value [0..3]");
-+	}
-+
-+	// New Data indication_1
-+	guint8 new_data_indication_1_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indication_1_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]");
-+	}
-+
-+	// UE TX antenna selection
-+	guint8 ue_tx_antenna_selection_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ue_tx_antenna_selection, 1, ENC_BIG_ENDIAN);
-+	if (ue_tx_antenna_selection_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ue tx antenna selection value [0..2]");
-+	}
-+
-+	// TPC
-+	guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN);
-+	if (tpc_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value value [0..3]");
-+	}
-+
-+	// CQI/CSI request
-+	guint8 cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cqi_csi_request, 1, ENC_BIG_ENDIAN);
-+	if (cqi_csi_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cqi csi value [0..7]");
-+	}
-+
-+	// UL index
-+	guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN);
-+	if (ul_index_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]");
-+	}
-+
-+	// DL assignment index
-+	guint8 dl_assignment_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN);
-+	if (!(dl_assignment_index_value >= 1 && dl_assignment_index_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment index value [1..4]");
-+	}
-+
-+	// TPC bitmap
-+	ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN);
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+}
-+static void dissect_hi_dci0_dci_ul_rel10_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Cross carrier scheduling flag
-+	guint8 cross_carrier_scheduling_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_cross_carrier_scheduling_flag, 1, ENC_BIG_ENDIAN);
-+	if (cross_carrier_scheduling_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cross carrier scheduling flag value [0..1]");
-+	}
-+
-+	// Carrier indicator
-+	guint8 carrier_indicator_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_carrier_indicator, 1, ENC_BIG_ENDIAN);
-+	if (carrier_indicator_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid carrier indicator value [0..7]");
-+	}
-+
-+	// Size of CQI/CSI field
-+	guint8 size_of_cqi_csi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_size_of_cqi_csi_feild, 1, ENC_BIG_ENDIAN);
-+	if (size_of_cqi_csi_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid size of cqi/csi field value [0..2]");
-+	}
-+
-+	// SRS flag
-+	guint8 srs_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_flag, 1, ENC_BIG_ENDIAN);
-+	if (srs_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs field value [0..1]");
-+	}
-+
-+	// SRS request
-+	//guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	//item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN);
-+
-+	// Resource allocation flag
-+	guint8 resource_allocation_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_flag, 1, ENC_BIG_ENDIAN);
-+	if (resource_allocation_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation flag value [0..1]");
-+	}
-+
-+	// Resource allocation type
-+	guint8 resource_alloction_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_allocation_type, 1, ENC_BIG_ENDIAN);
-+	if (resource_alloction_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource allocation type value [0..1]");
-+	}
-+
-+	// Resource block coding
-+	ptvcursor_add(ptvc, hf_nfapi_resource_block_coding, 4, ENC_BIG_ENDIAN);
-+
-+	// MCS_2
-+	guint8 mcs_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs_2, 1, ENC_BIG_ENDIAN);
-+	if (mcs_2_value > 31)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs 2 value [0..31]");
-+	}
-+
-+	// New data indication_2
-+	guint8 new_data_indication_2_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication_two, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indication_2_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication 2 value [0..1]");
-+	}
-+
-+	// Number of antenna ports
-+	guint8 number_of_antenna_ports_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_antenna_ports, 1, ENC_BIG_ENDIAN);
-+	if (number_of_antenna_ports_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of antenna ports value [0..2]");
-+	}
-+
-+	// TPMI
-+	guint8 tpmi_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpmi, 1, ENC_BIG_ENDIAN);
-+	if (number_of_antenna_ports_value == 2)
-+	{
-+		if (tpmi_value > 7)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..7]");
-+		}
-+	}
-+	else if (number_of_antenna_ports_value == 4)
-+	{
-+		if (tpmi_value > 63)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpmi value [0..63]");
-+		}
-+	}
-+
-+	// Total DCI length including padding
-+	ptvcursor_add(ptvc, hf_nfapi_total_dci_length_including_padding, 1, ENC_BIG_ENDIAN);
-+
-+	// N_UL_RB
-+	guint8 n_ul_rb_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_n_ul_rb, 1, ENC_BIG_ENDIAN);
-+	if (!(n_ul_rb_value == 6 || n_ul_rb_value == 15 || n_ul_rb_value == 25 || n_ul_rb_value == 50 ||
-+		n_ul_rb_value == 75 || n_ul_rb_value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid n ul rb value [6, 15, 25, 50, 75, 100]");
-+	}
-+}
-+static void dissect_hi_dci0_dci_ul_rel12_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// PSCCH Resource
-+	guint8 pscch_resource_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pscch_resource, 1, ENC_BIG_ENDIAN);
-+	if (pscch_resource_value > 0x3F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pscch resource value [0..0x3F]");
-+	}
-+
-+	// Time resource pattern
-+	guint8 time_resource_pattern_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_time_resource_pattern, 1, ENC_BIG_ENDIAN);
-+	if (time_resource_pattern_value > 0x7F)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid time resource pattern value [0..0x7F]");
-+	}
-+
-+}
-+static void dissect_hi_dci0_mdpcch_dci_ul_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// MPDCCH Narrowband
-+	guint8 mpdcch_narrowband_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_narrowband, 1, ENC_BIG_ENDIAN);
-+	if (mpdcch_narrowband_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch narrowband value [0..15]");
-+	}
-+
-+	// Number of PRB pairs
-+	guint8 number_of_prb_pairs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_prb_pairs, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_prb_pairs_value == 2 || number_of_prb_pairs_value == 4 || number_of_prb_pairs_value == 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of prb pairs value [2, 4, 6]");
-+	}
-+
-+	// Resource Block Assignment
-+	guint8 resource_block_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_block_assignment, 1, ENC_BIG_ENDIAN);
-+	if (resource_block_assignment_value > 14)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block assignment value [0..14]");
-+	}
-+
-+	// MPDCCH transmission type
-+	guint8 mpdcch_transmission_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_transmission_type, 1, ENC_BIG_ENDIAN);
-+	if (mpdcch_transmission_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mpdcch transmission type value [0..1]");
-+	}
-+
-+	// Start symbol
-+	guint8 start_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_start_symbol, 1, ENC_BIG_ENDIAN);
-+	if (!(start_symbol_value >= 1 && start_symbol_value <=4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid start symbol value [0..1]");
-+	}
-+
-+	// ECCE index
-+	guint8 ecce_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ecce_index, 1, ENC_BIG_ENDIAN);
-+	if (ecce_index_value > 22)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ecce index value [0..22]");
-+	}
-+
-+	// Aggregation level
-+	guint8 aggregation_level_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_aggregation_level, 1, ENC_BIG_ENDIAN);
-+	if (!(aggregation_level_value == 2 || aggregation_level_value == 4 || aggregation_level_value == 8 ||
-+		aggregation_level_value == 16 || aggregation_level_value == 24))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid aggregation level value [2, 4, 8, 16, 24]");
-+	}
-+
-+	// RNTI type
-+	guint8 rnti_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_rnti_type, 1, ENC_BIG_ENDIAN);
-+	if (!(rnti_type_value == 0 || rnti_type_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti type value [0, 4]");
-+	}
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// CEMode
-+	guint8 cemode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ce_mode, 1, ENC_BIG_ENDIAN);
-+	if (!(cemode_value == 1 || cemode_value == 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid cemode value [1,2]");
-+	}
-+
-+	// DMRS scrambling init
-+	guint16 drms_scrambling_init_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_drms_scrambling_init, 2, ENC_BIG_ENDIAN);
-+	if (drms_scrambling_init_value < 503)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid drms scrambling init value [0..503]");
-+	}
-+
-+	// Initial transmission SF (io)
-+	guint16 initial_transmission_sf_io_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_transmission_sf, 2, ENC_BIG_ENDIAN);
-+	if (!(initial_transmission_sf_io_value <= 10239 || initial_transmission_sf_io_value == 0xFFFF))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial transmission sf io value [0..10239, 0xFFFF]");
-+	}
-+
-+	// Transmission power
-+	guint16 transmission_power_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_transmission_power, 2, ENC_BIG_ENDIAN);
-+	if (transmission_power_value > 10000)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid transmission power value [0..10000]");
-+	}
-+
-+	// DCI format
-+	guint8 dci_format_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mpdcch_ul_dci_format, 1, ENC_BIG_ENDIAN);
-+	if (!(dci_format_value == 1 || dci_format_value == 2 || dci_format_value == 4 || dci_format_value == 5))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci format value [1, 2, 4, 5]");
-+	}
-+
-+	// Resource block start
-+	guint8 resource_block_start_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_resource_block_start, 1, ENC_BIG_ENDIAN);
-+	if (resource_block_start_value > 99)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid resource block start value [0..99]");
-+	}
-+
-+	// Number of resource blocks
-+	guint8 number_of_resource_blocks_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_resource_blocks_value >= 1 && number_of_resource_blocks_value <= 6))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of resource blocks value [1..6]");
-+	}
-+
-+	// MCS
-+	guint8 mcs_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_mcs, 1, ENC_BIG_ENDIAN);
-+	if (mcs_value > 15)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mcs value [0..15]");
-+	}
-+
-+	// PUSCH repetition levels
-+	guint8 pusch_repetition_levels_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_pusch_repetition_levels, 1, ENC_BIG_ENDIAN);
-+	if (dci_format_value == 4)
-+	{
-+		if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 4))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..4]");
-+		}
-+	}
-+	else if (dci_format_value == 5)
-+	{
-+		if (!(pusch_repetition_levels_value >= 1 && pusch_repetition_levels_value <= 8))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pusch repetition levels value [1..8]");
-+		}
-+	}
-+
-+	// Frequency hopping flag
-+	guint8 frequency_hopping_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_frequency_hopping_flag, 1, ENC_BIG_ENDIAN);
-+	if (frequency_hopping_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid frequency hopping flag value [0..1]");
-+	}
-+
-+	// New Data indication
-+	guint8 new_data_indication_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_new_data_indication, 1, ENC_BIG_ENDIAN);
-+	if (new_data_indication_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid new data indication value [0..1]");
-+	}
-+
-+	// HARQ process
-+	guint8 harq_process_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_process, 1, ENC_BIG_ENDIAN);
-+	if (harq_process_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq process value [0..7]");
-+	}
-+
-+	// Redundancy version
-+	guint8 redundancy_version_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_redundancy_version, 1, ENC_BIG_ENDIAN);
-+	if (redundancy_version_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid redundancy version value [0..3]");
-+	}
-+
-+	// TPC
-+	guint8 tpc_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tpc, 1, ENC_BIG_ENDIAN);
-+	if (tpc_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid tpc value [0..3]");
-+	}
-+
-+	// CSI request
-+	guint8 csi_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_csi_request, 1, ENC_BIG_ENDIAN);
-+	if (csi_request_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid csi request value [0..1]");
-+	}
-+
-+	// UL index
-+	guint8 ul_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ul_index, 1, ENC_BIG_ENDIAN);
-+	if (ul_index_value > 3)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul index value [0..3]");
-+	}
-+
-+	// DAI presence flag
-+	guint8 dai_presence_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dai_presence_flag, 1, ENC_BIG_ENDIAN);
-+	if (dai_presence_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dai presence value [0..1]");
-+	}
-+
-+	// DL assignment index
-+	guint8 dl_assignment_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dl_assignment_index, 1, ENC_BIG_ENDIAN);
-+	if (!(dl_assignment_value >=1 && dl_assignment_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dl assignment value [1, 2, 3, 4]");
-+	}
-+
-+	// SRS request
-+	guint8 srs_request_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_srs_request, 1, ENC_BIG_ENDIAN);
-+	if (srs_request_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid srs request value [0..1]");
-+	}
-+
-+	// DCI subframe repetition number
-+	guint8 dci_subframe_repetition_number_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_dci_subframe_repetition_number, 1, ENC_BIG_ENDIAN);
-+	if (!(dci_subframe_repetition_number_value >= 1 && dci_subframe_repetition_number_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid dci subframe repetition number value [1..4]");
-+	}
-+
-+	//TPC bitmap
-+	ptvcursor_add(ptvc, hf_nfapi_tpc_bitmap, 4, ENC_BIG_ENDIAN);
-+
-+	// Total DCI length including padding
-+	ptvcursor_add(ptvc, hf_nfapi_total_dci_length_include_padding, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of TX Antenna ports
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna_ports, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "TX Antenna Ports", ett_nfapi_tx_antenna_ports, count, dissect_precoding_value);
-+}
-+static void dissect_rx_ue_info_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+}
-+static void dissect_rx_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Length
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+
-+	// Data offset
-+	ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
-+
-+	// UL_CQI
-+	ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
-+
-+	// Timing advance
-+	guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]");
-+	}
-+}
-+static void dissect_rx_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Timing advance R9
-+	guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_r9_value > 7690)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance r9 value [0..7690]");
-+	}
-+
-+}
-+static void dissect_harq_indication_data_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+
-+	guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN);
-+	if (!(value_1 >= 1 && value_1 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_data_format_1a_1b_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_data_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+
-+	guint8 value_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_1, 1, ENC_BIG_ENDIAN);
-+	if (!(value_1 >= 1 && value_1 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 1 [1..7]");
-+	}
-+
-+	guint8 value_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_2, 1, ENC_BIG_ENDIAN);
-+	if (!(value_2 >= 1 && value_2 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 2 [1..7]");
-+	}
-+
-+	guint8 value_3 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_3, 1, ENC_BIG_ENDIAN);
-+	if (!(value_3 >= 1 && value_3 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 3 [1..7]");
-+	}
-+
-+}
-+static void dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_data_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN);
-+	if (value_0 > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]");
-+	}
-+}
-+static void dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0_special, 1, ENC_BIG_ENDIAN);
-+	if (value_0 > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [0..4]");
-+	}
-+}
-+static void dissect_harq_indication_data_channel_selection_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_data_format_3_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_data_format_4_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_data_format_5_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 value_0 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_data_value_0, 1, ENC_BIG_ENDIAN);
-+	if (!(value_0 >= 1 && value_0 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid value 0 [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_rel8_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN);
-+	if (mode > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]");
-+	}
-+
-+	guint8 number_of_ack_nack_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_ack_nack_value >= 1 && number_of_ack_nack_value <= 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]");
-+	}
-+
-+	switch (mode)
-+	{
-+		case 0:
-+		{
-+			dissect_harq_indication_data_bundling_value(ptvc, pinfo);
-+			break;
-+		}
-+		case 1:
-+		{
-+			dissect_harq_indication_data_multplexing_value(ptvc, pinfo);
-+			break;
-+		}
-+		case 2:
-+		{
-+			dissect_harq_indication_data_special_bundling_value(ptvc, pinfo);
-+			break;
-+		}
-+	};
-+}
-+static void dissect_harq_indication_rel9_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 i;
-+	proto_item* item;
-+
-+	guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN);
-+	if (mode > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..4]");
-+	}
-+
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN);
-+	if (mode == 0 || mode == 1)
-+	{
-+		if (!(count >= 1 && count <= 4))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]");
-+		}
-+	}
-+	else if (mode == 3)
-+	{
-+		if (!(count >= 1 && count <= 8))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]");
-+		}
-+	}
-+	else if (mode == 4)
-+	{
-+		if (!(count >= 1 && count <= 21))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]");
-+		}
-+	}
-+
-+
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data");
-+
-+	for (i = 0; i < count; ++i)
-+	{
-+		ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i);
-+
-+		switch (mode)
-+		{
-+			case 0:
-+			{
-+				dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 1:
-+			{
-+				dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 2:
-+			{
-+				dissect_harq_indication_data_format_1a_1b_special_bundling_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 3:
-+			{
-+				dissect_harq_indication_data_channel_selection_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 4:
-+			{
-+				dissect_harq_indication_data_format_3_value(ptvc, pinfo);
-+				break;
-+			}
-+		};
-+
-+		ptvcursor_pop_subtree(ptvc);
-+	}
-+
-+	ptvcursor_pop_subtree(ptvc);
-+}
-+static void dissect_harq_indication_rel13_later_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 i = 0;
-+	proto_item* item;
-+
-+	guint8 mode = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_tdd_harq_mode, 1, ENC_BIG_ENDIAN);
-+	if (mode > 6)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid mode value [0..6]");
-+	}
-+
-+
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN);
-+	if (mode == 0 || mode == 1)
-+	{
-+		if (!(count >= 1 && count <= 4))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..4]");
-+		}
-+	}
-+	else if (mode == 3)
-+	{
-+		if (!(count >= 1 && count <= 8))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..8]");
-+		}
-+	}
-+	else if (mode == 4)
-+	{
-+		if (!(count >= 1 && count <= 21))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [1..21]");
-+		}
-+	}
-+	else if (mode == 5 || mode == 6)
-+	{
-+		if (count < 22)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack nack value [>= 22]");
-+		}
-+
-+	}
-+
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "ACK/NACK Data");
-+
-+	for (i = 0; i < count; ++i)
-+	{
-+		ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_harq_ack_nack_data, "[%d]", i);
-+
-+		switch (mode)
-+		{
-+			case 0:
-+			{
-+				dissect_harq_indication_data_format_1a_1b_bundling_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 1:
-+			{
-+				dissect_harq_indication_data_format_1a_1b_multplexing_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 2:
-+			{
-+				dissect_harq_indication_data_special_bundling_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 3:
-+			{
-+				dissect_harq_indication_data_channel_selection_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 4:
-+			{
-+				dissect_harq_indication_data_format_3_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 5:
-+			{
-+				dissect_harq_indication_data_format_4_value(ptvc, pinfo);
-+				break;
-+			}
-+			case 6:
-+			{
-+				dissect_harq_indication_data_format_5_value(ptvc, pinfo);
-+				break;
-+			}
-+		};
-+
-+		ptvcursor_pop_subtree(ptvc);
-+	}
-+
-+	ptvcursor_pop_subtree(ptvc);
-+}
-+static void dissect_harq_indication_rel8_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_1, 1, ENC_BIG_ENDIAN);
-+	if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 1 [1..7]");
-+	}
-+
-+	guint8 harq_tb_2 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_2, 1, ENC_BIG_ENDIAN);
-+	if (!(harq_tb_2 >= 1 && harq_tb_2 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb 2 [1..7]");
-+	}
-+
-+}
-+static void dissect_harq_tb_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint8 harq_tb_1 = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_harq_tb_n, 1, ENC_BIG_ENDIAN);
-+	if (!(harq_tb_1 >= 1 && harq_tb_1 <= 7))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq tb n [1..7]");
-+	}
-+}
-+static void dissect_harq_indication_rel9_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Mode
-+	guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN);
-+	if (harq_mode_value > 2)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..2]");
-+	}
-+
-+	// Number of ACK/NACK
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 1, ENC_BIG_ENDIAN);
-+
-+	if (harq_mode_value == 0)
-+	{
-+		if (!(count >=1 && count <= 2))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]");
-+		}
-+	}
-+	else if (harq_mode_value == 1)
-+	{
-+		if (!(count >= 1 && count <= 4))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]");
-+		}
-+
-+	}
-+	else if (harq_mode_value == 2)
-+	{
-+		if (!(count >= 1 && count <= 10))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]");
-+		}
-+
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value);
-+}
-+static void dissect_harq_indication_rel13_later_fdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Mode
-+	guint8 harq_mode_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_fdd_harq_mode, 1, ENC_BIG_ENDIAN);
-+	if (harq_mode_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid harq mode value [0..4]");
-+	}
-+
-+	// Number of ACK/NACK
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_ack_nack, 2, ENC_BIG_ENDIAN);
-+
-+	if (harq_mode_value == 0)
-+	{
-+		if (!(count >= 1 && count <= 2))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..2]");
-+		}
-+	}
-+	else if (harq_mode_value == 1)
-+	{
-+		if (!(count >= 1 && count <= 4))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..4]");
-+		}
-+
-+	}
-+	else if (harq_mode_value == 2)
-+	{
-+		if (!(count >= 1 && count <= 10))
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [1..10]");
-+		}
-+	}
-+	else if (harq_mode_value == 3 || harq_mode_value == 4)
-+	{
-+		if (count < 22)
-+		{
-+			expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of ack/nack value [>= 22]");
-+		}
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "HARQ TB List", ett_nfapi_harq_data, count, dissect_harq_tb_value);
-+}
-+static void dissect_ul_cqi_information_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// UL_CQI
-+	ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
-+
-+	// Channel
-+	guint8 channel_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_channel, 1, ENC_BIG_ENDIAN);
-+	if (channel_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid channel value [0..1]");
-+	}
-+}
-+static void dissect_crc_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// CRC Flag
-+	guint8 crc_flag_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_crc_flag, 1, ENC_BIG_ENDIAN);
-+	if (crc_flag_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid crc flag value [0..1]");
-+	}
-+}
-+static void dissect_rx_cqi_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	//Length
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+
-+	// Data Offset
-+	ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
-+
-+	// UL_CQI
-+	ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
-+
-+	// RI
-+	guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN);
-+	if (ri_value > 8)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]");
-+	}
-+
-+	// Timing Advance
-+	guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_value > 8)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]");
-+	}
-+}
-+static void dissect_ri_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// RI
-+	guint8 ri_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ri, 1, ENC_BIG_ENDIAN);
-+	if (ri_value > 8)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ri value [0..8]");
-+	}
-+}
-+static void dissect_rx_cqi_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Length
-+	ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+
-+	// Data Offset
-+	ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
-+
-+	// UL_CQI
-+	ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of CC reported
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_cc_reported, 1, ENC_BIG_ENDIAN);
-+	if (!(count >= 1 && count <= 5))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of CC reported value [1..5]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "CC List", ett_nfapi_cc, count, dissect_ri_value);
-+
-+	// Timing Advance
-+	guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..63]");
-+	}
-+
-+	// Timing Advance R9
-+	guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_r9_value > 7690)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]");
-+	}
-+}
-+static void dissect_rach_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// RNTI
-+	guint16 rnti_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_rnti, 2, ENC_BIG_ENDIAN);
-+	if (rnti_value < 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rnti value [1..65535]");
-+	}
-+
-+	// Preamble
-+	guint8 preamble_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_preamble, 1, ENC_BIG_ENDIAN);
-+	if (preamble_value > 63)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid preamble value [0..63]");
-+	}
-+
-+	// Timing Advance
-+	guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_value > 1282)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]");
-+	}
-+
-+}
-+static void dissect_rach_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Timing Advance R9
-+	guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_r9_value > 7690)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]");
-+	}
-+}
-+static void dissect_rach_indication_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// RACH resource type
-+	guint8 rach_resource_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_rach_resource_type, 1, ENC_BIG_ENDIAN);
-+	if (rach_resource_type_value > 4)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid rach resource type value [0..4]");
-+	}
-+}
-+static void dissect_snr_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// SNR
-+	ptvcursor_add(ptvc, hf_nfapi_snr, 1, ENC_BIG_ENDIAN);
-+}
-+static void dissect_srs_indication_rel8_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Doppler estimation
-+	ptvcursor_add(ptvc, hf_nfapi_doppler_estimation, 2, ENC_BIG_ENDIAN);
-+
-+	// Timing Advance
-+	guint16 timing_advance_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_value > 1282)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..1282]");
-+	}
-+
-+	// Number of resource blocks
-+	guint8 count = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_resource_blocks, 1, ENC_BIG_ENDIAN);
-+
-+	// RB start
-+	ptvcursor_add(ptvc, hf_nfapi_rb_start, 1, ENC_BIG_ENDIAN);
-+
-+
-+	dissect_array_value(ptvc, pinfo, "RB List", ett_nfapi_rbs, count, dissect_snr_value);
-+}
-+static void dissect_srs_indication_rel9_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Timing Advance R9
-+	guint16 timing_advance_r9_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_timing_advance_r9, 2, ENC_BIG_ENDIAN);
-+	if (timing_advance_r9_value > 7690)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid timing advance value [0..7690]");
-+	}
-+}
-+static void dissect_srs_indication_rel10_tdd_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// UpPTS Symbol
-+	guint8 uppts_symbol_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_up_pts_symbol, 1, ENC_BIG_ENDIAN);
-+	if (uppts_symbol_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid up pts symbol value [0..1]");
-+	}
-+
-+}
-+static void dissect_tdd_channel_measurement_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint16 i = 0;
-+	guint16 j = 0;
-+
-+	// numPRBperSubband
-+	ptvcursor_add(ptvc, hf_nfapi_number_prb_per_subband, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of subbands
-+	guint8 num_subbands = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_subbands, 1, ENC_BIG_ENDIAN);
-+
-+	// numAntennas
-+	guint8 num_phy_ant = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_antennas, 1, ENC_BIG_ENDIAN);
-+
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "Subbands");
-+
-+	for (i = 0; i < num_subbands; ++i)
-+	{
-+		ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_subbands, "[%d]", i);
-+
-+		// subbandIndex
-+		ptvcursor_add(ptvc, hf_nfapi_subband_index, 1, ENC_BIG_ENDIAN);
-+
-+		ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "Physical Antennas");
-+
-+		for (j = 0; j < num_phy_ant; ++j)
-+		{
-+			ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_antennas, "[%d]", j);
-+
-+			// Channel
-+			ptvcursor_add(ptvc, hf_nfapi_channel_coefficient, 2, ENC_BIG_ENDIAN);
-+
-+			ptvcursor_pop_subtree(ptvc);
-+		}
-+
-+		ptvcursor_pop_subtree(ptvc);
-+
-+		ptvcursor_pop_subtree(ptvc);
-+	}
-+
-+	ptvcursor_pop_subtree(ptvc);
-+}
-+static void dissect_srs_indication_rel11_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	//UL_RTOA
-+	guint16 ul_rtoa_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_ul_rtoa, 2, ENC_BIG_ENDIAN);
-+	if (ul_rtoa_value > 4800)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid ul rtoa value [0..4800]");
-+	}
-+}
-+static void dissect_lbt_dl_config_request_pdsch_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// nCCA
-+	ptvcursor_add(ptvc, hf_nfapi_mp_cca, 4, ENC_BIG_ENDIAN);
-+
-+	// NCCA
-+	ptvcursor_add(ptvc, hf_nfapi_n_cca, 4, ENC_BIG_ENDIAN);
-+
-+	// Offset
-+	guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN);
-+	if (ul_rtoa_value > 999)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]");
-+	}
-+
-+	// LTE TXOP SF
-+	ptvcursor_add(ptvc, hf_nfapi_lte_txop_sf, 4, ENC_BIG_ENDIAN);
-+
-+	// TXOP SFN/SF End
-+	ptvcursor_add(ptvc, hf_nfapi_txop_sfn_sf_end, 2, ENC_BIG_ENDIAN);
-+
-+	// LBT mode
-+	guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN);
-+	if (lbt_mode > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]");
-+	}
-+}
-+static void dissect_lbt_dl_config_request_drs_req_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// Offset
-+	guint32 ul_rtoa_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_offset, 4, ENC_BIG_ENDIAN);
-+	if (ul_rtoa_value > 999)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..999]");
-+	}
-+
-+	// SFN/SF End
-+	ptvcursor_add(ptvc, hf_nfapi_sfn_sf_end, 2, ENC_BIG_ENDIAN);
-+
-+	// LBT mode
-+	guint32 lbt_mode = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_lbt_mode, 4, ENC_BIG_ENDIAN);
-+	if (lbt_mode > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid offset value [0..1]");
-+	}
-+}
-+static void dissect_lbt_dl_config_request_pdsch_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// result
-+	guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN);
-+	if (result_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]");
-+	}
-+
-+	// LTE TXOP symbols
-+	ptvcursor_add(ptvc, hf_nfapi_txop_symbols, 4, ENC_BIG_ENDIAN);
-+
-+	// Initial Partial SF
-+	guint32 initial_partial_sf_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_initial_partial_sf, 4, ENC_BIG_ENDIAN);
-+	if (initial_partial_sf_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid initial partial sf value [0..1]");
-+	}
-+}
-+static void dissect_lbt_dl_config_request_drs_resp_rel13_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// Handle
-+	ptvcursor_add(ptvc, hf_nfapi_handle, 4, ENC_BIG_ENDIAN);
-+
-+	// result
-+	guint32 result_value = tvb_get_guint32(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), ENC_BIG_ENDIAN);
-+	item = ptvcursor_add(ptvc, hf_nfapi_result, 4, ENC_BIG_ENDIAN);
-+	if (result_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid result value [0..1]");
-+	}
-+}
-+static void dissect_tx_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PDU length
-+	guint16 len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_length, 2, ENC_BIG_ENDIAN);
-+
-+	// PDU index
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_index, 2, ENC_BIG_ENDIAN);
-+
-+	// PDU#N
-+	ptvcursor_add(ptvc, hf_nfapi_pdu, len, ENC_NA);
-+}
-+static void dissect_tx_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of PDUs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "TX PDU List", ett_nfapi_tx_request_pdu_list, num_pdu, dissect_tx_pdu);
-+}
-+static void dissect_harq_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Instance Length
-+	guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN);
-+
-+	guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
-+	dissect_tlv_list(ptvc, pinfo, instance_end);
-+}
-+static void dissect_harq_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of HARQs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_harqs, 2, ENC_BIG_ENDIAN);
-+
-+
-+	dissect_array_value(ptvc, pinfo, "HARQ PDU List", ett_nfapi_harq_indication_pdu_list, num_pdu, dissect_harq_indication_pdu);
-+}
-+static void dissect_crc_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Instance Length
-+	guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN);
-+
-+	guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
-+	dissect_tlv_list(ptvc, pinfo, instance_end);
-+}
-+static void dissect_crc_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of CRCs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_crcs, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "CRC PDU List", ett_nfapi_crc_indication_pdu_list, num_pdu, dissect_crc_indication_pdu);
-+}
-+static void dissect_sr_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Instance Length
-+	guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN);
-+
-+	guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
-+	dissect_tlv_list(ptvc, pinfo, instance_end);
-+}
-+static void dissect_rx_sr_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of SRs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_srs, 2, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "SR PDU List", ett_nfapi_sr_indication_pdu_list, num_pdu, dissect_sr_indication_pdu);
-+}
-+static void dissect_cqi_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Instance Length
-+	guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN);
-+
-+	guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
-+	dissect_tlv_list(ptvc, pinfo, instance_end);
-+}
-+static void dissect_rx_cqi_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of PDUs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_cqi, 2, ENC_BIG_ENDIAN);
-+
-+	guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), num_pdu * 2);
-+	memset(lengths, 0, num_pdu * 2);
-+
-+	tvbuff_t* tvb = ptvcursor_tvbuff(ptvc);
-+	guint8 tmp_offset = ptvcursor_current_offset(ptvc);
-+
-+	int i = 0;
-+	for (i = 0; i < num_pdu; ++i)
-+	{
-+		guint16 instance_len = tvb_get_ntohs(tvb, tmp_offset);
-+		tmp_offset += 2;
-+		guint8 pdu_end = tmp_offset + instance_len;
-+
-+		while (tmp_offset < pdu_end)
-+		{
-+			guint16 tlv_id = tvb_get_ntohs(tvb, tmp_offset);
-+			tmp_offset += 2;
-+			guint16 tlv_len = tvb_get_ntohs(tvb, tmp_offset);
-+			tmp_offset += 2;
-+
-+			if (tlv_id == 0x202F)
-+			{
-+				lengths[i] = tvb_get_ntohs(tvb, tmp_offset);
-+			}
-+			else if (tlv_id == 0x2030)
-+			{
-+				lengths[i] = tvb_get_ntohs(tvb, tmp_offset);
-+			}
-+
-+			tmp_offset += tlv_len;
-+		}
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "CQI PDU List", ett_nfapi_cqi_indication_pdu_list, num_pdu, dissect_cqi_indication_pdu);
-+
-+	for (i = 0; i < num_pdu; ++i)
-+	{
-+		ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA);
-+	}
-+}
-+static void dissect_preamble_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Instance Length
-+	guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN);
-+
-+	guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
-+	dissect_tlv_list(ptvc, pinfo, instance_end);
-+}
-+static void dissect_rach_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of Preambles
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_preambles, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "Preamble PDU List", ett_nfapi_preamble_indication_pdu_list, num_pdu, dissect_preamble_indication_pdu);
-+}
-+static void dissect_srs_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Instance Length
-+	guint16 instance_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_instance_length, 2, ENC_BIG_ENDIAN);
-+	guint instance_end = (ptvcursor_current_offset(ptvc) + instance_len - 2);
-+	dissect_tlv_list(ptvc, pinfo, instance_end);
-+}
-+static void dissect_srs_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of UEs
-+	guint8 num_pdu = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_srss, 1, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "SRS PDU List", ett_nfapi_srs_indication_pdu_list, num_pdu, dissect_srs_indication_pdu);
-+}
-+static void dissect_lbt_dl_config_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PDU Type
-+	guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_req_pdu_type, 1, ENC_BIG_ENDIAN);
-+	if (pdu_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]");
-+	}
-+
-+	guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN);
-+	guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
-+
-+	dissect_tlv_list(ptvc, pinfo, pdu_end);
-+}
-+static void dissect_lbt_dl_config_request_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of  PDUs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN);
-+	if (!(num_pdu >= 1 && num_pdu <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_config_pdu_list, num_pdu, dissect_lbt_dl_config_pdu);
-+}
-+static void dissect_lbt_dl_indication_pdu(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PDU Type
-+	guint8 pdu_type_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_lbt_dl_ind_pdu_type, 1, ENC_BIG_ENDIAN);
-+	if (pdu_type_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid pdu type value [0..1]");
-+	}
-+
-+	// PDU Size
-+	guint8 size = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pdu_size, 1, ENC_BIG_ENDIAN);
-+	guint pdu_end = (ptvcursor_current_offset(ptvc) + size - 2);
-+	dissect_tlv_list(ptvc, pinfo, pdu_end);
-+}
-+static void dissect_lbt_indication_message_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of  PDUs
-+	guint16 num_pdu = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN);
-+	if (!(num_pdu >= 1 && num_pdu <= 2))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of pdus value [1..2]");
-+	}
-+
-+	dissect_array_value(ptvc, pinfo, "LBT DL PDU List", ett_nfapi_lbt_dl_indication_pdu_list, num_pdu, dissect_lbt_dl_indication_pdu);
-+}
-+static void dissect_lte_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Frequency Band Indicator
-+	ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN);
-+
-+	// Measurement Period
-+	ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN);
-+
-+	// Bandwidth
-+	guint8 bandwidth_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 1, ENC_BIG_ENDIAN);
-+	if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 ||
-+		bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]");
-+	}
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+
-+	// Number of EARFCNs
-+	guint8 num_earfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_earfcns, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "EARFCNs", ett_nfapi_earfcn_list, num_earfcns, dissect_earfcn_value);
-+}
-+static void dissect_uarfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// UARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_utran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Frequency Band Indicator
-+	ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN);
-+
-+	// Measurement Period
-+	ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+
-+	// Number of UARFCNs
-+	guint8 num_uarfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_uarfcns, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "UARFCNs", ett_nfapi_uarfcn_list, num_uarfcns, dissect_uarfcn_value);
-+}
-+static void dissect_arfcn_dir_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// ARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// Direction
-+	guint8 direction_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_arfcn_direction, 1, ENC_BIG_ENDIAN);
-+	if (direction_value > 1)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid direction value [0..1]");
-+	}
-+
-+}
-+static void dissect_geran_rssi_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Frequency Band Indicator
-+	ptvcursor_add(ptvc, hf_nfapi_frequency_band_indicator, 1, ENC_BIG_ENDIAN);
-+
-+	// Measurement Period
-+	ptvcursor_add(ptvc, hf_nfapi_measurement_period, 2, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+
-+	// Number of ARFCNs
-+	guint8 num_arfcns = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcns, dissect_arfcn_dir_value);
-+}
-+static void dissect_rssi_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// RSSI
-+	ptvcursor_add(ptvc, hf_nfapi_rssi, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_rssi_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of RSSI
-+	guint16 num_rssi = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_rssi, 2, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_rssi_list, num_rssi, dissect_rssi_value);
-+}
-+static void dissect_pci_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PCI
-+	ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_lte_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// EARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// Measurement Bandwidth
-+	ptvcursor_add(ptvc, hf_nfapi_measurement_bandwidth, 1, ENC_BIG_ENDIAN);
-+
-+	// Exhaustive Search
-+	ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+
-+	// Number of PCI
-+	guint8 num_pci = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_pci, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "PCIs", ett_nfapi_pci_list, num_pci, dissect_pci_value);
-+}
-+static void dissect_psc_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PSC
-+	ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_utran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// UARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// Exhaustive Search
-+	ptvcursor_add(ptvc, hf_nfapi_exhaustive_search, 1, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+
-+	// Number of PSC
-+	guint8 num_psc = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_psc, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "PSCs", ett_nfapi_psc_list, num_psc, dissect_psc_value);
-+}
-+static void dissect_arfcn_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// ARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_geran_cell_search_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+
-+	// Number of ARFCN
-+	guint8 num_arfcn = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_arfcns, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "ARFCNs", ett_nfapi_arfcn_list, num_arfcn, dissect_arfcn_value);
-+}
-+
-+static void dissect_lte_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PCI
-+	ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN);
-+
-+	// RSRP
-+	ptvcursor_add(ptvc, hf_nfapi_rsrp, 1, ENC_BIG_ENDIAN);
-+
-+	// RSRQ
-+	ptvcursor_add(ptvc, hf_nfapi_rsrq, 1, ENC_BIG_ENDIAN);
-+
-+	// Frequency Offset
-+	ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_lte_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of LTE Cells Found
-+	guint16 num_lte_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_lte_cells_found, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "LTE Cells Found", ett_nfapi_lte_cells_found_list, num_lte_cells, dissect_lte_cell_found_value);
-+}
-+static void dissect_utran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// PSC
-+	ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN);
-+
-+	// RSCP
-+	ptvcursor_add(ptvc, hf_nfapi_rscp, 1, ENC_BIG_ENDIAN);
-+
-+	// EcN0
-+	ptvcursor_add(ptvc, hf_nfapi_enco, 1, ENC_BIG_ENDIAN);
-+
-+	// Frequency Offset
-+	ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN);
-+}
-+static void dissect_utran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of UTRAN Cells Found
-+	guint16 num_utran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_utran_cells_found, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "UTRAN Cells Found", ett_nfapi_utran_cells_found_list, num_utran_cells, dissect_utran_cell_found_value);
-+}
-+static void dissect_geran_cell_found_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// ARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// BSIC
-+	ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN);
-+
-+	// RxLev
-+	ptvcursor_add(ptvc, hf_nfapi_rxlev, 1, ENC_BIG_ENDIAN);
-+
-+	// RxQual
-+	ptvcursor_add(ptvc, hf_nfapi_rxqual, 1, ENC_BIG_ENDIAN);
-+
-+	// Frequency Offset
-+	ptvcursor_add(ptvc, hf_nfapi_frequency_offset, 2, ENC_BIG_ENDIAN);
-+
-+	// SFN Offset
-+	ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_geran_cell_search_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of GSM Cells Found
-+	guint16 num_geran_cells = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_geran_cells_found, 2, ENC_BIG_ENDIAN);
-+	dissect_array_value(ptvc, pinfo, "GERAN Cells Found", ett_nfapi_geran_cells_found_list, num_geran_cells, dissect_geran_cell_found_value);
-+}
-+static void dissect_pnf_cell_search_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_search_state, len, ENC_NA);
-+}
-+static void dissect_pnf_cell_broadcast_state_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_pnf_broadcast_state, len, ENC_NA);
-+}
-+static void dissect_lte_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// EARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// PCI
-+	ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_utran_broadcast_detect_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// UARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// PSC
-+	ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_lte_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// Number of Tx Antenna
-+	guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]");
-+	}
-+
-+
-+	// MIB Length
-+	guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN);
-+
-+	// MIB[MIB Length]
-+	ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA);
-+
-+	// SFN Offset
-+	ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_utran_broadcast_detect_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// MIB Length
-+	guint16 mib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_mib_length, 2, ENC_BIG_ENDIAN);
-+
-+	// MIB[MIB Length]
-+	ptvcursor_add(ptvc, hf_nfapi_mib, mib_len, ENC_NA);
-+
-+	// SFN Offset
-+	ptvcursor_add(ptvc, hf_nfapi_sfn_offset, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_lte_system_information_schedule_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// EARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// PCI
-+	ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN);
-+
-+	// Bandwidth
-+	guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_bandwidth, 2, ENC_BIG_ENDIAN);
-+	if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 ||
-+		bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]");
-+	}
-+
-+	// PHICH Configuration
-+	// todo : phich bit decode
-+	ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of Tx Antenna
-+	guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]");
-+	}
-+
-+	// retryCount
-+	ptvcursor_add(ptvc, hf_nfapi_retry_count, 1, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_lte_system_information_schedule_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// this needs to be SIB 1
-+	guint len = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_sib1, len, ENC_NA);
-+}
-+static void dissect_si_periodicity_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	proto_item* item;
-+
-+	// SI Periodicity
-+	guint8 si_periodicity_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_si_periodicity, 1, ENC_BIG_ENDIAN);
-+	if (si_periodicity_value > 7)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si periodicity value [0..7]");
-+	}
-+
-+	// SI Index
-+	guint8 si_index_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_si_index, 1, ENC_BIG_ENDIAN);
-+	if (si_index_value > 32)
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si index value [0..32]");
-+	}
-+}
-+
-+static void dissect_lte_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// EARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_earfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// PCI
-+	ptvcursor_add(ptvc, hf_nfapi_pci, 2, ENC_BIG_ENDIAN);
-+
-+	// Downlink channel bandwidth
-+	guint16 bandwidth_value = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_downlink_channel_bandwidth, 2, ENC_BIG_ENDIAN);
-+	if (!(bandwidth_value == 6 || bandwidth_value == 15 || bandwidth_value == 25 ||
-+		bandwidth_value == 50 || bandwidth_value == 75 || bandwidth_value == 100))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid bandwidth value [6, 15, 25, 50, 75, 100]");
-+	}
-+
-+	// PHICH Configuration
-+	ptvcursor_add(ptvc, hf_nfapi_phich_configuration, 1, ENC_BIG_ENDIAN);
-+
-+	// Number of Tx Antenna
-+	guint8 number_of_tx_antenna_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_number_of_tx_antenna, 1, ENC_BIG_ENDIAN);
-+	if (!(number_of_tx_antenna_value == 1 || number_of_tx_antenna_value == 2 || number_of_tx_antenna_value == 4))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid number of tx antenna value [1, 2, 4]");
-+	}
-+
-+	// Number of SI Periodicity
-+	guint8 si_priodicity = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_of_si_periodicity, 1, ENC_BIG_ENDIAN);
-+
-+	dissect_array_value(ptvc, pinfo, "Number SI Periodicity", ett_nfapi_si_periodicity_list, si_priodicity, dissect_si_periodicity_value);
-+
-+	// SI Window Length
-+	guint8 si_window_length_value = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	item = ptvcursor_add(ptvc, hf_nfapi_si_window_length, 1, ENC_BIG_ENDIAN);
-+	if (!(si_window_length_value == 1 || si_window_length_value == 2 || si_window_length_value == 5 || si_window_length_value == 10 ||
-+		  si_window_length_value == 15 || si_window_length_value == 20 || si_window_length_value == 40))
-+	{
-+		expert_add_info_format(pinfo, item, &ei_invalid_range, "Invalid si window length value [1, 2, 5, 10, 15, 20, 40]");
-+	}
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_utran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// UARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_uarfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// PSC
-+	ptvcursor_add(ptvc, hf_nfapi_psc, 2, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_geran_system_information_request_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// ARFCN
-+	ptvcursor_add(ptvc, hf_nfapi_arfcn, 2, ENC_BIG_ENDIAN);
-+
-+	// BSIC
-+	ptvcursor_add(ptvc, hf_nfapi_bsic, 1, ENC_BIG_ENDIAN);
-+
-+	// Timeout
-+	ptvcursor_add(ptvc, hf_nfapi_timeout, 4, ENC_BIG_ENDIAN);
-+}
-+static void dissect_lte_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// SIB Type
-+	ptvcursor_add(ptvc, hf_nfapi_sib_type, 1, ENC_BIG_ENDIAN);
-+
-+	// SIB Length
-+	guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN);
-+
-+	// SIB[SIB Length]
-+	ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA);
-+}
-+static void dissect_utran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// SIB Length
-+	guint16 sib_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_sib_len, 2, ENC_BIG_ENDIAN);
-+
-+	// SIB[SIB Length]
-+	ptvcursor_add(ptvc, hf_nfapi_sib, sib_len, ENC_NA);
-+}
-+static void dissect_geran_system_information_indication_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	// SI Length
-+	guint16 si_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_si_len, 2, ENC_BIG_ENDIAN);
-+
-+	// SI[SI Length]
-+	ptvcursor_add(ptvc, hf_nfapi_si, si_len, ENC_NA);
-+}
-+
-+static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_);
-+
-+// Important the tags must be in numerical order so that they can be indexed correctly
-+const tlv_t nfapi_tags[] =
-+{
-+	{ 0x1000, "PNF Param General", dissect_pnf_param_general_value },
-+	{ 0x1001, "PNF PHY", dissect_pnf_phy_value },
-+	{ 0x1002, "PNF RF", dissect_pnf_rf_value },
-+	{ 0x1003, "PNF PHY RF Config", dissect_pnf_phy_rf_config_value },
-+	{ 0x1004, "DL RS Tx power", dissect_dl_rs_tx_power_value },
-+	{ 0x1005, "Received interference power", dissect_received_interference_power_value },
-+	{ 0x1006, "Thermal noise power", dissect_thermal_noise_power_value },
-+	{ 0x1007, "DL RS TX Power measurement", dissect_dl_rs_tx_power_measurement_value },
-+	{ 0x1008, "Received Interference power measurement", dissect_received_interference_power_measurement_value },
-+	{ 0x1009, "Thermal noise power measurement", dissect_thermal_noise_power_measurement_value },
-+	{ 0x100A, "PNF PHY Rel 10", dissect_pnf_phy_rel10_value },
-+	{ 0x100B, "PNF PHY Rel 11", dissect_pnf_phy_rel11_value },
-+	{ 0x100C, "PNF PHY Rel 12", dissect_pnf_phy_rel12_value },
-+	{ 0x100D, "PNF PHY Rel 13", dissect_pnf_phy_rel13_value },
-+};
-+
-+const tlv_t configuration_tags[] =
-+{
-+	{ 0x0000, NULL, NULL },
-+	{ 0x0001, "Subframe config - Duplex Mode", dissect_duplex_mode_value },
-+	{ 0x0002, "Subframe config - PCFICH power offset TLV", dissect_pcfich_power_offset_value },
-+	{ 0x0003, "Subframe config - P-B", dissect_pb_value },
-+	{ 0x0004, "Subframe config - DL cyclic prefix type", dissect_dl_cyclic_prefix_value },
-+	{ 0x0005, "Subframe config - UL cyclic prefix type", dissect_ul_cyclic_prefix_value },
-+	{ 0x0006, NULL, NULL },
-+	{ 0x0007, NULL, NULL },
-+	{ 0x0008, NULL, NULL },
-+	{ 0x0009, NULL, NULL },
-+	{ 0x000A, "RF config - Downlink channel bandwidth", dissect_dl_channel_bandwidth_value },
-+	{ 0x000B, "RF config - Uplink channel bandwidth", dissect_ul_channel_bandwidth_value },
-+	{ 0x000C, "RF config - Reference signal power", dissect_reference_signal_power_value },
-+	{ 0x000D, "RF config - Tx antenna ports", dissect_tx_antenna_ports_value },
-+	{ 0x000E, "RF config - Rx Antenna ports", dissect_rx_antenna_ports_value },
-+	{ 0x000F, NULL, NULL },
-+	{ 0x0010, NULL, NULL },
-+	{ 0x0011, NULL, NULL },
-+	{ 0x0012, NULL, NULL },
-+	{ 0x0013, NULL, NULL },
-+	{ 0x0014, "PHICH config - PHICH resource", dissect_phich_resource_value },
-+	{ 0x0015, "PHICH config - PHICH duration", dissect_phich_duration_value },
-+	{ 0x0016, "PHICH config - PHICH power offset", dissect_phich_power_offset_value },
-+	{ 0x0017, NULL, NULL },
-+	{ 0x0018, NULL, NULL },
-+	{ 0x0019, NULL, NULL },
-+	{ 0x001A, NULL, NULL },
-+	{ 0x001B, NULL, NULL },
-+	{ 0x001C, NULL, NULL },
-+	{ 0x001D, NULL, NULL },
-+	{ 0x001E, "SCH config - Primary synchronization signal EPRE/EPRERS", dissect_psch_synch_signal_epre_eprers_value },
-+	{ 0x001F, "SCH config - Secondary synchronization signal EPRE/EPRERS", dissect_ssch_synch_signal_epre_eprers_value },
-+	{ 0x0020, "SCH config - Physical Cell Id", dissect_physical_cell_id_value },
-+	{ 0x0021, NULL, NULL },
-+	{ 0x0022, NULL, NULL },
-+	{ 0x0023, NULL, NULL },
-+	{ 0x0024, NULL, NULL },
-+	{ 0x0025, NULL, NULL },
-+	{ 0x0026, NULL, NULL },
-+	{ 0x0027, NULL, NULL },
-+	{ 0x0028, "PRACH config - Configuration index", dissect_prach_configuration_index_value },
-+	{ 0x0029, "PRACH config - Root sequence index", dissect_prach_root_sequence_index_value },
-+	{ 0x002A, "PRACH config - Zero correlation zone configuration", dissect_prach_zero_correlation_zone_configuration_value },
-+	{ 0x002B, "PRACH config - High speed flag", dissect_prach_high_speed_flag_value },
-+	{ 0x002C, "PRACH config - Frequency offset", dissect_prach_frequency_offset_value },
-+	{ 0x002D, NULL, NULL },
-+	{ 0x002E, NULL, NULL },
-+	{ 0x002F, NULL, NULL },
-+	{ 0x0030, NULL, NULL },
-+	{ 0x0031, NULL, NULL },
-+	{ 0x0032, "PUSCH config - Hopping mode", dissect_pusch_hopping_mode_value },
-+	{ 0x0033, "PUSCH config - Hopping offset", dissect_pusch_hopping_offset_value },
-+	{ 0x0034, "PUSCH config - Number of sub-bands", dissect_pusch_number_of_subbands_value },
-+	{ 0x0035, NULL, NULL },
-+	{ 0x0036, NULL, NULL },
-+	{ 0x0037, NULL, NULL },
-+	{ 0x0038, NULL, NULL },
-+	{ 0x0039, NULL, NULL },
-+	{ 0x003A, NULL, NULL },
-+	{ 0x003B, NULL, NULL },
-+	{ 0x003C, "PUCCH config - Delta PUCCH Shift", dissect_pucch_delta_pucch_shift_value },
-+	{ 0x003D, "PUCCH config - N_CQI RB", dissect_pucch_n_cqi_rb_value },
-+	{ 0x003E, "PUCCH config - N_AN CS", dissect_pucch_n_an_cs_value },
-+	{ 0x003F, "PUCCH config - N1Pucch-AN", dissect_pucch_n1_pucch_an_value },
-+	{ 0x0040, NULL, NULL },
-+	{ 0x0041, NULL, NULL },
-+	{ 0x0042, NULL, NULL },
-+	{ 0x0043, NULL, NULL },
-+	{ 0x0044, NULL, NULL },
-+	{ 0x0045, NULL, NULL },
-+	{ 0x0046, "SRS config - Bandwidth configuration", dissect_srs_bandwidth_configuration_value },
-+	{ 0x0047, "SRS config - MaxUpPTS", dissect_srs_max_uppts_value },
-+	{ 0x0048, "SRS config - SRS subframe configuration", dissect_srs_subframe_configuration_value },
-+	{ 0x0049, "SRS config - SRS AckNack SRS simultaneous transmission", dissect_srs_acknack_srs_sim_tx_value },
-+	{ 0x004A, NULL, NULL },
-+	{ 0x004B, NULL, NULL },
-+	{ 0x004C, NULL, NULL },
-+	{ 0x004D, NULL, NULL },
-+	{ 0x004E, NULL, NULL },
-+	{ 0x004F, NULL, NULL },
-+	{ 0x0050, "Uplink reference signal config - Uplink RS hopping", dissect_uplink_rs_hopping_value },
-+	{ 0x0051, "Uplink reference signal config - Group assignment (delta sequence-shift pattern)", dissect_group_assignment_value },
-+	{ 0x0052, "Uplink reference signal config - Cyclic Shift 1 for DMRS", dissect_cyclic_shift_1_for_drms_value },
-+	{ 0x0053, NULL, NULL },
-+	{ 0x0054, NULL, NULL },
-+	{ 0x0055, NULL, NULL },
-+	{ 0x0056, NULL, NULL },
-+	{ 0x0057, NULL, NULL },
-+	{ 0x0058, NULL, NULL },
-+	{ 0x0059, NULL, NULL },
-+	{ 0x005A, "TDD frame structure config - Subframe assignment", dissect_tdd_subframe_assignement_value },
-+	{ 0x005B, "TDD frame structure config - Special sub-frame patterns", dissect_tdd_subframe_patterns_value },
-+	{ 0x005C, NULL, NULL },
-+	{ 0x005D, NULL, NULL },
-+	{ 0x005E, NULL, NULL },
-+	{ 0x005F, NULL, NULL },
-+	{ 0x0060, NULL, NULL },
-+	{ 0x0061, NULL, NULL },
-+	{ 0x0062, NULL, NULL },
-+	{ 0x0063, NULL, NULL },
-+	{ 0x0064, "LAA config - ED Threshold for LBT for PDSCH", dissect_laa_ed_threashold_for_lbt_for_pdsch_value },
-+	{ 0x0065, "LAA config - ED Threshold for LBT for DRS", dissect_laa_ed_threashold_for_lbt_for_drs_value },
-+	{ 0x0066, "LAA config - PD Threshold", dissect_laa_pd_threshold_value },
-+	{ 0x0067, "LAA config - Multi carrier type", dissect_laa_multi_carrier_type_value },
-+	{ 0x0068, "LAA config - Multi carrier TX", dissect_laa_multi_carrier_tx_value },
-+	{ 0x0069, "LAA config - Multi carrier freeze", dissect_laa_multi_carrier_freeze_value },
-+	{ 0x006A, "LAA config - Tx antenna ports for DRS", dissect_laa_tx_antenna_port_for_drs_value },
-+	{ 0x006B, "LAA config - Transmission power for DRS", dissect_laa_transmission_power_for_drs_value },
-+	{ 0x006C, NULL, NULL },
-+	{ 0x006D, NULL, NULL },
-+	{ 0x006E, NULL, NULL },
-+	{ 0x006F, NULL, NULL },
-+	{ 0x0070, NULL, NULL },
-+	{ 0x0071, NULL, NULL },
-+	{ 0x0072, NULL, NULL },
-+	{ 0x0073, NULL, NULL },
-+	{ 0x0074, NULL, NULL },
-+	{ 0x0075, NULL, NULL },
-+	{ 0x0076, NULL, NULL },
-+	{ 0x0077, NULL, NULL },
-+	{ 0x0078, "eMTC config - PBCH Repetitions enable R13", dissect_emtc_pbch_repeitions_enabled_r13_value },
-+	{ 0x0079, "eMTC config - PRACH CAT-M Root sequence index", dissect_emtc_prach_cat_m_root_sequence_index_value },
-+	{ 0x007A, "eMTC config - PRACH CAT-M Zero correlation zone configuration", dissect_emtc_prach_cat_m_zero_correlation_zone_configuration_value },
-+	{ 0x007B, "eMTC config - PRACH CAT-M High speed flag", dissect_emtc_prach_cat_m_high_speed_flag_value },
-+	{ 0x007C, "eMTC config - PRACH CE level #0 Enable", dissect_emtc_prach_ce_level_0_enabled_value },
-+	{ 0x007D, "eMTC config - PRACH CE level #0 Configuration index", dissect_emtc_prach_ce_level_0_configuration_offset_value },
-+	{ 0x007E, "eMTC config - PRACH CE level #0 Frequency offset", dissect_emtc_prach_ce_level_0_frequency_offset_value },
-+	{ 0x007F, "eMTC config - PRACH CE level #0 Number of repetitions per attempt", dissect_emtc_preach_ce_level_0_num_of_repeitions_per_attempt_value },
-+	{ 0x0080, "eMTC config - CE level #0 Starting subframe periodicity", dissect_emtc_ce_level_0_starting_subframe_periodicity_value },
-+	{ 0x0081, "eMTC config - PRACH CE level #0 Hopping Enable", dissect_emtc_preach_ce_level_0_hopping_enabled_value },
-+	{ 0x0082, "eMTC config - PRACH CE level #0 Hopping Offset", dissect_emtc_preach_ce_level_0_hopping_offset_value },
-+	{ 0x0083, "eMTC config - PRACH CE level #1 Enable", dissect_emtc_prach_ce_level_1_enabled_value },
-+	{ 0x0084, "eMTC config - PRACH CE level #1 Configuration index", dissect_emtc_prach_ce_level_1_configuration_offset_value },
-+	{ 0x0085, "eMTC config - PRACH CE level #1 Frequency offset", dissect_emtc_prach_ce_level_1_frequency_offset_value },
-+	{ 0x0086, "eMTC config - PRACH CE level #1 Number of repetitions per attempt", dissect_emtc_preach_ce_level_1_num_of_repeitions_per_attempt_value },
-+	{ 0x0087, "eMTC config - CE level #1 Starting subframe periodicity", dissect_emtc_ce_level_1_starting_subframe_periodicity_value },
-+	{ 0x0088, "eMTC config - PRACH CE level #1 Hopping Enable", dissect_emtc_preach_ce_level_1_hopping_enabled_value },
-+	{ 0x0089, "eMTC config - PRACH CE level #1 Hopping Offset", dissect_emtc_preach_ce_level_1_hopping_offset_value },
-+	{ 0x008A, "eMTC config - PRACH CE level #2 Enable", dissect_emtc_prach_ce_level_2_enabled_value },
-+	{ 0x008B, "eMTC config - PRACH CE level #2 Configuration index", dissect_emtc_prach_ce_level_2_configuration_offset_value },
-+	{ 0x008C, "eMTC config - PRACH CE level #2 Frequency offset", dissect_emtc_prach_ce_level_2_frequency_offset_value },
-+	{ 0x008D, "eMTC config - PRACH CE level #2 Number of repetitions per attempt", dissect_emtc_preach_ce_level_2_num_of_repeitions_per_attempt_value },
-+	{ 0x008E, "eMTC config - CE level #2 Starting subframe periodicity", dissect_emtc_ce_level_2_starting_subframe_periodicity_value },
-+	{ 0x008F, "eMTC config - PRACH CE level #2 Hopping Enable", dissect_emtc_preach_ce_level_2_hopping_enabled_value },
-+	{ 0x0090, "eMTC config - PRACH CE level #2 Hopping Offset", dissect_emtc_preach_ce_level_2_hopping_offset_value },
-+	{ 0x0091, "eMTC config - PRACH CE level #3 Enable", dissect_emtc_prach_ce_level_3_enabled_value },
-+	{ 0x0092, "eMTC config - PRACH CE level #3 Configuration index", dissect_emtc_prach_ce_level_3_configuration_offset_value },
-+	{ 0x0093, "eMTC config - PRACH CE level #3 Frequency offset", dissect_emtc_prach_ce_level_3_frequency_offset_value },
-+	{ 0x0094, "eMTC config - PRACH CE level #3 Number of repetitions per attempt", dissect_emtc_preach_ce_level_3_num_of_repeitions_per_attempt_value },
-+	{ 0x0095, "eMTC config - CE level #3 Starting subframe periodicity", dissect_emtc_ce_level_3_starting_subframe_periodicity_value },
-+	{ 0x0096, "eMTC config - PRACH CE level #3 Hopping Enable", dissect_emtc_preach_ce_level_3_hopping_enabled_value },
-+	{ 0x0097, "eMTC config - PRACH CE level #3 Hopping Offset", dissect_emtc_preach_ce_level_3_hopping_offset_value },
-+	{ 0x0098, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeA", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_a_value },
-+	{ 0x0099, "eMTC config - PUCCH Interval - ULHoppingConfigCommonModeB", dissect_emtc_pucch_interval_ul_hopping_config_common_mode_b_value },
-+	{ 0x009A, NULL, NULL },
-+	{ 0x009B, NULL, NULL },
-+	{ 0x009C, NULL, NULL },
-+	{ 0x009D, NULL, NULL },
-+	{ 0x009E, NULL, NULL },
-+	{ 0x009F, NULL, NULL },
-+	{ 0x00A0, NULL, NULL },
-+	{ 0x00A1, NULL, NULL },
-+	{ 0x00A2, NULL, NULL },
-+	{ 0x00A3, NULL, NULL },
-+	{ 0x00A4, NULL, NULL },
-+	{ 0x00A5, NULL, NULL },
-+	{ 0x00A6, NULL, NULL },
-+	{ 0x00A7, NULL, NULL },
-+	{ 0x00A8, NULL, NULL },
-+	{ 0x00A9, NULL, NULL },
-+	{ 0x00AA, NULL, NULL },
-+	{ 0x00AB, NULL, NULL },
-+	{ 0x00AC, NULL, NULL },
-+	{ 0x00AD, NULL, NULL },
-+	{ 0x00AE, NULL, NULL },
-+	{ 0x00AF, NULL, NULL },
-+	{ 0x00B0, NULL, NULL },
-+	{ 0x00B1, NULL, NULL },
-+	{ 0x00B2, NULL, NULL },
-+	{ 0x00B3, NULL, NULL },
-+	{ 0x00B4, NULL, NULL },
-+	{ 0x00B5, NULL, NULL },
-+	{ 0x00B6, NULL, NULL },
-+	{ 0x00B7, NULL, NULL },
-+	{ 0x00B8, NULL, NULL },
-+	{ 0x00B9, NULL, NULL },
-+	{ 0x00BA, NULL, NULL },
-+	{ 0x00BB, NULL, NULL },
-+	{ 0x00BC, NULL, NULL },
-+	{ 0x00BD, NULL, NULL },
-+	{ 0x00BE, NULL, NULL },
-+	{ 0x00BF, NULL, NULL },
-+	{ 0x00C0, NULL, NULL },
-+	{ 0x00C1, NULL, NULL },
-+	{ 0x00C2, NULL, NULL },
-+	{ 0x00C3, NULL, NULL },
-+	{ 0x00C4, NULL, NULL },
-+	{ 0x00C5, NULL, NULL },
-+	{ 0x00C6, NULL, NULL },
-+	{ 0x00C7, NULL, NULL },
-+	{ 0x00C8, "Layer 2/3 - Downlink Bandwidth Support", dissect_dl_bandwidth_support_value },
-+	{ 0x00C9, "Layer 2/3 - Uplink Bandwidth Support", dissect_ul_bandwidth_support_value },
-+	{ 0x00CA, "Layer 2/3 - Downlink modulation support", dissect_dl_modulation_value },
-+	{ 0x00CB, "Layer 2/3 - Uplink modulation support", dissect_ul_modulation_value },
-+	{ 0x00CC, "Layer 2/3 - PHY antenna capability", dissect_phy_antenna_capability_value },
-+	{ 0x00CD, "Layer 2/3 - Release capability", dissect_release_capability_value },
-+	{ 0x00CE, "Layer 2/3 - MBSFN capability", dissect_mbsfn_value },
-+	{ 0x00CF, NULL, NULL },
-+	{ 0x00D0, NULL, NULL },
-+	{ 0x00D1, "LAA Capability - LAA support", dissect_laa_support_value },
-+	{ 0x00D2, "LAA Capability - PD sensing LBT support", dissect_laa_pd_sensing_lbt_support_value },
-+	{ 0x00D3, "LAA Capability - Multi carrier LBT support", dissect_laa_multi_carrier_lbt_support_value },
-+	{ 0x00D4, "LAA Capability - Partial SF support", dissect_laa_partial_sf_support_value },
-+	{ 0x00D5, NULL, NULL },
-+	{ 0x00D6, NULL, NULL },
-+	{ 0x00D7, NULL, NULL },
-+	{ 0x00D8, NULL, NULL },
-+	{ 0x00D9, NULL, NULL },
-+	{ 0x00DA, NULL, NULL },
-+	{ 0x00DB, NULL, NULL },
-+	{ 0x00DC, NULL, NULL },
-+	{ 0x00DD, NULL, NULL },
-+	{ 0x00DE, NULL, NULL },
-+	{ 0x00DF, NULL, NULL },
-+	{ 0x00E0, NULL, NULL },
-+	{ 0x00E1, NULL, NULL },
-+	{ 0x00E2, NULL, NULL },
-+	{ 0x00E3, NULL, NULL },
-+	{ 0x00E4, NULL, NULL },
-+	{ 0x00E5, NULL, NULL },
-+	{ 0x00E6, NULL, NULL },
-+	{ 0x00E7, NULL, NULL },
-+	{ 0x00E8, NULL, NULL },
-+	{ 0x00E9, NULL, NULL },
-+	{ 0x00EA, NULL, NULL },
-+	{ 0x00EB, NULL, NULL },
-+	{ 0x00EC, NULL, NULL },
-+	{ 0x00ED, NULL, NULL },
-+	{ 0x00EE, NULL, NULL },
-+	{ 0x00EF, NULL, NULL },
-+	{ 0x00F0, "Layer 2/3 - Data report mode", dissect_data_report_mode_value },
-+	{ 0x00F1, "Layer 2/3 - SFN/SF", dissect_sfn_sf_value },
-+	{ 0x00F2, NULL, NULL },
-+	{ 0x00F3, NULL, NULL },
-+	{ 0x00F4, NULL, NULL },
-+	{ 0x00F5, NULL, NULL },
-+	{ 0x00F6, NULL, NULL },
-+	{ 0x00F7, NULL, NULL },
-+	{ 0x00F8, NULL, NULL },
-+	{ 0x00F9, NULL, NULL },
-+	{ 0x00FA, "Layer 1 - PHY state", dissect_phy_state_value },
-+	{ 0x00FB, NULL, NULL },
-+	{ 0x00FC, NULL, NULL },
-+	{ 0x00FD, NULL, NULL },
-+	{ 0x00FE, NULL, NULL },
-+	{ 0x00FF, NULL, NULL },
-+	{ 0x0100, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv4_value },
-+	{ 0x0101, "NFAPI - P7 VNF Address IPv4", dissect_p7_vnf_address_ipv6_value },
-+	{ 0x0102, "NFAPI - P7 Port", dissect_p7_vnf_port_value },
-+	{ 0x0103, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv4_value },
-+	{ 0x0104, "NFAPI - P7 PNF Address IPv4", dissect_p7_pnf_address_ipv6_value },
-+	{ 0x0105, "NFAPI - P7 Port", dissect_p7_pnf_port_value },
-+	{ 0x0106, NULL, NULL },
-+	{ 0x0107, NULL, NULL },
-+	{ 0x0108, NULL, NULL },
-+	{ 0x0109, NULL, NULL },
-+	{ 0x010A, "NFAPI - Downlink UEs per Subframe", dissect_downlink_ues_per_subframe_value },
-+	{ 0x010B, "NFAPI - Uplink UEs per Subframe", dissect_uplink_ues_per_subframe_value },
-+	{ 0x010C, NULL, NULL },
-+	{ 0x010D, NULL, NULL },
-+	{ 0x010E, NULL, NULL },
-+	{ 0x010F, NULL, NULL },
-+	{ 0x0110, NULL, NULL },
-+	{ 0x0111, NULL, NULL },
-+	{ 0x0112, NULL, NULL },
-+	{ 0x0113, NULL, NULL },
-+	{ 0x0114, "NFAPI - nFAPI RF Bands", dissect_rf_bands_value },
-+	{ 0x0115, NULL, NULL },
-+	{ 0x0116, NULL, NULL },
-+	{ 0x0117, NULL, NULL },
-+	{ 0x0118, NULL, NULL },
-+	{ 0x0119, NULL, NULL },
-+	{ 0x011A, NULL, NULL },
-+	{ 0x011B, NULL, NULL },
-+	{ 0x011C, NULL, NULL },
-+	{ 0x011D, NULL, NULL },
-+	{ 0x011E, "NFAPI - Timing window", dissect_timing_window_value },
-+	{ 0x011F, "NFAPI - Timing info mode", dissect_timing_info_mode_value },
-+	{ 0x0120, "NFAPI - Timing info period", dissect_timing_info_period_value },
-+	{ 0x0121, NULL, NULL },
-+	{ 0x0122, NULL, NULL },
-+	{ 0x0123, NULL, NULL },
-+	{ 0x0124, NULL, NULL },
-+	{ 0x0125, NULL, NULL },
-+	{ 0x0126, NULL, NULL },
-+	{ 0x0127, NULL, NULL },
-+	{ 0x0128, "NFAPI - Maximum Transmit Power", dissect_maximum_transmit_power_value },
-+	{ 0x0129, "NFAPI - EARFCN", dissect_earfcn_value },
-+	{ 0x012A, NULL, NULL },
-+	{ 0x012B, NULL, NULL },
-+	{ 0x012C, NULL, NULL },
-+	{ 0x012D, NULL, NULL },
-+	{ 0x012E, NULL, NULL },
-+	{ 0x012F, NULL, NULL },
-+	{ 0x0130, "NFAPI - NMM GSM Frequency Bands", dissect_nmm_gsm_frequency_bands_value },
-+	{ 0x0131, "NFAPI - NMM UMTS Frequency Bands", dissect_nmm_umts_frequency_bands_value },
-+	{ 0x0132, "NFAPI - NMM LTE Frequency Bands", dissect_nmm_lte_frequency_bands_value },
-+	{ 0x0133, "NFAPI - NMM Uplink RSSI supported", dissect_nmm_uplink_rssi_supported_value },
-+};
-+
-+const tlv_t p7_tags[] =
-+{
-+	{ 0x2000, "DL Config Request Body", dissect_dl_config_request_body_value },
-+	{ 0x2001, "DL DCI PDU Release 8", dissect_dl_config_request_dl_dci_pdu_rel8_value },
-+	{ 0x2002, "DL DCI PDU Release 9", dissect_dl_config_request_dl_dci_pdu_rel9_value },
-+	{ 0x2003, "DL DCI PDU Release 10", dissect_dl_config_request_dl_dci_pdu_rel10_value },
-+	{ 0x2004, "BCH PDU Release 8", dissect_dl_config_request_bch_pdu_rel8_value },
-+	{ 0x2005, "MCH PDU Release 8", dissect_dl_config_request_mch_pdu_rel8_value },
-+	{ 0x2006, "DLSCH PDU Release 8", dissect_dl_config_request_dlsch_pdu_rel8_value },
-+	{ 0x2007, "DLSCH PDU Release 9", dissect_dl_config_request_dlsch_pdu_rel9_value },
-+	{ 0x2008, "DLSCH PDU Release 10", dissect_dl_config_request_dlsch_pdu_rel10_value },
-+	{ 0x2009, "PCH PDU Release 8", dissect_dl_config_request_pch_pdu_rel8_value },
-+	{ 0x200A, "PRS PDU Release 9", dissect_dl_config_request_prs_pdu_rel9_value },
-+	{ 0x200B, "CSI-RS PDU Release 10", dissect_dl_config_request_csi_rs_pdu_rel10_value },
-+	{ 0x200C, "UL Config Request Body", dissect_ul_config_request_body_value },
-+	{ 0x200D, "ULSCH PDU Release 8", dissect_ul_config_ulsch_pdu_rel8_value },
-+	{ 0x200E, "ULSCH PDU Release 10", dissect_ul_config_ulsch_pdu_rel10_value },
-+	{ 0x200F, "Initial Transmission Parameters Release 8", dissect_ul_config_init_tx_params_rel8_value },
-+	{ 0x2010, "CQI RI Information Release 8", dissect_ul_config_cqi_ri_info_rel8_value },
-+	{ 0x2011, "CQI RI Information Release 9 or later", dissect_ul_config_cqi_ri_info_rel9_later_value },
-+	{ 0x2012, "HARQ Information (ULSCH) Release 10", dissect_ul_config_harq_info_ulsch_rel10_value },
-+	{ 0x2013, "UE Information Release 8", dissect_ul_config_ue_info_rel8_value },
-+	{ 0x2014, "CQI Information Release 8", dissect_ul_config_cqi_info_rel8_value },
-+	{ 0x2015, "CQI Information Release 10", dissect_ul_config_cqi_info_rel10_value },
-+	{ 0x2016, "SR Information Release 8", dissect_ul_config_sr_info_rel8_value },
-+	{ 0x2017, "SR Information Release 10", dissect_ul_config_sr_info_rel10_value },
-+	{ 0x2018, "HARQ Information (UCI) Release 10 TDD", dissect_ul_config_harq_info_uci_rel10_tdd_value },
-+	{ 0x2019, "HARQ Information (UCI) Release 8 FDD", dissect_ul_config_harq_info_uci_rel8_fdd_value },
-+	{ 0x201A, "HARQ Information (UCI) Release 9 or later FDD", dissect_ul_config_harq_info_uci_rel9_later_fdd_value },
-+	{ 0x201B, "SRS Information Release 8", dissect_ul_config_srs_info_rel8_value },
-+	{ 0x201C, "SRS Information Release 10", dissect_ul_config_srs_info_rel10_value },
-+	{ 0x201D, "HI DCI0 Request Body", dissect_hi_dci0_request_body_value },
-+	{ 0x201E, "HI PDU Release 8", dissect_hi_dci0_hi_rel8_value },
-+	{ 0x201F, "HI PDU Release 10", dissect_hi_dci0_hi_rel10_value },
-+	{ 0x2020, "DCI UL PDU Release 8", dissect_hi_dci0_dci_ul_rel8_value },
-+	{ 0x2021, "DCI UL PDU Release 10", dissect_hi_dci0_dci_ul_rel10_value },
-+	{ 0x2022, "Tx Request Body", dissect_tx_request_body_value },
-+	{ 0x2023, "RX Indication Body", dissect_rx_indication_body_value },
-+	{ 0x2024, "RX PDU Release 8", dissect_rx_indication_rel8_value },
-+	{ 0x2025, "RX PDU Release 9", dissect_rx_indication_rel9_value },
-+	{ 0x2026, "HARQ Indication Body", dissect_harq_indication_body_value },
-+	{ 0x2027, "HARQ PDU Release 8 TDD", dissect_harq_indication_rel8_tdd_value },
-+	{ 0x2028, "HARQ PDU Release 9 or later TDD", dissect_harq_indication_rel9_later_tdd_value },
-+	{ 0x2029, "HARQ PDU Release 8 FDD", dissect_harq_indication_rel8_fdd_value },
-+	{ 0x202A, "HARQ PDU Release 9 or later FDD", dissect_harq_indication_rel9_later_fdd_value },
-+	{ 0x202B, "CRC Indication Body", dissect_crc_indication_body_value },
-+	{ 0x202C, "CRC PDU Release 8", dissect_crc_indication_rel8_value },
-+	{ 0x202D, "RX SR Indication Body", dissect_rx_sr_indication_body_value },
-+	{ 0x202E, "RX CQI Indication Body", dissect_rx_cqi_indication_body_value },
-+	{ 0x202F, "CQI PDU Release 8", dissect_rx_cqi_indication_rel8_value },
-+	{ 0x2030, "CQI PDU Release 9", dissect_rx_cqi_indication_rel9_value },
-+	{ 0x2031, "RACH Indication Body", dissect_rach_indication_body_value },
-+	{ 0x2032, "Preamable PDU Release 8", dissect_rach_indication_rel8_value },
-+	{ 0x2033, "Preamable PDU Release 9", dissect_rach_indication_rel9_value },
-+	{ 0x2034, "SRS Indication Body", dissect_srs_indication_body_value },
-+	{ 0x2035, "SRS PDU Release 8", dissect_srs_indication_rel8_value },
-+	{ 0x2036, "SRS PDU Release 9", dissect_srs_indication_rel9_value },
-+	{ 0x2037, "SRS PDU Release 10 TDD", dissect_srs_indication_rel10_tdd_value },
-+	{ 0x2038, "RX UE Information", dissect_rx_ue_info_value },
-+	{ 0x2039, "DL DCI PDU Release 11", dissect_dl_config_request_dl_dci_pdu_rel11_value },
-+	{ 0x203A, "DL DCI PDU Release 12", dissect_dl_config_request_dl_dci_pdu_rel12_value },
-+	{ 0x203B, "DL DCI PDU Release 13", dissect_dl_config_request_dl_dci_pdu_rel13_value },
-+	{ 0x203C, "DLSCH PDU Release 11", dissect_dl_config_request_dlsch_pdu_rel11_value },
-+	{ 0x203D, "DLSCH PDU Release 12", dissect_dl_config_request_dlsch_pdu_rel12_value },
-+	{ 0x203E, "DLSCH PDU Release 13", dissect_dl_config_request_dlsch_pdu_rel13_value },
-+	{ 0x203F, "PCH PDU Release 13", dissect_dl_config_request_pch_pdu_rel13_value },
-+	{ 0x2040, "CSI-RS PDU Release 13", dissect_dl_config_request_csi_rs_pdu_rel13_value },
-+	{ 0x2041, "EDPCCH PDU Release 11 Parameters", dissect_dl_config_request_edpcch_params_rel11_value },
-+	{ 0x2042, "EDPCCH PDU Release 13 Parameters", dissect_dl_config_request_edpcch_params_rel13_value },
-+	{ 0x2043, "ULSCH PDU Release 11", dissect_ul_config_ulsch_pdu_rel11_value },
-+	{ 0x2044, "ULSCH PDU Release 13", dissect_ul_config_ulsch_pdu_rel13_value },
-+	{ 0x2045, "CQI RI Information Release 13", dissect_ul_config_cqi_ri_info_rel13_value },
-+	{ 0x2046, "HARQ Information (ULSCH) Release 13", dissect_ul_config_harq_info_ulsch_rel13_value },
-+	{ 0x2047, "UE Information Release 11", dissect_ul_config_ue_info_rel11_value },
-+	{ 0x2048, "UE Information Release 13", dissect_ul_config_ue_info_rel13_value },
-+	{ 0x2049, "CQI Information Release 13", dissect_ul_config_cqi_info_rel13_value },
-+	{ 0x204A, "HARQ Information (UCI) Release 11 FDD/TDD", dissect_ul_config_harq_info_uci_rel11_fdd_tdd_value },
-+	{ 0x204B, "HARQ Information (UCI) Release 13 FDD/TDD", dissect_ul_config_harq_info_uci_rel13_fdd_tdd_value },
-+	{ 0x204C, "SRS Information Release 13", dissect_ul_config_srs_info_rel13_value },
-+	{ 0x204D, "DCI UL PDU Release 12", dissect_hi_dci0_dci_ul_rel12_value },
-+	{ 0x204E, "MDPCCH DCI UL PDU Release 13", dissect_hi_dci0_mdpcch_dci_ul_rel13_value },
-+	{ 0x204F, "HARQ PDU Release 13 or later TDD", dissect_harq_indication_rel13_later_tdd_value },
-+	{ 0x2050, "HARQ PDU Release 13 or later FDD", dissect_harq_indication_rel13_later_fdd_value },
-+	{ 0x2051, "Preamable PDU Release 13", dissect_rach_indication_rel13_value },
-+	{ 0x2052, "UL CQI Information", dissect_ul_cqi_information_value },
-+	{ 0x2053, "SRS PDU Release 11", dissect_srs_indication_rel11_value },
-+	{ 0x2054, "TDD Channel Measurement", dissect_tdd_channel_measurement_value },
-+	{ 0x2055, "LBT DL Config Request Body", dissect_lbt_dl_config_request_body_value },
-+	{ 0x2056, "LBT PDSCH Req PDU Release 13", dissect_lbt_dl_config_request_pdsch_req_rel13_value },
-+	{ 0x2057, "LBT DRS req PDU Release 13", dissect_lbt_dl_config_request_drs_req_rel13_value },
-+	{ 0x2058, "LBT DL Indication Message Body", dissect_lbt_indication_message_body_value },
-+	{ 0x2059, "LBT PDSCH Resp PDU Release 13", dissect_lbt_dl_config_request_pdsch_resp_rel13_value },
-+	{ 0x205A, "LBT DRS Resp PDU Release 13", dissect_lbt_dl_config_request_drs_resp_rel13_value },
-+	{ 0x205B, "MPDCCH PDU Release 13", dissect_dl_config_request_mpdpcch_pdu_rel13_value },
-+};
-+
-+const tlv_t p4_tags[] =
-+{
-+	{ 0x3000, "LTE RSSI Request", dissect_lte_rssi_request_value },
-+	{ 0x3001, "UTRAN RSSI Request", dissect_utran_rssi_request_value },
-+	{ 0x3002, "GERAN RSSI Request", dissect_geran_rssi_request_value },
-+	{ 0x3003, "RSSI Indication", dissect_rssi_indication_value },
-+	{ 0x3004, "LTE CELL SEARCH Request", dissect_lte_cell_search_value },
-+	{ 0x3005, "UTRAN CELL SEARCH Request", dissect_utran_cell_search_value },
-+	{ 0x3006, "GERAN CELL SEARCH Request", dissect_geran_cell_search_value },
-+	{ 0x3007, "LTE CELL SEARCH Indication", dissect_lte_cell_search_indication_value },
-+	{ 0x3008, "UTRAN CELL SEARCH Indication", dissect_utran_cell_search_indication_value },
-+	{ 0x3009, "GERAN CELL SEARCH Indication", dissect_geran_cell_search_indication_value },
-+	{ 0x300A, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value },
-+	{ 0x300B, "LTE BROADCAST DETECT Request", dissect_lte_broadcast_detect_request_value },
-+	{ 0x300C, "UTRAN BROADCAST DETECT Request", dissect_utran_broadcast_detect_request_value },
-+	{ 0x300D, "PNF CELL SEARCH STATE", dissect_pnf_cell_search_state_value },
-+	{ 0x300E, "LTE BROADCAST DETECT Indication", dissect_lte_broadcast_detect_indication_value },
-+	{ 0x300F, "UTRAN BROADCAST DETECT Indication", dissect_utran_broadcast_detect_indication_value },
-+	{ 0x3010, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value },
-+	{ 0x3011, "LTE SYSTEM INFORMATION SCHEDULE Request", dissect_lte_system_information_schedule_request_value },
-+	{ 0x3012, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value },
-+	{ 0x3013, "LTE SYSTEM INFORMATION SCHEDULE Indication", dissect_lte_system_information_schedule_indication_value },
-+	{ 0x3014, "LTE SYSTEM INFORMATION Request", dissect_lte_system_information_request_value },
-+	{ 0x3015, "UTRAN SYSTEM INFORMATION Request", dissect_utran_system_information_request_value },
-+	{ 0x3016, "GERAN SYSTEM INFORMATION Request", dissect_geran_system_information_request_value },
-+	{ 0x3017, "PNF CELL BROADCAST STATE", dissect_pnf_cell_broadcast_state_value },
-+	{ 0x3018, "LTE SYSTEM INFORMATION Indication", dissect_lte_system_information_indication_value },
-+	{ 0x3019, "UTRAN SYSTEM INFORMATION Indication", dissect_utran_system_information_indication_value },
-+	{ 0x301A, "GERAN SYSTEM INFORMATION Indication", dissect_geran_system_information_indication_value },
-+};
-+
-+
-+static const tlv_t* look_up_tlv(int tag_id)
-+{
-+	const tlv_t* tlv = NULL;
-+
-+	static const gint num_configuration_tags = sizeof(configuration_tags) / sizeof(tlv_t);
-+	static const gint num_nfapi_tags = sizeof(nfapi_tags) / sizeof(tlv_t);
-+	static const gint num_p7_tags = sizeof(p7_tags) / sizeof(tlv_t);
-+	static const gint num_p4_tags = sizeof(p4_tags) / sizeof(tlv_t);
-+
-+	if (tag_id >= 0x0000 && tag_id <= (0x0000 + num_configuration_tags - 1)) // 0x0133)
-+	{
-+		tlv = &configuration_tags[tag_id];
-+	}
-+	else if (tag_id >= 0x1000 && tag_id <= (0x1000 + num_nfapi_tags - 1)) // 0x100D)
-+	{
-+		tlv = &nfapi_tags[tag_id - 0x1000];
-+	}
-+	else if (tag_id >= 0x2000 && tag_id <= (0x2000 + num_p7_tags - 1)) //0x205B)
-+	{
-+		tlv = &p7_tags[tag_id - 0x2000];
-+	}
-+	else if (tag_id >= 0x3000 && tag_id <= (0x3000 + num_p4_tags - 1)) // 0x301A)
-+	{
-+		tlv = &p4_tags[tag_id - 0x3000];
-+	}
-+	return tlv;
-+}
-+
-+
-+static proto_item* dissect_tl_header(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tl, "TL");
-+	ptvcursor_add(ptvc, hf_nfapi_tl_tag, 2, ENC_BIG_ENDIAN);
-+	proto_item* item = ptvcursor_add(ptvc, hf_nfapi_tl_length, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_pop_subtree(ptvc);
-+
-+	return item;
-+}
-+
-+static void dissect_tlv_list(ptvcursor_t* ptvc, packet_info* pinfo, gint len)
-+{
-+	while (ptvcursor_current_offset(ptvc) < len)
-+	{
-+		guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+		guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2);
-+
-+		const tlv_t* tlv = look_up_tlv(tlv_id);
-+
-+		if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id)
-+		{
-+			ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "%s", tlv->name);
-+			proto_item* tlv_length_item = dissect_tl_header(ptvc, pinfo);
-+
-+			// There are rare cases where the len of the tlv is 0.
-+			if (tlv_len > 0)
-+			{
-+
-+				if (tlv->decode != NULL)
-+				{
-+					// Create a sub buff with the correct length, so we can detect reading off the end
-+					tvbuff_t* sub_tvbuff = tvb_new_subset_length(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc), tlv_len);
-+					ptvcursor_t* sub_ptvc = ptvcursor_new(ptvcursor_tree(ptvc), sub_tvbuff, 0);
-+
-+					tlv->decode(sub_ptvc, pinfo);
-+
-+					if (ptvcursor_current_offset(sub_ptvc) != tlv_len)
-+					{
-+						// error in the tlv length
-+						expert_add_info_format(pinfo, tlv_length_item, &ei_invalid_tlv_length, "TLV length does not match decoded length");
-+					}
-+
-+					ptvcursor_free(sub_ptvc);
-+				}
-+
-+				ptvcursor_advance(ptvc, tlv_len);
-+			}
-+
-+			ptvcursor_pop_subtree(ptvc);
-+		}
-+		else
-+		{
-+			if (tlv_id >= 0xF000 /* && tlv_id <= 0xFFFF*/)
-+			{
-+				ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown Vendor Extension Tag");
-+			}
-+			else
-+			{
-+				ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_tlv_tree, "Unknown");
-+			}
-+
-+			dissect_tl_header(ptvc, pinfo);
-+			ptvcursor_advance(ptvc, tlv_len);
-+			ptvcursor_pop_subtree(ptvc);
-+		}
-+	}
-+}
-+
-+
-+static void dissect_rx_indication_body_value(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	guint number_of_pdu_addr = ptvcursor_current_offset(ptvc); // *offset;
-+	guint16 count = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_number_pdus, 2, ENC_BIG_ENDIAN);
-+
-+	guint16* lengths = (guint16*)wmem_alloc0(wmem_packet_scope(), count * 2);
-+	memset(lengths, 0, count * 2);
-+
-+	guint16 i = 0;
-+
-+	if (count > 0)
-+	{
-+		ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "RX PDU List");
-+		gint pdu_end = tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc);
-+
-+		while (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) > 0 &&
-+			   ptvcursor_current_offset(ptvc) < pdu_end )
-+		{
-+			guint16 tlv_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+			//guint16 tlv_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc) + 2);
-+
-+			if (tlv_id == 0x2038)
-+			{
-+				if (i != 0)
-+					ptvcursor_pop_subtree(ptvc);
-+
-+				ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "[%d]", i);
-+
-+				i++;
-+			}
-+
-+			char* tlv_name = "Unknown";
-+			const tlv_t* tlv = look_up_tlv(tlv_id);
-+
-+			if (tlv != NULL && tlv->name != NULL && tlv->tag_id == tlv_id)
-+			{
-+				tlv_name = tlv->name;
-+			}
-+
-+			ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_rx_indication_pdu_list, "%s", tlv_name);
-+
-+			dissect_tl_header(ptvc, pinfo);
-+
-+
-+			if (tlv_id == 0x2038)
-+			{
-+				dissect_rx_ue_info_value(ptvc, pinfo);
-+			}
-+			else if (tlv_id == 0x2024)
-+			{
-+				lengths[i - 1] = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+				ptvcursor_add(ptvc, hf_nfapi_length, 2, ENC_BIG_ENDIAN);
-+				int data_offset = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+				ptvcursor_add(ptvc, hf_nfapi_data_offset, 2, ENC_BIG_ENDIAN);
-+				ptvcursor_add(ptvc, hf_nfapi_ul_cqi, 1, ENC_BIG_ENDIAN);
-+				ptvcursor_add(ptvc, hf_nfapi_timing_advance, 2, ENC_BIG_ENDIAN);
-+
-+				if ((data_offset > 0) && (pdu_end == (tvb_reported_length_remaining(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc)) + ptvcursor_current_offset(ptvc))))
-+				{
-+					pdu_end = number_of_pdu_addr + data_offset;
-+				}
-+
-+			}
-+			else if (tlv_id == 0x2025)
-+			{
-+				dissect_rx_indication_rel9_value(ptvc, pinfo);
-+			}
-+
-+			ptvcursor_pop_subtree(ptvc);
-+
-+		}
-+
-+		// pop the last pdu index.
-+		ptvcursor_pop_subtree(ptvc);
-+
-+		ptvcursor_pop_subtree(ptvc);
-+	}
-+
-+	for (i = 0; i < count; ++i)
-+	{
-+		ptvcursor_add(ptvc, hf_nfapi_pdu, lengths[i], ENC_NA);
-+	}
-+}
-+
-+
-+// ----------------------------------------------------------------------------|
-+
-+static void dissect_p45_header(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p4_p5_message_header, "P4 P5 Header");
-+	ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_phy_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_message_length, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p4_p5_message_header_spare, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_pop_subtree(ptvc);
-+
-+}
-+
-+static void dissect_p7_header_new(ptvcursor_t* ptvc, guint8* m, guint8* seg, guint8* seq)
-+{
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header");
-+
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN);
-+
-+	guint8 m_seg = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	*m = (m_seg & 0x80) >> 7;
-+	*seg = m_seg & 0x7F;
-+
-+	proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA);
-+	proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA);
-+	ptvcursor_advance(ptvc, 1);
-+
-+
-+	*seq = tvb_get_guint8(ptvcursor_tvbuff(ptvc), ptvcursor_current_offset(ptvc));
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN);
-+
-+	ptvcursor_pop_subtree(ptvc);
-+}
-+
-+
-+static void dissect_p7_header(ptvcursor_t * ptvc, packet_info* pinfo _U_)
-+{
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_p7_message_header, "P7 Header");
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_phy_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_id, 2, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_message_length, 2, ENC_BIG_ENDIAN);
-+
-+	proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_m, ptvcursor_tvbuff(ptvc), (ptvcursor_current_offset(ptvc)) * 8, 1, ENC_NA);
-+	proto_tree_add_bits_item(ptvcursor_tree(ptvc), hf_nfapi_p7_message_header_segment, ptvcursor_tvbuff(ptvc), ((ptvcursor_current_offset(ptvc)) * 8) + 1, 7, ENC_NA);
-+	ptvcursor_advance(ptvc, 1);
-+
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_sequence_number, 1, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_checksum, 4, ENC_BIG_ENDIAN);
-+	ptvcursor_add(ptvc, hf_nfapi_p7_message_header_transmit_timestamp, 4, ENC_BIG_ENDIAN);
-+
-+	ptvcursor_pop_subtree(ptvc);
-+}
-+
-+static reassembly_table ul_p7_reassemble_table;
-+static reassembly_table dl_p7_reassemble_table;
-+
-+static int hf_msg_fragments = -1;
-+static int hf_msg_fragment = -1;
-+static int hf_msg_fragment_overlap = -1;
-+static int hf_msg_fragment_overlap_conflicts = -1;
-+static int hf_msg_fragment_multiple_tails = -1;
-+static int hf_msg_fragment_too_long_fragment = -1;
-+static int hf_msg_fragment_error = -1;
-+static int hf_msg_fragment_count = -1;
-+static int hf_msg_reassembled_in = -1;
-+static int hf_msg_reassembled_length = -1;
-+static gint ett_msg_fragment = -1;
-+static gint ett_msg_fragments = -1;
-+
-+static const fragment_items msg_frag_items = {
-+	/* Fragment subtrees */
-+	&ett_msg_fragment,
-+	&ett_msg_fragments,
-+	/* Fragment fields */
-+	&hf_msg_fragments,
-+	&hf_msg_fragment,
-+	&hf_msg_fragment_overlap,
-+	&hf_msg_fragment_overlap_conflicts,
-+	&hf_msg_fragment_multiple_tails,
-+	&hf_msg_fragment_too_long_fragment,
-+	&hf_msg_fragment_error,
-+	&hf_msg_fragment_count,
-+	/* Reassembled in field */
-+	&hf_msg_reassembled_in,
-+	/* Reassembled length field */
-+	&hf_msg_reassembled_length,
-+	NULL,
-+	/* Tag */
-+	"Message fragments"
-+};
-+
-+static void dissect_nfapi_ul_p7(ptvcursor_t *ptvc, packet_info *pinfo)
-+{
-+	guint8 m;
-+	guint8 seg;
-+	guint8 seq;
-+
-+	guint8 save_fragmented;
-+	ptvcursor_t* sub_ptvc = 0;
-+
-+	guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2);
-+	guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4);
-+
-+	dissect_p7_header_new(ptvc, &m, &seg, &seq);
-+	save_fragmented = pinfo->fragmented;
-+
-+	if (m == 1 || (m == 0 && seg > 0))
-+	{
-+		tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc);
-+		guint offset = ptvcursor_current_offset(ptvc);
-+		proto_tree* tree = ptvcursor_tree(ptvc);
-+
-+		pinfo->fragmented = TRUE;
-+
-+		fragment_head *fd_head = fragment_add_seq_check(&ul_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1));
-+
-+		if (fd_head)
-+		{
-+			tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled UL P7", fd_head, &msg_frag_items, NULL, tree);
-+			if (new_tvb)
-+			{
-+				sub_ptvc = ptvcursor_new(tree, new_tvb, 0);
-+
-+				col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg);
-+			}
-+			else
-+			{
-+				col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg);
-+				return;
-+			}
-+		}
-+		else
-+		{
-+			return;
-+		}
-+	}
-+
-+	pinfo->fragmented = save_fragmented;
-+
-+	{
-+		switch (msg_id)
-+		{
-+			case NFAPI_HARQ_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+			case NFAPI_CRC_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+			case NFAPI_RX_ULSCH_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+			case NFAPI_RACH_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+			case NFAPI_SRS_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+			case NFAPI_RX_SR_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+			case NFAPI_RX_CQI_INDICATION_MSG_ID:
-+			{
-+				ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+				dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			}
-+			break;
-+
-+		};
-+	}
-+
-+	if (sub_ptvc)
-+		ptvcursor_free(sub_ptvc);
-+}
-+
-+static void dissect_nfapi_dl_p7(ptvcursor_t *ptvc, packet_info *pinfo)
-+{
-+	guint8 m;
-+	guint8 seg;
-+	guint8 seq;
-+
-+	guint8 save_fragmented;
-+	ptvcursor_t* sub_ptvc = 0;
-+
-+	guint16 msg_id = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 2);
-+	guint16 msg_len = tvb_get_ntohs(ptvcursor_tvbuff(ptvc), 4);
-+
-+	dissect_p7_header_new(ptvc, &m, &seg, &seq);
-+	save_fragmented = pinfo->fragmented;
-+
-+	if (m == 1 || (m == 0 && seg > 0))
-+	{
-+		tvbuff_t* tvbuff = ptvcursor_tvbuff(ptvc);
-+		guint offset = ptvcursor_current_offset(ptvc);
-+		proto_tree* tree = ptvcursor_tree(ptvc);
-+
-+		pinfo->fragmented = TRUE;
-+
-+		fragment_head *fd_head = fragment_add_seq_check(&dl_p7_reassemble_table, tvbuff, offset, pinfo, seq, NULL, seg, msg_len - offset, (m == 1));
-+
-+		if (fd_head)
-+		{
-+			tvbuff_t * new_tvb = process_reassembled_data(tvbuff, offset, pinfo, "Reassembled DL P7", fd_head, &msg_frag_items, NULL, tree);
-+			if (new_tvb)
-+			{
-+				sub_ptvc = ptvcursor_new(tree, new_tvb, 0);
-+				col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Reassembled %d]", seg);
-+			}
-+			else
-+			{
-+				col_append_fstr(pinfo->cinfo, COL_INFO, "[NFAPI P7 Segment %d]", seg);
-+				return;
-+			}
-+		}
-+		else
-+		{
-+			return;
-+		}
-+	}
-+
-+	pinfo->fragmented = save_fragmented;
-+
-+	switch (msg_id)
-+	{
-+		case NFAPI_DL_CONFIG_REQUEST_MSG_ID:
-+		{
-+			ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			break;
-+		}
-+		case NFAPI_UL_CONFIG_REQUEST_MSG_ID:
-+		{
-+			ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+		}
-+		break;
-+		case NFAPI_HI_DCI0_REQUEST_MSG_ID:
-+		{
-+			ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+		}
-+		break;
-+		case NFAPI_TX_REQUEST_MSG_ID:
-+		{
-+			ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+		}
-+		break;
-+		case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID:
-+		{
-+			ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+		}
-+		break;
-+		case NFAPI_LBT_DL_INDICATION_MSG_ID:
-+		{
-+			ptvcursor_add(sub_ptvc ? sub_ptvc : ptvc, hf_nfapi_sfn_sf, 2, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(sub_ptvc ? sub_ptvc : ptvc, pinfo, msg_len);
-+			break;
-+		}
-+	}
-+
-+	if (sub_ptvc)
-+		ptvcursor_free(sub_ptvc);
-+}
-+
-+
-+static int dissect_nfapi(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
-+{
-+	col_set_str(pinfo->cinfo, COL_PROTOCOL, "NFAPI");
-+
-+	ptvcursor_t* ptvc = ptvcursor_new(tree, tvb, 0);
-+
-+	guint16 msg_id = tvb_get_ntohs(tvb, 2);
-+
-+	// Get the name of the message
-+	const gchar* message_str = val_to_str_const(msg_id, message_id_vals, "Unknown");
-+
-+	// Append to the Info string the nFAPI messages
-+	col_clear(pinfo->cinfo, COL_INFO);
-+	col_append_fstr(pinfo->cinfo, COL_INFO, " %s ", message_str);
-+
-+	// Flag if this is a vendor extention message, could do it for P4, 5, 7
-+	if (msg_id >= 0x0300 && msg_id <= 0x03FF)
-+	{
-+		col_append_fstr(pinfo->cinfo, COL_INFO, " Vendor Extension");
-+	}
-+
-+	// Create the top level tree
-+	ptvcursor_add_text_with_subtree(ptvc, SUBTREE_UNDEFINED_LENGTH, ett_nfapi_message_tree, "%s", message_str);
-+
-+	switch (msg_id)
-+	{
-+		case NFAPI_HARQ_INDICATION_MSG_ID:
-+		case NFAPI_CRC_INDICATION_MSG_ID:
-+		case NFAPI_RX_ULSCH_INDICATION_MSG_ID:
-+		case NFAPI_RACH_INDICATION_MSG_ID:
-+		case NFAPI_SRS_INDICATION_MSG_ID:
-+		case NFAPI_RX_SR_INDICATION_MSG_ID:
-+		case NFAPI_RX_CQI_INDICATION_MSG_ID:
-+		{
-+			dissect_nfapi_ul_p7(ptvc, pinfo);
-+		}
- 		break;
--		// LBT_DL.indication
--		case 0x8D:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint16_with_conversion(msg_tree, hf_nfapi_sfn_sf, tvb, &offset, sfn_sf_conversion);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--		// PNF_PARAM.request
--		case 0x100:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--		// PNF_PARAM.response
--		case 0x101:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--		// PNF_CONFIG.request
--		case 0x102:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--		// PNF_CONFIG.response
--		case 0x103:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			break;
--		}
--		// PNF_START.request
--		case 0x104:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			break;
--		}
--		// PNF_START.response
--		case 0x105:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			break;
--		}
--		// PNF_STOP.response
--		case 0x106:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			break;
--		}
--		// PNF_STOP.request
--		case 0x107:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			break;
--		}
--		// PARAM.request
--		case 0x108:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			break;
--		}
--		// PARAM.response
--		case 0x109:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--		// CONFIG.request
--		case 0x10A:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint8(msg_tree, hf_nfapi_num_tlv, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--		// CONFIG.response
--		case 0x10B:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			break;
--		}
--		// START.request
--		case 0x10C:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			break;
--		}
--		// START.response
--		case 0x10D:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			break;
--		}
--		// STOP.request
--		case 0x10E:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			break;
--		}
--		// STOP.response
--		case 0x10F:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			break;
--		}
--		// MEASUREMENT.request
--		case 0x110:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+
-+		case NFAPI_DL_CONFIG_REQUEST_MSG_ID:
-+		case NFAPI_UL_CONFIG_REQUEST_MSG_ID:
-+		case NFAPI_HI_DCI0_REQUEST_MSG_ID:
-+		case NFAPI_TX_REQUEST_MSG_ID:
-+		case NFAPI_LBT_DL_CONFIG_REQUEST_MSG_ID:
-+		case NFAPI_LBT_DL_INDICATION_MSG_ID:
-+		{
-+			dissect_nfapi_dl_p7(ptvc, pinfo);
-+			break;
-+		}
-+
-+		case NFAPI_PNF_PARAM_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_PNF_PARAM_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+
-+			break;
-+		}
-+		case NFAPI_PNF_CONFIG_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_PNF_CONFIG_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_PNF_START_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			break;
-+		}
-+		case NFAPI_PNF_START_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_PNF_STOP_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			break;
-+		}
-+		case NFAPI_PNF_STOP_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_PARAM_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			break;
-+		}
-+		case NFAPI_PARAM_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_num_tlv, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_CONFIG_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_CONFIG_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_START_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			break;
-+		}
-+		case NFAPI_START_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_STOP_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			break;
-+		}
-+		case NFAPI_STOP_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_MEASUREMENT_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_MEASUREMENT_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+
-+		// P4
-+		case NFAPI_RSSI_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_RSSI_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
-+		}
-+		case NFAPI_RSSI_INDICATION_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
-+		}
-+		case NFAPI_CELL_SEARCH_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// MEASUREMENT.response
--		case 0x111:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
--		}
--
--		// P4
--		// RSSI.request
--		case 0x200:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_CELL_SEARCH_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// RSSI.response
--		case 0x201:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			break;
-+		case NFAPI_CELL_SEARCH_INDICATION_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// RSSI.indication
--		case 0x202:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_BROADCAST_DETECT_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// CELL_SEARCH.request
--		case 0x203:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_BROADCAST_DETECT_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// CELL_SEARCH.response
--		case 0x204:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			break;
-+		case NFAPI_BROADCAST_DETECT_INDICATION_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// CELL_SEARCH.indication
--		case 0x205:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// BROADCAST_DETECT.request
--		case 0x206:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// BROADCAST_DETECT.response
--		case 0x207:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			break;
-+		case NFAPI_SYSTEM_INFORMATION_SCHEDULE_INDICATION_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// BROADCAST_DETECT.indication
--		case 0x208:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_SYSTEM_INFORMATION_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_rat_type, 1, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// SYSTEM_INFORMATION_SCHEDULE.request
--		case 0x209:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_SYSTEM_INFORMATION_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// SYSTEM_INFORMATOIN_SCHEDULE.response
--		case 0x20A:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			break;
-+		case NFAPI_SYSTEM_INFORMATION_INDICATION_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			dissect_tlv_list(ptvc, pinfo, tvb_reported_length(tvb));
-+			break;
- 		}
--		// SYSTEM_INFORMATION_SCHEDULE.indication
--		case 0x20B:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_NMM_STOP_REQUEST_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			break;
- 		}
--		// SYSTEM_INFORMATION.request
--		case 0x20C:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint8(msg_tree, hf_nfapi_rat_type, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_NMM_STOP_RESPONSE_MSG_ID:
-+		{
-+			dissect_p45_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_p4_error_code, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// SYSTEM_INFORMATION.response
--		case 0x20D:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			break;
-+		case NFAPI_DL_NODE_SYNC_MSG_ID:
-+		{
-+			dissect_p7_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t1, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t2, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_ul_node_sync_t3, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// SYSTEM_INFORMATION.indication
--		case 0x20E:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			dissect_tlv_list(tvb, pinfo, msg_tree, data, &offset, tvb_reported_length(tvb));
--			break;
-+		case NFAPI_UL_NODE_SYNC_MSG_ID:
-+		{
-+			dissect_p7_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_t1, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_dl_node_sync_delta_sfn_sf, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// NMM_STOP.request
--		case 0x20F:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			break;
-+		case NFAPI_TIMING_INFO_MSG_ID:
-+		{
-+			dissect_p7_header(ptvc, pinfo);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_last_sfn_sf, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_time_since_last_timing_info, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_jitter, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_jitter, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_jitter, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_jitter, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_latest_delay, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_latest_delay, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_latest_delay, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_latest_delay, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_dl_config_earliest_arrival, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_tx_request_earliest_arrival, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_ul_config_earliest_arrival, 4, ENC_BIG_ENDIAN);
-+			ptvcursor_add(ptvc, hf_nfapi_timing_info_hi_dci0_earliest_arrival, 4, ENC_BIG_ENDIAN);
-+			break;
- 		}
--		// NMM_STOP_response
--		case 0x210:
--		{
--			dissect_p45_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_p4_error_code, tvb, &offset, 0);
--			break;
--		}
--
--		// DL_NODE.sync
--		case 0x0180:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t1, tvb, &offset, "microseconds");
--			proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t2, tvb, &offset, "microseconds");
--			proto_tree_add_uint32(msg_tree, hf_nfapi_ul_node_sync_t3, tvb, &offset, "microseconds");
--			break;
--		}
--		// UL_NODE.sync
--		case 0x0181:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_t1, tvb, &offset, "microseconds");
--			proto_tree_add_uint32(msg_tree, hf_nfapi_dl_node_sync_delta_sfn_sf, tvb, &offset, 0);
--			break;
--		}
--		// TIMING_INFO
--		case 0x0182:
--		{
--			dissect_p7_header(tvb, pinfo, msg_tree, data, &offset);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_last_sfn_sf, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_time_since_last_timing_info, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_jitter, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_jitter, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_jitter, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_jitter, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_latest_delay, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_latest_delay, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_latest_delay, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_latest_delay, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_dl_config_earliest_arrival, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_tx_request_earliest_arrival, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_ul_config_earliest_arrival, tvb, &offset, 0);
--			proto_tree_add_uint32(msg_tree, hf_nfapi_timing_info_hi_dci0_earliest_arrival, tvb, &offset, 0);
--			break;
--		}
--		default:
--		{
--			// todo : is this vendor extention?
--			break;
--		}
--	};
--
--	return tvb_captured_length(tvb);
--}
--
--static void nfapi_tag_vals_fn(gchar* s, guint32 v)
--{
--	int index = look_up_tlv(v);
--	if (v >= 0)
--	{
--		g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tags[index].name, v);
--	}
--	else
--	{
--		g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v);
--	}
--}
--
--// ----------------------------------------------------------------------------|
--
--void proto_register_nfapi(void)
--{
--
--	static hf_register_info hf[] =
--	{
--		{ &hf_msg_fragments, { "Message fragments", "afs.fragments", FT_NONE, BASE_NONE, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment, { "Message fragment", "afs.fragment", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment_overlap, { "Message fragment overlap", "afs.fragment.overlap", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment_overlap_conflicts, { "Message fragment overlapping with conflicting data", "afs.fragment.overlap.conflicts", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment_multiple_tails, { "Message has multiple tail fragments", "afs.fragment.multiple_tails", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment_too_long_fragment, { "Message fragment too long", "afs.fragment.too_long_fragment", FT_BOOLEAN, 0, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment_error, { "Message defragmentation error", "afs.fragment.error", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_fragment_count, { "Message fragment count", "afs.fragment.count", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_reassembled_in, { "Reassembled in", "afs.reassembled.in", FT_FRAMENUM, BASE_NONE, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_reassembled_length, { "Reassembled length", "afs.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } },
--		{ &hf_msg_reassembled_data, { "Reassembled data", "afs.reassembled.data", FT_UINT32, BASE_DEC, NULL, 0x00, NULL, HFILL } },
--		{ &hf_nfapi_message_tree, { "Message tree", "nfapi.message_tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p4_p5_message_header, { "P4 P5 Header", "nfapi.p4_p5_message_header",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p4_p5_message_header_phy_id, { "PHY ID", "nfapi.p4_p5_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p4_p5_message_header_message_id, { "Message ID", "nfapi.p4_p5_message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p4_p5_message_header_message_length, { "Message Length", "nfapi.p4_p5_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p4_p5_message_header_spare,	{ "Spare", "nfapi.p4_p5_message_header.spare", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header, { "P7 Header", "nfapi.p7_message_header", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_phy_id, { "Phy ID", "nfapi.p7_message_header.phy_id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_message_id, { "Message ID", "nfapi.p7.message_header.message_id", FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_message_length, { "Message Length", "nfapi.p7_message_header.message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_m, { "M", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_segment, { "Segment Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_sequence_number, { "Sequence Number", "nfapi.p7_message_header.m_segment_sequence", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_checksum, { "Checksum", "nfapi.p7_message_header.checksum", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p7_message_header_transmit_timestamp, { "Transmit Timestamp", "nfapi.p7_message_header.timestamp", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tlv_tree, { "TAG", "nfapi.tlv.tree", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tl, { "TL", "nfapi.tl", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tl_tag, { "TL Tag", "nfapi.tl_tag", FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tl_length, { "TL Length", "nfapi.tl_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tag_uint8_value, { "Value", "nfapi.tag.uint8.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tag_uint16_value, { "Value", "nfapi.tag.uint16.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_param_response, { "Param Request", "nfapi.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_error_code, { "Error Code", "nfapi.error.code", FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_p4_error_code, { "Error Code", "nfapi.p4_error.code", FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rat_type, { "RAT Type", "nfapi.rat_type", FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_num_tlv, { "Number of TLV", "nfapi.param.response.num_tlv", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phy_state, { "Phy state value", "nfapi.phy.state", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_modulation_support,	{ "Modulation value", "nfapi.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_ue_per_sf, { "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_ue_per_sf, { "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_duplex_mode, { "Duplex Mode", "nfapi.duplex.mode", FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_bandwidth_support, { "Downlink bandwidth support", "nfapi.dl.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_bandwidth_support, { "Uplink bandwidth support", "nfapi.ul.bandwidth.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_modulation_support, { "Downlink modulation support", "nfapi.dl.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_modulation_support, { "Uplink modulation support", "nfapi.ul.modulation.support", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phy_antenna_capability, { "Phy Antenna capability", "nfapi.phy.antenna.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_release_capability, { "Release capability", "nfapi.release.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mbsfn_capability, { "MBSFN capability", "nfapi.mbsfn.capability", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_laa_capability, { "LAA Support", "nfapi.laa.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pd_sensing_lbt_support, { "PD sensing LBT support", "nfapi.pd.sensing.lbt.support", FT_BOOLEAN, 8, TFS(&support_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_multi_carrier_lbt_support, { "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support", FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_partial_sf_support, { "Partial SF support", "nfapi.partial.sf.support", FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_reference_signal_power, { "Reference signal power", "nfapi.ref_sig_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_primary_synchronization_signal_epre_eprers, { "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_secondary_synchronization_signal_epre_eprers, { "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_physical_cell_id, { "Physical Cell ID", "nfapi.physical.cell.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phich_resource, { "PHICH Resource", "nfapi.phich.resource", FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phich_duration, { "PHICH Duration", "nfapi.phich.duration", FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phich_power_offset, { "PHICH Power Offset", "nfapi.phich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_configuration_index, { "Configuration Index", "nfapi.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_root_sequence_index, { "Root sequence Index", "nfapi.root.sequence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_zero_correlation_zone_configuration, { "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_high_speed_flag, { "High Speed Flag", "nfapi.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_frequency_offset, { "Frequency offset", "nfapi.frequency.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_hopping_mode, { "Hopping Mode", "nfapi.hopping.mode", FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_hopping_offset, { "Hopping offset", "nfapi.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_delta_pucch_shift, { "Delta PUCCH Shift", "nfapi.delta.pucch.shift", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_cqi_rb, { "N CQI RB", "nfapi.n.cqi.rb", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_an_cs, { "N AN CS", "nfapi.n.an.cs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n1_pucch_an, { "N1 PUCCH AN", "nfapi.n1.pucch.an", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bandwidth_configuration, { "Bandwidth configuration", "nfapi.bw.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_subframe_configuration, { "SRS subframe configuration", "nfapi.srs.subframe.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uplink_rs_hopping, { "Uplink RS hopping", "nfapi.uplink.rs.hopping", FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_group_assignment, { "Group assigment", "nfapi.group.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cyclic_shift_1_for_drms, { "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_subframe_assignment, { "Subframe_assignment", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_special_subframe_patterns, { "Special Subframe patterns", "nfapi.special.subframe.patterns", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ed_threshold_for_lbt_for_pdsch, { "ED Threshold for LBT for PDSCH", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ed_threshold_for_lbt_for_drs, { "ED Threshold for LBT for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pd_threshold, { "PD Threshold", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_multi_carrier_type, { "Multi carrier type", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_multi_carrier_tx, { "Multi carrier TX", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_multi_carrier_freeze, { "Multi carrier freeze ", "nfapi.subframe.assignment", FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tx_antenna_ports_for_drs, { "Tx antenna ports for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_power_for_drs, { "Transmission power for DRS", "nfapi.subframe.assignment", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pbch_repetitions_enabled_r13, { "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_cat_m_root_sequence_index, { "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration, { "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_cat_m_high_speed_flag, { "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag", FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_enable, { "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_configuration_index, { "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_frequency_offset, { "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt, { "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity, { "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_hopping_enabled, { "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_0_hopping_offset, { "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_enable, { "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_configuration_index, { "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_frequency_offset, { "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt, { "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity, { "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_hopping_enabled, { "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_1_hopping_offset, { "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_enable, { "PRACH CE level #2 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_configuration_index, { "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_frequency_offset, { "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt, { "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity, { "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_hopping_enabled, { "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_2_hopping_offset, { "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_enable, { "PRACH CE level #3 Enable", "nfapi.prach.ce.level.0.enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_configuration_index, { "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.0.configuration.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_frequency_offset, { "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt, { "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity, { "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_hopping_enabled, { "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_ce_level_3_hopping_offset, { "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a, { "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b, { "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_data_report_mode, { "Data Report Mode", "nfapi.data.report.mode", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sfnsf, { "SFN/SF", "nfapi.sfn.sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_max_up_pts, { "Max UpPTS frames", "nfapi.max.uppts.frame", FT_BOOLEAN, 8, TFS(&enabled_disabled_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_acknack_srs_simultaneous_transmission, { "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx", FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_address, { "PNF address", "nfapi.p7.pnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_address_ipv4, { "PNF IPV4", "nfapi.pnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_address_ipv6, { "PNF IPV6", "nfapi.pnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_vnf_address, { "VNF address", "nfapi.vnf.address", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_vnf_address_ipv4, { "VNF IPV4 Address", "nfapi.vnf.address.ipv4", FT_IPv4, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_vnf_address_ipv6, { "VNF IPV6 Address", "nfapi.vnf.address.ipv6", FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_port, { "PNF PORT value", "nfapi.config.pnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_vnf_port, { "VNF PORT value", "nfapi.config.vnf.port.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rf_bands, { "RF Bands", "nfapi.rf.bands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rf_bands_count,	{ "Number of RF Bands", "nfapi.rf.bands.count", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rf_bands_value, { "Band value", "nfapi.rf.bands.value",	FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_param_request, { "PNF Param Request", "nfapi.pnf.param.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_param_response, { "PNF Param Response", "nfapi.pnf.param.response",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_config_request,	{ "PNF Config Request", "nfapi.pnf.config.request",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_config_response, { "PNF Config Response", "nfapi.pnf.config.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_start_request, { "PNF Start Request", "nfapi.pnf.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_start_response, { "PNF Start Response", "nfapi.pnf.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_start_request, { "PNF Start Request", "nfapi.start.request", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_start_response, { "PNF Start Response", "nfapi.start.response", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_param_general, { "PNF Param General ", "nfapi.pnf.param.general", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sync_mode, { "Sync Mode", "nfapi.sync.mode", FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_location_mode, { "Location Mode", "nfapi.location.mode", FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_location_coordinates_length, { "Location Coordinates Length", "nfapi.location.coordinates.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_location_coordinates, { "Location Coordinates", "nfapi.location.coordinates", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdu, { "PDU", "nfapi.pdu", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_timing, { "DL config Timing", "nfapi.dl.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tx_timing, { "Tx Timing", "nfapi.general.tx.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_timing, { "UL Config Timing", "nfapi.ul.config.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_hi_dci0_timing, { "HI DCi0 Timing", "nfapi.hi.dci0.timing", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_number_phys, { "Maximum number of Phys", "nfapi.maximum.number.phys", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_total_bandwidth, { "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_total_number_dl_layers,	{ "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_total_number_ul_layers,	{ "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers",	FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_shared_bands, { "Shared bands", "nfapi.shared.bands", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_shared_pa, { "Shared pa", "nfapi.shared.pa", FT_BOOLEAN, 8, TFS(&true_false_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_total_power, { "Maximum total power", "nfapi.maximum.total.power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_oui, { "OUI", "nfapi.oui", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_phy, { "PNF Phy", "nfapi.pnf.phy", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_phy_number_phy, { "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_phy_config_index, { "PNF Phy Config Index", "nfapi.pnf.phy.config.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_rf,	{ "PNF Phy RF", "nfapi.pnf.rf",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_rfs, { "Number of RFs", "nfapi.pnf.rf.number.rf",	FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phy_rf_config_info,	{ "Phy RF Config Info", "nfapi.phy.rf.config.info",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phy_rf_config_info_phy_id, { "Phy ID", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phy_rf_config_info_band, { "RF Band", "nfapi.pnf.phy.rf.config.phy.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_phy_rf_config, { "PNF Phy RF Config", "nfapi.pnf.phy.rf.config", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_phy_rf_config_number_phy_rf_config_info, { "Number of RF Config Info(s)", "nfapi.pnf.phy.rf.config.number.phy.rf.config.info", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_phy_rf_config_array_phy_rf_config_info,	{ "PNF Phy RF Config array phy rf config info ", "nfapi.pnf.phy.rf.config.array.phy.rf.config.info", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rf_config_index, { "RF Config Index", "nfapi.rf_config_index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_rf_exclusions, { "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions",	FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_3gpp_release_supported,	{ "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_downlink_channel_bandwidth_supported, { "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uplink_channel_bandwidth_supported, { "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_dl_layers_supported, { "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_ul_layers_supported, { "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_nmm_modes_supported, { "NMM modes supported", "nfapi.nmm_modes_supported", FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_band, { "Band", "nfapi.band", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_transmit_power, { "Maximum transmit power", "nfapi.maximum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_earfcn, { "EARFCN", "nfapi.earfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_rf_bands, { "Number of RF Bands", "nfapi.num.rf_bands", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_nmm_uplink_rssi_supported, { "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported", FT_UINT16, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_minimum_transmit_power, { "Minimum transmit power", "nfapi.minimum_transmit_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_antennas_suppported, { "Number of Supported Antennas", "nfapi.number_of_antennas_suppported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_minimum_downlink_frequency, { "Minimum downlink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_downlink_frequency, { "Maximum downlink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_minimum_uplink_frequency, { "Minimum uplink frequency", "nfapi.minimum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_maximum_uplink_frequency, { "Maximum uplink frequency", "nfapi.maximum_downlink_frequency", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_mode7_supported, { "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_transmission_mode8_supported, { "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_two_antennas_ports_for_pucch, { "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_transmission_mode_9_supported, { "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_simultaneous_pucch_pusch, { "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_for_layer_tx_with_tm3_and_tm4, { "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_epdcch_supported, { "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_multi_ack_csi_reporting, { "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_pucch_tx_diversity_with_channel_selection, { "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_ul_comp_supported, { "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_transmission_mode_5_supported, { "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_subframe_set, { "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_enhanced_4tx_codebook, { "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_drs_supported, { "DRS supported", "nfapi.pnf.phy_rel12.drs_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_ul_64qam_supported, { "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_transmission_mode_10_supported, { "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hi_nfapi_alternative_tbs_indices, { "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pucch_format_4_supported, { "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pucch_format_5_supported, { "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_more_than_5_ca_supported, { "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_laa_supported, { "LAA supported", "nfapi.pnf.phy_rel13.laa_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_laa_ending_in_dwpts_supported, { "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_laa_starting_in_second_slot_supported, { "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_beamforming_supported, { "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_enhancements_supported, { "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_drms_enhancements_supported, { "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_enhancements_supported, { "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sfn_sf, { "SFN_SF", "nfapi.sfn_sf", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_request_body, { "DL Config Request body", "nfapi.dl.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_pdcch_ofdm_symbols, { "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_dci, { "Number of DCI", "nfapi.number_dci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_pdus, { "Number of PDUs", "nfapi.number_pdu", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_harqs, { "Number of HARQs", "nfapi.number_harqs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_crcs, { "Number of CRCs", "nfapi.number_crcs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_srs, { "Number of SRs", "nfapi.number_srs", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_cqi, { "Number of CQIs", "nfapi.number_cqi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_preambles, { "Number of Preambles", "nfapi.number_preambles", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_srss, { "Number of SRSs", "nfapi.number_srss", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_lbt_dl_req_pdu_type, { "LBT DL Request PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_lbt_dl_ind_pdu_type, { "LBT DL Indication PDU Type", "nfapi.number_srss", FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_pdsch_rnti, { "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_power_pcfich, { "Transmission Power PCFICH", "nfapi.transmission_power_pcfich", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_request_pdu_list,	{ "DL Config Request body", "nfapi.dl.config.request.pdu_list",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_request_pdu_list,	{ "UL Config Request body", "nfapi.ul.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_hi_dci0_request_pdu_list, { "HI DCI0 Request body", "nfapi.hi.dci0.config.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tx_request_pdu_list, { "Tx Request body", "nfapi.tx.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rx_indication_pdu_list, { "Rx Indication body", "nfapi.rx.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_indication_pdu_list, { "Harq Indication body", "nfapi.harq.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_crc_indication_pdu_list, { "CRC Indication body", "nfapi.crc.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sr_indication_pdu_list, { "SR Indication body", "nfapi.sr.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cqi_indication_pdu_list, { "CQI Indication body", "nfapi.cqi.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_preamble_indication_pdu_list, { "Preamble Indication body", "nfapi.preamble.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_indication_pdu_list, { "SRS Indication body", "nfapi.srs.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_lbt_dl_config_pdu_list, { "LBT DL Config Request body", "nfapi.lbt.dl.request.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_lbt_dl_indication_pdu_list, { "LBT DL Indicatoin body", "nfapi.lbt.dl.indication.pdu_list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_pdu_type, { "PDU Type", "nfapi.pdu.type",	FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdu_size, { "PDU size", "nfapi.pdu.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_instance_length, { "Instance length", "nfapi.instance.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_dlsch_pdu_rel8, { "DL CONFIG DLSCH PDU REL8", "nfapi.dl.config.dlsch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdu_index, { "PDU Index", "nfapi.pdu.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rnti, { "RNTI", "nfapi.rnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_resource_allocation_type, { "Resource Allocation Type", "nfapi.resource.allocation.type", FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_virtual_resource_block_assignment_flag, { "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag", FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_resource_block_coding, { "Resource block coding", "nfapi.resource.block.coding", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_modulation, { "Modulation", "nfapi.modulation", FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_redundancy_version, { "Redundancy version", "nfapi.redundancy.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transport_blocks, { "Transport blocks", "nfapi.transport.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transport_block_to_codeword_swap_flag, { "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag", FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } },
--		{ &hf_nfapi_ul_transmission_scheme, { "Transmission scheme", "nfapi.transmission.scheme", FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0, "The MIMO mode used in the PDU", HFILL } },
--		{ &hf_nfapi_number_of_layers, { "Number of layers", "nfapi.number.of.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_subbands, { "Number of subbands", "nfapi.number.of.subbands", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_codebook_index, { "Codebook index", "nfapi.number.of.codebook.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ue_category_capacity, { "UE category capacity", "nfapi.ue.category.capacity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pa, { "P-A", "nfapi.pa", FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_delta_power_offset_index, { "Delta Power offset index", "nfapi.delta.power.offset.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_nprb, { "Nprb", "nfapi.nprb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_mode, { "Transmission Mode", "nfapi.transmission_nprb", FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0, "Transmission mode associated with the UE", HFILL } },
--		{ &hf_nfapi_prnti, { "P-RNTI", "nfapi.prnti", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mcs, { "MCS", "nfapi.mcs", FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_transport_blocks, { "Number of transport blocks", "nfapi.number_of_transport_blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ue_mode, { "UE Mode", "nfapi.ue.mode", FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0, NULL, HFILL } },
--		{ &hf_prs_bandwidth, { "PRS bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_prs_muting, { "PRS muting", "nfapi.prs.muting", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_num_bf_prb_per_subband, { "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_num_bf_vector, { "Num of BF Vector", "nfapi.num.bf.vector", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_resource_config, { "CSI-RS resource config", "nfapi.csi.rs.resource.config", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bf_vector_subband_index, { "BF Subband Index", "nfapi.num.bf.vector.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bf_vector_num_antennas, { "BF Num of Antennas", "nfapi.num.bf.vector.bf.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bf_vector_bf_value, { "BF Value per Antenna", "nfapi.num.bf.vector.bf.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_dlsch_pdu_rel9, { "DL CONFIG DLSCH PDU REL9", "nfapi.dl.config.dlsch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_nscid, { "NSC id", "nfapi.nscid", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_dlsch_pdu_rel10, { "DL CONFIG DLSCH PDU REL10", "nfapi.dl.config.dlsch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_flag, { "CSI RS Flag", "nfapi.csi.rs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_subbands, { "Subbands", "nfapi.subbands", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bf_vectors, { "BF Vectors", "nfapi.bf.vectors", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bf_vector_antennas, { "Antennas", "nfapi.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_resource_config_r10, { "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10, { "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_number_if_nzp_configurations, { "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_resource_configs, { "CSR/RS Resource Configs", "nfapi.csi.rs.resource.configs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_start, { "PDSCH_start", "nfapi.pdsch.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_drms_config_flag, { "DMRS Config flag", "nfapi.drms.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_drms_scrambling, { "DMRS Scrambling", "nfapi.drms.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_config_flag, { "CSI Config flag", "nfapi.csi.config.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_scrambling, { "CSI Scrambling", "nfapi.csi.scrambling", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_re_mapping_flag, { "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_re_mapping_antenna_ports, { "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_re_mapping_freq_shift, { "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_alt_cqi_table_r12, { "altCQI-Table-r12", "nfapi.alt.cqi.table.r12", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_max_layers, { "MaxLayers", "nfapi.max.layers", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_dl_harq, { "N_DL_HARQ", "nfapi.n.dl.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dwpts_symbols, { "DwPTS Symbols", "nfapi.dwpts.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_initial_lbt_sf, { "Initial LBT SF", "nfapi.initial.lbt.sf", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ue_type, { "UE Type", "nfapi.ue.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_payload_type, { "PDSCH Payload Type", "nfapi.pdsch.payload.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_initial_transmission_sf, { "Initial transmission SF (io) ", "nfapi.init.tx.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_req13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_resource_index, { "CSI-RS resource index", "nfapi.csi.rs.resource.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_class, { "Class", "nfapi.csi.rs.class", FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cdm_type, { "CDM Type", "nfapi.cdm.type", FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_bf_vector, { "BF Vector", "nfapi.bf.vector", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_edpcch_prb_index, { "EPDCCH PRB index", "nfapi.edpcch.prb.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_epdcch_resource_assignment_flag, { "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_epdcch_id, { "EPDCCH ID", "nfapi.epdcch.id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_epdcch_start_symbol, { "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_epdcch_num_prb, { "EPDCCH NumPRB", "nfapi.epdcch.num.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_epdcch_prbs, { "EPDCCH PRBs", "nfapi.epdcch.prbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_precoding_value, { "Precoding value", "nfapi.precoding.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mpdcch_narrowband, { "MPDCCH Narrowband", "nfapi.mpdcch.narrowband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_prb_pairs, { "Number of PRB pairs", "nfapi.number.prb.pairs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_resource_block_assignment, { "Resource Block Assignment", "nfapi.resource.block.assignement", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_start_symbol, { "Start symbol", "nfapi.start.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ecce_index, { "ECCE index", "nfapi.ecce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ce_mode, { "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_drms_scrabmling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_reception_levels, { "PDSCH repetition levels", "nfapi.pdsch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_new_data_indicator, { "New data indicator", "nfapi.new.data.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tpmi_length, { "TPMI length", "nfapi.tpmi.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pmi_flag, { "PMI flag", "nfapi.pmi.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_resource_offset, { "HARQ resource offset", "nfapi.harq.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dci_subframe_repetition_number, { "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_downlink_assignment_index_length, { "Downlink assignment index Length", "nfapi.dl.assignement.index.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_starting_ce_level, { "Starting CE Level", "nfapi.starting.ce.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_antenna_ports_and_scrambling_identity_flag, { "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_antenna_ports_and_scrambling_identity, { "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_paging_direct_indication_differentiation_flag, { "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_direct_indication, { "Direct indication", "nfapi.direct.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_tx_antenna_ports, { "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_precoding, { "Precoding", "nfapi.precodiing", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_bch_pdu_rel8, { "DL CONFIG BCH PDU Rel8", "nfapi.dl.config.bch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_value_float, { "Value", "nfapi.value.float", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_power, { "Transmission Power", "nfapi.transmission_power", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_mch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mbsfn_area_id, { "MBSFN Area id", "nfapi.mbsfn.area.id", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_pch_pdu_rel8, { "DL CONFIG MCH PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_dci_dl_pdu_rel8, { "DL CONFIG DCI DL PDU Rel8", "nfapi.dl.config.mch.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dci_format, { "DCI format", "nfapi.dci.format", FT_UINT8, BASE_DEC, VALS(dci_format_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cce_idx, { "CCE index", "nfapi.cce.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_aggregation_level, { "Aggregation level", "nfapi.aggregation.level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mcs_1, { "MCS_1", "nfapi.mcs_1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mcs_2, { "MCS_2", "nfapi.mcs_2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_redundancy_version_1, { "Redundancy version_1", "nfapi.redundancy.version.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_redundancy_version_2, { "Redundancy version_2", "nfapi.redundancy.version.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_new_data_indicator_1, { "New data indicator_1", "nfapi.new.data.indicator.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_new_data_indicator_2 ,{ "New data indicator_2", "nfapi.new.data.indicator.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_process, { "HARQ process", "nfapi.harq.process", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tpmi, { "TPMI", "nfapi.tpmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pmi, { "PMI", "nfapi.pmi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_precoding_information, { "Precoding information", "nfapi.precoding.information", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tpc, { "TPC", "nfapi.tpc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_downlink_assignment_index, { "Downlink assignment index", "nfapi.downlink.assignment.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ngap, { "Ngap", "nfapi.ngap", FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transport_block_size_index, { "Transport block size index", "nfapi.transport.block.size.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_downlink_power_offset, { "Downlink power offset", "nfapi.downlink.power.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_allocate_prach_flag, { "Allocation PRACH flag", "nfapi.allocation.prach.flag", FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_preamble_index, { "Preamble index", "nfapi.preamable.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prach_mask_index, { "PRACH mask index", "nfapi.prach.mask.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rnti_type, { "RNTI type", "nfapi.rnti.type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_dci_dl_pdu_rel9, { "DL CONFIG DCI DL PDU Rel9", "nfapi.dl.config.mch.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mcch_flag, { "MCCH flag", "nfapi.mcch.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mcch_change_notification, { "MCCH change notification", "nfapi.mcch.change.notification", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_scrambling_identity, { "Scrambling identity", "nfapi.scrambling.identity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_dci_dl_pdu_rel10, { "DL CONFIG DCI DL PDU Rel10", "nfapi.dl.config.mch.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cross_carrier_scheduling_flag, { "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_carrier_indicator, { "Carrier Indicator", "nfapi.carrier.indicator", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_flag, { "SRS flag", "nfapi.srs.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_request, { "SRS request", "nfapi.srs.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_antenna_ports_scrambling_and_layers, { "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_total_dci_length_including_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_dl_rb, { "N_DL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_ul_rb, { "N_UL_RB", "nfapi.n.dl.rb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_ack_resource_offset, { "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator, { "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_primary_cell_type, { "Primary cell type", "nfapi.primary.cell.type", FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_dl_configuration_flag, { "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_ul_dl_configurations, { "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_dl_configuration_index, { "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_laa_end_partial_sf_flag, { "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_laa_end_partial_sf_configuration, { "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_codebooksize_determination_r13, { "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rel13_drms_table_flag, { "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pscch_resource, { "PSCCH Resource", "nfapi.pscch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_time_resource_pattern, { "Time resource pattern", "nfapi.time.resource.pattern", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mpdcch_transmission_type, { "MPDCCH transmission type", "nfapi.mpdcch.transmission.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_drms_scrambling_init, { "DMRS scrambling init", "nfapi.drms.scrambling.init", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pusch_repetition_levels, { "PUSCH repetition levels", "nfapi.pusch.repetition.levels", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_frequency_hopping_flag, { "Frequency hopping flag", "nfapi.frequency.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_request, { "CSI request", "nfapi.csi.request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dai_presence_flag, { "DAI presence flag", "nfapi.dia.presence.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_total_dci_length_include_padding, { "Total DCI length including padding", "nfapi.total.dci.length.including.padding", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_prs_pdu_rel9, { "DL CONFIG PRS PDU Rel9", "nfapi.dl.config.prs.pdu.rel9", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prs_bandwidth, { "PRS Bandwidth", "nfapi.prs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_prs_cyclic_prefix_type, { "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_config_csi_rs_pdu_rel10, { "DL CONFIG CSI RS PDU Rel10", "nfapi.dl.config.csi.rs.pdu.rel10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_rs_antenna_port_count_r10, { "Antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_request_body, { "UL Config Request body", "nfapi.ul.config.request.body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_pdu_type,	{ "UL Config PDU Type", "nfapi.ul.config.pdu.type", FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rach_prach_frequency_resources,	{ "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_present, { "SRS present", "nfapi.srs.present", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_harq_buffer_pdu, { "HARQ Buffer PDU", "nfapi.ul.config.harq.buffer.pdu", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_ue_information_rel8, { "UE Information Rel 8", "nfapi.ul.config.ue.information.pdu.rel8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_handle,	{ "Handle", "nfapi.handle",	FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_sr_information_pdu_rel8, { "SR Information Rel 8", "nfapi.ul.config.sr.information.pdu.rel8",	FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pucch_index, { "PUCCH Index", "nfapi.pucch.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_size, { "Size", "nfapi.size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_resource_block_start, { "Resource block start", "nfapi.resource.block.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_resource_blocks, { "Number of resource blocks", "nfapi.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cyclic_shift_2_for_drms, { "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_frequency_hopping_enabled_flag, { "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag", FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_frequency_hopping_bits, { "Frequency hopping bits", "nfapi.frequency.hopping.bits", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_new_data_indication, { "New Data inidication", "nfapi.new.data.indication", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_process_number, { "HARQ Process number", "nfapi.harq.process.number", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_tx_mode, { "UL Tx Mode", "nfapi.ul.tx.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_current_tx_nb, { "Current Tx nb", "nfapi.current.tx.nb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_srs, { "N SRS", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_disable_sequence_hopping_flag, { "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_virtual_cell_id_enabled_flag, { "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag", FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_npusch_identity, { "nPUSCH Identity", "nfapi.npusch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ndrms_csh_identity, { "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_total_number_of_repetitions, { "Total Number of repetitions", "nfapi.total.number.of.repetitions", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_repetition_number, { "Repetition Number", "nfapi.repetition.number", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_initial_sf_io, { "Initial transmission SF (io) ", "nfapi.initial.sf.io", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_empty_symbols_due_to_retunning, { "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cqi_ri_pmi_size_2, { "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_size_2, { "HARQ Size 2", "nfapi.harq.size2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_delta_offset_harq_2, { "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_starting_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_antenna_port, { "Antenna Port", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_combs, { "Number of Combs", "nfapi.num.of.combs", FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_npucch_identity, { "nPUCCH Identity", "nfapi.npucch.identity", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_empty_symbols, { "Empty symbols", "nfapi.empty.symbols", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_csi_mode, { "CSI_mode", "nfapi.csi.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cqi_pmi_size_2, { "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_statring_prb, { "Starting PRB", "nfapi.starting.prb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cdm_index, { "cdm_Index", "nfapi.cdm.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_nsrs, { "N srs", "nfapi.n.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_num_ant_ports, { "Num_ant_ports", "nfapi.num.ant.port", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_2_0, { "n_PUCCH_2_0", "nfapi.n.pucch.2.0", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_2_1, { "n_PUCCH_2_1", "nfapi.n.pucch.2.1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_2_2, { "n_PUCCH_2_2", "nfapi.n.pucch.2.2", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_2_3, { "n_PUCCH_2_3", "nfapi.n.pucch.2.3", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cqi_pmi_size_rank_1, { "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cqi_pmi_size_rank_greater_1,	{ "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ri_size, { "RI size", "nfapi.ri.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_delta_offset_cqi, { "Delta offset cqi", "nfapi.delta.offset.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_delta_offset_ri, { "Delta offset ri", "nfapi.delta.offset.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_size, { "HARQ size", "nfapi.harq_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_delta_offset_harq, { "Delta offset HARQ", "nfapi.delta.offset.harq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ack_nack_mode, { "ACK NACK mode", "nfapi.ack.nack.mode", FT_UINT8, BASE_DEC, VALS(nfapi_ack_nack_mode_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_srs_initial, { "N srs initial", "nfapi.n.srs.initial", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_initial_number_of_resource_blocks, { "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cqi_pmi_size, { "DL cqi pmi size", "nfapi.dl.cqi.pmi.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_report_type, { "Report type", "nfapi.report.type", FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cqi_ri_pmi_size,	{ "DL CQI RI PMI size", "nfapi.dl.cqi.ri.pmi.size",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_control_type, { "Control type", "nfapi.control.type", FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_cc, { "Number of cc", "nfapi.number.of.cc",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_pucch_resource, { "Number of PUCCH Resource", "nfapi.number.of.pucch.resource", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pucch_index_p1, { "PUCCH Index P1", "nfapi.pucch.index.p1", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_1_0, { "N PUCCH 1 0", "nfapi.n.pucch.1.0", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_1_1, { "N PUCCH 1 1", "nfapi.n.pucch.1.1", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_1_2, { "N PUCCH 1 2", "nfapi.n.pucch.1.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_n_pucch_1_3, { "N PUCCH 1 3", "nfapi.n.pucch.1.3", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_bandwidth, { "SRS Bandwidth", "nfapi.srs.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_frequency_domain_position, { "Frequency Domain position", "nfapi.frequency.domain.position", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_srs_hopping_bandwidth, { "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_transmission_comb, { "Transmission comb", "nfapi.transmission.comb", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_i_srs, { "I SRS", "nfapi.i.srs", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sounding_reference_cyclic_shift, { "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_antenna_ports, { "Antenna port(s)", "nfapi.antenna.port", FT_UINT8, BASE_DEC, VALS(nfapi_antenna_port_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_srs_pdu_rel10, { "SRS PDU Rel 10", "nfapi.srs.pdu.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_srs_pdu_rel8, { "SRS PDU Rel 8", "nfapi.srs.pdu.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_harq_information_rel9_fdd, { "HARQ information Rel 9 FDD", "nfapi.harq.information.rel.9.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_harq_information_rel8_fdd, { "HARQ information Rel 8 FDD", "nfapi.harq.information.rel.8.fdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_harq_information_rel10_tdd, { "HARQ information Rel 10 TDD", "nfapi.harq.information.rel.10.tdd", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_sr_information_rel10, { "SR information Rel 10", "nfapi.sr.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_sr_information_rel8, { "SR information Rel 8", "nfapi.sr.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_cqi_information_rel10, { "CQI information Rel 10", "nfapi.cqi.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_cqi_information_rel8, { "CQI information Rel 8", "nfapi.cqi.information.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_initial_transmission_parameters_rel8, { "Initial transmission parameters Rel 8", "nfapi.initial.transmission.parameters.rel.8", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_config_ulsch_harq_information_rel10, { "HARQ Information Rel 10", "nfapi.harq.information.rel.10", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdu_length, { "PDU length", "nfapi.pdu.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_num_segments, { "Num segments", "nfapi.num.segments", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_segment_length, { "Segment length", "nfapi.segment.length", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_segment_data, { "Segment data", "nfapi.segment.data", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_crc_indication_body, { "CRC Indication Body", "nfapi.crc_indication_body", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_crc_flag, { "CRC flag", "nfapi.crc.flag", FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_hi_pdus, { "Number of HI Pdu's", "nfapi.number_of_hi_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_dci_pdus, { "Number of DCI Pdu's", "nfapi.number_of_dci_pdus", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pdu_type, { "PDU Type", "nfapi.pdu_type",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_hi_value, { "HI Value", "nfapi.hi_value", FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_i_phich, { "i phich", "nfapi.i_phich", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_flag_tb2, { "Flag TB2", "nfapi.flag_tb2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_hi_value_2, { "HI Value 2", "nfapi.hi_value_2", FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ue_tx_antenna_selection, { "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cqi_csi_request, { "cqi csi request", "nfapi.cqi_csi_request", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_index, { "UL index", "nfapi.ul_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_assignment_index, { "DL Assignment index", "nfapi.dl_assignment_index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tpc_bitmap, { "TPC bitmap", "nfapi.tpc_bitmap", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_antenna_ports, { "Number of antenna ports", "nfapi.number.of.antenna.ports", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_size_of_cqi_csi_feild, { "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_new_data_indication_two, { "New data indicatipon 2", "nfapi.new.data.indication.two", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_resource_allocation_flag, { "Resource allocation flag", "nfapi.resource.allocation.flag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_node_sync, { "DL Node Sync", "nfapi.dl.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_node_sync_t1, { "DL Node Sync t1", "nfapi.dl.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_node_sync_delta_sfn_sf, { "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_dl_cyclic_prefix_type, { "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_cyclic_prefix_type, { "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type", FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_downlink_channel_bandwidth, { "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uplink_channel_bandwidth, { "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_tx_antenna_ports, { "Tx Antenna Ports", "nfapi.tx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rx_antenna_ports, { "Tx Antenna Ports", "nfapi.rx.antenna.ports", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_node_sync, { "UL Node Sync", "nfapi.ul.node.sync", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_node_sync_t1, { "UL Node Sync t1", "nfapi.ul.node.sync.t1", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_node_sync_t2, { "UL Node Sync t2", "nfapi.ul.node.sync.t2", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_node_sync_t3, { "UL Node Sync t3", "nfapi.ul.node.sync.t3", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pb, { "P-B", "nfapi.pb.allocation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_last_sfn_sf, { "Last SFN/SF", "nfapi.timing.info.last.sfn.sf", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_time_since_last_timing_info, { "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_dl_config_jitter, { "DL Config Jitter", "nfapi.timing.info.dl.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_tx_request_jitter, { "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_ul_config_jitter, { "UL Config Jitter", "nfapi.timing.info.ul.config.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_hi_dci0_jitter, { "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_dl_config_latest_delay, { "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_tx_request_latest_delay, { "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_ul_config_latest_delay, { "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_hi_dci0_latest_delay, { "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_dl_config_earliest_arrival, { "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_tx_request_earliest_arrival, { "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_ul_config_earliest_arrival, { "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_hi_dci0_earliest_arrival, { "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pcfich_power_offset, { "PCFICH Power Offset", "nfapi.pcfich.power.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_window, { "NFAPI Timing window", "nfapi.timing.window", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_mode, { "Timing Info mode", "nfapi.timing.info.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_info_period, { "Timing info period", "nfapi.timing.info.period", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_max_transmit_power, { "Max transmit power", "nfapi.max.transmit.power", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uint8_tag, { "uint8 tag", "nfapi.uint8.tag", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uint16_tag, { "uint16 tag", "nfapi.uint16.tag", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_mode, { "Mode", "nfapi.harq.mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_ack_nack,	{ "Number of ACK/NACK", "nfapi.uint16.tag",	FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_data_value_0,	{ "Value 0", "nfapi.harq.value.0",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_data_value_1,	{ "Value 1", "nfapi.harq.value.1",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_data_value_2,	{ "Value 2", "nfapi.harq.value.2",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_data_value_3,	{ "Value 3", "nfapi.harq.value.3",	FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_tb_1, { "HARQ TB1", "nfapi.harq.tb.", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_tb_2, { "HARQ TB2", "nfapi.harq.tb.2", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_tb_n, { "HARQ TB_N", "nfapi.harq.tb.n", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_cqi, { "UL_CQI", "nfapi.ul.cqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_channel, { "Channel", "nfapi.channel", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_data_offset, { "Data Offset", "nfapi.data.offset", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },		
--		{ &hf_nfapi_ri, { "RI", "nfapi.ri", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_ack_nack_data, { "HARQ Ack/Nack Data", "nfapi.harq.ack.nack.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_harq_data, { "HARQ TB Data", "nfapi.harq.tb.data", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_cc, { "CC", "nfapi.cc", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rbs, { "RBs", "nfapi.rbs", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_antennas, { "Physical Antennas", "nfapi.physical.antennas", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_advance, { "Timing Advance", "nfapi.timing.advance", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timing_advance_r9, { "Timing Advance R9", "nfapi.timing.advance.r9", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_cc_reported, { "Number of CC reported", "nfapi.number.of.cc.reported", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_preamble, { "Preamble", "nfapi.preamble", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rach_resource_type, { "RACH resource type", "nfapi.rach.resource.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_doppler_estimation, { "Doppler estimation", "nfapi.doppler.estimation", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rb_start, { "RB Start", "nfapi.rb.start", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_snr, { "SNR", "nfapi.snr", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_up_pts_symbol, { "UpPTS Symbol", "nfapi.uppts.symbol", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_prb_per_subband, { "numPRBperSubband", "nfapi.num.prb.per.subband", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_antennas, { "numAntennas", "nfapi.num.antennas", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_subband_index, { "subbandIndex", "nfapi.subband.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_channel_coefficient, { "Channel", "nfapi.channel.coefficient", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_ul_rtoa, { "UL_RTOA", "nfapi.ul.rtoa", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_frequency_band_indicator, { "Frequency Band Indicator", "nfapi.frequency.band.indicator", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_measurement_period, { "Measurement Period", "nfapi.measurement.period", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bandwidth, { "Bandwidth", "nfapi.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_timeout, { "Timeout", "nfapi.timeout", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_earfcns, { "Number of EARFCNs", "nfapi.number.of.earfcns", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_earfcn_list, { "EARFCN List", "nfapi.earfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uarfcn, { "UARFCN", "nfapi.uarfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_uarfcns, { "Number of UARFCNs", "nfapi.number.of.uarfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_uarfcn_list, { "UARFCN List", "nfapi.uarfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_arfcn, { "ARFCN", "nfapi.arfcn", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_arfcn_direction, { "Direction", "nfapi.arfcn.direction", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_arfcns, { "Number of ARFCNs", "nfapi.number.of.arfcn", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_arfcn_list, { "ARFCN List", "nfapi.arfcn.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rssi, { "RSSI", "nfapi.rssi", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_rssi, { "Number of RSSI", "nfapi.number.of.rssi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rssi_list, { "RSSI List", "nfapi.rssi.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pci, { "PCI", "nfapi.pci", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_measurement_bandwidth, { "Measurement Bandwidth", "nfapi.measurement.bandwidth", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_exhaustive_search, { "Exhaustive Search", "nfapi.exhaustive.search", FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_pci, { "Number of PCI", "nfapi.number.of.pci", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pci_list, { "PCI List", "nfapi.pci.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_psc, { "PSC", "nfapi.psc", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_psc, { "Number of PSC", "nfapi.number.of.psc", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_psc_list, { "PCS List", "nfapi.psc.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rsrp, { "RSRP", "nfapi.rsrp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rsrq, { "RSRQ", "nfapi.rsrq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_lte_cells_found, { "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_lte_cells_found_list, { "LTE Cells Found List", "nfapi.lte.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rscp, { "RSCP", "nfapi.rscp", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_enco, { "EcNo", "nfapi.ecno", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_utran_cells_found, { "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_utran_cells_found_list, { "UTRAN Cells Found List", "nfapi.utran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_bsic, { "BSIC", "nfapi.bsic", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rxlev, { "RxLev", "nfapi.rxlev", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_rxqual, { "RxQual", "nfapi.rxqual", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sfn_offset, { "SFN Offset", "nfapi.sfn.offset", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_geran_cells_found, { "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_geran_cells_found_list, { "GERAN Cells Found List", "nfapi.geran.cells.found.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_tx_antenna, { "Number of Tx Antenna", "nfapi.number.of.tx.antenna", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mib_length, { "MIB Length", "nfapi.mib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_mib, { "MIB", "nfapi.mib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_phich_configuration, { "PHICH Configuration", "nfapi.phich.configuration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_retry_count, { "retryCount", "nfapi.retry.count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sib1, { "SIB1", "nfapi.sib1", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_si_periodicity, { "SI Periodicity", "nfapi.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_si_index, { "SI Index", "nfapi.si.index", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_number_of_si_periodicity, { "Number of SI Periodicity", "nfapi.number.of.si.periodicity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_si_periodicity_list, { "SI Periodicity List", "nfapi.si.periodicity.list", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_si_window_length, { "SI Window Length", "nfapi.si.window.length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sib_type, { "SIB Type", "nfapi.sib.type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sib_len, { "SIB Length", "nfapi.sib.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_sib, { "SIB", "nfapi.sib", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_si_len, { "SI Length", "nfapi.si.length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_si, { "SI", "nfapi.si", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_search_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--		{ &hf_nfapi_pnf_broadcast_state, { "State", "nfapi.state", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } },
--
--	};
--
--    /* Setup protocol subtree array */
--    static gint *ett[] = {
--        &ett_nfapi_message_tree,
--		&ett_nfapi_p4_p5_message_header,
--		&ett_nfapi_p7_message_header,
--		&ett_nfapi_tlv_tree,
--		&ett_nfapi_tl,
--		&ett_nfapi_pnf_param_response,
--		&ett_nfapi_pnf_phy_rf_config,
--		&ett_nfapi_pnf_phy_rf_config_instance,
--		&ett_nfapi_pnf_phy,
--		&ett_nfapi_pnf_phy_rel10,
--		&ett_nfapi_pnf_phy_rel11,
--		&ett_nfapi_pnf_phy_rel12,
--		&ett_nfapi_pnf_phy_rel13,
--		&ett_nfapi_pnf_rf,
--		&ett_nfapi_phy_state,
--		&ett_nfapi_rf_bands,
--		&ett_nfapi_bf_vectors,
--		&ett_nfapi_csi_rs_bf_vector,
--		&ett_nfapi_csi_rs_resource_configs,
--		&ett_nfapi_tx_antenna_ports,
--		&ett_nfapi_harq_ack_nack_data,
--		&ett_nfapi_harq_data,
--		&ett_nfapi_cc,
--		&ett_nfapi_rbs,
--		&ett_nfapi_antennas,
--		&ett_nfapi_epdcch_prbs,
--		&ett_nfapi_dl_config_request_body,
--		&ett_nfapi_dl_config_request_pdu_list,
--		&ett_nfapi_ul_config_request_pdu_list,
--		&ett_nfapi_hi_dci0_request_pdu_list,
--		&ett_nfapi_tx_request_pdu_list,
--		&ett_nfapi_rx_indication_pdu_list,
--		&ett_nfapi_harq_indication_pdu_list,
--		&ett_nfapi_crc_indication_pdu_list,
--		&ett_nfapi_sr_indication_pdu_list,
--		&ett_nfapi_cqi_indication_pdu_list,
--		&ett_nfapi_preamble_indication_pdu_list,
--		&ett_nfapi_srs_indication_pdu_list,
--		&ett_nfapi_lbt_dl_config_pdu_list,
--		&ett_nfapi_lbt_dl_indication_pdu_list,
--		&ett_nfapi_dl_config_request_dlsch_pdu_rel8,
--		&ett_nfapi_dl_config_request_dlsch_pdu_rel9,
--		&ett_nfapi_dl_config_request_dlsch_pdu_rel10,
--		&ett_nfapi_dl_config_bch_pdu_rel8,
--		&ett_nfapi_dl_config_mch_pdu_rel8,
--		&ett_nfapi_dl_config_pch_pdu_rel8,
--		&ett_nfapi_dl_config_dci_dl_pdu_rel8,
--		&ett_nfapi_dl_config_dci_dl_pdu_rel9,
--		&ett_nfapi_dl_config_dci_dl_pdu_rel10,
--		&ett_nfapi_dl_config_prs_pdu_rel9,
--		&ett_nfapi_dl_config_csi_rs_pdu_rel10,
--		&ett_nfapi_subbands,
--		&ett_nfapi_precoding,
--		&ett_nfapi_bf_vector_antennas,
--		&ett_nfapi_ul_config_request_body,
--		&ett_nfapi_ul_config_harq_buffer_pdu,
--		&ett_nfapi_ul_config_ue_information_rel8,
--		&ett_nfapi_ul_config_sr_information_pdu_rel8,
--		&ett_nfapi_ul_config_ulsch_pdu_rel8,
--		&ett_nfapi_ul_config_ulsch_pdu_rel10,
--		&ett_nfapi_ul_config_cqi_ri_information_rel8,
--		&ett_nfapi_ul_config_cqi_ri_information_rel9,
--		&ett_nfapi_ul_config_ulsch_harq_information_rel10,
--		&ett_nfapi_ul_config_initial_transmission_parameters_rel8,
--		&ett_nfapi_ul_config_cqi_information_rel8,
--		&ett_nfapi_ul_config_cqi_information_rel10,
--		&ett_nfapi_ul_config_sr_information_rel8,
--		&ett_nfapi_ul_config_sr_information_rel10,
--		&ett_nfapi_ul_config_harq_information_rel10_tdd,
--		&ett_nfapi_ul_config_harq_information_rel8_fdd,
--		&ett_nfapi_ul_config_harq_information_rel9_fdd,
--		&ett_nfapi_ul_config_srs_pdu_rel8,
--		&ett_nfapi_ul_config_srs_pdu_rel10,
--		&ett_nfapi_crc_indication_body,
--
--		&ett_nfapi_earfcn_list,
--		&ett_nfapi_uarfcn_list,
--		&ett_nfapi_arfcn_list,
--		&ett_nfapi_rssi_list,
--		&ett_nfapi_pci_list,
--		&ett_nfapi_psc_list,
--		&ett_nfapi_lte_cells_found_list,
--		&ett_nfapi_utran_cells_found_list,
--		&ett_nfapi_geran_cells_found_list,
--		&ett_nfapi_si_periodicity_list,
--
--		/* for fragmentation support*/
--		&ett_msg_fragment,
--		&ett_msg_fragments
--    };
--
--    static ei_register_info ei[] = 
--	{
--		{ &ei_power_invalid, { "nfapi.power.invalid", PI_PROTOCOL, PI_ERROR, "Tx Power range invalid [0 - 10000]", EXPFILL } },
--		{ &ei_ref_sig_power_invalid, { "nfapi.ref_sig_power.invalid", PI_PROTOCOL, PI_ERROR, "Ref Sig Power range invalid [0 - 255]", EXPFILL }},
--		{ &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_ERROR, "Out of valid range. Todo create more specific error", EXPFILL } },
--    };
--	
--
--
--    expert_module_t* expert_nfapi;
--
--	/* Register protocol */
--	proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi");
--
--    expert_nfapi = expert_register_protocol(proto_nfapi);
--
--    expert_register_field_array(expert_nfapi, ei, array_length(ei));
--
--    proto_register_field_array(proto_nfapi, hf, array_length(hf));
--    proto_register_subtree_array(ett, array_length(ett));
--	
--	reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions);
--	reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions);
--
--	register_dissector("nfapi", dissect_nfapi, proto_nfapi);
--
--}
--
--// ----------------------------------------------------------------------------|
--
--void proto_reg_handoff_nfapi(void)
--{
--	static dissector_handle_t nfapi_handle;
--
--	nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi);
--
--	dissector_add_for_decode_as("sctp.port", nfapi_handle);
--
--	dissector_add_uint("udp.port", 41700, nfapi_handle);
--
--}
-+
-+		default:
-+		{
-+			if (msg_id >= 0x112 && msg_id <= 0x017f)
-+			{
-+				// reserved P5 message
-+			}
-+			else if (msg_id >= 0x183 && msg_id <= 0x01ff)
-+			{
-+				// reserved P7 message
-+			}
-+			else if (msg_id >= 0x0200 && msg_id <= 0x02ff)
-+			{
-+				// reserved P4 message
-+			}
-+			else if (msg_id >= 0x0300 && msg_id <= 0x03ff)
-+			{
-+				// reserved vendor extentions
-+			}
-+
-+			break;
-+		}
-+	};
-+
-+	ptvcursor_pop_subtree(ptvc);
-+	ptvcursor_free(ptvc);
-+
-+	return tvb_captured_length(tvb);
-+}
-+
-+static void nfapi_tag_vals_fn(gchar* s, guint32 v)
-+{
-+	const tlv_t* tlv = look_up_tlv(v);
-+	if (tlv != 0)
-+	{
-+		g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", tlv->name, v);
-+	}
-+	else
-+	{
-+		g_snprintf(s, ITEM_LABEL_LENGTH, "%s (0x%x)", "Unknown", v);
-+	}
-+}
-+static void neg_pow_conversion_fn(gchar* s, guint8 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%d dB (%d)", ((gint16)v * (-1)), v);
-+}
-+static void power_offset_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.001) - 6.0), v);
-+}
-+static void reference_signal_power_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v * 0.25) - 63.75), v);
-+}
-+static void laa_threshold_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (float)(v * -100.00), v);
-+}
-+static void max_transmit_power_2_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1) - 10.0, v);
-+}
-+static void max_transmit_power_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v);
-+}
-+static void sfn_sf_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%d/%d (%d)", v >> 0x4, v & 0x000F, v);
-+}
-+static void rssi_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v);
-+}
-+static void dl_rs_tx_pow_measment_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", ((float)v * 0.1), v);
-+}
-+
-+static void ul_cqi_conversion_fn(gchar* s, guint16 v)
-+{
-+	g_snprintf(s, ITEM_LABEL_LENGTH, "%.2f dB (%d)", (((float)v / 2 ) - 64.0), v);
-+}
-+
-+// ----------------------------------------------------------------------------|
-+
-+void proto_register_nfapi(void)
-+{
-+	static hf_register_info hf[] =
-+	{
-+		{ &hf_msg_fragments,
-+			{ "Message fragments", "nfapi.fragments",
-+			FT_NONE, BASE_NONE, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment,
-+			{ "Message fragment", "nfapi.fragment",
-+			FT_FRAMENUM, BASE_NONE, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment_overlap,
-+			{ "Message fragment overlap", "nfapi.fragment.overlap",
-+			FT_BOOLEAN, 0, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment_overlap_conflicts,
-+			{ "Message fragment overlapping with conflicting data", "nfapi.fragment.overlap.conflicts",
-+			FT_BOOLEAN, 0, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment_multiple_tails,
-+			{ "Message has multiple tail fragments", "nfapi.fragment.multiple_tails",
-+			FT_BOOLEAN, 0, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment_too_long_fragment,
-+			{ "Message fragment too long", "nfapi.fragment.too_long_fragment",
-+			FT_BOOLEAN, 0, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment_error,
-+			{ "Message defragmentation error", "nfapi.fragment.error",
-+			FT_FRAMENUM, BASE_NONE, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_fragment_count,
-+			{ "Message fragment count", "nfapi.fragment.count",
-+			FT_UINT32, BASE_DEC, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_reassembled_in,
-+			{ "Reassembled in", "nfapi.reassembled.in",
-+			FT_FRAMENUM, BASE_NONE, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_msg_reassembled_length,
-+			{ "Reassembled length", "nfapi.reassembled.length",
-+			FT_UINT32, BASE_DEC, NULL, 0x00,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_p4_p5_message_header_phy_id,
-+			{ "PHY ID", "nfapi.p4_p5_message_header.phy_id",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL }
-+		},
-+		{ &hf_nfapi_p4_p5_message_header_message_id,
-+			{ "Message ID", "nfapi.p4_p5_message_header.message_id",
-+			FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0,
-+			"The nFAPI message identity", HFILL }
-+		},
-+		{ &hf_nfapi_p4_p5_message_header_message_length,
-+			{ "Message Length", "nfapi.p4_p5_message_header.message_length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The length in bytes of the message including the header", HFILL }
-+		},
-+		{ &hf_nfapi_p4_p5_message_header_spare,
-+			{ "Spare", "nfapi.p4_p5_message_header.spare",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Reserved field to be populated with zeros on transmission and ignored on reception", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_phy_id,
-+			{ "Phy ID", "nfapi.p7_message_header.phy_id",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Within the PNF Device, the unique identity of the PHY instance as assigned through the PNF_CONFIG.request", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_message_id,
-+			{ "Message ID", "nfapi.p7.message_header.message_id",
-+			FT_UINT16, BASE_HEX_DEC, VALS(message_id_vals), 0x0,
-+			"The nFAPI message identity", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_message_length,
-+			{ "Message Length", "nfapi.p7_message_header.message_length",
-+			FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0,
-+			"The length in bytes of the message segment including the header", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_m,
-+			{ "M", "nfapi.p7_message_header.m_segment_sequence",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"A More flag indicating there are more segments to follow to complete the entire message", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_segment,
-+			{ "Segment Number", "nfapi.p7_message_header.m_segment_sequence",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The segment number starting at zero and incrementing by one between each segment", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_sequence_number,
-+			{ "Sequence Number", "nfapi.p7_message_header.m_segment_sequence",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The incrementing sequence number for all complete messages over the P7 nFAPI interface per PHY instance", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_checksum,
-+			{ "Checksum", "nfapi.p7_message_header.checksum",
-+			FT_UINT32, BASE_HEX_DEC, NULL, 0x0,
-+			"The checksum of the whole message segment (including header) as calculated using "
-+			"the CRC32c algorithm following the same method as the SCTP protocol defined in IETF RFC 4960 "
-+			"The Checksum is optional to populate and must be filled with zero's when not used", HFILL }
-+		},
-+		{ &hf_nfapi_p7_message_header_transmit_timestamp,
-+			{ "Transmit Timestamp", "nfapi.p7_message_header.timestamp",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The offset from VNF SFN/SF 0/0 time reference of the message transmission at the transport layer, in microseconds, with a range of 0 to 10239999", HFILL }
-+		},
-+		{ &hf_nfapi_tl_tag,
-+			{ "TLV Tag", "nfapi.tl_tag",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(nfapi_tag_vals_fn), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_tl_length,
-+			{ "TLV Length", "nfapi.tl_length",
-+			FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_byte_bytes, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_error_code,
-+			{ "Error Code", "nfapi.error.code",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_error_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_p4_error_code,
-+			{ "Error Code", "nfapi.p4_error.code",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_p4_error_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_rat_type,
-+			{ "RAT Type", "nfapi.rat_type",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_rat_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_num_tlv,
-+			{ "Number of TLV", "nfapi.param.response.num_tlv",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_phy_state,
-+			{ "Phy state value", "nfapi.phy.state",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_phy_state_vals), 0x0,
-+			"Indicates the current operational state of the PHY", HFILL }
-+		},
-+		{ &hf_nfapi_dl_ue_per_sf,
-+			{ "Downlink UEs per Subframe", "nfapi.dl.ue.per.sf",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The maximum number of downlink UEs per subframe supported."
-+			"This is the maximum number of downlink UEs that can be scheduled per "
-+			"subframe, non-inclusive of broadcast, paging and common channels.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_ue_per_sf,
-+			{ "Uplink UEs per Subframe", "nfapi.ul.ue.per.sf",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The maximum number of uplink UEs per subframe supported."
-+			"This is the maximum number of uplink UEs that can be scheduled per "
-+			"subframe, non-inclusive of common channels.", HFILL }
-+		},
-+		{ &hf_nfapi_duplex_mode,
-+			{ "Duplex Mode", "nfapi.duplex.mode",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_duplex_mode_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support,
-+			{ "Downlink bandwidth support", "nfapi.dl.bandwidth.support",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PHY downlink channel bandwidth capability (in resource blocks)", HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support_6,
-+			{ "6Mhz", "nfapi.dl.bandwidth.support.6",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support_15,
-+			{ "15Mhz", "nfapi.dl.bandwidth.support.15",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support_25,
-+			{ "25Mhz", "nfapi.dl.bandwidth.support.25",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support_50,
-+			{ "50Mhz", "nfapi.dl.bandwidth.support.50",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support_75,
-+			{ "75Mhz", "nfapi.dl.bandwidth.support.75",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_bandwidth_support_100,
-+			{ "100Mhz", "nfapi.dl.bandwidth.support.100",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support,
-+			{ "Uplink bandwidth support", "nfapi.ul.bandwidth.support",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PHY uplink channel bandwidth capability (in resource blocks)", HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support_6,
-+			{ "6Mhz", "nfapi.ul.bandwidth.support.6",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support_15,
-+			{ "15Mhz", "nfapi.ul.bandwidth.support.15",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support_25,
-+			{ "25Mhz", "nfapi.ul.bandwidth.support.25",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support_50,
-+			{ "50Mhz", "nfapi.ul.bandwidth.support.50",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support_75,
-+			{ "75Mhz", "nfapi.ul.bandwidth.support.75",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_bandwidth_support_100,
-+			{ "100Mhz", "nfapi.ul.bandwidth.support.100",
-+			FT_BOOLEAN, 1, TFS(&tfs_supported_not_supported), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_modulation_support,
-+			{ "Downlink modulation support", "nfapi.dl.modulation.support",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PHY downlink modulation capability", HFILL }
-+		},
-+		{ &hf_nfapi_dl_modulation_support_qpsk,
-+			{ "QPSK", "nfapi.dl.modulation.support.qpsk",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_modulation_support_16qam,
-+			{ "16QAM", "nfapi.dl.modulation.support.16qam",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_modulation_support_64qam,
-+			{ "64QAM", "nfapi.dl.modulation.support.64qam",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_modulation_support_256qam,
-+			{ "256QAM", "nfapi.dl.modulation.support.256qam",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_modulation_support,
-+			{ "Uplink modulation support", "nfapi.ul.modulation.support",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PHY uplink modulation capability", HFILL }
-+		},
-+		{ &hf_nfapi_ul_modulation_support_qpsk,
-+			{ "QPSK", "nfapi.ul.modulation.support.qpsk",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_modulation_support_16qam,
-+			{ "16QAM", "nfapi.ul.modulation.support.16qam",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_modulation_support_64qam,
-+			{ "64QAM", "nfapi.ul.modulation.support.64qam",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_phy_antenna_capability,
-+			{ "Phy Antenna capability", "nfapi.phy.antenna.capability",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of antennas supported", HFILL }
-+		},
-+		{ &hf_nfapi_release_capability,
-+			{ "Release capability", "nfapi.release.capability",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates which release the PHY supports", HFILL }
-+		},
-+		{ &hf_nfapi_mbsfn_capability,
-+			{ "MBSFN capability", "nfapi.mbsfn.capability",
-+			FT_BOOLEAN, 8, TFS(&support_strname), 0x0,
-+			"Indicates support for MBSFN features", HFILL }
-+		},
-+		{ &hf_nfapi_laa_capability,
-+			{ "LAA Support", "nfapi.laa.support",
-+			FT_BOOLEAN, 8, TFS(&support_strname), 0x0,
-+			"Indicates support for LAA features", HFILL }
-+		},
-+		{ &hf_nfapi_pd_sensing_lbt_support,
-+			{ "PD sensing LBT support", "nfapi.pd.sensing.lbt.support",
-+			FT_BOOLEAN, 8, TFS(&support_strname), 0x0,
-+			"Indicates support for PD sensing in L1", HFILL }
-+		},
-+		{ &hf_nfapi_multi_carrier_lbt_support,
-+			{ "Multi carrier LBT support", "nfapi.multi.carrier.lbt.support",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_mutli_carrier_lbt_support_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_partial_sf_support,
-+			{ "Partial SF support", "nfapi.partial.sf.support",
-+			FT_BOOLEAN, 8, TFS(&partial_sf_support_strname), 0x0,
-+			"Indicates support for Partial SF in L1", HFILL }
-+		},
-+		{ &hf_nfapi_reference_signal_power,
-+			{ "Reference signal power", "nfapi.ref_sig_power",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(reference_signal_power_conversion_fn), 0x0,
-+			"Normalized value levels (relative) to accommodate different absolute Tx Power used by eNb", HFILL }
-+		},
-+		{ &hf_nfapi_primary_synchronization_signal_epre_eprers,
-+			{ "Primary synchronization signal EPRE/EPRERS", "nfapi.primary.sync.signal",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"The power of synchronization signal with respect to the reference signal, (PSS for LTE cell, NPSS for NB-IOT cell)", HFILL }
-+		},
-+		{ &hf_nfapi_secondary_synchronization_signal_epre_eprers,
-+			{ "Secondary synchronization signal EPRE/EPRERS", "nfapi.secondary.sync.signal",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"The power of synchronization signal with respect to the reference signal, (SSS for LTE cell, NSSS for NB-IOT cell)", HFILL }
-+		},
-+		{ &hf_nfapi_physical_cell_id,
-+			{ "Physical Cell ID", "nfapi.physical.cell.id",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The Cell ID sent with the synchronization signal", HFILL }
-+		},
-+		{ &hf_nfapi_phich_resource,
-+			{ "PHICH Resource", "nfapi.phich.resource",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_phich_resource_vals), 0x0,
-+			"The number of resource element groups used for PHICH", HFILL }
-+		},
-+		{ &hf_nfapi_phich_duration,
-+			{ "PHICH Duration", "nfapi.phich.duration",
-+			FT_BOOLEAN, 8, TFS(&phich_duration_strname), 0x0,
-+			"The PHICH duration for MBSFN and non-MBSFN sub-frames", HFILL }
-+		},
-+		{ &hf_nfapi_phich_power_offset,
-+			{ "PHICH Power Offset", "nfapi.phich.power.offset",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"The power per antenna of the PHICH with respect to the reference signal", HFILL }
-+		},
-+		{ &hf_nfapi_configuration_index,
-+			{ "Configuration Index", "nfapi.configuration.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Provides information about the location and format of the PRACH.", HFILL }
-+		},
-+		{ &hf_nfapi_root_sequence_index,
-+			{ "Root sequence Index", "nfapi.root.sequence.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"PRACH Root sequence index", HFILL }
-+		},
-+		{ &hf_nfapi_zero_correlation_zone_configuration,
-+			{ "Zero correlation zone configuration", "nfapi.zero.correlation.zone.configuration",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Equivalent to Ncs", HFILL }
-+		},
-+		{ &hf_nfapi_high_speed_flag,
-+			{ "High Speed Flag", "nfapi.high.speed.flag",
-+			FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0,
-+			"Indicates if unrestricted, or restricted, set of preambles is used", HFILL }
-+		},
-+		{ &hf_nfapi_frequency_offset,
-+			{ "Frequency offset", "nfapi.frequency.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The first physical resource block available for PRACH", HFILL }
-+		},
-+		{ &hf_nfapi_hopping_mode,
-+			{ "Hopping Mode", "nfapi.hopping.mode",
-+			FT_BOOLEAN, 8, TFS(&hopping_mode_strname), 0x0,
-+			"If hopping is enabled indicates the type of hopping used", HFILL }
-+		},
-+		{ &hf_nfapi_hopping_offset,
-+			{ "Hopping offset", "nfapi.hopping.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The offset used if hopping is enabled", HFILL }
-+		},
-+		{ &hf_nfapi_delta_pucch_shift,
-+			{ "Delta PUCCH Shift", "nfapi.delta.pucch.shift",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The cyclic shift difference", HFILL }
-+		},
-+		{ &hf_nfapi_n_cqi_rb,
-+			{ "N CQI RB", "nfapi.n.cqi.rb",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The bandwidth, in units of resource blocks, that is available for use by PUCCH formats 2/2a/2b transmission in each slot", HFILL }
-+		},
-+		{ &hf_nfapi_n_an_cs,
-+			{ "N AN CS", "nfapi.n.an.cs",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of cyclic shifts used for PUCCH formats 1/1a/1b in a resource block with a mix of formats 1/a/1/ab and 2/2a/2b.", HFILL }
-+		},
-+		{ &hf_nfapi_n1_pucch_an,
-+			{ "N1 PUCCH AN", "nfapi.n1.pucch.an",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"N1 PUCCH", HFILL }
-+		},
-+		{ &hf_nfapi_bandwidth_configuration,
-+			{ "Bandwidth configuration", "nfapi.bw.configuration",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The available SRS bandwidth of the cell", HFILL }
-+		},
-+		{ &hf_nfapi_srs_subframe_configuration,
-+			{ "SRS subframe configuration", "nfapi.srs.subframe.configuration",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The subframe configuration. Needed if semi-static configuration is held in PHY", HFILL }
-+		},
-+		{ &hf_nfapi_uplink_rs_hopping,
-+			{ "Uplink RS hopping", "nfapi.uplink.rs.hopping",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_uplink_rs_hopping_vals), 0x0,
-+			"Indicates the type of hopping to use", HFILL }
-+		},
-+		{ &hf_nfapi_group_assignment,
-+			{ "Group assignment", "nfapi.group.assignment",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The sequence shift pattern used if group hopping is enabled", HFILL }
-+		},
-+		{ &hf_nfapi_cyclic_shift_1_for_drms,
-+			{ "Cyclic Shift 1 for DRMS", "nfapi.cyclic.shift.1.for.drms",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Specifies the cyclic shift for the reference signal used in the cell.", HFILL }
-+		},
-+		{ &hf_nfapi_subframe_assignment,
-+			{ "Subframe_assignment", "nfapi.subframe.assignment",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"For TDD mode only, indicates the DL/UL subframe structure", HFILL }
-+		},
-+		{ &hf_nfapi_special_subframe_patterns,
-+			{ "Special Subframe patterns", "nfapi.special.subframe.patterns",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"For TDD mode only. Length of fields DwPTS, GP and UpPTS", HFILL }
-+		},
-+		{ &hf_nfapi_ed_threshold_for_lbt_for_pdsch,
-+			{ "ED Threshold for LBT for PDSCH", "nfapi.ed.threshold.for.lbt.pdsch",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0,
-+			"Indicates the energy detection threshold in dBm for LBT for PDSCH", HFILL }
-+		},
-+		{ &hf_nfapi_ed_threshold_for_lbt_for_drs,
-+			{ "ED Threshold for LBT for DRS", "nfapi.ed.threshold.for.lbt.for.drs",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0,
-+			"Indicates the energy detection threshold in dBm for LBT for DRS", HFILL }
-+		},
-+		{ &hf_nfapi_pd_threshold,
-+			{ "PD Threshold", "nfapi.pd.threshold",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(laa_threshold_conversion_fn), 0x0,
-+			"Indicates the preamble detection threshold in dBm, if the L1 capabilities support PD", HFILL }
-+		},
-+		{ &hf_nfapi_multi_carrier_type,
-+			{ "Multi carrier type", "nfapi.multi.carrier.type",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_laa_carrier_type_vals), 0x0,
-+			"Indicates multi carrier type configuration of L1 (according to L1 capabilities and L2 scheduler requirements", HFILL }
-+		},
-+		{ &hf_nfapi_multi_carrier_tx,
-+			{ "Multi carrier TX", "nfapi.multi.carrier.tx",
-+			FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_tx_strname), 0x0,
-+			"Indicates multi carrier transmission configuration of L1 (according to type if supporting multi carrier)", HFILL }
-+		},
-+		{ &hf_nfapi_multi_carrier_freeze,
-+			{ "Multi carrier freeze", "nfapi.multi.carrier.freeze",
-+			FT_BOOLEAN, 8, TFS(&nfapi_multi_carrier_freeze_strname), 0x0,
-+			"Indicates multi carrier freeze, configuration of L1 (applicable only to type A type if supporting multi carrier)", HFILL }
-+		},
-+		{ &hf_nfapi_tx_antenna_ports_for_drs,
-+			{ "Tx antenna ports for DRS", "nfapi.tx.antenna.ports.for.drs",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of cell specific transmit antenna ports within the DRS occasions", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_power_for_drs,
-+			{ "Transmission power for DRS", "nfapi.transmission.power.for.drs.",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"Offset of cell specific Reference signals power within DRS occasions to the reference signal power", HFILL }
-+		},
-+		{ &hf_nfapi_pbch_repetitions_enabled_r13,
-+			{ "PBCH Repetitions enable R13", "nfapi.pbch.repetitions.enabled_r13",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable / Disable PBCH repetitions", HFILL }
-+		},
-+		{ &hf_nfapi_prach_cat_m_root_sequence_index,
-+			{ "PRACH CAT-M Root sequence index", "nfapi.prach.cat_m.root.squence.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"PRACH Root sequence index", HFILL }
-+		},
-+		{ &hf_nfapi_prach_cat_m_zero_correlation_zone_configuration,
-+			{ "PRACH CAT-M Zero correlation zone configuration", "nfapi.prach.cat_m.zero.correlation.zone.configuration",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Equivalent to Ncs", HFILL }
-+		},
-+		{ &hf_nfapi_prach_cat_m_high_speed_flag,
-+			{ "PRACH CAT-M High speed flag", "nfapi.prach.cat_m.high.speed.flag",
-+			FT_BOOLEAN, 8, TFS(&high_speed_flag_strname), 0x0,
-+			"Indicates if unrestricted, or restricted, set of preambles is used", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_enable,
-+			{ "PRACH CE level #0 Enable", "nfapi.prach.ce.level.0.enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable CE level #0.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_configuration_index,
-+			{ "PRACH CE level #0 Configuration index", "nfapi.prach.ce.level.0.configuration.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Provides information about the location and format of the PRACH", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_frequency_offset,
-+			{ "PRACH CE level #0 Frequency offset", "nfapi.prach.ce.level.0.frequency_offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The first physical resource block available for PRACH for each CE", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_number_of_repetitions_per_attempt,
-+			{ "PRACH CE level #0 Number of repetitions per attempt", "nfapi.prach.ce.level.0.number.of.repetitions.per_attempt",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of PRACH repetitions per attempt for each CE level", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_starting_subframe_periodicity,
-+			{ "CE level #0 Starting subframe periodicity", "nfapi.prach.ce.level.0.starting.subframe_periodicity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_hopping_enabled,
-+			{ "PRACH CE level #0 Hopping Enable", "nfapi.prach.ce.level.0.hopping_enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable PRACH frequency hopping for each CE level", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_0_hopping_offset,
-+			{ "PRACH CE level #0 Hopping Offset", "nfapi.prach.ce.level.0.hopping.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Valid in case 'PRACH Hopping Enable' is enabled", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_enable,
-+			{ "PRACH CE level #1 Enable", "nfapi.prach.ce.level.0.enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable CE level #1", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_configuration_index,
-+			{ "PRACH CE level #1 Configuration index", "nfapi.prach.ce.level.1.configuration.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Provides information about the location and format of the PRACH", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_frequency_offset,
-+			{ "PRACH CE level #1 Frequency offset", "nfapi.prach.ce.level.1.frequency_offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The first physical resource block available for PRACH for each CE", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_number_of_repetitions_per_attempt,
-+			{ "PRACH CE level #1 Number of repetitions per attempt", "nfapi.prach.ce.level.1.number.of.repetitions.per_attempt",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of PRACH repetitions per attempt for each CE level", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_starting_subframe_periodicity,
-+			{ "CE level #1 Starting subframe periodicity", "nfapi.prach.ce.level.1.starting.subframe_periodicity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Optional.PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities),", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_hopping_enabled,
-+			{ "PRACH CE level #1 Hopping Enable", "nfapi.prach.ce.level.1.hopping_enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_1_hopping_offset,
-+			{ "PRACH CE level #1 Hopping Offset", "nfapi.prach.ce.level.1.hopping.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Valid in case 'PRACH Hopping Enable' is enabled.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_enable,
-+			{ "PRACH CE level #2 Enable", "nfapi.prach.ce.level.2.enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable CE level #2", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_configuration_index,
-+			{ "PRACH CE level #2 Configuration index", "nfapi.prach.ce.level.2.configuration.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Provides information about the location and format of the PRACH", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_frequency_offset,
-+			{ "PRACH CE level #2 Frequency offset", "nfapi.prach.ce.level.2.frequency_offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The first physical resource block available for PRACH for each CE", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_number_of_repetitions_per_attempt,
-+			{ "PRACH CE level #2 Number of repetitions per attempt", "nfapi.prach.ce.level.2.number.of.repetitions.per_attempt",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of PRACH repetitions per attempt for each CE level", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_starting_subframe_periodicity,
-+			{ "CE level #2 Starting subframe periodicity", "nfapi.prach.ce.level.2.starting.subframe_periodicity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_hopping_enabled,
-+			{ "PRACH CE level #2 Hopping Enable", "nfapi.prach.ce.level.2.hopping_enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable PRACH frequency hopping for each CE level", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_2_hopping_offset,
-+			{ "PRACH CE level #2 Hopping Offset", "nfapi.prach.ce.level.2.hopping.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Valid in case 'PRACH Hopping Enable' is enabled.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_enable,
-+			{ "PRACH CE level #3 Enable", "nfapi.prach.ce.level.3.enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable CE level #3.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_configuration_index,
-+			{ "PRACH CE level #3 Configuration index", "nfapi.prach.ce.level.3.configuration.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Provides information about the location and format of the PRACH.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_frequency_offset,
-+			{ "PRACH CE level #3 Frequency offset", "nfapi.prach.ce.level.3.frequency_offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The first physical resource block available for PRACH for each CE", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_number_of_repetitions_per_attempt,
-+			{ "PRACH CE level #3 Number of repetitions per attempt", "nfapi.prach.ce.level.3.number.of.repetitions.per_attempt",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of PRACH repetitions per attempt for each CE level", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_starting_subframe_periodicity,
-+			{ "CE level #3 Starting subframe periodicity", "nfapi.prach.ce.level.3.starting.subframe_periodicity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Optional. PRACH starting subframe periodicity, expressed in number of slots available for preamble transmission(PRACH opportunities)", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_hopping_enabled,
-+			{ "PRACH CE level #3 Hopping Enable", "nfapi.prach.ce.level.3.hopping_enable",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Enable \\ Disable PRACH frequency hopping for each CE level.", HFILL }
-+		},
-+		{ &hf_nfapi_prach_ce_level_3_hopping_offset,
-+			{ "PRACH CE level #3 Hopping Offset", "nfapi.prach.ce.level.3.hopping.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Valid in case 'PRACH Hopping Enable' is enabled.", HFILL }
-+		},
-+		{ &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_a,
-+			{ "PUCCH Interval-ULHoppingConfigCommonModeA", "nfapi.pucch.interval.ulhopping.config.common.mode.a",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"NthULNB for UEModeA", HFILL }
-+		},
-+		{ &hf_nfapi_pucch_internal_ul_hopping_config_common_mode_b,
-+			{ "PUCCH Interval-ULHoppingConfigCommonModeB", "nfapi.pucch.interval.ulhopping.config.common.mode.b",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"NthULNB for UEModeB", HFILL }
-+		},
-+		{ &hf_nfapi_data_report_mode,
-+			{ "Data Report Mode", "nfapi.data.report.mode",
-+			FT_BOOLEAN, 8, TFS(&data_report_mode_vals), 0x0,
-+			"The data report mode for the uplink data", HFILL }
-+		},
-+		{ &hf_nfapi_sfnsf,
-+			{ "SFN/SF", "nfapi.sfn.sf",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0,
-+			"The future SFN/SF subframe where the TLVs included in the message should be applied", HFILL }
-+		},
-+		{ &hf_nfapi_max_up_pts,
-+			{ "Max UpPTS frames", "nfapi.max.uppts.frame",
-+			FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x0,
-+			"Used for TDD only and indicates how SRS operates in UpPTS subframes", HFILL }
-+		},
-+		{ &hf_nfapi_srs_acknack_srs_simultaneous_transmission,
-+			{ "SRS AckNack Simultaneous transmission", "nfapi.srs.acknack.simult.tx",
-+			FT_BOOLEAN, 8, TFS(&srs_simult_tx_strname), 0x0,
-+			"Indicates if SRS and ACK/NACK can be received in the same subframe. Needed if semi-static configuration is held in PHY.", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_address_ipv4,
-+			{ "PNF IPV4", "nfapi.pnf.address.ipv4",
-+			FT_IPv4, BASE_NONE, NULL, 0x0,
-+			"The IPv4 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_address_ipv6,
-+			{ "PNF IPV6", "nfapi.pnf.address.ipv6",
-+			FT_IPv6, BASE_NONE, NULL, 0x0,
-+			"The IPv6 address of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL }
-+		},
-+		{ &hf_nfapi_vnf_address_ipv4,
-+			{ "VNF IPV4 Address", "nfapi.vnf.address.ipv4",
-+			FT_IPv4, BASE_NONE, NULL, 0x0,
-+			"The IPv4 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL }
-+		},
-+		{ &hf_nfapi_vnf_address_ipv6,
-+			{ "VNF IPV6 Address", "nfapi.vnf.address.ipv6",
-+			FT_IPv6, BASE_NONE, NULL, 0x0,
-+			"The IPv6 address of the VNF to be used by the PNF for this P7 PHY instance", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_port,
-+			{ "PNF PORT value", "nfapi.config.pnf.port.value",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The port of the PNF PHY instance to be used by the VNF for this PNF PHY instance", HFILL }
-+		},
-+		{ &hf_nfapi_vnf_port,
-+			{ "VNF PORT value", "nfapi.config.vnf.port.value",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The port of the VNF to be used by the PNF for this P7 PHY instance", HFILL } },
-+		{ &hf_nfapi_sync_mode,
-+			{ "Sync Mode", "nfapi.sync.mode",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_sync_mode_vals), 0x0,
-+			"The method of nFAPI Synchronization supported by the PNF", HFILL }
-+		},
-+		{ &hf_nfapi_location_mode,
-+			{ "Location Mode", "nfapi.location.mode",
-+			FT_UINT8, BASE_DEC, VALS(location_mode_vals), 0x0,
-+			"The method of location derivation supported by the PNF", HFILL }
-+		},
-+		{ &hf_nfapi_location_coordinates_length,
-+			{ "Location Coordinates Length", "nfapi.location.coordinates.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Length in bytes of the Location Coordinates Array field", HFILL }
-+		},
-+		{ &hf_nfapi_location_coordinates,
-+			{ "Location Coordinates", "nfapi.location.coordinates",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			"The Location of the PNF. The value is formatted as the LocationCoordinates IE using BASIC-PER encoding as defined in "
-+			"TS36.355 section 6.4.2. The first bit of the LocationCoordinates IE is in the LSB of the first byte of the array."
-+			"The MSBs of the last element of the array may be padded with zeros if the ASN.1 element is not an integer number of bytes", HFILL }
-+		},
-+		{ &hf_nfapi_pdu,
-+			{ "PDU", "nfapi.pdu",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_config_timing,
-+			{ "DL config Timing", "nfapi.dl.config.timing",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The timing offset before the air interface subframe start that the DL_Config.request must be received at the PNF.", HFILL }
-+		},
-+		{ &hf_nfapi_tx_timing,
-+			{ "Tx Timing", "nfapi.general.tx.timing",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The timing offset before the air interface subframe start that the TX.request must be received at the PNF.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_config_timing,
-+			{ "UL Config Timing", "nfapi.ul.config.timing",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The timing offset before the air interface subframe start that the UL_CONFIG.request must be received at the PNF.", HFILL }
-+		},
-+		{ &hf_nfapi_hi_dci0_timing,
-+			{ "HI DCi0 Timing", "nfapi.hi.dci0.timing",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The timing offset before the air interface subframe start that the HI_DCI0.request must be received at the PNF.", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_number_phys,
-+			{ "Maximum number of Phys", "nfapi.maximum.number.phys",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The maximum number of operational PHYs supported by the PNF device.", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_total_bandwidth,
-+			{ "Maximum Total Bandwidth", "nfapi.maximum.total.bandwidth",
-+			FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0,
-+			"The total maximum bandwidth (in units of 100kHz) supported by the PNF device.", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_total_number_dl_layers,
-+			{ "Maximum Total Number DL Layers", "nfapi.maximum.total.number.dl.layers",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The maximum total number of downlink layers supported.", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_total_number_ul_layers,
-+			{ "Maximum Total Number UL Layers", "nfapi.maximum.total.number.ul.layers",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The maximum total number of uplink layers supported across all available PHYs.", HFILL }
-+		},
-+		{ &hf_nfapi_shared_bands,
-+			{ "Shared bands", "nfapi.shared.bands",
-+			FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0,
-+			"Indication that the PNF device shares the list of RF band options available across all available PHYs, so each may only be used with a single PHY.", HFILL }
-+		},
-+		{ &hf_nfapi_shared_pa,
-+			{ "Shared pa", "nfapi.shared.pa",
-+			FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0,
-+			"Indication that the PNF device shares a single RF PA across all available PHYs, so that the maximum Total Power is shared across all available PHYs.", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_total_power,
-+			{ "Maximum total power", "nfapi.maximum.total.power",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0,
-+			"The maximum transmit power of the PNF device summed across all PHYs.", HFILL }
-+		},
-+		{ &hf_nfapi_oui,
-+			{ "OUI", "nfapi.oui",
-+			FT_STRING, BASE_NONE, NULL, 0x0,
-+			"The PNF OUI in the format as specified by IEEE", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_phy_number_phy,
-+			{ "PNF Phy Number of Phy", "nfapi.pnf.phy.number.phy",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of PHY instances", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_phy_config_index,
-+			{ "PNF Phy Config Index", "nfapi.pnf.phy.config.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The unique index number of the PHY to permit the PNF to identify the PHY in the PNF_CONFIG.Request", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_rfs,
-+			{ "Number of RFs", "nfapi.pnf.rf.number.rf",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of RF configurations", HFILL }
-+		},
-+		{ &hf_nfapi_phy_rf_config_info_phy_id,
-+			{ "Phy ID", "nfapi.pnf.phy.rf.config.phy.id",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_rf_config_index,
-+			{ "RF Config Index", "nfapi.rf_config_index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The index number defined in the PNF RF struct that the PHY can support",
-+			HFILL }
-+		},
-+		{ &hf_nfapi_number_of_rf_exclusions,
-+			{ "Number of RF exclusions", "nfapi.hf_nfapi_number_of_rf_exclusions",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of RF configurations excluded from use by this PHY", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported,
-+			{ "Maximum 3gpp Release Supported", "nfapi.maximum_3gpp_release_supported",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The major 3GPP releases supported", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported_rel8,
-+			{ "Release 8", "nfapi.maximum_3gpp_release_supported.rel8",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported_rel9,
-+			{ "Release 9", "nfapi.maximum_3gpp_release_supported.rel9",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported_rel10,
-+			{ "Release 10", "nfapi.maximum_3gpp_release_supported.rel10",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported_rel11,
-+			{ "Release 11", "nfapi.maximum_3gpp_release_supported.rel11",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported_rel12,
-+			{ "Release 12", "nfapi.maximum_3gpp_release_supported.rel12",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_maximum_3gpp_release_supported_rel13,
-+			{ "Release 13", "nfapi.maximum_3gpp_release_supported.rel13",
-+			FT_BOOLEAN, 1, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_downlink_channel_bandwidth_supported,
-+			{ "Maximum Channel Downlink Bandwidth Supported", "nfapi.downlink_channel_bandwidth_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The downlink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104", HFILL }
-+		},
-+		{ &hf_nfapi_uplink_channel_bandwidth_supported,
-+			{ "Maximum Channel Uplink Bandwidth Supported", "nfapi.uplink_channel_bandwidth_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The uplink channel bandwidth supported in resource blocks as specified in 3GPP TS 36.104.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_dl_layers_supported,
-+			{ "Number of DL Layers Supported", "nfapi.number_of_dl_layer_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The maximum number of downlink layers supported", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_ul_layers_supported,
-+			{ "Number of UL Layers Supported", "nfapi.number_of_ul_layer_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The maximum number of uplink layers supported", HFILL }
-+		},
-+		{ &hf_nfapi_nmm_modes_supported,
-+			{ "NMM modes supported", "nfapi.nmm_modes_supported",
-+			FT_UINT8, BASE_DEC, VALS(nmm_modes_supported_vals), 0x0,
-+			"Network Monitor Modes Supported.", HFILL }
-+		},
-+		{ &hf_nfapi_band,
-+			{ "Band", "nfapi.band",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Band number as specified in 3GPP TS36.101", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_transmit_power_2,
-+			{ "Maximum transmit power", "nfapi.maximum_transmit_power",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_2_conversion_fn), 0x0,
-+			"The maximum transmit power for the PHY and RF operating at the configured bandwidth as defined in 3GPP TS 36.104.", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_transmit_power,
-+			{ "Maximum transmit power", "nfapi.maximum_transmit_power",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0,
-+			"The maximum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL }
-+		},
-+		{ &hf_nfapi_earfcn,
-+			{ "EARFCN", "nfapi.earfcn",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The EARFCN to be measured.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_rf_bands,
-+			{ "Number of RF Bands", "nfapi.num.rf_bands",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of RF Band instances", HFILL }
-+		},
-+		{ &hf_nfapi_nmm_uplink_rssi_supported,
-+			{ "NMM Uplink RSSI supported", "nfapi.nmm.uplink.rssi.supported",
-+			FT_UINT8, BASE_DEC, VALS(ul_rssi_supported_vals), 0x0,
-+			"Indicates if the uplink RSSI meausremnts are supported by NMM.", HFILL }
-+		},
-+		{ &hf_nfapi_minimum_transmit_power,
-+			{ "Minimum transmit power", "nfapi.minimum_transmit_power",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(max_transmit_power_conversion_fn), 0x0,
-+			"The minimum transmit power for the RF chain operating at the maximum supported bandwidth as defined in 3GPP TS 36.104.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_antennas_suppported,
-+			{ "Number of Supported Antennas", "nfapi.number_of_antennas_suppported",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The maximum number of antennas supported.", HFILL }
-+		},
-+		{ &hf_nfapi_minimum_downlink_frequency,
-+			{ "Minimum downlink frequency", "nfapi.minimum_downlink_frequency",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0,
-+			"The minimum supported downlink frequency in 100kHz units", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_downlink_frequency,
-+			{ "Maximum downlink frequency", "nfapi.maximum_downlink_frequency",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0,
-+			"The maximum supported downlink frequency in 100kHz units", HFILL }
-+		},
-+		{ &hf_nfapi_minimum_uplink_frequency,
-+			{ "Minimum uplink frequency", "nfapi.minimum_downlink_frequency",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0,
-+			"The minimum supported uplink frequency in 100kHz units", HFILL }
-+		},
-+		{ &hf_nfapi_maximum_uplink_frequency,
-+			{ "Maximum uplink frequency", "nfapi.maximum_downlink_frequency",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &khz_100_units_db, 0x0,
-+			"The maximum supported uplink frequency in 100kHz units", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_mode7_supported,
-+			{ "Transmission Mode 7 Supported", "nfapi.pnf.phy_rel10.tx_mode7_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports TM7 for PDSCH", HFILL }
-+		},
-+		{ &hi_nfapi_transmission_mode8_supported,
-+			{ "Transmission Mode 8 Supported", "nfapi.pnf.phy_rel10.tx_mode8_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports TM8 for PDSCH", HFILL }
-+		},
-+		{ &hi_nfapi_two_antennas_ports_for_pucch,
-+			{ "Two antennas ports for PUCCH", "nfapi.pnf.phy_rel10.two_antennas_ports_for_pucch",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports PUCCH transmit diversity introduced in Release 10. Equivalent to two-AntennaPortsForPUCCH-r10 in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_transmission_mode_9_supported,
-+			{ "Transmission Mode 9 Supported", "nfapi.pnf.phy_rel10.tx_mode9_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports TM9 for PDSCH with 8 antennas and 8 CSI. Equivalent to tm9-With-8Tx-FDD-r10 in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_simultaneous_pucch_pusch,
-+			{ "Simultaneous PUCCH PUSCH", "nfapi.pnf.simultaneous_pucch_pusch",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports UE sending simultaneous PUCCH and PUSCH introduced in Release 10. Equivalent to simultaneousPUCCH-PUSCH-r10 in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_four_layer_tx_with_tm3_and_tm4,
-+			{ "Four layer Tx with TM3 and TM4", "nfapi.pnf.phy_rel10.layer_tx_with_tm3_and_tm4",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports four layer transmission for TM3 and TM4. Equivalent to fourLayerTM3-TM4-r10 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_epdcch_supported,
-+			{ "ePDCCH supported", "nfapi.pnf.phy_rel11.epdcch_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports Enhanced PDCCH", HFILL }
-+		},
-+		{ &hi_nfapi_multi_ack_csi_reporting,
-+			{ "Multi ACK CSI reporting", "nfapi.pnf.phy_rel11.mutli_ack_csi_reporting",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports the multi ACK and CSI reporting required with CA and mixed FDD/TDD carriers. Equivalent to multiACK-CSI-Reporting-r11 in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_pucch_tx_diversity_with_channel_selection,
-+			{ "PUCCH Tx diversity with channel selection", "nfapi.pnf.phy_rel11.tx_div_with_channel_selection",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports transmit diversity for PUCCH format 1b with channel selection. Equivalent to txDiv-PUCCH1b-ChSelect in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_ul_comp_supported,
-+			{ "UL CoMP supported", "nfapi.pnf.phy_rel11.ul_comp_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports UL CoMP", HFILL }
-+		},
-+		{ &hi_nfapi_transmission_mode_5_supported,
-+			{ "Transmission mode 5 supported", "nfapi.pnf.phy_rel11.tx_mode5_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports TM5 for PDSCH", HFILL }
-+		},
-+		{ &hf_nfapi_csi_subframe_set,
-+			{ "CSI subframe set", "nfapi.pnf.phy_rel12.csi_subframe_set",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Equivalent to csi-SubframeSet-r12 in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_enhanced_4tx_codebook,
-+			{ "Enhanced 4TX codebook", "nfapi.pnf.phy_rel12.exhanced_t4x_codebook",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports the enhanced 4TX codebook. Equivalent to enhanced-4TxCodebook-r12 in TS36.306", HFILL }
-+		},
-+		{ &hi_nfapi_drs_supported,
-+			{ "DRS supported", "nfapi.pnf.phy_rel12.drs_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports the Discovery Reference Signal", HFILL }
-+		},
-+		{ &hi_nfapi_ul_64qam_supported,
-+			{ "UL 64QAM supported", "nfapi.pnf.phy_rel12.ul_64qam_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY support 64 QAM in the uplink", HFILL }
-+		},
-+		{ &hi_nfapi_transmission_mode_10_supported,
-+			{ "Transmission mode 10 supported", "nfapi.pnf.phy_rel12.tx_mode10_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports TM10 for PDSCH (DL CoMP)", HFILL }
-+		},
-+		{ &hi_nfapi_alternative_tbs_indices,
-+			{ "Alternative TBS indices", "nfapi.pnf.phy_rel12.alternative_tbs_indices",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports the alternate TBS indices (256 QAM).  Equivalent to alternativeTBS-Indices-r12 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_pucch_format_4_supported,
-+			{ "PUCCH format 4 supported", "nfapi.pnf.phy_rel13.pucch_format4_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports PUCCH format 4", HFILL }
-+		},
-+		{ &hf_nfapi_pucch_format_5_supported,
-+			{ "PUCCH format 5 supported", "nfapi.pnf.phy_rel13.pucch_format5_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports PUCCH format 5", HFILL }
-+		},
-+		{ &hf_nfapi_more_than_5_ca_supported,
-+			{ "More than 5 CA support", "nfapi.pnf.phy_rel13.mode_than_5_ca_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports features required for more than 5 CA support on PUSCH. Equivalent to uci-PUSCH-Ext-r13 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_laa_supported,
-+			{ "LAA supported", "nfapi.pnf.phy_rel13.laa_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports DL LAA (subframe format 3)", HFILL }
-+		},
-+		{ &hf_nfapi_laa_ending_in_dwpts_supported,
-+			{ "LAA ending in DwPTS supported", "nfapi.pnf.phy_rel13.laa_ending_in_dwpts_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports DL LAA ending in a DwPTS subframe. Equivalent to endingDwPTS-r13i n TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_laa_starting_in_second_slot_supported,
-+			{ "LAA starting in second slot Supported", "nfapi.pnf.phy_rel13.laa_starting_in_second_slot_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports DL LAA starting in the second slot in a subframe. Equivalent to secondSlotStartingPosition-r13 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_beamforming_supported,
-+			{ "Beamforming Supported", "nfapi.pnf.phy_rel13.beamingforming_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports beamforming (FD-MIMO Class B). Equivalent to beamformed-r13 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_enhancements_supported,
-+			{ "CSI-RS enhancements supported", "nfapi.pnf.phy_rel13.csi_rs_enchancements_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports CSI-RS enhancements (FD-MIMO Class A). Equivalent to csi-RS-EnhancementsTDD-r13 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_drms_enhancements_supported,
-+			{ "DMRS enhancements supported", "nfapi.pnf.phy_rel13.drms_enhancements_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports DMRS enhancements added in Release 13. Equivalent to dmrs-Enhancements-r13 in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_srs_enhancements_supported,
-+			{ "SRS enhancements supported", "nfapi.pnf.phy_rel13.srs_enhancements_supported",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates if PHY supports SRS enhancements added in Release 13. Equivalent to srs-Enhancements-r13in TS36.306", HFILL }
-+		},
-+		{ &hf_nfapi_sfn_sf,
-+			{ "SFN_SF", "nfapi.sfn_sf",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(sfn_sf_conversion_fn), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_number_pdcch_ofdm_symbols,
-+			{ "Number of PDCCH OFDM Symbols", "nfapi.number_pdcch_ofdm_symbols",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of OFDM symbols for the PDCCH", HFILL }
-+		},
-+		{ &hf_nfapi_number_dci,
-+			{ "Number of DCI", "nfapi.number_dci",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of DCI PDUs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_pdus,
-+			{ "Number of PDUs", "nfapi.number_pdu",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of PDUs that are included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_harqs,
-+			{ "Number of HARQs", "nfapi.number_harqs",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of HARQs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_crcs,
-+			{ "Number of CRCs", "nfapi.number_crcs",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of CRCs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_srs,
-+			{ "Number of SRs", "nfapi.number_srs",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of SRs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_cqi,
-+			{ "Number of CQIs", "nfapi.number_cqi",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of CQIs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_preambles,
-+			{ "Number of Preambles", "nfapi.number_preambles",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of RACH preambles", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_srss,
-+			{ "Number of SRSs", "nfapi.number_srss",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Number of UEs contributing to the uplink SRS", HFILL }
-+		},
-+		{ &hf_nfapi_lbt_dl_req_pdu_type,
-+			{ "LBT DL Request PDU Type", "nfapi.number_srss",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_req_pdu_type), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_lbt_dl_ind_pdu_type,
-+			{ "LBT DL Indication PDU Type", "nfapi.number_srss",
-+			FT_UINT16, BASE_DEC, VALS(nfapi_lbt_dl_ind_pdu_type), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_number_pdsch_rnti,
-+			{ "Number of PDSCH RNTI", "nfapi.number_pdsch_rnti",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of unique RNTIs sent on the PDSCH", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_power_pcfich,
-+			{ "Transmission Power PCFICH", "nfapi.transmission_power_pcfich",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"Offset to the reference signal power.", HFILL }
-+		},
-+		{ &hf_nfapi_dl_config_pdu_type,
-+			{ "PDU Type", "nfapi.pdu.type",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_dl_config_pdu_type_vals), 0x0,
-+			"DL_CONFIG.request PDU Type", HFILL }
-+		},
-+		{ &hf_nfapi_pdu_size,
-+			{ "PDU size", "nfapi.pdu.size",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Size of the PDU control information (in bytes). This length value includes the 2 bytes required for the PDU type and PDU size parameters", HFILL }
-+		},
-+		{ &hf_nfapi_instance_length,
-+			{ "Instance length", "nfapi.instance.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The Length in bytes of all TLVs within this instance", HFILL }
-+		},
-+		{ &hf_nfapi_length,
-+			{ "PDU length", "nfapi.pdu.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Length of PDU in bytes.", HFILL }
-+		},
-+		{ &hf_nfapi_pdu_index,
-+			{ "PDU Index", "nfapi.pdu.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PDU index parameter specified for each PDU", HFILL }
-+		},
-+		{ &hf_nfapi_rnti,
-+			{ "RNTI", "nfapi.rnti",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The RNTI used for identifying the UE when receiving the PDU", HFILL }
-+		},
-+		{ &hf_nfapi_resource_allocation_type,
-+			{ "Resource Allocation Type", "nfapi.resource.allocation.type",
-+			FT_UINT8, BASE_DEC, VALS(resource_allocation_type_vals), 0x0,
-+			"Resource allocation type/header Valid for DCI formats : 1, 2, 2A, 2B, 2C, 2D", HFILL }
-+		},
-+		{ &hf_nfapi_virtual_resource_block_assignment_flag,
-+			{ "Virtual resource block assignment flag", "nfapi.resource.block.assignment.flag",
-+			FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0,
-+			"Type of virtual resource block used Valid for DCI formats : 1A, 1B, 1D", HFILL }
-+		},
-+		{ &hf_nfapi_resource_block_coding,
-+			{ "Resource block coding", "nfapi.resource.block.coding",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The encoding for the resource blocks. The coding is dependent on whether resource allocation type 0, 1, 2 is in use", HFILL }
-+		},
-+		{ &hf_nfapi_modulation,
-+			{ "Modulation", "nfapi.modulation",
-+			FT_UINT8, BASE_DEC, VALS(modulation_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_redundancy_version,
-+			{ "Redundancy version", "nfapi.redundancy.version",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ redundancy version", HFILL }
-+		},
-+		{ &hf_nfapi_transport_blocks,
-+			{ "Transport blocks", "nfapi.transport.blocks",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The transport block transmitted to this RNTI", HFILL }
-+		},
-+		{ &hf_nfapi_transport_block_to_codeword_swap_flag,
-+			{ "Transport block to codeword swap flag", "nfapi.transport.block.to.codeword.swap.flag",
-+			FT_UINT8, BASE_DEC, VALS(transport_block_to_codeword_swap_flag_vals), 0x0,
-+			"Indicates the mapping of transport block to codewords.", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_scheme,
-+			{ "Transmission scheme", "nfapi.transmission.scheme",
-+			FT_UINT8, BASE_DEC, VALS(transmission_scheme_vals), 0x0,
-+			"The MIMO mode used in the PDU", HFILL }
-+		},
-+		{ &hf_nfapi_ul_transmission_scheme,
-+			{ "Transmission scheme", "nfapi.transmission.scheme",
-+			FT_UINT8, BASE_DEC, VALS(ul_transmission_scheme_vals), 0x0,
-+			"The MIMO mode used in the PDU", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_layers,
-+			{ "Number of layers", "nfapi.number.of.layers",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of layers used in transmission", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_subbands,
-+			{ "Number of subbands", "nfapi.number.of.subbands",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Only valid when transmission scheme = 3, 4, 5. Defines the number of subbands and "
-+			"codebooks used for PMI.If value = 1 then a single PMI value is supplied which should be used over all RB", HFILL }
-+		},
-+		{ &hf_nfapi_codebook_index,
-+			{ "Codebook index", "nfapi.number.of.codebook.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Only valid when transmission scheme = 3, 4, 5. Defines the codebook used.", HFILL }
-+		},
-+		{ &hf_nfapi_ue_category_capacity,
-+			{ "UE category capacity", "nfapi.ue.category.capacity",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The UE capabilities category", HFILL }
-+		},
-+		{ &hf_nfapi_pa,
-+			{ "P-A", "nfapi.pa",
-+			FT_UINT8, BASE_DEC, VALS(pa_vals), 0x0,
-+			"The ratio of PDSCH EPRE to cell-specific RS EPRE among PDSCH REs in all the OFDM symbols not containing cell-specific RS in dB.", HFILL }
-+		},
-+		{ &hf_nfapi_delta_power_offset_index,
-+			{ "Delta Power offset index", "nfapi.delta.power.offset.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Delta power offset, value: 0..1", HFILL }
-+		},
-+		{ &hf_nfapi_nprb,
-+			{ "Nprb", "nfapi.nprb",
-+			FT_UINT8, BASE_DEC, VALS(nprb_vals), 0x0,
-+			"Used with DCI format 1A and RNTI=SI-RNTI or RA-RNTI. This should match the value sent in the TPC field of the DCI 1A PDU which allocated this grant.", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_mode,
-+			{ "Transmission Mode", "nfapi.transmission_nprb",
-+			FT_UINT8, BASE_DEC, VALS(transmission_mode_vals), 0x0,
-+			"Transmission mode associated with the UE", HFILL }
-+		},
-+		{ &hf_nfapi_prnti,
-+			{ "P-RNTI", "nfapi.prnti",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The P-RNTI associated with the paging", HFILL }
-+		},
-+		{ &hf_nfapi_mcs,
-+			{ "MCS", "nfapi.mcs",
-+			FT_UINT8, BASE_DEC, VALS(pch_modulation_vals), 0x0,
-+			"The modulation and coding scheme for the transport block", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_transport_blocks,
-+			{ "Number of transport blocks", "nfapi.number_of_transport_blocks",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of transport blocks transmitted to this RNTI", HFILL }
-+		},
-+		{ &hf_nfapi_ue_mode,
-+			{ "UE Mode", "nfapi.ue.mode",
-+			FT_UINT8, BASE_DEC, VALS(ue_mode_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_prs_bandwidth,
-+			{ "PRS bandwidth", "nfapi.prs.bandwidth",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"PRS bandwidth in resource blocks.", HFILL }
-+		},
-+		{ &hf_prs_cyclic_prefix_type,
-+			{ "PRS cyclic prefix type", "nfapi.prs.cyclic.prefix.type",
-+			FT_BOOLEAN, 8, TFS(&prs_cyclic_prefix_type_strname), 0x0,
-+			"The cyclic prefix used for PRS transmission", HFILL }
-+		},
-+		{ &hf_prs_muting,
-+			{ "PRS muting", "nfapi.prs.muting",
-+			FT_BOOLEAN, 8, TFS(&prs_muting_strname), 0x0,
-+			"PRS muting dictates if PRS REs are vacant (prsMutingInfo-r9 indicates the SF occasions)", HFILL }
-+		},
-+		{ &hf_nfapi_num_bf_prb_per_subband,
-+			{ "Num of BF PRB per Subband", "nfapi.num.bf.prb.per.subband",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of PRBs that are treated as one subband", HFILL }
-+		},
-+		{ &hf_nfapi_num_bf_vector,
-+			{ "Num of BF Vector", "nfapi.num.bf.vector",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of beam forming vectors. One beam forming vector is specified for each subband", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_resource_config,
-+			{ "CSI-RS resource config", "nfapi.csi.rs.resource.config",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates reference signal configuration for CSI-RS", HFILL }
-+		},
-+		{ &hf_nfapi_bf_vector_subband_index,
-+			{ "BF Subband Index", "nfapi.num.bf.vector.subband.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Index of subband for which the following beam forming vector is applied", HFILL }
-+		},
-+		{ &hf_nfapi_bf_vector_num_antennas,
-+			{ "BF Num of Antennas", "nfapi.num.bf.vector.bf.value",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of physical antennas", HFILL }
-+		},
-+		{ &hf_nfapi_bf_vector_bf_value,
-+			{ "BF Value per Antenna", "nfapi.num.bf.vector.bf.value",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Beam forming vector element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL }
-+		},
-+		{ &hf_nfapi_nscid,
-+			{ "NSC id", "nfapi.nscid",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Used with DCI format 2B and 2C.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_flag,
-+			{ "CSI RS Flag", "nfapi.csi.rs.flag",
-+			FT_BOOLEAN, 8, TFS(&csi_rs_flags_strname), 0x0,
-+			"Indicates if parameters related to CSI-RS are valid or not.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_resource_config_r10,
-+			{ "CSI RS resource config R10", "nfapi.csi.rs.resource_config_r10",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"This value is deprecated", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_zero_tx_power_resource_config_bitmap_r10,
-+			{ "CSI-RS Number of NZP configuration", "nfapi.csi.rs.num.of.nzp.configurations",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Bitmap of 16 bits. Encoding format of bitmap follows section 6.10.5.2 of 36.211", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_number_of_nzp_configurations,
-+			{ "CSI RS zero Tx Power Resource config bitmap R10", "nfapi.csi.rs.zero.tx.power.resource.config.bitmap.r10",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates the number of Non-Zero power CSI-RS configurations.", HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_start,
-+			{ "PDSCH_start", "nfapi.pdsch.start",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Per UE starting OFDM symbol for the PDSCH, impacts the mapping of PDSCH to REs", HFILL }
-+		},
-+		{ &hf_nfapi_drms_config_flag,
-+			{ "DMRS Config flag", "nfapi.drms.config.flag",
-+			FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0,
-+			"Indicates if the DMRS Config parameter is valid", HFILL }
-+		},
-+		{ &hf_nfapi_drms_scrambling,
-+			{ "DMRS Scrambling", "nfapi.drms.scrambling",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The scrambling identity for UE specific reference signals.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_config_flag,
-+			{ "CSI Config flag", "nfapi.csi.config.flag",
-+			FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0,
-+			"Indicates if the CSI Config parameter is valid", HFILL }
-+		},
-+		{ &hf_nfapi_csi_scrambling,
-+			{ "CSI Scrambling", "nfapi.csi.scrambling",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The scrambling identity for CSI.", HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_re_mapping_flag,
-+			{ "PDSCH RE mapping flag", "nfapi.pdsch.remapping.flag",
-+			FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0,
-+			"Indicates if the PDSCH RE parameters are valid.", HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_re_mapping_antenna_ports,
-+			{ "PDSCH RE mapping antenna ports", "nfapi.pdsch.remapping.antenna.ports",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates number of antennas used for PDSCH RE mapping", HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_re_mapping_freq_shift,
-+			{ "PDSCH RE mapping freq shift", "nfapi.pdsch.remapping.freq.shift",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the frequency shift used for PDSCH RE mapping.", HFILL }
-+		},
-+		{ &hf_nfapi_alt_cqi_table_r12,
-+			{ "altCQI-Table-r12", "nfapi.alt.cqi.table.r12",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"altCQI-Table-r12 is indicative of using an alternative MCS table for UEs supporting 256QAM."
-+			"This is taken into account  for calculation of soft buffer size for the transport block", HFILL }
-+		},
-+		{ &hf_nfapi_max_layers,
-+			{ "MaxLayers", "nfapi.max.layers",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Maximal number of negotiated / configured layers for a UE, used for the calculation of soft buffer size for the transport block", HFILL }
-+		},
-+		{ &hf_nfapi_n_dl_harq,
-+			{ "N_DL_HARQ", "nfapi.n.dl.harq",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dwpts_symbols,
-+			{ "DwPTS Symbols", "nfapi.dwpts.symbols",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Valid if DCI format 1C is being used to signal LAA end partial SF. Indicates the number of starting symbols according to 36.213 Table  13-A-1", HFILL }
-+		},
-+		{ &hf_nfapi_initial_lbt_sf,
-+			{ "Initial LBT SF", "nfapi.initial.lbt.sf",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if the DCI PDU is prepared for full SF (regular) or for initial partial SF (2nd slot) according to [11] section 6.2.4 (if PDCCH) or 6.2.4A (if ePDCCH)", HFILL }
-+		},
-+		{ &hf_nfapi_ue_type,
-+			{ "UE Type", "nfapi.ue.type",
-+			FT_UINT8, BASE_DEC, VALS(dlsch_re13_ue_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_payload_type,
-+			{ "PDSCH Payload Type", "nfapi.pdsch.payload.type",
-+			FT_UINT8, BASE_DEC, VALS(dlsch_re13_pdsch_payload_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_initial_transmission_sf,
-+			{ "Initial transmission SF (io)", "nfapi.init.tx.sf.io",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Absolute Sub-Frame  of the initial transmission", HFILL }
-+		},
-+		{ &hf_nfapi_req13_drms_table_flag,
-+			{ "Rel-13-DMRS-tabe flag", "nfapi.r13.drms.table.flag",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if Release 13 DMRS table is used.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_resource_index,
-+			{ "CSI-RS resource index", "nfapi.csi.rs.resource.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Index of the CSI-RS resource. This is included to link bfValues to CSI-RS resources included in Release 10 parameters.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_class,
-+			{ "Class", "nfapi.csi.rs.class",
-+			FT_UINT8, BASE_DEC, VALS(csi_rs_class_vals), 0x0,
-+			"Indicates CSI-RS class", HFILL }
-+		},
-+		{ &hf_nfapi_cdm_type,
-+			{ "CDM Type", "nfapi.cdm.type",
-+			FT_UINT8, BASE_DEC, VALS(csi_rs_cdm_type_vals), 0x0,
-+			"Indicates CDM type for CSI-RS. See [36.211] section 6.10.5.2. Valid for Class A", HFILL }
-+		},
-+		{ &hf_nfapi_edpcch_prb_index,
-+			{ "EPDCCH PRB index", "nfapi.edpcch.prb.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"PRB index", HFILL }
-+		},
-+		{ &hf_nfapi_epdcch_resource_assignment_flag,
-+			{ "EPDCCH Resource assignment flag", "nfapi.epdcch.resource.assignment.flag",
-+			FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0,
-+			"Type of virtual resource block used", HFILL }
-+		},
-+		{ &hf_nfapi_epdcch_id,
-+			{ "EPDCCH ID", "nfapi.epdcch.id",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"EPDCCH index- used for the scrambler initiation The DMRS scrambling sequence initialization parameter defined in[11] section 6.10.3A.1", HFILL }
-+		},
-+		{ &hf_nfapi_epdcch_start_symbol,
-+			{ "EPDCCH Start Symbol", "nfapi.epdcch.start.symbol",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the OFDM starting symbol for any EPDCCH and PDSCH", HFILL }
-+		},
-+		{ &hf_nfapi_epdcch_num_prb,
-+			{ "EPDCCH NumPRB", "nfapi.epdcch.num.prb",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of PRBs allocated for EPDCCH", HFILL }
-+		},
-+		{ &hf_nfapi_precoding_value,
-+			{ "Precoding value", "nfapi.precoding.value",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Precoding element for physical antenna #i real 8 bits followed by imaginary 8 bits", HFILL }
-+		},
-+		{ &hf_nfapi_mpdcch_narrowband,
-+			{ "MPDCCH Narrowband", "nfapi.mpdcch.narrowband",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Narrowband for MPDCCH", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_prb_pairs,
-+			{ "Number of PRB pairs", "nfapi.number.prb.pairs",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of PRB-pairs constituting the MPDCCH-PRB-pair set", HFILL }
-+		},
-+		{ &hf_nfapi_resource_block_assignment,
-+			{ "Resource Block Assignment", "nfapi.resource.block.assignement",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Combinational index r", HFILL }
-+		},
-+		{ &hf_nfapi_start_symbol,
-+			{ "Start symbol", "nfapi.start.symbol",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ecce_index,
-+			{ "ECCE index", "nfapi.ecce.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"CCE index used to send the DCI", HFILL }
-+		},
-+		{ &hf_nfapi_ce_mode,
-+			{ "CE Mode", "nfapi.ce.mode",
-+			FT_UINT8, BASE_DEC, VALS(ce_mode_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_drms_scrabmling_init,
-+			{ "DMRS scrambling init", "nfapi.drms.scrambling.init",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The DMRS scrambling sequence initialization parameter defined in [11] section 6.10.3A.1", HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_reception_levels,
-+			{ "PDSCH repetition levels", "nfapi.pdsch.repetition.levels",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Valid for DCI formats: 6-0A, 6-0B", HFILL }
-+		},
-+		{ &hf_nfapi_new_data_indicator,
-+			{ "New data indicator", "nfapi.new.data.indicator",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The new data indicator for the transport block", HFILL }
-+		},
-+		{ &hf_nfapi_tpmi_length,
-+			{ "TPMI length", "nfapi.tpmi.length",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Length of 'TPMI' field in units of bits", HFILL }
-+		},
-+		{ &hf_nfapi_pmi_flag,
-+			{ "PMI flag", "nfapi.pmi.flag",
-+			FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
-+			"Indicates if 'PMI' field is present", HFILL }
-+		},
-+		{ &hf_nfapi_harq_resource_offset,
-+			{ "HARQ resource offset", "nfapi.harq.resource.offset",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ-ACK resource offset used", HFILL }
-+		},
-+		{ &hf_nfapi_dci_subframe_repetition_number,
-+			{ "DCI subframe repetition number", "nfapi.dci.subframe.repetition.number",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the number of MPDCCH repetitions", HFILL }
-+		},
-+		{ &hf_nfapi_downlink_assignment_index_length,
-+			{ "Downlink assignment index Length", "nfapi.dl.assignement.index.length",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Length of Downlink assignment index field in units of bits.", HFILL }
-+		},
-+		{ &hf_nfapi_starting_ce_level,
-+			{ "Starting CE Level", "nfapi.starting.ce.level",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"2 bits provide the PRACH starting CE level", HFILL }
-+		},
-+		{ &hf_nfapi_antenna_ports_and_scrambling_identity_flag,
-+			{ "Antenna ports and scrambling identity flag", "nfapi.antenna.ports.and.scrambling.identity.flag",
-+			FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
-+			"Indicates if 'Antenna ports and scrambling identity' field is present.", HFILL }
-+		},
-+		{ &hf_nfapi_antenna_ports_and_scrambling_identity,
-+			{ "Antenna ports and scrambling identity", "nfapi.antenna.ports.and.scrambling.identit",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the Antenna port and, scrambling identity value", HFILL }
-+		},
-+		{ &hf_nfapi_paging_direct_indication_differentiation_flag,
-+			{ "Paging/Direct indication differentiation flag", "nfapi.paging.direct.indictation.differentiation.flag",
-+			FT_UINT8, BASE_DEC, VALS(paging_direct_indication_differtiation_flag_vals), 0x0,
-+			"Valid for DCI format 6-2", HFILL }
-+		},
-+		{ &hf_nfapi_direct_indication,
-+			{ "Direct indication", "nfapi.direct.indication",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Valid for DCI format 6-2", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_tx_antenna_ports,
-+			{ "Number of TX Antenna ports", "nfapi.num.of.tx.antenna.ports.",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of TX physical antenna ports", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_power,
-+			{ "Transmission Power", "nfapi.transmission_power",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"Offset to the reference signal power.", HFILL }
-+		},
-+		{ &hf_nfapi_mbsfn_area_id,
-+			{ "MBSFN Area id", "nfapi.mbsfn.area.id",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates MBSFN area ID", HFILL }
-+		},
-+		{ &hf_nfapi_dl_dci_format,
-+			{ "DL DCI format", "nfapi.dl.dci.format",
-+			FT_UINT8, BASE_DEC, VALS(dl_dci_format_vals), 0x0,
-+			"Format of the DL DCI", HFILL }
-+		},
-+		{ &hf_nfapi_ul_dci_format,
-+			{ "UL DCI format", "nfapi.ul_dci.format",
-+			FT_UINT8, BASE_DEC, VALS(ul_dci_format_vals), 0x0,
-+			"Format of the UL DCI", HFILL }
-+		},
-+		{ &hf_nfapi_mpdcch_ul_dci_format,
-+			{ "UL DCI format", "nfapi.mpdcch.ul_dci.format",
-+			FT_UINT8, BASE_DEC, VALS(mpdcch_ul_dci_format_vals), 0x0,
-+			"Format of the UL DCI", HFILL }
-+		},
-+		{ &hf_nfapi_cce_idx,
-+			{ "CCE index", "nfapi.cce.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"CCE index used to send the DCI", HFILL }
-+		},
-+		{ &hf_nfapi_aggregation_level,
-+			{ "Aggregation level", "nfapi.aggregation.level",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The aggregation level used", HFILL }
-+		},
-+		{ &hf_nfapi_mcs_1,
-+			{ "MCS_1", "nfapi.mcs_1",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The modulation and coding scheme for 1st transport block", HFILL }
-+		},
-+		{ &hf_nfapi_mcs_2,
-+			{ "MCS_2", "nfapi.mcs_2",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The modulation and coding scheme for 2nd transport block", HFILL }
-+		},
-+		{ &hf_nfapi_redundancy_version_1,
-+			{ "Redundancy version_1", "nfapi.redundancy.version.1",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The redundancy version for 1st transport block.", HFILL }
-+		},
-+		{ &hf_nfapi_redundancy_version_2,
-+			{ "Redundancy version_2", "nfapi.redundancy.version.2",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The redundancy version for 2nd transport block", HFILL }
-+		},
-+		{ &hf_nfapi_new_data_indicator_1,
-+			{ "New data indicator_1", "nfapi.new.data.indicator.1",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The new data indicator for 1st transport block.", HFILL }
-+		},
-+		{ &hf_nfapi_new_data_indicator_2,
-+			{ "New data indicator_2", "nfapi.new.data.indicator.2",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The new data indicator for 2nd transport block.", HFILL }
-+		},
-+		{ &hf_nfapi_harq_process,
-+			{ "HARQ process", "nfapi.harq.process",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ process number", HFILL }
-+		},
-+		{ &hf_nfapi_tpmi,
-+			{ "TPMI", "nfapi.tpmi",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The codebook index to be used for precoding", HFILL }
-+		},
-+		{ &hf_nfapi_pmi,
-+			{ "PMI", "nfapi.pmi",
-+			FT_UINT8, BASE_DEC, VALS(pmi_vals), 0x0,
-+			"Confirmation for precoding", HFILL }
-+		},
-+		{ &hf_nfapi_precoding_information,
-+			{ "Precoding information", "nfapi.precoding.information",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_tpc,
-+			{ "TPC", "nfapi.tpc",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Tx power control command for PUCCH", HFILL }
-+		},
-+		{ &hf_nfapi_downlink_assignment_index,
-+			{ "Downlink assignment index", "nfapi.downlink.assignment.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The downlink assignment index. In release 8-11 this is only used in TDD mode, "
-+			"value ignored for FDD. In release 12 or later a field indicating the structure "
-+			"type of the primary cell is used to determine if this is valid with size 2 bits."
-+			"In release 13 or later a field indicating codebooksizeDetermination - r13 = 0 is "
-+			"used to determine is this field is valid with size 4 bits", HFILL }
-+		},
-+		{ &hf_nfapi_ngap,
-+			{ "Ngap", "nfapi.ngap",
-+			FT_UINT8, BASE_DEC, VALS(ngap_vals), 0x0,
-+			"Used in virtual resource block distribution", HFILL }
-+		},
-+		{ &hf_nfapi_transport_block_size_index,
-+			{ "Transport block size index", "nfapi.transport.block.size.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The transport block size", HFILL }
-+		},
-+		{ &hf_nfapi_downlink_power_offset,
-+			{ "Downlink power offset", "nfapi.downlink.power.offset",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the DL power offset type for multi-user MIMO transmission", HFILL }
-+		},
-+		{ &hf_nfapi_allocate_prach_flag,
-+			{ "Allocation PRACH flag", "nfapi.allocation.prach.flag",
-+			FT_UINT8, BASE_DEC, VALS(true_false_vals), 0x0,
-+			"Indicates that PRACH procedure is initiated", HFILL }
-+		},
-+		{ &hf_nfapi_preamble_index,
-+			{ "Preamble index", "nfapi.preamable.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The preamble index to be used on the PRACH", HFILL }
-+		},
-+		{ &hf_nfapi_prach_mask_index,
-+			{ "PRACH mask index", "nfapi.prach.mask.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The mask index to be used on the PRACH", HFILL }
-+		},
-+		{ &hf_nfapi_rnti_type,
-+			{ "RNTI type", "nfapi.rnti.type",
-+			FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_mpdcch_rnti_type,
-+			{ "RNTI type", "nfapi.mpdcch.rnti.type",
-+			FT_UINT8, BASE_DEC, VALS(mpdcch_rnti_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_mcch_flag,
-+			{ "MCCH flag", "nfapi.mcch.flag",
-+			FT_BOOLEAN, BASE_NONE, TFS(&mcch_flag_string_name), 0x0,
-+			"Indicates if format 1C is being used to signal a MCCH or SC-MCCH change notification", HFILL }
-+		},
-+		{ &hf_nfapi_mcch_change_notification,
-+			{ "MCCH change notification", "nfapi.mcch.change.notification",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"MCCH or SC-MCCH Change Notification", HFILL }
-+		},
-+		{ &hf_nfapi_scrambling_identity,
-+			{ "Scrambling identity", "nfapi.scrambling.identity",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the scrambling identity value NSCID", HFILL }
-+		},
-+		{ &hf_nfapi_cross_carrier_scheduling_flag,
-+			{ "Cross Carrier scheduling flag", "nfapi.cross.carrier.scheduling.flag",
-+			FT_BOOLEAN, 8, TFS(&cross_carrier_scheduling_flag_strname), 0x0,
-+			"Indicates if cross carrier scheduling has been enabled for the UE receiving this DCI", HFILL }
-+		},
-+		{ &hf_nfapi_carrier_indicator,
-+			{ "Carrier Indicator", "nfapi.carrier.indicator",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Serving Cell Index", HFILL }
-+		},
-+		{ &hf_nfapi_srs_flag,
-+			{ "SRS flag", "nfapi.srs.flag",
-+			FT_BOOLEAN, 8, TFS(&srs_flag_strname), 0x0,
-+			"Indicates if the SRS request parameter is valid", HFILL }
-+		},
-+		{ &hf_nfapi_srs_request,
-+			{ "SRS request", "nfapi.srs.request",
-+			FT_BOOLEAN, 8, TFS(&srs_request_strname), 0x0,
-+			"SRS request flag", HFILL }
-+		},
-+		{ &hf_nfapi_antenna_ports_scrambling_and_layers,
-+			{ "Antenna ports scrambling and layers", "nfapi.antenna.ports.scrambling.and.layers",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the Antenna port, scrambling identity value NSCID and number of layers", HFILL }
-+		},
-+		{ &hf_nfapi_total_dci_length_including_padding,
-+			{ "Total DCI length including padding", "nfapi.total.dci.length.including.padding",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The total DCI length including padding bits", HFILL }
-+		},
-+		{ &hf_nfapi_n_ul_rb,
-+			{ "N_UL_RB", "nfapi.n.dl.rb",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"BW of serving cell for which the DCI was scheduled for.  This is valid for "
-+			"the case of cross carrier scheduling, for the case of a self - "
-+			"scheduling(cross carrier scheduling is not valid or Carrier indicator has value '0', "
-+			"the BW is the 'DL BW support' as configured in configuration phase(params) "
-+			"Uplink channel bandwidth in resource blocks", HFILL }
-+		},
-+		{ &hf_nfapi_harq_ack_resource_offset,
-+			{ "HARQ-ACK resource offset", "nfapi.harq.ack.resource.offset",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ-ACK resource offset field is present only when this format is carried by EPDCCH.", HFILL }
-+		},
-+		{ &hf_nfapi_pdsch_re_mapping_and_quasi_co_location_indicator,
-+			{ "PDSCH RE Mapping and Quasi-Co-Location Indicator", "nfapi.pdsch.re.mapping",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the parameter set configured by the higher layers which the UE should use.", HFILL }
-+		},
-+		{ &hf_nfapi_primary_cell_type,
-+			{ "Primary cell type", "nfapi.primary.cell.type",
-+			FT_UINT8, BASE_DEC, VALS(primary_cells_type_vals), 0x0,
-+			"Indicates the type of the primary cell.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_dl_configuration_flag,
-+			{ "UL/DL configuration flag", "nfapi.ul.dl.configuration.flag",
-+			FT_BOOLEAN, 8, TFS(&ul_dl_configuration_flag_strname), 0x0,
-+			"Indicates if format 1C is being used to signal UL/DL configuration", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_ul_dl_configurations,
-+			{ "Number of UL/DL configurations", "nfapi.number.ul.dl.configurations",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_dl_configuration_index,
-+			{ "UL/DL configuration indication", "nfapi.ul.dl.configuration.indication",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"UL/DL configuration index", HFILL }
-+		},
-+		{ &hf_nfapi_laa_end_partial_sf_flag,
-+			{ "LAA end partial SF flag", "nfapi.laa.end.partial.sf.flag",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if DCI format 1C is being used to signal LAA end partial SF (valid if end partial SF support configuraton is set)", HFILL }
-+		},
-+		{ &hf_nfapi_laa_end_partial_sf_configuration,
-+			{ "LAA end partial SF configuration", "nfapi.laa.end.partial.sf.configuration",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"If DCI format 1C scrambled by CC - RNTI is used to signal end partial SF, this field "
-+			"contains LAA common information (4 bits used in [9] Table 13A-1 for configuration of "
-+			"occupied OFDM symbols for current and next SF)", HFILL }
-+		},
-+		{ &hf_nfapi_codebooksize_determination_r13,
-+			{ "Codebook Size Determination R13", "nfapi.codebook.size.determination.r13",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if the downlink assignment index parameter (DAI) is 4 bits", HFILL }
-+		},
-+		{ &hf_nfapi_rel13_drms_table_flag,
-+			{ "Rel-13-DMRS-tabe flag", "nfapi.drms.table.flag.r13",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if Release 13 DMRS table for be used", HFILL }
-+		},
-+		{ &hf_nfapi_pscch_resource,
-+			{ "PSCCH Resource", "nfapi.pscch.resource",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"6-bits describing the resource blocks for transmitting PSCCH", HFILL }
-+		},
-+		{ &hf_nfapi_time_resource_pattern,
-+			{ "Time resource pattern", "nfapi.time.resource.pattern",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"7-bits describing the time resource pattern index", HFILL }
-+		},
-+		{ &hf_nfapi_mpdcch_transmission_type,
-+			{ "MPDCCH transmission type", "nfapi.mpdcch.transmission.type",
-+			FT_UINT8, BASE_DEC, VALS(local_distributed_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_drms_scrambling_init,
-+			{ "DMRS scrambling init", "nfapi.drms.scrambling.init",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The DMRS scrambling sequence initialization", HFILL }
-+		},
-+		{ &hf_nfapi_pusch_repetition_levels,
-+			{ "PUSCH repetition levels", "nfapi.pusch.repetition.levels",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Valid for DCI formats: 6-0A, 6-0B", HFILL }
-+		},
-+		{ &hf_nfapi_frequency_hopping_flag,
-+			{ "Frequency hopping flag", "nfapi.frequency.hopping.flag",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if hopping is being used.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_request,
-+			{ "CSI request", "nfapi.csi.request",
-+			FT_UINT8, BASE_DEC, VALS(csi_request_vals), 0x0,
-+			"Aperiodic CSI request flag", HFILL }
-+		},
-+		{ &hf_nfapi_dai_presence_flag,
-+			{ "DAI presence flag", "nfapi.dia.presence.flag",
-+			FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
-+			"Indicates if DL assignment index field is present in the DCI", HFILL }
-+		},
-+		{ &hf_nfapi_total_dci_length_include_padding,
-+			{ "Total DCI length including padding", "nfapi.total.dci.length.including.padding",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The total DCI length including padding bits", HFILL }
-+		},
-+		{ &hf_nfapi_csi_rs_antenna_port_count_r10,
-+			{ "CSI-RS antenna port count r10", "nfapi.csi.rs.antenna.port.count.r10",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates number of antennas used for transmission of CSI reference signal.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_config_pdu_type,
-+			{ "UL Config PDU Type", "nfapi.ul.config.pdu.type",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_ul_config_pdu_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_rach_prach_frequency_resources,
-+			{ "RACH PRACH Frequency resources", "nfapi.rach.prach.frequency.resources",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"If semi-static information is held in the MAC", HFILL }
-+		},
-+		{ &hf_nfapi_srs_present,
-+			{ "SRS present", "nfapi.srs.present",
-+			FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x0,
-+			"If semi-static information is held in the MAC", HFILL }
-+		},
-+		{ &hf_nfapi_handle,
-+			{ "Handle", "nfapi.handle",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"An opaque handle", HFILL }
-+		},
-+		{ &hf_nfapi_pucch_index,
-+			{ "PUCCH Index", "nfapi.pucch.index",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PUCCH index value", HFILL }
-+		},
-+		{ &hf_nfapi_size,
-+			{ "Size", "nfapi.size",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The size of the ULSCH PDU in bytes as defined by the relevant UL grant", HFILL }
-+		},
-+		{ &hf_nfapi_resource_block_start,
-+			{ "Resource block start", "nfapi.resource.block.start",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The starting resource block for this ULSCH allocation", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_resource_blocks,
-+			{ "Number of resource blocks", "nfapi.resource.blocks",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of resource blocks allocated to this ULSCH grant", HFILL }
-+		},
-+		{ &hf_nfapi_cyclic_shift_2_for_drms,
-+			{ "Cyclic Shift 2 for DRMS", "nfapi.cyclic.shift.2.for.drms",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The 2nd cyclic shift for DMRS assigned to the UE in the ULSCH grant", HFILL }
-+		},
-+		{ &hf_nfapi_frequency_hopping_enabled_flag,
-+			{ "Frequency hopping enabled flag", "nfapi.frequency.hopping.enabled.flag",
-+			FT_UINT8, BASE_DEC, VALS(hopping_vals), 0x0,
-+			"Indicates if hopping is being used", HFILL }
-+		},
-+		{ &hf_nfapi_frequency_hopping_bits,
-+			{ "Frequency hopping bits", "nfapi.frequency.hopping.bits",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_new_data_indication,
-+			{ "New Data inidication", "nfapi.new.data.indication",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Specify whether this received transport block is a new transmission from UE", HFILL }
-+		},
-+		{ &hf_nfapi_harq_process_number,
-+			{ "HARQ Process number", "nfapi.harq.process.number",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_ul_tx_mode,
-+			{ "UL Tx Mode", "nfapi.ul.tx.mode",
-+			FT_UINT8, BASE_DEC, VALS(ul_tx_mode_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_current_tx_nb,
-+			{ "Current Tx nb", "nfapi.current.tx.nb",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The current HARQ transmission count of this transport block. Valid if frequency hopping enabled.", HFILL }
-+		},
-+		{ &hf_nfapi_n_srs,
-+			{ "N SRS", "nfapi.n.srs",
-+			FT_UINT8, BASE_DEC, VALS(n_srs_vals), 0x0,
-+			"Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL }
-+		},
-+		{ &hf_nfapi_disable_sequence_hopping_flag,
-+			{ "Disable seqeunce hopping flag", "nfapi.disable.sequence.hopping.flag",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if any configured group hopping should be disabled for this UE.", HFILL }
-+		},
-+		{ &hf_nfapi_virtual_cell_id_enabled_flag,
-+			{ "Virtual cell ID enabled flag", "nfapi.virtual.cell.id.enabled.flag",
-+			FT_UINT8, BASE_DEC, VALS(not_used_enabled_vals), 0x0,
-+			"Indicates if virtual cell is being used and nPUSCH identity is valid.", HFILL }
-+		},
-+		{ &hf_nfapi_npusch_identity,
-+			{ "nPUSCH Identity", "nfapi.npusch.identity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Virtual cell ID for initialization of group hopping, sequence hopping and sequence shift pattern of PUSCH DMRS.", HFILL }
-+		},
-+		{ &hf_nfapi_ndrms_csh_identity,
-+			{ "nDMRS-CSH Identity", "nfapi.ndrms.csh.identity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Virtual cell ID for initialization of cyclic shift hopping of PUSCH DMRS.", HFILL }
-+		},
-+		{ &hf_nfapi_total_number_of_repetitions,
-+			{ "Total Number of repetitions", "nfapi.total.number.of.repetitions",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_repetition_number,
-+			{ "Repetition Number", "nfapi.repetition.number",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Current transmission number", HFILL }
-+		},
-+		{ &hf_nfapi_initial_sf_io,
-+			{ "Initial transmission SF (io)", "nfapi.initial.sf.io",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Absolute Sub-Frame  of the initial transmission", HFILL }
-+		},
-+		{ &hf_nfapi_empty_symbols_due_to_retunning,
-+			{ "Empy symbols due to re-tunning", "nfapi.empty.symbols.due.to.retunning",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the symbols that are left empty due to eMTC retuning.", HFILL }
-+		},
-+		{ &hf_nfapi_dl_cqi_ri_pmi_size_2,
-+			{ "DL CQI/PMI/RI size 2", "nfapi.dl.cqi.ri.pmi.size.2",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The size of the DL CQI/PMI/RI in bits. If the CQI/PMI/RI size exceeds 255 (8-bits) then the Release 9 size value = 0, and this field is used instead.", HFILL }
-+		},
-+		{ &hf_nfapi_harq_size_2,
-+			{ "HARQ Size 2", "nfapi.harq.size2",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of the ACK/NACK in bits.", HFILL }
-+		},
-+		{ &hf_nfapi_delta_offset_harq_2,
-+			{ "Delta Offset HARQ 2", "nfapi.delta.offset.harq.2",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Delta offset 2 for HARQ. This value is fixed for a UE, allocated in RRC connection setup and used for ACK_NACK mode = 4 or 5", HFILL }
-+		},
-+		{ &hf_nfapi_starting_prb,
-+			{ "Starting PRB", "nfapi.starting.prb",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The starting PRB for the PUCCH", HFILL }
-+		},
-+		{ &hf_nfapi_antenna_port,
-+			{ "Antenna Port", "nfapi.antenna.port",
-+			FT_UINT8, BASE_DEC, VALS(antenna_ports_vals), 0x0,
-+			"Defines the number of antenna ports used by the UE for the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_combs,
-+			{ "Number of Combs", "nfapi.num.of.combs",
-+			FT_UINT8, BASE_DEC, VALS(combs_vals), 0x0,
-+			"Defines the maximum number of transmission combs (TC).", HFILL }
-+		},
-+		{ &hf_nfapi_npucch_identity,
-+			{ "nPUCCH Identity", "nfapi.npucch.identity",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Virtual cell ID for initialization of base sequence and cyclic shift hopping of PUCCH.", HFILL }
-+		},
-+		{ &hf_nfapi_empty_symbols,
-+			{ "Empty symbols", "nfapi.empty.symbols",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates the symbols that are left empty due to eMTC retuning.", HFILL }
-+		},
-+		{ &hf_nfapi_csi_mode,
-+			{ "CSI_mode", "nfapi.csi.mode",
-+			FT_UINT8, BASE_DEC, VALS(csi_mode_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_dl_cqi_pmi_size_2,
-+			{ "DL CQI/PMI Size 2", "nfapi.dl.cqi.pmi.size.2",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The size of the DL CQI/PMI in bits", HFILL }
-+		},
-+		{ &hf_nfapi_statring_prb,
-+			{ "Starting PRB", "nfapi.starting.prb",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The starting PRB for the PUCCH", HFILL }
-+		},
-+		{ &hf_nfapi_cdm_index,
-+			{ "cdm_Index", "nfapi.cdm.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Selected CDM option", HFILL }
-+		},
-+		{ &hf_nfapi_nsrs,
-+			{ "N srs", "nfapi.n.srs",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if the resource blocks allocated for this grant overlap with the SRS configuration.", HFILL }
-+		},
-+		{ &hf_nfapi_num_ant_ports,
-+			{ "Num_ant_ports", "nfapi.num.ant.port",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of antenna ports used by the UE transmit", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_2_0,
-+			{ "n_PUCCH_2_0", "nfapi.n.pucch.2.0",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PUCCH Index value for ACK/NACK HARQ resource 4 on antenna port", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_2_1,
-+			{ "n_PUCCH_2_1", "nfapi.n.pucch.2.1",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 5", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_2_2,
-+			{ "n_PUCCH_2_2", "nfapi.n.pucch.2.2",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 6", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_2_3,
-+			{ "n_PUCCH_2_3", "nfapi.n.pucch.2.3",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 7", HFILL }
-+		},
-+		{ &hf_nfapi_dl_cqi_pmi_size_rank_1,
-+			{ "DL CQI PMI size rank 1", "nfapi.dl.cqi.pmi.size.rank.1",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of the DL CQI/PMI in bits in case of rank 1 report.", HFILL }
-+		},
-+		{ &hf_nfapi_dl_cqi_pmi_size_rank_greater_1,
-+			{ "DL CQI PMI size rank greater 1", "nfapi.dl.cqi.pmi.size.rank.1",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of the DL CQI/PMI in bits in case of rank>1 report.", HFILL }
-+		},
-+		{ &hf_nfapi_ri_size,
-+			{ "RI size", "nfapi.ri.size",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of RI in bits", HFILL }
-+		},
-+		{ &hf_nfapi_delta_offset_cqi,
-+			{ "Delta offset cqi", "nfapi.delta.offset.cqi",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Delta offset for CQI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_delta_offset_ri,
-+			{ "Delta offset ri", "nfapi.delta.offset.ri",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Delta offset for RI. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_harq_size,
-+			{ "HARQ size", "nfapi.harq_size",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of the ACK/NACK in bits", HFILL }
-+		},
-+		{ &hf_nfapi_delta_offset_harq,
-+			{ "Delta offset HARQ", "nfapi.delta.offset.harq",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Delta offset for HARQ. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_tdd_ack_nack_mode,
-+			{ "ACK NACK mode", "nfapi.tdd.ack.nack.mode",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_tdd_ack_nack_mode_vals), 0x0,
-+			"The format of the ACK/NACK response expected. For TDD only.", HFILL }
-+		},
-+		{ &hf_nfapi_fdd_ack_nack_mode,
-+			{ "ACK NACK mode", "nfapi.fdd.ack.nack.mode",
-+			FT_UINT8, BASE_DEC, VALS(nfapi_fdd_ack_nack_mode_vals), 0x0,
-+			"The format of the ACK/NACK response expected. For TDD only.", HFILL }
-+		},
-+		{ &hf_nfapi_n_srs_initial,
-+			{ "N srs initial", "nfapi.n.srs.initial",
-+			FT_UINT8, BASE_DEC, VALS(n_srs_initial_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_initial_number_of_resource_blocks,
-+			{ "Initial number of resource blocks", "nfapi.initial.number.of.resource.blocks",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of resource blocks used in the initial transmission of this transport block.", HFILL }
-+		},
-+		{ &hf_nfapi_dl_cqi_pmi_size,
-+			{ "DL cqi pmi size", "nfapi.dl.cqi.pmi.size",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of the DL CQI/PMI in bits in case of this RI value. The size of the DL CQI / PMI / RI in bits in case of this CRI value", HFILL }
-+		},
-+		{ &hf_nfapi_report_type,
-+			{ "Report type", "nfapi.report.type",
-+			FT_BOOLEAN, 8, TFS(&nfapi_csi_report_type_strname), 0x0,
-+			"Type of CSI report", HFILL }
-+		},
-+		{ &hf_nfapi_dl_cqi_ri_pmi_size,
-+			{ "DL CQI/PMI/RI size", "nfapi.dl.cqi.ri.pmi.size",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The size of the DL CQI/PMI/RI/CRI in bits", HFILL }
-+		},
-+		{ &hf_nfapi_control_type,
-+			{ "Control type", "nfapi.control.type",
-+			FT_BOOLEAN, 8, TFS(&nfapi_control_type_string_name), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_number_of_cc,
-+			{ "Number of cc", "nfapi.number.of.cc",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of CC in the aperiodic report", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_pucch_resource,
-+			{ "Number of PUCCH Resource", "nfapi.number.of.pucch.resource",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"A value of 2 indicates that the UE is configured to transmit on two antenna ports", HFILL }
-+		},
-+		{ &hf_nfapi_pucch_index_p1,
-+			{ "PUCCH Index P1", "nfapi.pucch.index.p1",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PUCCH index value   for antenna port P1", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_1_0,
-+			{ "N PUCCH 1 0", "nfapi.n.pucch.1.0",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 0", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_1_1,
-+			{ "N PUCCH 1 1", "nfapi.n.pucch.1.1",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 1", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_1_2,
-+			{ "N PUCCH 1 2", "nfapi.n.pucch.1.2",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 2", HFILL }
-+		},
-+		{ &hf_nfapi_n_pucch_1_3,
-+			{ "N PUCCH 1 3", "nfapi.n.pucch.1.3",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"HARQ resource 3", HFILL }
-+		},
-+		{ &hf_nfapi_srs_bandwidth,
-+			{ "SRS Bandwidth", "nfapi.srs.bandwidth",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"SRS Bandwidth. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_frequency_domain_position,
-+			{ "Frequency Domain position", "nfapi.frequency.domain.position",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Frequency-domain position, NRRC This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_srs_hopping_bandwidth,
-+			{ "SRS hopping bandwidth", "nfapi.srs.hopping.bandwidth",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Configures the frequency hopping on the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_transmission_comb,
-+			{ "Transmission comb", "nfapi.transmission.comb",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Configures the frequency location of the SRS. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_i_srs,
-+			{ "I SRS", "nfapi.i.srs",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Defines the periodicity and subframe location of the SRS. SRS Configuration Index. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_sounding_reference_cyclic_shift,
-+			{ "Sounding reference cyclic shift", "nfapi.sounding.reference.cyclic.shift",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Configures the SRS sequence generation. This value is fixed for a UE and allocated in RRC connection setup.", HFILL }
-+		},
-+		{ &hf_nfapi_pdu_length,
-+			{ "PDU length", "nfapi.pdu.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The total length (in bytes) of the PDU description and PDU data, without the padding bytes", HFILL }
-+		},
-+		{ &hf_nfapi_crc_flag,
-+			{ "CRC flag", "nfapi.crc.flag",
-+			FT_BOOLEAN, 8, TFS(&crc_flag_strname), 0x0,
-+			"A flag indicating if a CRC error was detected", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_hi_pdus,
-+			{ "Number of HI Pdu's", "nfapi.number_of_hi_pdus",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of HI PDUs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_dci_pdus,
-+			{ "Number of DCI Pdu's", "nfapi.number_of_dci_pdus",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of DCI PDUs included in this message", HFILL }
-+		},
-+		{ &hf_nfapi_hi_dci0_pdu_type,
-+			{ "PDU Type", "nfapi.pdu_type",
-+			FT_UINT8, BASE_DEC, VALS(hi_dci0_pdu_type_vals), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_hi_value,
-+			{ "HI Value", "nfapi.hi_value",
-+			FT_BOOLEAN, 8, TFS(&hi_value_strname), 0x0,
-+			"The PHICH value which is sent on the resource", HFILL }
-+		},
-+		{ &hf_nfapi_i_phich,
-+			{ "i phich", "nfapi.i_phich",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Is used in the calculation of the PHICH location. For TDD only", HFILL }
-+		},
-+		{ &hf_nfapi_flag_tb2,
-+			{ "Flag TB2", "nfapi.flag_tb2",
-+			FT_BOOLEAN, BASE_NONE, TFS(&flag_tb2_strname), 0x0,
-+			"Indicates is HI is present for a second transport block", HFILL }
-+		},
-+		{ &hf_nfapi_hi_value_2,
-+			{ "HI Value 2", "nfapi.hi_value_2",
-+			FT_BOOLEAN, BASE_NONE, TFS(&hi_value_strname), 0x0,
-+			"The PHICH value for a second transport block.", HFILL }
-+		},
-+		{ &hf_nfapi_ue_tx_antenna_selection,
-+			{ "UE Tx Antenna selection", "nfapi.ue_tx_antenna_selection",
-+			FT_UINT8, BASE_DEC, VALS(ue_tx_antenna_selection_vals), 0x0,
-+			"Indicates how the CRC is calculated on the PDCCH.", HFILL }
-+		},
-+		{ &hf_nfapi_cqi_csi_request,
-+			{ "cqi csi request", "nfapi.cqi_csi_request",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Aperiodic CQI request flag", HFILL }
-+		},
-+		{ &hf_nfapi_ul_index,
-+			{ "UL index", "nfapi.ul_index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Valid for TDD mode only", HFILL }
-+		},
-+		{ &hf_nfapi_dl_assignment_index,
-+			{ "DL Assignment index", "nfapi.dl_assignment_index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Valid for TDD mode only.", HFILL }
-+		},
-+		{ &hf_nfapi_tpc_bitmap,
-+			{ "TPC bitmap", "nfapi.tpc_bitmap",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"TPC commands for PUCCH and PUSCH", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_antenna_ports,
-+			{ "Number of antenna ports", "nfapi.number.of.antenna.ports",
-+			FT_UINT8, BASE_DEC, VALS(number_of_antenna_port_vals), 0x0,
-+			"Defines number of antenna ports for this ULSCH allocation", HFILL }
-+		},
-+		{ &hf_nfapi_size_of_cqi_csi_feild,
-+			{ "Size of cqi csi feild", "nfapi.size.of.cqi.csi.feild",
-+			FT_UINT8, BASE_DEC, VALS(size_of_cqi_csi_feild_vals), 0x0,
-+			"Indicates the size of the CQI/CSI request field", HFILL }
-+		},
-+		{ &hf_nfapi_new_data_indication_two,
-+			{ "New data indication 2", "nfapi.new.data.indication.two",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The new data indicator for the second transport block", HFILL }
-+		},
-+		{ &hf_nfapi_resource_allocation_flag,
-+			{ "Resource allocation flag", "nfapi.resource.allocation.flag",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Indicates if the Resource Allocation Type parameter is valid.", HFILL }
-+		},
-+		{ &hf_nfapi_dl_node_sync_t1,
-+			{ "DL Node Sync t1", "nfapi.dl.node.sync.t1",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"Offset from VNF SFN/SF 0/0 time reference of the DL Node Sync message transmission at the transport layer, in microseconds.", HFILL }
-+		},
-+		{ &hf_nfapi_dl_node_sync_delta_sfn_sf,
-+			{ "DL Node Sync Delta SFN SF", "nfapi.dl.node.sync.delta_sfn_sf",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The delta shift in subframes that the PNF PHY instance must update to on the next subframe boundary", HFILL }
-+		},
-+		{ &hf_nfapi_dl_cyclic_prefix_type,
-+			{ "DL Cyclic Prefix type", "nfapi.dl.cyclic.prefix.type",
-+			FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0,
-+			"Cyclic prefix type, used for DL", HFILL }
-+		},
-+		{ &hf_nfapi_ul_cyclic_prefix_type,
-+			{ "UL Cyclic Prefix type", "nfapi.ul.cyclic.prefix.type",
-+			FT_BOOLEAN, 8, TFS(&cyclic_prefix_type_strname), 0x0,
-+			"Cyclic prefix type, used for UL", HFILL }
-+		},
-+		{ &hf_nfapi_downlink_channel_bandwidth,
-+			{ "Downlink Channel Bandwidth", "nfapi.dl.channel.bandwidth",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Downlink channel bandwidth in resource blocks.", HFILL }
-+		},
-+		{ &hf_nfapi_uplink_channel_bandwidth,
-+			{ "Uplink Channel Bandwidth", "nfapi.ul.channel_bandwidth",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Uplink channel bandwidth in resource blocks.", HFILL }
-+		},
-+		{ &hf_nfapi_tx_antenna_ports,
-+			{ "Tx Antenna Ports", "nfapi.tx.antenna.ports",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of cell specific or NB transmit antenna ports.", HFILL }
-+		},
-+		{ &hf_nfapi_rx_antenna_ports,
-+			{ "Tx Antenna Ports", "nfapi.rx.antenna.ports",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of cell specific or NB receive antenna ports.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_node_sync_t1,
-+			{ "UL Node Sync t1", "nfapi.ul.node.sync.t1",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The supplied t1 field in the DL Node Sync", HFILL }
-+		},
-+		{ &hf_nfapi_ul_node_sync_t2,
-+			{ "UL Node Sync t2", "nfapi.ul.node.sync.t2",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"Offset from PNF SFN/SF 0/0 time reference of the DL Node Sync message reception at the transport layer, in microseconds.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_node_sync_t3,
-+			{ "UL Node Sync t3", "nfapi.ul.node.sync.t3",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"Offset from PNF SFN/SF 0/0 time reference of the UL Node Sync message transmission at the transport layer, in microseconds.", HFILL }
-+		},
-+		{ &hf_nfapi_pb,
-+			{ "P-B", "nfapi.pb.allocation",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Refers to downlink power allocation. Value is an index into the referenced table.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_last_sfn_sf,
-+			{ "Last SFN/SF", "nfapi.timing.info.last.sfn.sf",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The completed SFN/SF at the PNF PHY instance that triggered the Timing Info message", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_time_since_last_timing_info,
-+			{ "Time since last Timing Info", "nfapi.timing.info.time.since.last.timing.info",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The number of ms since the last Timing Info was sent from this PNF PHY instance.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_dl_config_jitter,
-+			{ "DL Config Jitter", "nfapi.timing.info.dl.config.jitter",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The inter message jitter of the DL Config message reception in microseconds", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_tx_request_jitter,
-+			{ "Tx Request Jitter", "nfapi.timing.info.tx.req.jitter",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The inter message jitter of the Tx Request message reception in microseconds", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_ul_config_jitter,
-+			{ "UL Config Jitter", "nfapi.timing.info.ul.config.jitter",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The inter message jitter of the UL Config message reception in microseconds", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_hi_dci0_jitter,
-+			{ "HI_DCI0 Jitter", "nfapi.timing.info.hi.dci0.jitter",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The inter message jitter of the HI_DCI0 message reception in microseconds", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_dl_config_latest_delay,
-+			{ "DL Config Latest Delay", "nfapi.timing.info.dl.config.latest.delay",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The latest delay offset in microseconds from the latest acceptable time for the DL Config as defined in the DL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_tx_request_latest_delay,
-+			{ "Tx Request Latest Delay", "nfapi.timing.info.tx.request.latest.delay",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The latest delay offset in microseconds from the latest acceptable time for the Tx Request as defined in the Tx Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_ul_config_latest_delay,
-+			{ "UL Config Latest Delay", "nfapi.timing.info.ul.config.latest.delay",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The latest delay offset in microseconds from the latest acceptable time for the UL Config as defined in the UL Config Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_hi_dci0_latest_delay,
-+			{ "HI_DCI0 Latest Delay", "nfapi.timing.info.hi.dci0.latest.delay",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The latest delay offset in microseconds from the latest acceptable time for the HI_DCI0 as defined in the HI_DCI0 Timing in the PNF_PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_dl_config_earliest_arrival,
-+			{ "DL Config Earliest Arrival", "nfapi.timing.info.dl.config.earliest.arrival",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The earlierst arrival offset in microseconds from the latest time acceptable for the DL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_tx_request_earliest_arrival,
-+			{ "Tx Request Earliest Arrival", "nfapi.timing.info.tx.request.earliest.arrival",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The earlierst arrival offset in microseconds from the latest time acceptable for the Tx Request as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_ul_config_earliest_arrival,
-+			{ "UL Config Earliest Arrival", "nfapi.timing.info.ul.config.earliest.arrival",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The earlierst arrival offset in microseconds from the latest time acceptable for the UL Config as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_hi_dci0_earliest_arrival,
-+			{ "HI_DCI0 Earliest Arrival", "nfapi.timing.info.hi.dci0.earliest.arrival",
-+			FT_INT32, BASE_DEC, NULL, 0x0,
-+			"The earlierst arrival offset in microseconds from the latest time acceptable for the HI_DCI0 as defined in the Timing Window in the PARAM.Response since the last transmission of the Timing Info Message.", HFILL }
-+		},
-+		{ &hf_nfapi_pcfich_power_offset,
-+			{ "PCFICH Power Offset", "nfapi.pcfich.power.offset",
-+			FT_UINT16, BASE_CUSTOM, CF_FUNC(power_offset_conversion_fn), 0x0,
-+			"The power per antenna of the PCFICH with respect to the reference signal.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_window,
-+			{ "NFAPI Timing window", "nfapi.timing.window",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The window in milliseconds that the PHY must receive and queue the P7 messages.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_mode,
-+			{ "Timing Info mode", "nfapi.timing.info.mode",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The configured mode of operation for the timing info message to be sent to the VNF from the PHY", HFILL }
-+		},
-+		{ &hf_nfapi_timing_info_period,
-+			{ "Timing info period", "nfapi.timing.info.period",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"If Periodic timing mode is enabled, this defines the periodicity in subframes. This field is ignored if periodic timing mode is disabled.", HFILL }
-+		},
-+		{ &hf_nfapi_tdd_harq_mode,
-+			{ "Mode", "nfapi.tdd.harq.mode",
-+			FT_UINT8, BASE_DEC, VALS(tdd_harq_mode_vals), 0x0,
-+			"The format of the ACK/NACK response expected", HFILL }
-+		},
-+		{ &hf_nfapi_fdd_harq_mode,
-+			{ "Mode", "nfapi.fdd.harq.mode",
-+			FT_UINT8, BASE_DEC, VALS(fdd_harq_mode_vals), 0x0,
-+			"The format of the ACK/NACK response expected", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_ack_nack,
-+			{ "Number of ACK/NACK", "nfapi.uint16.tag",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of ACK/NACK results reported for this UE", HFILL }
-+		},
-+		{ &hf_nfapi_harq_data_value_0,
-+			{ "Value 0", "nfapi.harq.value.0",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"Indicates HARQ results", HFILL }
-+		},
-+		{ &hf_nfapi_harq_data_value_0_special,
-+			{ "Value 0", "nfapi.harq.value.0.special",
-+			FT_UINT8, BASE_DEC, VALS(harq_special_value_vals), 0x0,
-+			"Indicates HARQ results", HFILL }
-+		},
-+		{ &hf_nfapi_harq_data_value_1,
-+			{ "Value 1", "nfapi.harq.value.1",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"Indicates HARQ results", HFILL }
-+		},
-+		{ &hf_nfapi_harq_data_value_2,
-+			{ "Value 2", "nfapi.harq.value.2",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"Indicates HARQ results", HFILL }
-+		},
-+		{ &hf_nfapi_harq_data_value_3,
-+			{ "Value 3", "nfapi.harq.value.3",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"Indicates HARQ results", HFILL }
-+		},
-+		{ &hf_nfapi_harq_tb_1,
-+			{ "HARQ TB1", "nfapi.harq.tb.",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"HARQ feedback of 1st TB.", HFILL }
-+		},
-+		{ &hf_nfapi_harq_tb_2,
-+			{ "HARQ TB2", "nfapi.harq.tb.2",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"HARQ feedback of 2nd TB.", HFILL }
-+		},
-+		{ &hf_nfapi_harq_tb_n,
-+			{ "HARQ TB_N", "nfapi.harq.tb.n",
-+			FT_UINT8, BASE_DEC, VALS(harq_value_vals), 0x0,
-+			"HARQ feedback of Nth TB.", HFILL }
-+		},
-+		{ &hf_nfapi_ul_cqi,
-+			{ "UL_CQI", "nfapi.ul.cqi",
-+			FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0,
-+			"SNR", HFILL }
-+		},
-+		{ &hf_nfapi_channel,
-+			{ "Channel", "nfapi.channel",
-+			FT_UINT8, BASE_DEC, VALS(channel_vals), 0x0,
-+			"The channel to which this measurement refers", HFILL }
-+		},
-+		{ &hf_nfapi_data_offset,
-+			{ "Data Offset", "nfapi.data.offset",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Gives the PDU#i data address offset from the beginning of the 'Number of PDUs' field. An offset of 0 indicates a CRC or decoding error", HFILL }
-+		},
-+		{ &hf_nfapi_ri,
-+			{ "RI", "nfapi.ri",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The rank indication reported by the UE on PUSCH for aperiodic CSI.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_advance,
-+			{ "Timing Advance", "nfapi.timing.advance",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The timing advance measured for this PDU and UE.", HFILL }
-+		},
-+		{ &hf_nfapi_timing_advance_r9,
-+			{ "Timing Advance R9", "nfapi.timing.advance.r9",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Timing advance used for positioning", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_cc_reported,
-+			{ "Number of CC reported", "nfapi.number.of.cc.reported",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_preamble,
-+			{ "Preamble", "nfapi.preamble",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The detected preamble", HFILL }
-+		},
-+		{ &hf_nfapi_rach_resource_type,
-+			{ "RACH resource type", "nfapi.rach.resource.type",
-+			FT_UINT8, BASE_DEC, VALS(rach_resource_type_vals), 0x0,
-+			"Indicates if this indication is related to Cat-M UE and in which CE level", HFILL }
-+		},
-+		{ &hf_nfapi_doppler_estimation,
-+			{ "Doppler estimation", "nfapi.doppler.estimation",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"FFS", HFILL }
-+		},
-+		{ &hf_nfapi_rb_start,
-+			{ "RB Start", "nfapi.rb.start",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The starting point of the RBs to be reported", HFILL }
-+		},
-+		{ &hf_nfapi_snr,
-+			{ "SNR", "nfapi.snr",
-+			FT_UINT8, BASE_CUSTOM, CF_FUNC(ul_cqi_conversion_fn), 0x0,
-+			"Field size dependent on configured bandwidth SNR for RBs, each RBs report one SNR.", HFILL }
-+		},
-+		{ &hf_nfapi_up_pts_symbol,
-+			{ "UpPTS Symbol", "nfapi.uppts.symbol",
-+			FT_UINT8, BASE_DEC, VALS(up_pts_symbol_vals), 0x0,
-+			"Indicates symbol where SRS was received. Only valid if the SRS was received in subframe 1 or 6.", HFILL }
-+		},
-+		{ &hf_nfapi_number_prb_per_subband,
-+			{ "numPRBperSubband", "nfapi.num.prb.per.subband",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of PRBs that are treated as one subband", HFILL }
-+		},
-+		{ &hf_nfapi_number_antennas,
-+			{ "numAntennas", "nfapi.num.antennas",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Number of physical antennas", HFILL }
-+		},
-+		{ &hf_nfapi_subband_index,
-+			{ "subbandIndex", "nfapi.subband.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"Index of subband for which the following channel coefficient is applied", HFILL }
-+		},
-+		{ &hf_nfapi_channel_coefficient,
-+			{ "Channel", "nfapi.channel.coefficient",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Averaged channel coefficient in a subband for physical antenna #i, real 8 bits followed by imaginary 8 bits", HFILL }
-+		},
-+		{ &hf_nfapi_ul_rtoa,
-+			{ "UL_RTOA", "nfapi.ul.rtoa",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"UL relative time of arrival used for network based positioning", HFILL }
-+		},
-+		{ &hf_nfapi_frequency_band_indicator,
-+			{ "Frequency Band Indicator", "nfapi.frequency.band.indicator",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The E-UTRA band for which the carrierList applies.", HFILL }
-+		},
-+		{ &hf_nfapi_measurement_period,
-+			{ "Measurement Period", "nfapi.measurement.period",
-+			FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The length of time to measure RSSI over, in units of 1ms.", HFILL }
-+		},
-+		{ &hf_nfapi_bandwidth,
-+			{ "Bandwidth", "nfapi.bandwidth",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The bandwidth (in resource blocks) over which the RSSI is measured.", HFILL }
-+		},
-+		{ &hf_nfapi_timeout,
-+			{ "Timeout", "nfapi.timeout",
-+			FT_UINT32, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The timeout value after which the PNF should abort the procedure in units of 1ms. The value of 0 indicates that the PNF should attempt to complete the procedure without any VNF-imposed timeout.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_earfcns,
-+			{ "Number of EARFCNs", "nfapi.number.of.earfcns",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of EARFCNs which should be measured. In the case that no EARFCN (value 0) is specified, all valid EARFCNs for the specified bandwidth in the band shall be measured, in order of ascending EARCFN.", HFILL }
-+		},
-+		{ &hf_nfapi_uarfcn,
-+			{ "UARFCN", "nfapi.uarfcn",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"UARFCN to be measured.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_uarfcns,
-+			{ "Number of UARFCNs", "nfapi.number.of.uarfcn",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of UARFCNs which should be measured. In the case that no UARFCN (value 0) is specified, all UARFCNs in the band shall be measured, in order of ascending UARCFN.", HFILL }
-+		},
-+		{ &hf_nfapi_arfcn,
-+			{ "ARFCN", "nfapi.arfcn",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The ARFCN to be measured", HFILL }
-+		},
-+		{ &hf_nfapi_arfcn_direction,
-+			{ "Direction", "nfapi.arfcn.direction",
-+			FT_UINT8, BASE_DEC, VALS(arfcn_direction_vals), 0x0,
-+			"The link direction to be measured", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_arfcns,
-+			{ "Number of ARFCNs", "nfapi.number.of.arfcn",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of ARFCNs which should be measured. In the case that no ARFCN (value 0) is specified, all ARFCNs in the band shall be measured, in order of ascending ARCFN.", HFILL }
-+		},
-+		{ &hf_nfapi_rssi,
-+			{ "RSSI", "nfapi.rssi",
-+			FT_INT16, BASE_CUSTOM, CF_FUNC(rssi_conversion_fn), 0x0,
-+			"The list of RSSI values of the carriers measured, in the order of the list of the original request.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_rssi,
-+			{ "Number of RSSI", "nfapi.number.of.rssi",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of RSSI results returned in the following array.", HFILL }
-+		},
-+		{ &hf_nfapi_pci,
-+			{ "PCI", "nfapi.pci",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PCI for cell which should be searched", HFILL }
-+		},
-+		{ &hf_nfapi_measurement_bandwidth,
-+			{ "Measurement Bandwidth", "nfapi.measurement.bandwidth",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of resource blocks which should be used for measuring RSRP", HFILL }
-+		},
-+		{ &hf_nfapi_exhaustive_search,
-+			{ "Exhaustive Search", "nfapi.exhaustive.search",
-+			FT_UINT8, BASE_DEC, VALS(exhustive_search_vals), 0x0,
-+			"NMM should try to find all cells on the carrier", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_pci,
-+			{ "Number of PCI", "nfapi.number.of.pci",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of cells in the PCI list. If 0 all cells on the carrier should be found. Otherwise, depending on exhaustiveSearch flag, only the given pciList is searched or the pciList is used for indicating a priority list. Range: 0 to MAX_PCI_LIST.", HFILL }
-+		},
-+		{ &hf_nfapi_psc,
-+			{ "PSC", "nfapi.psc",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The PSC for cells which should be searched.", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_psc,
-+			{ "Number of PSC", "nfapi.number.of.psc",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of cells in the PSC list. If 0 all cells on the carrier should be found. Otherwise, depending on Exhaustive Search flag, only the given PSC list is searched or the PSC list is used for indicating a priority list. Range: 0 to MAX_PSC_LIST.", HFILL }
-+		},
-+		{ &hf_nfapi_rsrp,
-+			{ "RSRP", "nfapi.rsrp",
-+			FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0,
-+			"The measured RSRP value in units of -1dB", HFILL }
-+		},
-+		{ &hf_nfapi_rsrq,
-+			{ "RSRQ", "nfapi.rsrq",
-+			FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0,
-+			"The measured RSRQ value in units of -1dB", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_lte_cells_found,
-+			{ "Number of LTE Cells Found", "nfapi.number.of.lte.cells.found",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of LTE cells indicated in this message.", HFILL }
-+		},
-+		{ &hf_nfapi_rscp,
-+			{ "RSCP", "nfapi.rscp",
-+			FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0,
-+			"The measured RSCP value in units of -1dB", HFILL }
-+		},
-+		{ &hf_nfapi_enco,
-+			{ "EcNo", "nfapi.ecno",
-+			FT_UINT8, BASE_CUSTOM, CF_FUNC(neg_pow_conversion_fn), 0x0,
-+			"The measured RSCP value in units of -1dB", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_utran_cells_found,
-+			{ "Number of UTRAN Cells Found", "nfapi.number.of.utran.cells.found",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of LTE cells indicated in this message", HFILL }
-+		},
-+		{ &hf_nfapi_bsic,
-+			{ "BSIC", "nfapi.bsic",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The BSIC of the cell which the NMM synchronized to", HFILL }
-+		},
-+		{ &hf_nfapi_rxlev,
-+			{ "RxLev", "nfapi.rxlev",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The measured RxLev value", HFILL }
-+		},
-+		{ &hf_nfapi_rxqual,
-+			{ "RxQual", "nfapi.rxqual",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The measured RxQual value", HFILL }
-+		},
-+		{ &hf_nfapi_sfn_offset,
-+			{ "SFN Offset", "nfapi.sfn.offset",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"The offset in us of the start of the current GSM Radio HyperFrame (i.e. FN=0) from the start of the preceding LTE Radio Frame of the PNF for SFN=0", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_geran_cells_found,
-+			{ "Number of GSM Cells Found", "nfapi.number.of.geran.cells.found",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The number of GSM cells indicated in this message", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_tx_antenna,
-+			{ "Number of Tx Antenna", "nfapi.number.of.tx.antenna",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of Tx Antenna detected for the cell", HFILL }
-+		},
-+		{ &hf_nfapi_mib_length,
-+			{ "MIB Length", "nfapi.mib.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Length in bytes of the following MIB array", HFILL }
-+		},
-+		{ &hf_nfapi_mib,
-+			{ "MIB", "nfapi.mib",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			"The MIB read from the specified cell.", HFILL }
-+		},
-+		{ &hf_nfapi_phich_configuration,
-+			{ "PHICH Configuration", "nfapi.phich.configuration",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The PHICH-Config of the cell", HFILL }
-+		},
-+		{ &hf_nfapi_retry_count,
-+			{ "retryCount", "nfapi.retry.count",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of SIB1 repetition periods for which decoding of SIB1 should be retried.", HFILL }
-+		},
-+		{ &hf_nfapi_sib1,
-+			{ "SIB1", "nfapi.sib1",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_si_periodicity,
-+			{ "SI Periodicity", "nfapi.si.periodicity",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The SI Periodicity of the requested SIBs, with the first element being for SIB2, the next for SIB3, etc, encoded as follows", HFILL }
-+		},
-+		{ &hf_nfapi_si_index,
-+			{ "SI Index", "nfapi.si.index",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The index of this SIB in the SIB1 SchedulingInfoList:", HFILL }
-+		},
-+		{ &hf_nfapi_number_of_si_periodicity,
-+			{ "Number of SI Periodicity", "nfapi.number.of.si.periodicity",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The number of System Information periodicity values in the following array", HFILL }
-+		},
-+		{ &hf_nfapi_si_window_length,
-+			{ "SI Window Length", "nfapi.si.window.length",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The SI window in units of 1ms", HFILL }
-+		},
-+		{ &hf_nfapi_sib_type,
-+			{ "SIB Type", "nfapi.sib.type",
-+			FT_UINT8, BASE_DEC, NULL, 0x0,
-+			"The SIB type", HFILL }
-+		},
-+		{ &hf_nfapi_sib_len,
-+			{ "SIB Length", "nfapi.sib.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The length in bytes of the following SIB array", HFILL }
-+		},
-+		{ &hf_nfapi_sib,
-+			{ "SIB", "nfapi.sib",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			"The SIB element read from the specified cell.", HFILL }
-+		},
-+		{ &hf_nfapi_si_len,
-+			{ "SI Length", "nfapi.si.length",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The length in bytes of the following SI array", HFILL }
-+		},
-+		{ &hf_nfapi_si,
-+			{ "SI", "nfapi.si",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			"The SI element read from the specified cell.", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_search_state,
-+			{ "State", "nfapi.state",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			"A structure of opaque data optionally sent by the PNF to the VNF", HFILL }
-+		},
-+		{ &hf_nfapi_pnf_broadcast_state,
-+			{ "State", "nfapi.state",
-+			FT_BYTES, BASE_NONE, NULL, 0x0,
-+			"A structure of opaque data optionally sent by the PNF to the VNF", HFILL }
-+		},
-+		{ &hf_nfapi_dl_rs_tx_power,
-+			{ "DL RS Tx power", "nfapi.dl.rs.tx.power",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"The DL RS Tx power measurement", HFILL }
-+		},
-+		{ &hf_nfapi_received_interference_power,
-+			{ "Received interference power", "nfapi.received.interference.power",
-+			FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The Received interference power measurement", HFILL }
-+		},
-+		{ &hf_nfapi_thermal_noise_power,
-+			{ "Thermal noise power", "nfapi.thermal.noise.power",
-+			FT_UINT16, BASE_DEC | BASE_UNIT_STRING, &units_milliseconds, 0x0,
-+			"The Thermal noise power measurement", HFILL }
-+		},
-+		{ &hf_nfapi_dl_rs_tx_power_measurement,
-+			{ "DL RS TX Power measurement", "nfapi.dl.rs.tx.power.measurement",
-+			FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0,
-+			"The DL RS Tx power measurement defined", HFILL }
-+		},
-+		{ &hf_nfapi_received_interference_power_measurement,
-+			{ "Received interference power measurement", "nfapi.received.interference.power.measurement",
-+			FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0,
-+			NULL, HFILL }
-+		},
-+		{ &hf_nfapi_thermal_noise_power_measurement,
-+			{ "Thermal noise power measurement", "nfapi.thermal.noise.power.measurement",
-+			FT_INT16, BASE_CUSTOM, CF_FUNC(dl_rs_tx_pow_measment_conversion_fn), 0x0,
-+			"The Thermal noise power measurement", HFILL }
-+		},
-+		{ &hf_nfapi_initial_partial_sf,
-+			{ "Initial Partial SF", "nfapi.initial.partial.sf",
-+			FT_BOOLEAN, 32, TFS(&initial_partial_sf_strname), 0x0,
-+			"Indicates whether the initial SF in the LBT process is full or partial", HFILL }
-+		},
-+		{ &hf_nfapi_lbt_mode,
-+			{ "LBT Mode", "nfapi.lbt.mode",
-+			FT_BOOLEAN, 32, TFS(&lbt_mode_strname), 0x0,
-+			"Part of multi-carrier support. Indicates whether full LBT process is carried or partial LBT process is carried (multi carrier mode B according to [9] section 15.1.5.2)", HFILL }
-+		},
-+		{ &hf_nfapi_lte_txop_sf,
-+			{ "LTE TXOP SF", "nfapi.txop.sf",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"Indicates the LTE TXOP (TMCOT,P in [9] section 15.1.1) duration in subframes.", HFILL }
-+		},
-+		{ &hf_nfapi_mp_cca,
-+			{ "mp cca", "nfapi.mp.cca",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"Indicates the value of the defer factor", HFILL }
-+		},
-+		{ &hf_nfapi_n_cca,
-+			{ "n cca", "nfapi.n.cca",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"Indicates the value of LBT backoff counter", HFILL }
-+		},
-+		{ &hf_nfapi_offset,
-+			{ "offset", "nfapi.offset",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"Indicates the LBT start time in microseconds from the beginning of the subframe scheduled by this message.", HFILL }
-+		},
-+		{ &hf_nfapi_result,
-+			{ "result", "nfapi.result",
-+			FT_BOOLEAN, 32, TFS(&tfs_fail_success), 0x0,
-+			"Indicates the LBT procedure result of SFN/SF:", HFILL }
-+		},
-+		{ &hf_nfapi_sfn_sf_end,
-+			{ "SFN/SF End", "nfapi.sfn.sf.end",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates the SFN/SF by which the DRS window (Discovery signal occasion as described in [9] section 6.11A) must end. In worst case, this would be the last TXOP subframe.", HFILL }
-+		},
-+		{ &hf_nfapi_txop_sfn_sf_end,
-+			{ "TXOP SFN/SF End", "nfapi.txop.sfn.sf.end",
-+			FT_UINT16, BASE_DEC, NULL, 0x0,
-+			"Indicates the SFN/SF by which the TXOP must end. In worst case, this would be the last TXOP subframe.", HFILL }
-+		},
-+		{ &hf_nfapi_txop_symbols,
-+			{ "LTE TXOP symbols", "nfapi.lte.txop.symbols",
-+			FT_UINT32, BASE_DEC, NULL, 0x0,
-+			"Actual LTE TXOP in symbols", HFILL }
-+		},
-+	};
-+
-+	/* Setup protocol subtree array */
-+	static gint *ett[] =
-+	{
-+		&ett_nfapi_message_tree,
-+		&ett_nfapi_p4_p5_message_header,
-+		&ett_nfapi_p7_message_header,
-+		&ett_nfapi_tlv_tree,
-+		&ett_nfapi_tl,
-+		&ett_nfapi_pnf_phy_rf_config,
-+		&ett_nfapi_pnf_phy,
-+		&ett_nfapi_pnf_phy_rel10,
-+		&ett_nfapi_pnf_phy_rel11,
-+		&ett_nfapi_pnf_phy_rel12,
-+		&ett_nfapi_pnf_phy_rel13,
-+		&ett_nfapi_rf_bands,
-+		&ett_nfapi_bf_vectors,
-+		&ett_nfapi_csi_rs_bf_vector,
-+		&ett_nfapi_csi_rs_resource_configs,
-+		&ett_nfapi_tx_antenna_ports,
-+		&ett_nfapi_harq_ack_nack_data,
-+		&ett_nfapi_harq_data,
-+		&ett_nfapi_cqi_pmi_size,
-+		&ett_nfapi_cc,
-+		&ett_nfapi_rbs,
-+		&ett_nfapi_antennas,
-+		&ett_nfapi_epdcch_prbs,
-+		&ett_nfapi_dl_config_request_pdu_list,
-+		&ett_nfapi_ul_config_request_pdu_list,
-+		&ett_nfapi_hi_dci0_request_pdu_list,
-+		&ett_nfapi_tx_request_pdu_list,
-+		&ett_nfapi_rx_indication_pdu_list,
-+		&ett_nfapi_harq_indication_pdu_list,
-+		&ett_nfapi_crc_indication_pdu_list,
-+		&ett_nfapi_sr_indication_pdu_list,
-+		&ett_nfapi_cqi_indication_pdu_list,
-+		&ett_nfapi_preamble_indication_pdu_list,
-+		&ett_nfapi_srs_indication_pdu_list,
-+		&ett_nfapi_lbt_dl_config_pdu_list,
-+		&ett_nfapi_lbt_dl_indication_pdu_list,
-+		&ett_nfapi_subbands,
-+		&ett_nfapi_precoding,
-+		&ett_nfapi_bf_vector_antennas,
-+		&ett_nfapi_received_interference_power_mesurement_results,
-+		&ett_nfapi_downlink_bandwidth_support,
-+		&ett_nfapi_uplink_bandwidth_support,
-+		&ett_nfapi_release_support,
-+		&ett_nfapi_downlink_modulation_support,
-+		&ett_nfapi_uplink_modulation_support,
-+
-+		&ett_nfapi_earfcn_list,
-+		&ett_nfapi_uarfcn_list,
-+		&ett_nfapi_arfcn_list,
-+		&ett_nfapi_rssi_list,
-+		&ett_nfapi_pci_list,
-+		&ett_nfapi_psc_list,
-+		&ett_nfapi_lte_cells_found_list,
-+		&ett_nfapi_utran_cells_found_list,
-+		&ett_nfapi_geran_cells_found_list,
-+		&ett_nfapi_si_periodicity_list,
-+
-+		/* for fragmentation support*/
-+		&ett_msg_fragment,
-+		&ett_msg_fragments
-+	};
-+
-+	static ei_register_info ei[] =
-+	{
-+		{ &ei_invalid_range, { "nfapi.invalid.range", PI_PROTOCOL, PI_WARN, NULL, EXPFILL } },
-+		{ &ei_invalid_tlv_length, { "nfapi.invalid.tlv.length", PI_PROTOCOL, PI_ERROR, NULL, EXPFILL } },
-+	};
-+
-+	expert_module_t* expert_nfapi;
-+	/* Register protocol */
-+	proto_nfapi = proto_register_protocol("Nfapi", "NFAPI", "nfapi");
-+
-+	expert_nfapi = expert_register_protocol(proto_nfapi);
-+	expert_register_field_array(expert_nfapi, ei, array_length(ei));
-+
-+
-+	proto_register_field_array(proto_nfapi, hf, array_length(hf));
-+	proto_register_subtree_array(ett, array_length(ett));
-+
-+	reassembly_table_register(&ul_p7_reassemble_table, &addresses_ports_reassembly_table_functions);
-+	reassembly_table_register(&dl_p7_reassemble_table, &addresses_ports_reassembly_table_functions);
-+
-+	register_dissector("nfapi", dissect_nfapi, proto_nfapi);
-+
-+}
-+
-+// ----------------------------------------------------------------------------|
-+
-+void proto_reg_handoff_nfapi(void)
-+{
-+	static dissector_handle_t nfapi_handle;
-+
-+	nfapi_handle = create_dissector_handle(dissect_nfapi, proto_nfapi);
-+
-+	dissector_add_for_decode_as("sctp.port", nfapi_handle);
-+
-+	dissector_add_uint("udp.port", 41700, nfapi_handle);
-+
-+}
-+
-+
-+/*
-+* Editor modelines  -  http://www.wireshark.org/tools/modelines.html
-+*
-+* Local variables:
-+* c-basic-offset: 8
-+* tab-width: 8
-+* indent-tabs-mode: t
-+* End:
-+*
-+* vi: set shiftwidth=8 tabstop=8 noexpandtab:
-+* :indentSize=8:tabSize=8:noTabs=false:
-+*/
-diff --git a/xml/pnf_phy_1_A.xml b/xml/pnf_phy_1_A.xml
-index da6cc26..45f8f46 100644
---- a/xml/pnf_phy_1_A.xml
-+++ b/xml/pnf_phy_1_A.xml
-@@ -26,7 +26,7 @@
- 		<phy>
- 			<index>88</index>
- 			<port>2500</port>
--			<address>127.0.0.1</address>
-+			<address>192.168.1.74</address>
- 
- 			<duplex_mode>1</duplex_mode>
- 
-@@ -54,9 +54,9 @@
- 
- 			<data>
- 				<udp>
--					<rx_port>7722</rx_port>
--					<tx_addr>127.0.0.1</tx_addr>
--					<tx_port>7733</tx_port>
-+					<rx_port>5201</rx_port>
-+					<tx_addr>192.168.1.28</tx_addr>
-+					<tx_port>5200</tx_port>
- 				</udp>
- 			</data>
- 		</phy>
-diff --git a/xml/vnf_A.xml b/xml/vnf_A.xml
-index e609c93..3791239 100644
---- a/xml/vnf_A.xml
-+++ b/xml/vnf_A.xml
-@@ -2,8 +2,8 @@
- <vnf>
- 	<vnf_p7_list>
- 		<vnf_p7>
--			<port>5200</port>
--			<address>127.0.0.1</address>
-+			<port>5201</port>
-+			<address>192.168.1.28</address>
- 			<timing_window>10</timing_window>
- 			<periodic_timing_enabled>0</periodic_timing_enabled>
- 			<periodic_timing_window>0</periodic_timing_window>
-@@ -12,7 +12,7 @@
- 			<data>
- 				<udp>
- 					<rx_port>8891</rx_port>
--					<tx_addr>127.0.0.1</tx_addr>
-+					<tx_addr>192.168.1.28</tx_addr>
- 					<tx_port>8892</tx_port>
- 				</udp>
- 			</data>
diff --git a/nfapi/tests/p5/nr_fapi_config_request_test.c b/nfapi/tests/p5/nr_fapi_config_request_test.c
index f980b3e61ec4081ebebfc8a8dfebb935c6d7c383..3b6ae99e941b0c73f649f7b09ad24c1563514800 100644
--- a/nfapi/tests/p5/nr_fapi_config_request_test.c
+++ b/nfapi/tests/p5/nr_fapi_config_request_test.c
@@ -22,7 +22,7 @@
 #include "nr_fapi_p5.h"
 #include "nr_fapi_p5_utils.h"
 
-void fill_config_request_tlv(nfapi_nr_config_request_scf_t *nfapi_resp)
+static void fill_config_request_tlv_tdd_rand(nfapi_nr_config_request_scf_t *nfapi_resp)
 {
   FILL_TLV(nfapi_resp->carrier_config.dl_bandwidth, NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, rand16());
   nfapi_resp->num_tlv++;
@@ -70,7 +70,8 @@ void fill_config_request_tlv(nfapi_nr_config_request_scf_t *nfapi_resp)
   FILL_TLV(nfapi_resp->cell_config.phy_cell_id, NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, rand16());
   nfapi_resp->num_tlv++;
 
-  FILL_TLV(nfapi_resp->cell_config.frame_duplex_type, NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, rand8());
+  // TDD because below we pack the TDD table
+  FILL_TLV(nfapi_resp->cell_config.frame_duplex_type, NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, 1 /* TDD */);
   nfapi_resp->num_tlv++;
 
   FILL_TLV(nfapi_resp->ssb_config.ss_pbch_power, NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, (int32_t)rand32());
@@ -230,7 +231,7 @@ void fill_config_request_tlv(nfapi_nr_config_request_scf_t *nfapi_resp)
   nfapi_resp->num_tlv++;
 }
 
-void test_pack_unpack(nfapi_nr_config_request_scf_t *req)
+static void test_pack_unpack(nfapi_nr_config_request_scf_t *req)
 {
   uint8_t msg_buf[65535];
   uint16_t msg_len = sizeof(*req);
@@ -263,7 +264,7 @@ void test_pack_unpack(nfapi_nr_config_request_scf_t *req)
   free_config_request(&unpacked_req);
 }
 
-void test_copy(const nfapi_nr_config_request_scf_t *msg)
+static void test_copy(const nfapi_nr_config_request_scf_t *msg)
 {
   // Test copy function
   nfapi_nr_config_request_scf_t copy = {0};
@@ -272,16 +273,173 @@ void test_copy(const nfapi_nr_config_request_scf_t *msg)
   free_config_request(&copy);
 }
 
-int main(int n, char *v[])
+static void test_config_req_rand(void)
 {
-  fapi_test_init();
   nfapi_nr_config_request_scf_t req = {.header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST};
   // Fill CONFIG.request TVLs
-  fill_config_request_tlv(&req);
+  fill_config_request_tlv_tdd_rand(&req);
+  // Perform tests
+  test_pack_unpack(&req);
+  test_copy(&req);
+  // All tests successful!
+  free_config_request(&req);
+}
+
+static void fill_config_request_tlv_fdd(nfapi_nr_config_request_scf_t *req)
+{
+  /* carrier config */
+  FILL_TLV(req->carrier_config.dl_bandwidth, NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, 5);
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.dl_frequency, NFAPI_NR_CONFIG_DL_FREQUENCY_TAG, 2150430);
+  req->num_tlv++;
+  for (int i = 0; i < 5; ++i)
+    FILL_TLV(req->carrier_config.dl_k0[i], NFAPI_NR_CONFIG_DL_K0_TAG, 0);
+  // these 5 are 1 tlv
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.dl_grid_size[0], NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, 25);
+  for (int i = 1; i < 5; ++i)
+    FILL_TLV(req->carrier_config.dl_grid_size[i], NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, 0);
+  // these 5 are 1 tlv
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.num_tx_ant, NFAPI_NR_CONFIG_NUM_TX_ANT_TAG, 1);
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.uplink_bandwidth, NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG, 5);
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.uplink_frequency, NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG, 1750430);
+  req->num_tlv++;
+  for (int i = 0; i < 5; ++i)
+    FILL_TLV(req->carrier_config.ul_k0[i], NFAPI_NR_CONFIG_UL_K0_TAG, 0);
+  // these 5 are 1 tlv
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.ul_grid_size[0], NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, 25);
+  for (int i = 0; i < 5; ++i)
+    FILL_TLV(req->carrier_config.ul_grid_size[i], NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, 0);
+  // these 5 are 1 tlv
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.num_rx_ant, NFAPI_NR_CONFIG_NUM_RX_ANT_TAG, 1);
+  req->num_tlv++;
+  FILL_TLV(req->carrier_config.frequency_shift_7p5khz, NFAPI_NR_CONFIG_FREQUENCY_SHIFT_7P5KHZ_TAG, 0);
+  req->num_tlv++;
+
+  /* cell config */
+  FILL_TLV(req->cell_config.phy_cell_id, NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, 0);
+  req->num_tlv++;
+  FILL_TLV(req->cell_config.frame_duplex_type, NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, 0 /* FDD */);
+  req->num_tlv++;
+
+  /* SSB config */
+  FILL_TLV(req->ssb_config.ss_pbch_power, NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, -25);
+  req->num_tlv++;
+  FILL_TLV(req->ssb_config.bch_payload, NFAPI_NR_CONFIG_BCH_PAYLOAD_TAG, 1 /* PHY generates timing bits */);
+  req->num_tlv++;
+  FILL_TLV(req->ssb_config.scs_common, NFAPI_NR_CONFIG_SCS_COMMON_TAG, 0 /* 15 kHz */);
+  req->num_tlv++;
+
+  /* PRACH config */
+  FILL_TLV(req->prach_config.prach_sequence_length, NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG, 1);
+  req->num_tlv++;
+  FILL_TLV(req->prach_config.prach_sub_c_spacing, NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, 0);
+  req->num_tlv++;
+  FILL_TLV(req->prach_config.restricted_set_config, NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, 0);
+  req->num_tlv++;
+  FILL_TLV(req->prach_config.prach_ConfigurationIndex, NFAPI_NR_CONFIG_PRACH_CONFIG_INDEX_TAG, 98);
+  req->num_tlv++;
+  int num_prach = 1;
+  FILL_TLV(req->prach_config.num_prach_fd_occasions, NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, num_prach);
+  req->num_tlv++;
+  nfapi_nr_num_prach_fd_occasions_t *l = calloc(num_prach, sizeof(*l));
+  req->prach_config.num_prach_fd_occasions_list = l;
+  FILL_TLV(l->prach_root_sequence_index, NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, 1);
+  req->num_tlv++;
+  FILL_TLV(l->num_root_sequences, NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, 16);
+  req->num_tlv++;
+  FILL_TLV(l->k1, NFAPI_NR_CONFIG_K1_TAG, 0);
+  req->num_tlv++;
+  FILL_TLV(l->prach_zero_corr_conf, NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, 13);
+  req->num_tlv++;
+  /* should be at least according to spec */
+  FILL_TLV(l->num_unused_root_sequences, NFAPI_NR_CONFIG_NUM_UNUSED_ROOT_SEQUENCES_TAG, 0);
+  req->num_tlv++;
+  l->unused_root_sequences_list = NULL;
+  FILL_TLV(req->prach_config.ssb_per_rach, NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, 3);
+  req->num_tlv++;
+  FILL_TLV(req->prach_config.prach_multiple_carriers_in_a_band, NFAPI_NR_CONFIG_PRACH_MULTIPLE_CARRIERS_IN_A_BAND_TAG, 0);
+  req->num_tlv++;
+
+  /* SSB table */
+  FILL_TLV(req->ssb_table.ssb_offset_point_a, NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG, 4);
+  req->num_tlv++;
+  FILL_TLV(req->ssb_table.ssb_period, NFAPI_NR_CONFIG_SSB_PERIOD_TAG, 2);
+  req->num_tlv++;
+  FILL_TLV(req->ssb_table.ssb_subcarrier_offset, NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, 0);
+  req->num_tlv++;
+  FILL_TLV(req->ssb_table.MIB, NFAPI_NR_CONFIG_MIB_TAG, 0);
+  req->num_tlv++;
+
+  FILL_TLV(req->ssb_table.ssb_mask_list[0].ssb_mask, NFAPI_NR_CONFIG_SSB_MASK_TAG, 2147483648);
+  req->num_tlv++;
+  FILL_TLV(req->ssb_table.ssb_mask_list[1].ssb_mask, NFAPI_NR_CONFIG_SSB_MASK_TAG, 0);
+  req->num_tlv++;
+  for (int i = 0; i < 64; i++) {
+    FILL_TLV(req->ssb_table.ssb_beam_id_list[i].beam_id, NFAPI_NR_CONFIG_BEAM_ID_TAG, 0);
+    req->num_tlv++;
+  }
+
+  /* NOTE: no TDD table! */
+
+  /* Measurement config rssi_measurement NULL -> not present */
+
+  /* nFAPI config */
+  /* IPv4 address is 127.0.0.1 */
+  req->nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG;
+  req->nfapi_config.p7_vnf_address_ipv4.address[0] = 127;
+  req->nfapi_config.p7_vnf_address_ipv4.address[1] = 0;
+  req->nfapi_config.p7_vnf_address_ipv4.address[2] = 0;
+  req->nfapi_config.p7_vnf_address_ipv4.address[3] = 1;
+  req->num_tlv++;
+  /* no IPv6 address */
+  FILL_TLV(req->nfapi_config.p7_vnf_port, NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, 50011);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.timing_window, NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, 30);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.timing_info_mode, NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, 3);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.timing_info_period, NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, 10);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_DL_TTI_TIMING_OFFSET, 0);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_UL_TTI_TIMING_OFFSET, 0);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_UL_DCI_TIMING_OFFSET, 0);
+  req->num_tlv++;
+  FILL_TLV(req->nfapi_config.dl_tti_timing_offset, NFAPI_NR_NFAPI_TX_DATA_TIMING_OFFSET, 0);
+  req->num_tlv++;
+
+  /* PMI list NULL */
+
+  /* Digital beamforming NULL */
+
+  /* Analog beamforming NULL */
+
+  //DevAssert(req->num_tlv == 103);
+}
+
+static void test_config_req_fdd(void)
+{
+  nfapi_nr_config_request_scf_t req = {.header.phy_id = 1, .header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST};
+  // Fill CONFIG.request TVLs
+  fill_config_request_tlv_fdd(&req);
   // Perform tests
   test_pack_unpack(&req);
   test_copy(&req);
   // All tests successful!
   free_config_request(&req);
+}
+
+int main(int n, char *v[])
+{
+  fapi_test_init();
+  test_config_req_rand();
+  test_config_req_fdd();
   return 0;
 }
diff --git a/openair1/PHY/CODING/3gpplte_sse.c b/openair1/PHY/CODING/3gpplte_sse.c
index 79fd825a4b443ff31e2ded502fd412a39a1b8e87..9d19c9b346ca3e8f95697807c75b411e96e0cc6e 100644
--- a/openair1/PHY/CODING/3gpplte_sse.c
+++ b/openair1/PHY/CODING/3gpplte_sse.c
@@ -47,14 +47,8 @@
 //#define CALLGRIND 1
 
 struct treillis {
-  union {
-    simde__m64 systematic_andp1_64[3];
-    uint8_t systematic_andp1_8[24];
-  };
-  union {
-    simde__m64 parity2_64[3];
-    uint8_t parity2_8[24];
-  };
+  uint8_t systematic_andp1[24] __attribute__((aligned(32)));
+  uint8_t parity2[24] __attribute__((aligned(32)));
   int exit_state;
 }  __attribute__ ((aligned(64)));
 
@@ -91,12 +85,11 @@ static void treillis_table_init(void) {
       current_state=i;
 
       for (b=0; b<8 ; b++ ) { // pre-compute the image of the byte j in _m128i vector right place
-        all_treillis[i][j].systematic_andp1_8[b*3]= (j&(1<<(7-b)))>>(7-b);
-        v=threegpplte_rsc( all_treillis[i][j].systematic_andp1_8[b*3] ,
-                           &current_state);
-        all_treillis[i][j].systematic_andp1_8[b*3+1]=v; // for the yparity1
+        all_treillis[i][j].systematic_andp1[b * 3] = (j & (1 << (7 - b))) >> (7 - b);
+        v = threegpplte_rsc(all_treillis[i][j].systematic_andp1[b * 3], &current_state);
+        all_treillis[i][j].systematic_andp1[b * 3 + 1] = v; // for the yparity1
         //        all_treillis[i][j].parity1_8[b*3+1]=v; // for the yparity1
-        all_treillis[i][j].parity2_8[b*3+2]=v; // for the yparity2
+        all_treillis[i][j].parity2[b * 3 + 2] = v; // for the yparity2
       }
 
       all_treillis[i][j].exit_state=current_state;
@@ -275,13 +268,9 @@ char interleave_compact_byte(short *base_interleaver,unsigned char *input, unsig
   }
 */
 
-void threegpplte_turbo_encoder_sse(unsigned char *input,
-                                   unsigned short input_length_bytes,
-                                   unsigned char *output,
-                                   unsigned char F) {
-  int i;
+void threegpplte_turbo_encoder_sse(unsigned char *input, unsigned short input_length_bytes, unsigned char *output, unsigned char F)
+{
   unsigned char *x;
-  unsigned char state0=0,state1=0;
   unsigned short input_length_bits = input_length_bytes<<3;
   short *base_interleaver;
 
@@ -290,6 +279,7 @@ void threegpplte_turbo_encoder_sse(unsigned char *input,
   }
 
   // look for f1 and f2 precomputed interleaver values
+  int i;
   for (i=0; i < 188 && f1f2mat[i].nb_bits != input_length_bits; i++);
 
   if ( i == 188 ) {
@@ -301,24 +291,19 @@ void threegpplte_turbo_encoder_sse(unsigned char *input,
 
   unsigned char systematic2[768] __attribute__((aligned(32)));
   interleave_compact_byte(base_interleaver, input, systematic2, input_length_bytes);
-  simde__m64 *ptr_output = (simde__m64 *)output;
-  unsigned char cur_s1, cur_s2;
-  int code_rate;
-
-  for ( state0=state1=i=0 ; i<input_length_bytes; i++ ) {
-    cur_s1=input[i];
-    cur_s2=systematic2[i];
-
-    for (code_rate = 0; code_rate < 3; code_rate++) {
-      /*
-       *ptr_output++ = simde_mm_add_pi8(all_treillis[state0][cur_s1].systematic_64[code_rate],
-       simde_mm_add_pi8(all_treillis[state0][cur_s1].parity1_64[code_rate],
-      all_treillis[state1][cur_s2].parity2_64[code_rate]));
-      */
-      *ptr_output++ = simde_mm_add_pi8(all_treillis[state0][cur_s1].systematic_andp1_64[code_rate],
-                                       all_treillis[state1][cur_s2].parity2_64[code_rate]);
+  unsigned char *ptr_output = output;
+  unsigned char state0 = 0, state1 = 0;
+  for (int i = 0; i < input_length_bytes; i++) {
+    int cur_s1 = input[i];
+    uint8_t *systematic_andp1 = all_treillis[state0][cur_s1].systematic_andp1;
+    int cur_s2 = systematic2[i];
+    uint8_t *parity2 = all_treillis[state1][cur_s2].parity2;
+    simde_mm_storeu_si128((simde__m128i *)ptr_output,
+                          simde_mm_add_epi8(*(simde__m128i *)systematic_andp1, *(simde__m128i *)parity2));
+    ptr_output += 16;
+    for (int code_rate = 16; code_rate < 24; code_rate++) {
+      *ptr_output++ = systematic_andp1[code_rate] + parity2[code_rate];
     }
-
     state0=all_treillis[state0][cur_s1].exit_state;
     state1=all_treillis[state1][cur_s2].exit_state;
   }
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
index 57c53df1b1341c6cbd2f5d03761e629d8fd60640..4d7f91acda015d42371e04e887dc7116cbe54493 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
@@ -54,10 +54,6 @@
 #include <string.h>
 #endif
 
-#ifdef MEX
-#include "mex.h"
-#endif
-
 #include "PHY/sse_intrin.h"
 
 //#define DEBUG_LOGMAP
@@ -837,19 +833,11 @@ void init_td16avx2(void)
 
   for (ind=0; ind<188; ind++) {
     n = f1f2mat[ind].nb_bits;
-    base_interleaver=il_tb+f1f2mat[ind].beg_index;
-#ifdef MEX
-    // This is needed for the Mex implementation to make the memory persistent
-    pi2tab16[ind] = mxMalloc((n+8)*sizeof(int));
-    pi5tab16[ind] = mxMalloc((n+8)*sizeof(int));
-    pi4tab16[ind] = mxMalloc((n+8)*sizeof(int));
-    pi6tab16[ind] = mxMalloc((n+8)*sizeof(int));
-#else
+    base_interleaver = il_tb + f1f2mat[ind].beg_index;
     pi2tab16avx2[ind] = malloc((n+8)*sizeof(int));
     pi5tab16avx2[ind] = malloc((n+8)*sizeof(int));
     pi4tab16avx2[ind] = malloc((n+8)*sizeof(int));
-    pi6tab16avx2[ind] = malloc((n+8)*sizeof(int));
-#endif
+    pi6tab16avx2[ind] = malloc((n + 8) * sizeof(int));
 
     //    fprintf(fdavx2,"Interleaver index %d\n",ind);
     for (i=i2=0; i2<8; i2++) {
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
index cae2093e9919081a425292599b5950739af7faab..12cbe867a488758167058487176cf1c968975fa9 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
@@ -52,12 +52,6 @@
   #include <string.h>
 #endif
 
-#ifdef MEX
-  #include "mex.h"
-#endif
-
-//#define DEBUG_LOGMAP
-
 #ifdef DEBUG_LOGMAP
   #define print_shorts(s,x) fprintf(fdsse4,"%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
 #endif
@@ -933,20 +927,11 @@ void init_td16(void) {
 
   for (ind=0; ind<188; ind++) {
     n = f1f2mat[ind].nb_bits;
-    base_interleaver=il_tb+f1f2mat[ind].beg_index;
-#ifdef MEX
-    // This is needed for the Mex implementation to make the memory persistent
-    pi2tab16[ind] = mxMalloc((n+8)*sizeof(int));
-    pi5tab16[ind] = mxMalloc((n+8)*sizeof(int));
-    pi4tab16[ind] = mxMalloc((n+8)*sizeof(int));
-    pi6tab16[ind] = mxMalloc((n+8)*sizeof(int));
-#else
+    base_interleaver = il_tb + f1f2mat[ind].beg_index;
     pi2tab16[ind] = malloc((n+8)*sizeof(int));
     pi5tab16[ind] = malloc((n+8)*sizeof(int));
     pi4tab16[ind] = malloc((n+8)*sizeof(int));
-    pi6tab16[ind] = malloc((n+8)*sizeof(int));
-#endif
-
+    pi6tab16[ind] = malloc((n + 8) * sizeof(int));
     for (i=i2=0; i2<8; i2++) {
       j=i2;
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index 1447dbc6cc78b4c9e2121811f536dd3bcc3e592c..0180bed149d40446aedbc0ce37fe5b480e532230 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -50,10 +50,6 @@
   #include <string.h>
 #endif
 
-#ifdef MEX
-  #include "mex.h"
-#endif
-
 #include "common/ran_context.h"
 
 #define SHUFFLE16(a, b, c, d, e, f, g, h)     \
@@ -858,19 +854,11 @@ void init_td8(void) {
 
   for (ind=0; ind<188; ind++) {
     n = f1f2mat[ind].nb_bits;
-    base_interleaver=il_tb+f1f2mat[ind].beg_index;
-#ifdef MEX
-    // This is needed for the Mex implementation to make the memory persistent
-    pi2tab8[ind] = mxMalloc((n+8)*sizeof(int));
-    pi5tab8[ind] = mxMalloc((n+8)*sizeof(int));
-    pi4tab8[ind] = mxMalloc((n+8)*sizeof(int));
-    pi6tab8[ind] = mxMalloc((n+8)*sizeof(int));
-#else
+    base_interleaver = il_tb + f1f2mat[ind].beg_index;
     pi2tab8[ind] = malloc((n+8)*sizeof(int));
     pi5tab8[ind] = malloc((n+8)*sizeof(int));
     pi4tab8[ind] = malloc((n+8)*sizeof(int));
-    pi6tab8[ind] = malloc((n+8)*sizeof(int));
-#endif
+    pi6tab8[ind] = malloc((n + 8) * sizeof(int));
 
     if ((n&15)>0) {
       n2 = n+8;
diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface_load.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface_load.c
index 4819b68598db7a6bea1d482797ce7566283a1573..ab80eb77a0c5ae33030bc21450a12d4c33ab266d 100644
--- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface_load.c
+++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface_load.c
@@ -70,5 +70,9 @@ int load_nrLDPC_coding_interface(char *version, nrLDPC_coding_interface_t *itf)
 
 int free_nrLDPC_coding_interface(nrLDPC_coding_interface_t *interface)
 {
-  return interface->nrLDPC_coding_shutdown();
+  if (interface->nrLDPC_coding_shutdown) {
+    return interface->nrLDPC_coding_shutdown();
+  } else {
+    return -1;
+  }
 }
diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c
index 4a4e6beaafe07672368c86ada0199edacd64a667..757566b1fcc9141c8b2c0d1e7947d06e5758bcba 100644
--- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c
+++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_segment/nrLDPC_coding_segment_encoder.c
@@ -177,8 +177,6 @@ static int nrLDPC_prepare_TB_encoding(nrLDPC_slot_encoding_parameters_t *nrLDPC_
   impp.toutput = nrLDPC_slot_encoding_parameters->toutput;
   impp.Kb = nrLDPC_TB_encoding_parameters->Kb;
   impp.Zc = nrLDPC_TB_encoding_parameters->Z;
-  NR_DL_gNB_HARQ_t harq;
-  impp.harq = &harq;
   impp.BG = nrLDPC_TB_encoding_parameters->BG;
   impp.output = nrLDPC_TB_encoding_parameters->segments->output;
   impp.K = nrLDPC_TB_encoding_parameters->K;
diff --git a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c
index fa5aa2d482243a076ba000fad4c42f3f939862fb..c16b21bfdca94b8b5b70f4a921a1701d50390d9e 100644
--- a/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c
+++ b/openair1/PHY/CODING/nrLDPC_coding/nrLDPC_coding_t2/nrLDPC_coding_t2.c
@@ -559,8 +559,18 @@ set_ldpc_dec_op(struct rte_bbdev_dec_op **ops,
         ops[j]->ldpc_dec.op_flags |= RTE_BBDEV_LDPC_CRC_TYPE_24B_CHECK;
       }
       ops[j]->ldpc_dec.code_block_mode = 1;
-      ops[j]->ldpc_dec.harq_combined_input.offset = (((nrLDPC_slot_decoding_parameters->TBs[h].harq_unique_pid * NR_LDPC_MAX_NUM_CB) % HARQ_CODEBLOCK_ID_MAX) + i) * LDPC_MAX_CB_SIZE;
-      ops[j]->ldpc_dec.harq_combined_output.offset = (((nrLDPC_slot_decoding_parameters->TBs[h].harq_unique_pid * NR_LDPC_MAX_NUM_CB) % HARQ_CODEBLOCK_ID_MAX) + i) * LDPC_MAX_CB_SIZE;
+
+      // Calculate offset in the HARQ combined buffers
+      // Unique segment offset
+      uint32_t segment_offset = (nrLDPC_slot_decoding_parameters->TBs[h].harq_unique_pid * NR_LDPC_MAX_NUM_CB) + i;
+      // Prune to avoid shooting above maximum id
+      uint32_t pruned_segment_offset = segment_offset % HARQ_CODEBLOCK_ID_MAX;
+      // Segment offset to byte offset
+      uint32_t harq_combined_offset = pruned_segment_offset * LDPC_MAX_CB_SIZE;
+
+      ops[j]->ldpc_dec.harq_combined_input.offset = harq_combined_offset;
+      ops[j]->ldpc_dec.harq_combined_output.offset = harq_combined_offset;
+
       if (bufs->hard_outputs != NULL)
         ops[j]->ldpc_dec.hard_output = bufs->hard_outputs[start_idx + j];
       if (bufs->inputs != NULL)
diff --git a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h
index 13f533781eb841e2b5d4ac52c99954e388097a08..c63fdc948b2d5e238d67873546cdbefedf6fc0f1 100644
--- a/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h
+++ b/openair1/PHY/CODING/nrLDPC_decoder/nrLDPC_tools/nrLDPC_debug.h
@@ -165,18 +165,4 @@ static inline void nrLDPC_debug_initBuffer2File(e_nrLDPC_buffers buffer)
     }
 }
 
-/**
-   \brief Prints 256 data type
-   \param in Input to print
-*/
-static inline void nrLDPC_debug_print256i_epi8(simde__m256i* in)
-{
-    uint32_t i;
-
-    for (i=0; i<32; i++)
-    {
-        mexPrintf("%d ", ((int8_t*)&in)[i]);
-    }
-}
-
 #endif
diff --git a/openair1/PHY/CODING/nrLDPC_defs.h b/openair1/PHY/CODING/nrLDPC_defs.h
index fe386ce6d756654e12bb0d5e253ae3e0b439c605..3db41a0e2976b664cd07ed92e894979e53837da0 100644
--- a/openair1/PHY/CODING/nrLDPC_defs.h
+++ b/openair1/PHY/CODING/nrLDPC_defs.h
@@ -66,7 +66,6 @@ typedef struct {
   uint32_t Zc;
   /// Number of "Filler" bits
   uint32_t F;
-  void *harq;
   /// Encoder BG
   uint8_t BG;
   /// Interleaver outputs
diff --git a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
index cc0f31f1ded26ac7bfc3146831a8c546d3f3211b..80d82c3f8c1bbc7f479e457bd9350aa97dda90b9 100644
--- a/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
+++ b/openair1/PHY/CODING/nrPolar_tools/nr_polar_decoding_tools.c
@@ -252,6 +252,7 @@ static inline void applyFtoleft(const t_nrPolar_params *pp, decoder_node_t *node
       simde__m128i minabs128 = simde_mm_min_epi16(absa128, absb128);
       *((simde__m128i *)alpha_l) = simde_mm_sign_epi16(minabs128, simde_mm_sign_epi16(a128, b128));
     } else if (avx2mod == 4) {
+      // this uses __m64, but only with SSE instructions, so we can disable MMX even with this piece of code
       simde__m64 a64 = *((simde__m64 *)alpha_v);
       simde__m64 b64 = ((simde__m64 *)alpha_v)[1];
       simde__m64 absa64 = simde_mm_abs_pi16(a64);
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 581338fa454f42b3bdadadddd32c25f30cacc5e2..f3c8d01579e16739f83794f7dd53d6061d42833f 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -128,7 +128,7 @@ void phy_init_nr_gNB(PHY_VARS_gNB *gNB)
   load_dftslib();
 
   crcTableInit();
-  init_scrambling_luts();
+  init_byte2m128i();
   init_pucch2_luts();
 
   nr_init_fde(); // Init array for frequency equalization of transform precoding of PUSCH
@@ -292,6 +292,9 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
     free_and_zero(pusch_vars->llr);
   } // ULSCH_id
   free(gNB->pusch_vars);
+
+  free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface);
+
 }
 
 //Adding nr_schedule_handler
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 5c4ace410618c8493456312b187108d7d837c11f..5a595af8abe74bd9bf9967635cd3fb0f28535c5c 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -515,7 +515,7 @@ void phy_init_nr_top(PHY_VARS_NR_UE *ue) {
   NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
   init_delay_table(frame_parms->ofdm_symbol_size, MAX_DELAY_COMP, NR_MAX_OFDM_SYMBOL_SIZE, frame_parms->delay_table);
   crcTableInit();
-  init_scrambling_luts();
+  init_byte2m128i();
   load_dftslib();
   init_context_synchro_nr(frame_parms);
   generate_ul_reference_signal_sequences(SHRT_MAX);
diff --git a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
index 7ee3be67018705ff9123aa8cb9bc11dec6be6c70..44eac0ff0c6337431aea0c2885863d6b53db9a94 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs_NB_IoT.h
@@ -756,17 +756,7 @@ typedef struct {
   /// num active cba group
   uint8_t                 num_active_cba_groups;
   /// allocated CBA RNTI for this ulsch
-  uint16_t                cba_rnti[4];//NUM_MAX_CBA_GROUP];
-  #ifdef LOCALIZATION
-  /// epoch timestamp in millisecond
-  int32_t                 reference_timestamp_ms;
-  /// aggregate physical states every n millisecond
-  int32_t                 aggregation_period_ms;
-  /// a set of lists used for localization
-  struct                  list loc_rss_list[10], loc_rssi_list[10], loc_subcarrier_rss_list[10], loc_timing_advance_list[10], loc_timing_update_list[10];
-  struct                  list tot_loc_rss_list, tot_loc_rssi_list, tot_loc_subcarrier_rss_list, tot_loc_timing_advance_list, tot_loc_timing_update_list;
-  #endif
-
+  uint16_t cba_rnti[4]; // NUM_MAX_CBA_GROUP];
 } NB_IoT_eNB_NULSCH_t;
 
 #define NPBCH_A 34
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 92350194ca6512e2227f377a419677bcf0288d69..e22054904568d2b303b2062d8b719ece627fadad 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -132,7 +132,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
       prach_ifftp         = eNB->prach_vars_br.prach_ifft[ce_level];
       rxsigF              = eNB->prach_vars_br.rxsigF[ce_level];
 
-      if (LOG_DEBUGFLAG(PRACH)) {
+      if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
         if (((frame_prach)&1023) < 20) LOG_D(PHY,
               "PRACH (eNB) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d, rootSequenceIndex %d, repetition number %d,numRepetitionsPrePreambleAttempt %d\n",
               br_flag,ce_level,frame_prach,subframe,
@@ -145,23 +145,26 @@ void rx_prach0(PHY_VARS_eNB *eNB,
       prach_ifftp       = eNB->prach_vars.prach_ifft[0];
       rxsigF            = eNB->prach_vars.rxsigF[0];
 
-      //if (LOG_DEBUGFLAG(PRACH)) {
-        if (((frame_prach)&1023) < 20) LOG_D(PHY,"PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n", subframe,
-              fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex,rootSequenceIndex);
-      //}
+      if (((frame_prach) & 1023) < 20)
+        LOG_D(PHY,
+              "PRACH (eNB) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d , rootSequenceIndex %d\n",
+              subframe,
+              fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,
+              prach_ConfigIndex,
+              rootSequenceIndex);
     }
   } else {
     if (br_flag == 1) {
       rxsigF            = ru->prach_rxsigF_br[ce_level];
 
-      if (LOG_DEBUGFLAG(PRACH)) {
+      if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
         if (((frame_prach)&1023) < 20) LOG_D(PHY,"PRACH (RU) : running rx_prach (br_flag %d, ce_level %d) for frame %d subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n",
               br_flag,ce_level,frame_prach,subframe,fp->prach_emtc_config_common.prach_ConfigInfo.prach_FreqOffset[ce_level],prach_ConfigIndex);
       }
     } else {
       rxsigF            = ru->prach_rxsigF[0];
 
-      if (LOG_DEBUGFLAG(PRACH)) {
+      if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
         if (((frame_prach)&1023) < 20) LOG_D(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n",
               subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex);
       }
@@ -178,7 +181,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
       // DJP - indexing below in subframe zero takes us off the beginning of the array???
       prach[aa] = (int16_t *)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset];
 
-      if (LOG_DUMPFLAG(PRACH)) {
+      if (LOG_DUMPFLAG(DEBUG_PRACH)) {
         int32_t en0=signal_energy((int32_t *)prach[aa],fp->samples_per_tti);
         dBEn0 = dB_fixed(en0);
         int8_t rach_dBm = dBEn0 - ru->rx_total_gain_dB;
@@ -281,7 +284,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
   if (((eNB!=NULL) && (ru->function != NGFI_RAU_IF4p5))||
       ((eNB==NULL) && (ru->function == NGFI_RRU_IF4p5))) { // compute the DFTs of the PRACH temporal resources
     // Do forward transform
-    if (LOG_DEBUGFLAG(PRACH)) {
+    if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
       LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d nb_rx:%d Ncp:%d\n",fp->N_RB_UL, nb_rx, Ncp);
     }
 
@@ -353,7 +356,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
 
     return;
   } else if (eNB!=NULL) {
-    if ( LOG_DEBUGFLAG(PRACH)) {
+    if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
       int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
 
       if ((en > 10)&&(br_flag==1)) LOG_I(PHY,"PRACH (br_flag %d,ce_level %d, n_ra_prb %d, k %d): Frame %d, Subframe %d => %d dB\n",br_flag,ce_level,n_ra_prb,k,frame_prach,subframe,en);
@@ -394,8 +397,8 @@ void rx_prach0(PHY_VARS_eNB *eNB,
   uint64_t avg_en=0;
 
   for (preamble_index=0 ; preamble_index<64 ; preamble_index++) {
-    if (LOG_DEBUGFLAG(PRACH)) {
-    //  int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
+    if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
+      //  int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
 
       if (dBEn0>30) LOG_I(PHY,"frame %d, subframe %d : Trying preamble %d (br_flag %d)\n",frame_prach,subframe,preamble_index,br_flag);
     }
@@ -479,7 +482,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
     }
 
     // Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex
-    if (LOG_DEBUGFLAG(PRACH)) {
+    if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
       //en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
 
       if (dBEn0>30) LOG_I(PHY,"frame %d, subframe %d : preamble index %d: offset %d, preamble shift %d (br_flag %d, en %d)\n",
@@ -502,8 +505,8 @@ void rx_prach0(PHY_VARS_eNB *eNB,
         memset(prach_ifft,0,((N_ZC==839) ? 2048 : 256)*sizeof(int32_t));
       }
       c16_t prachF[1024] __attribute__((aligned(32)))={0};
-      
-      if (LOG_DUMPFLAG(PRACH)) 
+
+      if (LOG_DUMPFLAG(DEBUG_PRACH))
         for (int z=0; z<nb_rx; z++) 
           if( prach[z] ) {
             char tmp[128];
@@ -543,7 +546,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
             prach_ifft[i] += (prach_ifft_tmp[i<<1]*prach_ifft_tmp[(i<<1)] + prach_ifft_tmp[1+(i<<1)]*prach_ifft_tmp[1+(i<<1)])>>9;
         }
 
-        if (LOG_DUMPFLAG(PRACH)) {
+        if (LOG_DUMPFLAG(DEBUG_PRACH)) {
           if (aa==0) LOG_M("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
 
           if (aa==1) LOG_M("prach_rxF_comp1.m","prach_rxF_comp1",prachF,1024,1,1);
@@ -555,7 +558,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
     if ((br_flag==0) ||
         (eNB->prach_vars_br.repetition_number[ce_level]==
          eNB->frame_parms.prach_emtc_config_common.prach_ConfigInfo.prach_numRepetitionPerPreambleAttempt[ce_level])) {
-      if (LOG_DEBUGFLAG(PRACH)) {
+      if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
         int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
 
         if (en>60) LOG_I(PHY,"frame %d, subframe %d: Checking for peak in time-domain (br_flag %d, en %d)\n",frame_prach,subframe,br_flag,en);
@@ -573,8 +576,8 @@ void rx_prach0(PHY_VARS_eNB *eNB,
           *max_preamble_delay   = ((i*fft_size)>>log2_ifft_size)*update_TA/update_TA2;
           *max_preamble         = preamble_index;
 
-          if (LOG_DEBUGFLAG(PRACH)) {
-        //    int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
+          if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
+            //    int en = dB_fixed(signal_energy((int32_t *)&rxsigF[0][0],840));
 
             if (dBEn0>30)
               LOG_D(PHY,"frame %d, subframe %d : max_preamble_energy %d, max_preamble_delay %d, max_preamble %d (br_flag %d,ce_level %d, levdB %d, lev %d)\n",
@@ -613,7 +616,7 @@ void rx_prach0(PHY_VARS_eNB *eNB,
         LOG_M("prach_ifft0_br.m","prach_t0_br",prach_ifft,1024,1,1);
       }
     }
-  } /* LOG_DUMPFLAG(PRACH) */
+  }
 
   if (eNB) stop_meas(&eNB->rx_prach);
   AssertFatal(exit_flag==0,"exiting\n");
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 6b499f14db7ba69d26590e965ab52cd24f4a43ee..e613efd6ca522f6c500f70d3abe06ebb13f6771d 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -42,25 +42,24 @@
 #include "PHY_INTERFACE/phy_interface.h"
 #include "transport_proto.h"
 
-static const int8_t wACK_RX[5][4] = {{-1, -1, -1, -1}, {-1, 1, -1, 1}, {-1, -1, 1, 1}, {-1, 1, 1, -1}, {1, 1, 1, 1}};
-
-void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch) {
-  int i,r;
+static const int wACK_RX[5][4] = {{-1, -1, -1, -1}, {-1, 1, -1, 1}, {-1, -1, 1, 1}, {-1, 1, 1, -1}, {1, 1, 1, 1}};
 
+void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch)
+{
   if (ulsch) {
-    for (i=0; i<8; i++) {
+    for (int i = 0; i < 8; i++) {
       if (ulsch->harq_processes[i]) {
         if (ulsch->harq_processes[i]->decodedBytes) {
           free16(ulsch->harq_processes[i]->decodedBytes,MAX_ULSCH_PAYLOAD_BYTES);
           ulsch->harq_processes[i]->decodedBytes = NULL;
         }
 
-        for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
+        for (int r = 0; r < MAX_NUM_ULSCH_SEGMENTS; r++) {
           free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 768);
           ulsch->harq_processes[i]->c[r] = NULL;
         }
 
-        for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++)
+        for (int r = 0; r < MAX_NUM_ULSCH_SEGMENTS; r++)
           if (ulsch->harq_processes[i]->d[r]) {
             free16(ulsch->harq_processes[i]->d[r],((3*8*6144)+12+96)*sizeof(short));
             ulsch->harq_processes[i]->d[r] = NULL;
@@ -411,32 +410,17 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
   LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
   LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[UE_id];
   uint8_t harq_pid;
-  unsigned short nb_rb;
-  unsigned int A;
-  uint8_t Q_m;
-  unsigned int i,i2,q,j,j2;
-  int iprime;
-  unsigned int ret=0;
-  //  uint8_t dummy_channel_output[(3*8*block_length)+12];
-  int r,Kr;
+  unsigned int ret = 0;
   const uint8_t *columnset;
-  unsigned int sumKr=0;
   unsigned int Qprime,L,G,Q_CQI,Q_RI,H,Hprime,Hpp,Cmux,Rmux_prime,O_RCC;
-  unsigned int Qprime_ACK,Qprime_RI,len_ACK=0,len_RI=0;
-  //  uint8_t q_ACK[MAX_ACK_PAYLOAD],q_RI[MAX_RI_PAYLOAD];
-  int metric,metric_new;
-  uint32_t x1, x2, s=0;
-  int16_t ys,c;
-  uint32_t wACK_idx;
+  unsigned int Qprime_ACK, Qprime_RI, len_ACK = 0, len_RI = 0;
   uint8_t dummy_w_cc[3*(MAX_CQI_BITS+8+32)];
   int16_t y[6*14*1200] __attribute__((aligned(32)));
   uint8_t ytag[14*1200];
   //  uint8_t ytag2[6*14*1200],*ytag2_ptr;
   int16_t cseq[6*14*1200] __attribute__((aligned(32)));
-  int off;
-  int frame = proc->frame_rx;
-  int subframe = proc->subframe_rx;
-  LTE_UL_eNB_HARQ_t *ulsch_harq;
+  const int frame = proc->frame_rx;
+  const int subframe = proc->subframe_rx;
 
   LOG_D(PHY,"ue_type %d\n",ulsch->ue_type);
 
@@ -446,15 +430,16 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
     harq_pid = subframe2harq_pid(frame_parms,proc->frame_rx,subframe);
 
   // x1 is set in lte_gold_generic
-  x2 = ((uint32_t)ulsch->rnti<<14) + ((uint32_t)subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
-  ulsch_harq = ulsch->harq_processes[harq_pid];
+  uint32_t x2 =
+      ((uint32_t)ulsch->rnti << 14) + ((uint32_t)subframe << 9) + frame_parms->Nid_cell; // this is c_init in 36.211 Sec 6.3.1
+  LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid];
   AssertFatal(harq_pid!=255,
               "FATAL ERROR: illegal harq_pid, returning\n");
   AssertFatal(ulsch_harq->Nsymb_pusch != 0,
               "FATAL ERROR: harq_pid %d, Nsymb 0!\n",harq_pid);
-  nb_rb = ulsch_harq->nb_rb;
-  A = ulsch_harq->TBS;
-  Q_m = ulsch_harq->Qm;
+  const int nb_rb = ulsch_harq->nb_rb;
+  const uint A = ulsch_harq->TBS;
+  const uint Q_m = ulsch_harq->Qm;
   G = nb_rb * (12 * Q_m) * ulsch_harq->Nsymb_pusch;
   LOG_D(PHY, "PUSCH nb_rb %d Q_m %d ulsch_harq->Nsymb_pusch %d\n",nb_rb, Q_m, ulsch_harq->Nsymb_pusch);  
   //#ifdef DEBUG_ULSCH_DECODING
@@ -517,15 +502,12 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
   //  CLEAR LLR's HERE for first packet in process
   //}
   //  printf("after segmentation c[%d] = %p\n",0,ulsch_harq->c[0]);
-  sumKr = 0;
-
-  for (r=0; r<ulsch_harq->C; r++) {
+  unsigned int sumKr = 0;
+  for (int r = 0; r < ulsch_harq->C; r++) {
     if (r<ulsch_harq->Cminus)
-      Kr = ulsch_harq->Kminus;
+      sumKr += ulsch_harq->Kminus;
     else
-      Kr = ulsch_harq->Kplus;
-
-    sumKr += Kr;
+      sumKr += ulsch_harq->Kplus;
   }
 
   AssertFatal(sumKr>0,
@@ -616,15 +598,13 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
   Cmux       = ulsch_harq->Nsymb_pusch;
   Rmux_prime = Hpp/Cmux;
   // Clear "tag" interleaving matrix to allow for CQI/DATA identification
-  memset(ytag,0,Cmux*Rmux_prime);
-  i=0;
+  memset(ytag, 0, Cmux * Rmux_prime);
   memset(y,LTE_NULL,Q_m*Hpp);
   // read in buffer and unscramble llrs for everything but placeholder bits
   // llrs stored per symbol correspond to columns of interleaving matrix
-  s = lte_gold_unscram(&x1, &x2, 1);
-  i2=0;
-
-  for (i=0; i<((Hpp*Q_m)>>5); i++) {
+  uint32_t x1 = 0;
+  uint32_t s = lte_gold_unscram(&x1, &x2, 1);
+  for (int i = 0, i2 = 0; i < ((Hpp * Q_m) >> 5); i++) {
     /*
     for (j=0; j<32; j++) {
       cseq[i2++] = (int16_t)((((s>>j)&1)<<1)-1);
@@ -642,18 +622,18 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
   else
     columnset = cs_ri_extended;
 
-  j=0;
+  int j = 0;
 
-  for (i=0; i<Qprime_RI; i++) {
-    r = Rmux_prime - 1 - (i>>2);
+  for (int i = 0; i < Qprime_RI; i++) {
+    int r = Rmux_prime - 1 - (i >> 2);
     /*
     for (q=0;q<Q_m;q++)
       ytag2[q+(Q_m*((r*Cmux) + columnset[j]))]  = q_RI[(q+(Q_m*i))%len_RI];
     */
-    off =((Rmux_prime*Q_m*columnset[j])+(r*Q_m));
+    int off = ((Rmux_prime * Q_m * columnset[j]) + (r * Q_m));
     cseq[off+1] = cseq[off];  // PUSCH_y
 
-    for (q=2; q<Q_m; q++)
+    for (int q = 2; q < Q_m; q++)
       cseq[off+q] = -1;    // PUSCH_x
 
     j=(j+3)&3;
@@ -669,18 +649,18 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
 
   j=0;
 
-  for (i=0; i<Qprime_ACK; i++) {
-    r = Rmux_prime - 1 - (i>>2);
-    off =((Rmux_prime*Q_m*columnset[j])+(r*Q_m));
+  for (int i = 0; i < Qprime_ACK; i++) {
+    int r = Rmux_prime - 1 - (i >> 2);
+    int off = ((Rmux_prime * Q_m * columnset[j]) + (r * Q_m));
 
     if (ulsch_harq->O_ACK == 1) {
       if (ulsch->bundling==0)
         cseq[off+1] = cseq[off];  // PUSCH_y
 
-      for (q=2; q<Q_m; q++)
+      for (int q = 2; q < Q_m; q++)
         cseq[off+q] = -1;    // PUSCH_x
     } else if (ulsch_harq->O_ACK == 2) {
-      for (q=2; q<Q_m; q++)
+      for (int q = 2; q < Q_m; q++)
         cseq[off+q] = -1;    // PUSCH_x
     }
 
@@ -690,79 +670,52 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
     j=(j+3)&3;
   }
 
-  i=0;
+  int16_t *in = ulsch_llr;
+  int16_t *cseqp = cseq;
 
   switch (Q_m) {
     case 2:
-      for (j=0; j<Cmux; j++) {
-        i2=j<<1;
-
-        for (r=0; r<Rmux_prime; r++) {
-          c = cseq[i];
-          //  printf("ulsch %d: %d * ",i,c);
-          y[i2++] = c*ulsch_llr[i++];
-          //  printf("%d\n",ulsch_llr[i-1]);
-          c = cseq[i];
-          //  printf("ulsch %d: %d * ",i,c);
-          y[i2] = c*ulsch_llr[i++];
-          //  printf("%d\n",ulsch_llr[i-1]);
-          i2=(i2+(Cmux<<1)-1);
+      for (j = 0; j < Cmux; j++) {
+        int i2 = j << 1;
+        for (int r = 0; r < Rmux_prime; r++) {
+          y[i2] = *cseqp++ * *in++;
+          y[i2 + 1] = *cseqp++ * *in++;
+          i2 += Cmux << 1;
         }
       }
-
       break;
 
     case 4:
-      for (j=0; j<Cmux; j++) {
-        i2=j<<2;
-
-        for (r=0; r<Rmux_prime; r++) {
-          /*
-                c = cseq[i];
-                y[i2++] = c*ulsch_llr[i++];
-                c = cseq[i];
-                y[i2++] = c*ulsch_llr[i++];
-                c = cseq[i];
-                y[i2++] = c*ulsch_llr[i++];
-                c = cseq[i];
-                y[i2] = c*ulsch_llr[i++];
-                i2=(i2+(Cmux<<2)-3);
-          */
-          // slightly more optimized version (equivalent to above) for 16QAM to improve computational performance
-          *(simde__m64 *)&y[i2] = simde_mm_sign_pi16(*(simde__m64 *)&ulsch_llr[i],*(simde__m64 *)&cseq[i]);
-          i+=4;
-          i2+=(Cmux<<2);
+      for (j = 0; j < Cmux; j++) {
+        int i2 = j << 2;
+        for (int r = 0; r < Rmux_prime; r++) {
+          y[i2] = *cseqp++ * *in++;
+          y[i2 + 1] = *cseqp++ * *in++;
+          y[i2 + 2] = *cseqp++ * *in++;
+          y[i2 + 3] = *cseqp++ * *in++;
+          i2 += Cmux << 2;
         }
       }
-
       break;
 
     case 6:
-      for (j=0; j<Cmux; j++) {
-        i2=j*6;
-
-        for (r=0; r<Rmux_prime; r++) {
-          c = cseq[i];
-          y[i2++] = c*ulsch_llr[i++];
-          c = cseq[i];
-          y[i2++] = c*ulsch_llr[i++];
-          c = cseq[i];
-          y[i2++] = c*ulsch_llr[i++];
-          c = cseq[i];
-          y[i2++] = c*ulsch_llr[i++];
-          c = cseq[i];
-          y[i2++] = c*ulsch_llr[i++];
-          c = cseq[i];
-          y[i2] = c*ulsch_llr[i++];
-          i2=(i2+(Cmux*6)-5);
+      for (j = 0; j < Cmux; j++) {
+        int i2 = j * 6;
+        for (int r = 0; r < Rmux_prime; r++) {
+          y[i2] = *cseqp++ * *in++;
+          y[i2 + 1] = *cseqp++ * *in++;
+          y[i2 + 2] = *cseqp++ * *in++;
+          y[i2 + 3] = *cseqp++ * *in++;
+          y[i2 + 4] = *cseqp++ * *in++;
+          y[i2 + 5] = *cseqp++ * *in++;
+          i2 += Cmux * 6;
         }
       }
-
       break;
   }
 
-  if (i!=(H+Q_RI))
-    LOG_D(PHY,"ulsch_decoding.c: Error in input buffer length (j %d, H+Q_RI %d)\n",i,H+Q_RI);
+  if ((in - ulsch_llr) != (H + Q_RI))
+    LOG_D(PHY, "ulsch_decoding.c: Error in input buffer length (j %ld, H+Q_RI %d)\n", in - ulsch_llr, H + Q_RI);
 
   // HARQ-ACK Bits (LLRs are nulled in overwritten bits after copying HARQ-ACK LLR)
 
@@ -810,17 +763,17 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
     return(-1);
   }
 
-  for (i=0; i<len_ACK; i++)
+  for (int i = 0; i < len_ACK; i++)
     ulsch_harq->q_ACK[i] = 0;
 
-  for (i=0; i<Qprime_ACK; i++) {
-    r = Rmux_prime -1 - (i>>2);
+  for (int i = 0; i < Qprime_ACK; i++) {
+    int r = Rmux_prime - 1 - (i >> 2);
 
-    for (q=0; q<Q_m; q++) {
-      if (y[q+(Q_m*((r*Cmux) + columnset[j]))]!=0)
-        ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK] += y[q+(Q_m*((r*Cmux) + columnset[j]))];
+    for (int q = 0; q < Q_m; q++) {
+      if (y[q + Q_m * (r * Cmux + columnset[j])] != 0)
+        ulsch_harq->q_ACK[(q + (Q_m * i)) % len_ACK] += y[q + Q_m * (r * Cmux + columnset[j])];
 
-      y[q+(Q_m*((r*Cmux) + columnset[j]))]=0;  // NULL LLRs in ACK positions
+      y[q + Q_m * (r * Cmux + columnset[j])] = 0; // NULL LLRs in ACK positions
     }
 
     j=(j+3)&3;
@@ -851,7 +804,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
     return(-1);
   }
 
-  for (i=0; i<len_RI; i++)
+  for (int i = 0; i < len_RI; i++)
     ulsch_harq->q_RI[i] = 0;
 
   if (frame_parms->Ncp == 0)
@@ -861,10 +814,10 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
 
   j=0;
 
-  for (i=0; i<Qprime_RI; i++) {
-    r = Rmux_prime -1 - (i>>2);
+  for (int i = 0; i < Qprime_RI; i++) {
+    int r = Rmux_prime - 1 - (i >> 2);
 
-    for (q=0; q<Q_m; q++)
+    for (int q = 0; q < Q_m; q++)
       ulsch_harq->q_RI[(q+(Q_m*i))%len_RI] += y[q+(Q_m*((r*Cmux) + columnset[j]))];
 
     ytag[(r*Cmux) + columnset[j]] = LTE_NULL;
@@ -874,19 +827,19 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
   //  printf("after RI2 c[%d] = %p\n",0,ulsch_harq->c[0]);
   // CQI and Data bits
   j=0;
-  j2=0;
+  int j2 = 0;
 
   //  r=0;
   if (Q_RI>0) {
-    for (i=0; i<(Q_CQI/Q_m); i++) {
+    for (int i = 0; i < (Q_CQI / Q_m); i++) {
       while (ytag[j]==LTE_NULL) {
         j++;
         j2+=Q_m;
       }
 
-      for (q=0; q<Q_m; q++) {
+      for (int q = 0; q < Q_m; q++) {
         //      ys = y[q+(Q_m*((r*Cmux)+j))];
-        ys = y[q+j2];
+        int ys = y[q + j2];
 
         if (ys>127)
           ulsch_harq->q[q+(Q_m*i)] = 127;
@@ -901,7 +854,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
 
     switch (Q_m) {
       case 2:
-        for (iprime=0; iprime<G;) {
+        for (int iprime = 0; iprime < G;) {
           while (ytag[j]==LTE_NULL) {
             j++;
             j2+=2;
@@ -914,7 +867,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
         break;
 
       case 4:
-        for (iprime=0; iprime<G;) {
+        for (int iprime = 0; iprime < G;) {
           while (ytag[j]==LTE_NULL) {
             j++;
             j2+=4;
@@ -929,7 +882,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
         break;
 
       case 6:
-        for (iprime=0; iprime<G;) {
+        for (int iprime = 0; iprime < G;) {
           while (ytag[j]==LTE_NULL) {
             j++;
             j2+=6;
@@ -947,9 +900,9 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
     }
   } // Q_RI>0
   else {
-    for (i=0; i<(Q_CQI/Q_m); i++) {
-      for (q=0; q<Q_m; q++) {
-        ys = y[q+j2];
+    for (int i = 0; i < (Q_CQI / Q_m); i++) {
+      for (int q = 0; q < Q_m; q++) {
+        int ys = y[q + j2];
 
         if (ys>127)
           ulsch_harq->q[q+(Q_m*i)] = 127;
@@ -961,88 +914,74 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
 
       j2+=Q_m;
     }
-
-    /* To be improved according to alignment of j2
-    for (iprime=0; iprime<G;iprime+=16,j2+=16)
-      *((simde__m256i *)&ulsch_harq->e[iprime]) = *((simde__m256i *)&y[j2]);
-    */
-    int16_t *yp,*ep;
-
-    for (iprime=0,yp=&y[j2],ep=&ulsch_harq->eUL[0];
-         iprime<G;
-         iprime+=8,j2+=8,ep+=8,yp+=8) {
-      ep[0] = yp[0];
-      ep[1] = yp[1];
-      ep[2] = yp[2];
-      ep[3] = yp[3];
-      ep[4] = yp[4];
-      ep[5] = yp[5];
-      ep[6] = yp[6];
-      ep[7] = yp[7];
-    }
+    int16_t *yp = &y[j2], *ep = ulsch_harq->eUL;
+    memcpy(ep, yp, G * sizeof(*yp));
   }
 
   stop_meas(&eNB->ulsch_demultiplexing_stats);
   //  printf("after ACKNAK2 c[%d] = %p (iprime %d, G %d)\n",0,ulsch_harq->c[0],iprime,G);
   // Do CQI/RI/HARQ-ACK Decoding first and pass to MAC
   // HARQ-ACK
-  wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
+  const uint32_t wACK_idx = ulsch->bundling == 0 ? 4 : (Nbundled - 1) & 3;
+  const int *wACK = wACK_RX[wACK_idx];
+  uint8_t *o_ACK = ulsch_harq->o_ACK;
+  int16_t *q_ACK = ulsch_harq->q_ACK;
 
   if (ulsch_harq->O_ACK == 1) {
-    ulsch_harq->q_ACK[0] *= wACK_RX[wACK_idx][0];
-    ulsch_harq->q_ACK[0] += (ulsch->bundling==0) ? ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] : ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][1];
+    q_ACK[0] *= wACK[0];
+    q_ACK[0] += (ulsch->bundling == 0) ? q_ACK[1] * wACK[0] : q_ACK[1] * wACK[1];
 
-    if (ulsch_harq->q_ACK[0] < 0)
-      ulsch_harq->o_ACK[0] = 0;
+    if (q_ACK[0] < 0)
+      o_ACK[0] = 0;
     else
-      ulsch_harq->o_ACK[0] = 1;
+      o_ACK[0] = 1;
   }
 
   if (ulsch_harq->O_ACK == 2) {
     switch (Q_m) {
       case 2:
-        ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[3]*wACK_RX[wACK_idx][1];
-        ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[4]*wACK_RX[wACK_idx][1];
-        ulsch_harq->q_ACK[2] = ulsch_harq->q_ACK[2]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[5]*wACK_RX[wACK_idx][1];
+        q_ACK[0] = q_ACK[0] * wACK[0] + q_ACK[3] * wACK[1];
+        q_ACK[1] = q_ACK[1] * wACK[0] + q_ACK[4] * wACK[1];
+        q_ACK[2] = q_ACK[2] * wACK[0] + q_ACK[5] * wACK[1];
         break;
 
       case 4:
-        ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[5]*wACK_RX[wACK_idx][1];
-        ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[8]*wACK_RX[wACK_idx][1];
-        ulsch_harq->q_ACK[2] = ulsch_harq->q_ACK[4]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[9]*wACK_RX[wACK_idx][1];
+        q_ACK[0] = q_ACK[0] * wACK[0] + q_ACK[5] * wACK[1];
+        q_ACK[1] = q_ACK[1] * wACK[0] + q_ACK[8] * wACK[1];
+        q_ACK[2] = q_ACK[4] * wACK[0] + q_ACK[9] * wACK[1];
         break;
 
       case 6:
-        ulsch_harq->q_ACK[0] =  ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[7]*wACK_RX[wACK_idx][1];
-        ulsch_harq->q_ACK[1] =  ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[12]*wACK_RX[wACK_idx][1];
-        ulsch_harq->q_ACK[2] =  ulsch_harq->q_ACK[6]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[13]*wACK_RX[wACK_idx][1];
+        q_ACK[0] = q_ACK[0] * wACK[0] + q_ACK[7] * wACK[1];
+        q_ACK[1] = q_ACK[1] * wACK[0] + q_ACK[12] * wACK[1];
+        q_ACK[2] = q_ACK[6] * wACK[0] + q_ACK[13] * wACK[1];
         break;
     }
 
-    ulsch_harq->o_ACK[0] = 1;
-    ulsch_harq->o_ACK[1] = 1;
-    metric     = ulsch_harq->q_ACK[0]+ulsch_harq->q_ACK[1]-ulsch_harq->q_ACK[2];
-    metric_new = -ulsch_harq->q_ACK[0]+ulsch_harq->q_ACK[1]+ulsch_harq->q_ACK[2];
+    o_ACK[0] = 1;
+    o_ACK[1] = 1;
+    int metric = q_ACK[0] + q_ACK[1] - q_ACK[2];
+    int metric_new = -q_ACK[0] + q_ACK[1] + q_ACK[2];
 
     if (metric_new > metric) {
-      ulsch_harq->o_ACK[0]=0;
-      ulsch_harq->o_ACK[1]=1;
+      o_ACK[0] = 0;
+      o_ACK[1] = 1;
       metric = metric_new;
     }
 
-    metric_new = ulsch_harq->q_ACK[0]-ulsch_harq->q_ACK[1]+ulsch_harq->q_ACK[2];
+    metric_new = q_ACK[0] - q_ACK[1] + q_ACK[2];
 
     if (metric_new > metric) {
-      ulsch_harq->o_ACK[0] = 1;
-      ulsch_harq->o_ACK[1] = 0;
+      o_ACK[0] = 1;
+      o_ACK[1] = 0;
       metric = metric_new;
     }
 
-    metric_new = -ulsch_harq->q_ACK[0]-ulsch_harq->q_ACK[1]-ulsch_harq->q_ACK[2];
+    metric_new = -q_ACK[0] - q_ACK[1] - q_ACK[2];
 
     if (metric_new > metric) {
-      ulsch_harq->o_ACK[0] = 0;
-      ulsch_harq->o_ACK[1] = 0;
+      o_ACK[0] = 0;
+      o_ACK[1] = 0;
       metric = metric_new;
     }
   }
@@ -1100,32 +1039,40 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *eNB,
 void dump_ulsch_stats(FILE *fd,PHY_VARS_eNB *eNB,int frame) {
 
   char output[16384];
-  int stroff=0;
-  for (int i=0;i<NUMBER_OF_ULSCH_MAX;i++)
-    if (eNB->ulsch_stats[i].rnti>0 && eNB->ulsch_stats[i].round_trials[0]>100) { 
-      for (int aa=0;aa<eNB->frame_parms.nb_antennas_rx;aa++) 
-        stroff+=sprintf(output+stroff,"ULSCH RNTI %x: ulsch_power[%d] %d, ulsch_noise_power[%d] %d\n", 
-              eNB->ulsch_stats[i].rnti, aa,eNB->ulsch_stats[i].ulsch_power[aa],aa,eNB->ulsch_stats[i].ulsch_noise_power[aa]);
-      AssertFatal(stroff<(STATSTRLEN-1000),"Increase STATSTRLEN\n");
-      stroff+=sprintf(output+stroff,"ULSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d\n",
-            eNB->ulsch_stats[i].rnti,
-            eNB->ulsch_stats[i].round_trials[0],
-            (double)eNB->ulsch_stats[i].round_trials[1]/eNB->ulsch_stats[i].round_trials[0],
-            eNB->ulsch_stats[i].round_trials[1],
-            (double)eNB->ulsch_stats[i].round_trials[2]/eNB->ulsch_stats[i].round_trials[0],
-            eNB->ulsch_stats[i].round_trials[2],
-           (double)eNB->ulsch_stats[i].round_trials[3]/eNB->ulsch_stats[i].round_trials[0],
-            eNB->ulsch_stats[i].round_trials[3]);
-      stroff+=sprintf(output+stroff,"ULSCH RNTI %x:  current_Qm %d, current_G %d, current_TBS %d, current_rate %f,current_RI %d, timing_offset %d, total_bytes RX/SCHED %d/%d\n",
-            eNB->ulsch_stats[i].rnti,
-            eNB->ulsch_stats[i].current_Qm,
-	    eNB->ulsch_stats[i].current_G,
-	    eNB->ulsch_stats[i].current_TBS,
-	    (double)eNB->ulsch_stats[i].current_G/eNB->ulsch_stats[i].current_TBS,
-            eNB->ulsch_stats[i].current_RI,
-	    eNB->ulsch_stats[i].timing_offset,
-            eNB->ulsch_stats[i].total_bytes_rx,
-            eNB->ulsch_stats[i].total_bytes_tx);
+  char *str = output;
+  for (eNB_SCH_STATS_t *st = eNB->ulsch_stats; st < eNB->ulsch_stats + sizeofArray(eNB->ulsch_stats); st++)
+    if (st->rnti > 0 && st->round_trials[0] > 100) {
+      for (int aa = 0; aa < eNB->frame_parms.nb_antennas_rx; aa++)
+        str += sprintf(str,
+                       "ULSCH RNTI %x: ulsch_power[%d] %d, ulsch_noise_power[%d] %d\n",
+                       st->rnti,
+                       aa,
+                       st->ulsch_power[aa],
+                       aa,
+                       st->ulsch_noise_power[aa]);
+      AssertFatal((str - output) < (STATSTRLEN - 1000), "Increase STATSTRLEN\n");
+      str += sprintf(str,
+                     "ULSCH RNTI %x: round_trials %d(%1.1e):%d(%1.1e):%d(%1.1e):%d\n",
+                     st->rnti,
+                     st->round_trials[0],
+                     (double)st->round_trials[1] / st->round_trials[0],
+                     st->round_trials[1],
+                     (double)st->round_trials[2] / st->round_trials[0],
+                     st->round_trials[2],
+                     (double)st->round_trials[3] / st->round_trials[0],
+                     st->round_trials[3]);
+      str += sprintf(str,
+                     "ULSCH RNTI %x:  current_Qm %d, current_G %d, current_TBS %d, current_rate %f,current_RI %d, timing_offset "
+                     "%d, total_bytes RX/SCHED %d/%d\n",
+                     st->rnti,
+                     st->current_Qm,
+                     st->current_G,
+                     st->current_TBS,
+                     (double)st->current_G / st->current_TBS,
+                     st->current_RI,
+                     st->timing_offset,
+                     st->total_bytes_rx,
+                     st->total_bytes_tx);
     }
   fprintf(fd,"%s",output);
 }
diff --git a/openair1/PHY/NR_REFSIG/nr_refsig.h b/openair1/PHY/NR_REFSIG/nr_refsig.h
index 7996db109ab83e6448de40972c7be650fca678f2..c79d0b70aa4895ab5e5cbdd67d5caf3bfa7a53f3 100644
--- a/openair1/PHY/NR_REFSIG/nr_refsig.h
+++ b/openair1/PHY/NR_REFSIG/nr_refsig.h
@@ -44,12 +44,10 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
                         const nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *csi_params,
                         const int slot,
                         const csi_mapping_parms_t *phy_csi_parms);
+void  init_byte2m128i(void);
 
-void init_scrambling_luts(void);
 void nr_generate_modulation_table(void);
 
-extern simde__m64 byte2m64_re[256];
-extern simde__m64 byte2m64_im[256];
 extern simde__m128i byte2m128i[256];
 
 int nr_pusch_lowpaprtype1_dmrs_rx(PHY_VARS_gNB *gNB,
diff --git a/openair1/PHY/NR_REFSIG/scrambling_luts.c b/openair1/PHY/NR_REFSIG/scrambling_luts.c
index 39130b5696eb1c5972f4a297da0370b0fc2440ef..f6b1207838cc028570cbb34d7d8ddc8d87b6c2d9 100644
--- a/openair1/PHY/NR_REFSIG/scrambling_luts.c
+++ b/openair1/PHY/NR_REFSIG/scrambling_luts.c
@@ -22,40 +22,13 @@
 /* Lookup tables for 3GPP scrambling/unscrambling */
 
 /* Author R. Knopp / EURECOM / OpenAirInterface.org */
-#ifndef __SCRAMBLING_LUTS__C__
-#define __SCRAMBLING_LUTS__C__
 
 #include "PHY/impl_defs_nr.h"
 #include "PHY/sse_intrin.h"
 #include <common/utils/LOG/log.h>
 
-simde__m64 byte2m64_re[256];
-simde__m64 byte2m64_im[256];
-
 simde__m128i byte2m128i[256];
 
-void init_byte2m64(void) {
-
-  for (int s=0;s<256;s++) {
-    byte2m64_re[s] = simde_mm_insert_pi16(byte2m64_re[s],(1-2*(s&1)),0);
-    byte2m64_im[s] = simde_mm_insert_pi16(byte2m64_im[s],(1-2*((s>>1)&1)),0);
-    byte2m64_re[s] = simde_mm_insert_pi16(byte2m64_re[s],(1-2*((s>>2)&1)),1);
-    byte2m64_im[s] = simde_mm_insert_pi16(byte2m64_im[s],(1-2*((s>>3)&1)),1);
-    byte2m64_re[s] = simde_mm_insert_pi16(byte2m64_re[s],(1-2*((s>>4)&1)),2);
-    byte2m64_im[s] = simde_mm_insert_pi16(byte2m64_im[s],(1-2*((s>>5)&1)),2);
-    byte2m64_re[s] = simde_mm_insert_pi16(byte2m64_re[s],(1-2*((s>>6)&1)),3);
-    byte2m64_im[s] = simde_mm_insert_pi16(byte2m64_im[s],(1-2*((s>>7)&1)),3);
-     LOG_T(PHY,"init_scrambling_luts: s %x (%d) ((%d,%d),(%d,%d),(%d,%d),(%d,%d))\n",
-	    ((uint16_t*)&s)[0],
-	    (1-2*(s&1)),
-	    ((int16_t*)&byte2m64_re[s])[0],((int16_t*)&byte2m64_im[s])[0],    
-	    ((int16_t*)&byte2m64_re[s])[1],((int16_t*)&byte2m64_im[s])[1],    
-	    ((int16_t*)&byte2m64_re[s])[2],((int16_t*)&byte2m64_im[s])[2],    
-	    ((int16_t*)&byte2m64_re[s])[3],((int16_t*)&byte2m64_im[s])[3]);  
-
-  }
-}
-
 void init_byte2m128i(void) {
 
   for (int s=0;s<256;s++) {
@@ -70,10 +43,3 @@ void init_byte2m128i(void) {
   }
 }
 
-void init_scrambling_luts(void) {
-
-  init_byte2m64();
-  init_byte2m128i();
-}
-
-#endif
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 120277479847b881d49d069b5dc223211bf6a15d..2484c0e80077bdfd97d7d30eb1d7a4aef62b4fb2 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -93,7 +93,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
     harq->unav_res = ptrsSymbPerSlot * n_ptrs;
 
     /// CRC, coding, interleaving and rate matching
-    AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
+    AssertFatal(harq->pdu != NULL, "%4d.%2d no HARQ PDU for PDSCH generation\n", msgTx->frame, msgTx->slot);
 
     /* output and its parts for each dlsch should be aligned on 64 bytes
      * => size_output is a sum of parts sizes rounded up to a multiple of 64
@@ -533,7 +533,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, int frame, int slot)
         int rb = 0;
         while(rb < rel15->rbSize) {
           //get pmi info
-          const int pmi = (pb->prg_size > 0) ? (pb->prgs_list[(int)rb / pb->prg_size].pm_idx) : 0;
+          const int pmi = (pb->num_prgs > 0 && pb->prg_size > 0) ? (pb->prgs_list[(int)rb / pb->prg_size].pm_idx) : 0;
           const int pmi2 = (rb < (rel15->rbSize - 1) && pb->prg_size > 0) ? (pb->prgs_list[(int)(rb+1)/pb->prg_size].pm_idx) : -1;
 
           // If pmi of next RB and pmi of current RB are the same, we do 2 RB in a row
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 53e0c17065bf1beeff1b7533af9596e92769f9cb..15f48825f527630515dda05eca9ef9a09393b27e 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -35,9 +35,8 @@
 
 #include "PHY/defs_gNB.h"
 
-void nr_fill_dlsch(processingData_L1tx_t *msgTx,
-                   nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
-                   unsigned char *sdu); 
+void nr_fill_dlsch_dl_tti_req(processingData_L1tx_t *msgTx, nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu);
+void nr_fill_dlsch_tx_req(processingData_L1tx_t *msgTx, int idx, uint8_t *sdu);
 
 void nr_generate_pdsch(processingData_L1tx_t *msgTx,
                        int frame,
@@ -57,8 +56,6 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
                       time_stats_t *dlsch_interleaving_stats,
                       time_stats_t *dlsch_segmentation_stats);
 
-void nr_emulate_dlsch_payload(uint8_t* payload, uint16_t size);
-
 void dump_pdsch_stats(FILE *fd,PHY_VARS_gNB *gNB);
 
 #endif
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 33ecfb37374ca083b2b891438bbbed902721f437..76955fd259552d000288de08b9df16a058a185a6 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -66,7 +66,6 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch, uint16_t N_RB, const NR_DL_FRAME_PARM
     harq->c[r] = NULL;
   }
   free(harq->c);
-  free(harq->pdu);
 }
 
 NR_gNB_DLSCH_t new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, uint16_t N_RB)
@@ -87,10 +86,6 @@ NR_gNB_DLSCH_t new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, uint16_t N_RB)
   bzero(harq, sizeof(NR_DL_gNB_HARQ_t));
   harq->b = malloc16(dlsch_bytes);
   AssertFatal(harq->b, "cannot allocate memory for harq->b\n");
-  harq->pdu = malloc16(dlsch_bytes);
-  AssertFatal(harq->pdu, "cannot allocate memory for harq->pdu\n");
-  bzero(harq->pdu, dlsch_bytes);
-  nr_emulate_dlsch_payload(harq->pdu, (dlsch_bytes) >> 3);
   bzero(harq->b, dlsch_bytes);
 
   harq->c = (uint8_t **)malloc16(a_segments*sizeof(uint8_t *));
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c
index c868334a3c9800796a6625b7302d779987eb88fd..0a3717ec70f546b5f159968cf6aca5692a87ef21 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_tools.c
@@ -36,21 +36,29 @@
 
 extern void set_taus_seed(unsigned int seed_type);
 
-
-/// Payload emulation
-void nr_emulate_dlsch_payload(uint8_t* pdu, uint16_t size) {
-  set_taus_seed(0);
-  for (int i=0; i<size; i++)
-    *(pdu+i) = (uint8_t)rand();
-}
-
-void nr_fill_dlsch(processingData_L1tx_t *msgTx, nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu, uint8_t *sdu)
+void nr_fill_dlsch_dl_tti_req(processingData_L1tx_t *msgTx, nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu)
 {
   NR_gNB_DLSCH_t *dlsch = &msgTx->dlsch[msgTx->num_pdsch_slot][0];
   NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process;
   /// DLSCH struct
   memcpy((void*)&harq->pdsch_pdu, (void*)pdsch_pdu, sizeof(nfapi_nr_dl_tti_pdsch_pdu));
+  AssertFatal(msgTx->num_pdsch_slot == pdsch_pdu->pdsch_pdu_rel15.pduIndex,
+              "PDSCH PDU index %d does not match msgTx index %d\n",
+              pdsch_pdu->pdsch_pdu_rel15.pduIndex,
+              msgTx->num_pdsch_slot);
   msgTx->num_pdsch_slot++;
+  harq->pdu = NULL;
+}
+
+void nr_fill_dlsch_tx_req(processingData_L1tx_t *msgTx, int idx, uint8_t *sdu)
+{
   AssertFatal(sdu != NULL, "sdu is null\n");
+
+  /* not sure if FAPI could transmit DL_TTI_req and TX_req in different orders.
+   * for the moment, assume they are in the same order (and check!) */
+  NR_gNB_DLSCH_t *dlsch = &msgTx->dlsch[idx][0];
+  NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process;
+  nfapi_nr_dl_tti_pdsch_pdu *pdsch = &harq->pdsch_pdu;
+  AssertFatal(pdsch->pdsch_pdu_rel15.pduIndex == idx, "PDSCH PDU index %d does not match %d\n", pdsch->pdsch_pdu_rel15.pduIndex, idx);
   harq->pdu = sdu;
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index 3f41712f2cf734aac57bb718c69c18714177e53e..9e3df3f2234e8553cd0c5a82469485db3d3d34cc 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -383,11 +383,10 @@ void rx_nr_prach_ru(RU_t *ru, int prachFormat, int numRA, int prachStartSymbol,
   const dft_size_idx_t dftsize = get_dft(dftlen);
 
   // Do forward transform
-  if (LOG_DEBUGFLAG(PRACH)) {
+  if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
     LOG_D(PHY, "rx_prach: Doing PRACH FFT for nb_rx:%d Ncp:%d dftlen:%d\n", ru->nb_rx, Ncp, dftlen);
   }
 
-
   // Note: Assumes PUSCH SCS @ 30 kHz, take values for formats 0-2 and adjust for others below
   int kbar = 1;
   int K    = 24;
@@ -497,7 +496,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
   LOG_D(PHY,"L1 PRACH RX: rooSequenceIndex %d, numRootSeqeuences %d, NCS %d, N_ZC %d, format %d \n",rootSequenceIndex,numrootSequenceIndex,NCS,N_ZC,prach_fmt);
 
   prach_ifft = gNB->prach_vars.prach_ifft;
-  if (LOG_DEBUGFLAG(PRACH)){
+  if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
     if ((frame&1023) < 20) LOG_D(PHY,"PRACH (gNB) : running rx_prach for slot %d, msg1_frequencystart %d, rootSequenceIndex %d\n", slot, msg1_frequencystart, rootSequenceIndex);
   }
 
@@ -520,8 +519,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
   *max_preamble = 0;
   int16_t prachF[2 * 1024];
   for (preamble_index=0 ; preamble_index<64 ; preamble_index++) {
-
-    if (LOG_DEBUGFLAG(PRACH)){
+    if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
       int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],(N_ZC==839) ? 840: 140));
       if (en>60) LOG_D(PHY,"frame %d, slot %d : Trying preamble %d \n",frame,slot,preamble_index);
     }
@@ -599,7 +597,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
     }
 
     // Compute DFT of RX signal (conjugate input, results in conjugate output) for each new rootSequenceIndex
-    if (LOG_DEBUGFLAG(PRACH)) {
+    if (LOG_DEBUGFLAG(DEBUG_PRACH)) {
       int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840));
       if (en>60)
         LOG_D(PHY,
@@ -626,11 +624,11 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
 
       memset(prach_ifft,0,((N_ZC==839) ? 2048 : 256)*sizeof(int32_t));
       memset(prachF, 0, sizeof(int16_t) * 2 * 1024);
-      if (LOG_DUMPFLAG(PRACH)) {
+      if (LOG_DUMPFLAG(DEBUG_PRACH)) {
         LOG_M("prach_rxF0.m","prach_rxF0",rxsigF[0],N_ZC,1,1);
         LOG_M("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1);
       }
-   
+
       for (int aa = 0; aa < nb_rx; aa++) {
 	// Do componentwise product with Xu* on each antenna 
 
@@ -653,7 +651,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
             prach_ifft[i] += (int32_t)prach_ifft_tmp[i<<1]*(int32_t)prach_ifft_tmp[(i<<1)] + (int32_t)prach_ifft_tmp[1+(i<<1)]*(int32_t)prach_ifft_tmp[1+(i<<1)];
         }
 
-        if (LOG_DUMPFLAG(PRACH)) {
+        if (LOG_DUMPFLAG(DEBUG_PRACH)) {
           if (aa == 0)
             LOG_M("prach_rxF_comp0.m","prach_rxF_comp0", prachF, 1024, 1, 1);
           if (aa == 1)
@@ -717,8 +715,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
   }
   else *TA = *TA/2;
 
-
-  if (LOG_DUMPFLAG(PRACH)) {
+  if (LOG_DUMPFLAG(DEBUG_PRACH)) {
     //int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840));
     //    if (en>60) {
       int k = (12 * n_ra_prb) - 6 * fp->N_RB_UL;
@@ -734,7 +731,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
       LOG_M("Xu.m","xu", Xu, N_ZC, 1, 1);
       LOG_M("prach_ifft0.m","prach_t0", prach_ifft, 1024, 1, 1);
       //    }
-  } /* LOG_DUMPFLAG(PRACH) */
+  }
   stop_meas(&gNB->rx_prach);
 
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index 396c8d89f4f3c9101dc5f645b7c6602ee80b52c6..902a7bae0282e436b9d88151e12f26bcb9f958df 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -1102,7 +1102,7 @@ static void inner_rx(PHY_VARS_gNB *gNB,
   }
 
   if (nb_layer == 2) {
-    if (rel15_ul->qam_mod_order < 6) {
+    if (rel15_ul->qam_mod_order <= 6) {
       nr_ulsch_compute_ML_llr(pusch_vars,
                               symbol,
                               (c16_t*)&pusch_vars->rxdataF_comp[0][symbol * buffer_length],
@@ -1133,7 +1133,7 @@ static void inner_rx(PHY_VARS_gNB *gNB,
                             buffer_length);
     }
   }
-  if (nb_layer != 2 || rel15_ul->qam_mod_order >= 6)
+  if (nb_layer != 2 || rel15_ul->qam_mod_order > 6)
     for (int aatx = 0; aatx < nb_layer; aatx++) 
       nr_ulsch_compute_llr((int32_t*)&pusch_vars->rxdataF_comp[aatx * nb_rx_ant][symbol * buffer_length],
                           (int32_t*)rxF_ch_maga[aatx],
@@ -1453,9 +1453,11 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
     for (int aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++)
       avgs = cmax(avgs, avg[nl * frame_parms->nb_antennas_rx + aarx]);
 
-  if (rel15_ul->nrOfLayers == 2 && rel15_ul->qam_mod_order >= 6)
+  if (rel15_ul->nrOfLayers == 2 && rel15_ul->qam_mod_order > 6)
     pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) - 3; // for MMSE
-  else
+  else if (rel15_ul->nrOfLayers == 2)
+    pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) - 2 + log2_approx(frame_parms->nb_antennas_rx >> 1);
+  else 
     pusch_vars->log2_maxh = (log2_approx(avgs) >> 1) + 1 + log2_approx(frame_parms->nb_antennas_rx >> 1);
 
   if (pusch_vars->log2_maxh < 0)
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 6f2ccc8bc190db0e6d6c0678bf02a4843bf3dd61..2ec081d8252bcbfc23e03a4e9f1cea098e904b8f 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -62,10 +62,6 @@ void nr_fill_pucch(PHY_VARS_gNB *gNB,
                    int slot,
                    nfapi_nr_pucch_pdu_t *pucch_pdu)
 {
-
-  if (NFAPI_MODE == NFAPI_MODE_PNF)
-    gNB->pucch[0].active = false; // check if true in monolithic mode
-
   bool found = false;
   for (int i = 0; i < gNB->max_nb_pucch; i++) {
     NR_gNB_PUCCH_t *pucch = &gNB->pucch[i];
@@ -1299,7 +1295,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
     corr_dB = dB_fixed64(corr);
     LOG_D(PHY, "metric %d dB\n", corr_dB);
   } else
-    LOG_E(PHY, "PUCCH not processed: nb_bit %d decoderState %d\n", nb_bit, decoderState);
+    LOG_D(PHY, "PUCCH not processed: nb_bit %d decoderState %d\n", nb_bit, decoderState);
 
   LOG_D(PHY, "UCI decoderState %d, payload[0] %llu\n", decoderState, (unsigned long long)decodedPayload[0]);
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index e2928b2df465322e67b269a95b65b1633b076a54..91f8f81f3c7fcdb4945b5327b584ac102d4302b5 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -227,7 +227,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
 
   LOG_I(PHY,
         "PRACH [UE %d] in frame.slot %d.%d, placing PRACH in position %d, Msg1/MsgA-Preamble frequency start %d (k1 %d), "
-        "preamble_offset %d, first_nonzero_root_idx %d\n",
+        "preamble_offset %d, first_nonzero_root_idx %d, preambleIndex = %d\n",
         Mod_id,
         frame,
         slot,
@@ -235,7 +235,8 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t
         n_ra_prb,
         nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].k1,
         preamble_offset,
-        first_nonzero_root_idx);
+        first_nonzero_root_idx,
+        prach_pdu->ra_PreambleIndex);
 
   // Ncp and dftlen here is given in terms of T_s wich is 30.72MHz sampling
   if (prach_sequence_length == 0) {
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index d7e738a9f44fc5cc39f8c25013187d8f61425c33..b456fab82b97eddc45bba14f5e0c1e1043097858 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -726,13 +726,6 @@ int32_t sub_cpx_vector16(int16_t *x,
 */
 int32_t signal_energy(int32_t *,uint32_t);
 
-#ifdef LOCALIZATION
-/*!\fn int32_t signal_energy(int *,uint32_t);
-\brief Computes the signal energy per subcarrier
-*/
-int32_t subcarrier_energy(int32_t *,uint32_t, int32_t *subcarrier_energy, uint16_t rx_power_correction);
-#endif
-
 /*!\fn uint32_t signal_energy_nodc(c16_t *,uint32_t);
 \brief Computes the signal energy per subcarrier, without DC removal
 */
diff --git a/openair1/PHY/defs_L1_NB_IoT.h b/openair1/PHY/defs_L1_NB_IoT.h
index 163e9e3d2b0a6eb47b4064754eae961c42f5cca2..aba1ffb25588cd0d16bcef3191963b4d33cb702c 100644
--- a/openair1/PHY/defs_L1_NB_IoT.h
+++ b/openair1/PHY/defs_L1_NB_IoT.h
@@ -45,17 +45,13 @@
 #include "defs_eNB.h"
 //#include <complex.h>
 #include "assertions.h"
-#ifdef MEX
-  #define msg mexPrintf
-#else
-    #if ENABLE_RAL
-      #include "collection/hashtable/hashtable.h"
-      #include "COMMON/ral_messages_types.h"
-      #include "UTIL/queue.h"
-    #endif
-    #include "common/utils/LOG/log.h"
-    #define msg(aRGS...) LOG_D(PHY, ##aRGS)
+#if ENABLE_RAL
+#include "collection/hashtable/hashtable.h"
+#include "COMMON/ral_messages_types.h"
+#include "UTIL/queue.h"
 #endif
+#include "common/utils/LOG/log.h"
+#define msg(aRGS...) LOG_D(PHY, ##aRGS)
 //use msg in the real-time thread context
 #define msg_nrt printf
 //use msg_nrt in the non real-time context (for initialization, ...)
@@ -663,13 +659,7 @@ typedef struct PHY_VARS_eNB_NB_IoT_s {
   time_stats_t                       ulsch_tc_gamma_stats;
   time_stats_t                       ulsch_tc_ext_stats;
   time_stats_t                       ulsch_tc_intl1_stats;
-  time_stats_t                       ulsch_tc_intl2_stats;
-
-#ifdef LOCALIZATION
-  /// time state for localization
-  time_stats_t                       localization_stats;
-#endif
-
+  time_stats_t ulsch_tc_intl2_stats;
   int32_t                                   pucch1_stats_cnt[NUMBER_OF_UE_MAX_NB_IoT][10];
   int32_t                                   pucch1_stats[NUMBER_OF_UE_MAX_NB_IoT][10*1024];
   int32_t                                   pucch1_stats_thres[NUMBER_OF_UE_MAX_NB_IoT][10*1024];
diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h
index 1b0182bffde8d921cf9a03a5c5de95f8fc8d50b7..167326e8116c4cb600722c782c48850c439f6565 100644
--- a/openair1/PHY/defs_RU.h
+++ b/openair1/PHY/defs_RU.h
@@ -39,7 +39,6 @@
 #include "time_meas.h"
 #include "defs_common.h"
 #include "nfapi_nr_interface_scf.h"
-#include <executables/rt_profiling.h>
 #include "common/utils/threadPool/task_ans.h"
 #include "common/utils/threadPool/thread-pool.h"
 
@@ -663,8 +662,6 @@ typedef struct RU_t_s {
   int tpcores[16];
   /// number of cores for RU ThreadPool
   int num_tpcores;
-  /// structure for analyzing high-level RT measurements
-  rt_ru_profiling_t rt_ru_profiling;
   void* scopeData;
 } RU_t;
 
diff --git a/openair1/PHY/defs_UE.h b/openair1/PHY/defs_UE.h
index 5a090752d5f982b7a1e5d79d763a74557a5c294c..17ae02610e69e043f0a9b584829a2fc748110d75 100644
--- a/openair1/PHY/defs_UE.h
+++ b/openair1/PHY/defs_UE.h
@@ -76,34 +76,13 @@
 #define stop_UE_TIMING(a)
 #endif
 
-#ifdef MEX
-  #include "mex.h"
-  #define msg mexPrintf
-  #undef LOG_D
-  #undef LOG_E
-  #undef LOG_I
-  #undef LOG_N
-  #undef LOG_T
-  #undef LOG_W
-  #undef LOG_M
-  #define LOG_D(x, ...) mexPrintf(__VA_ARGS__)
-  #define LOG_E(x, ...) mexPrintf(__VA_ARGS__)
-  #define LOG_I(x, ...) mexPrintf(__VA_ARGS__)
-  #define LOG_N(x, ...) mexPrintf(__VA_ARGS__)
-  #define LOG_T(x, ...) mexPrintf(__VA_ARGS__)
-  #define LOG_W(x, ...) mexPrintf(__VA_ARGS__)
-  #define LOG_M(x, ...) mexPrintf(__VA_ARGS__)
-#else
-    #if ENABLE_RAL
-      #include "collection/hashtable/hashtable.h"
-      #include "COMMON/ral_messages_types.h"
-      #include "UTIL/queue.h"
-    #endif
-    #include "common/utils/LOG/log.h"
-    #define msg(aRGS...) LOG_D(PHY, ##aRGS)
+#if ENABLE_RAL
+#include "collection/hashtable/hashtable.h"
+#include "COMMON/ral_messages_types.h"
+#include "UTIL/queue.h"
 #endif
-
-
+#include "common/utils/LOG/log.h"
+#define msg(aRGS...) LOG_D(PHY, ##aRGS)
 
 /// Context data structure for RX/TX portion of subframe processing
 typedef struct {
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 154cc7a9897115a6501eb35e631d32335007eb5c..492c022da699df19e6d869d8c398d888a364fa27 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -43,7 +43,6 @@
 #include "PHY/CODING/nrLDPC_coding/nrLDPC_coding_interface.h"
 #include "PHY/CODING/nrLDPC_extern.h"
 #include "PHY/CODING/nrLDPC_decoder/nrLDPC_types.h"
-#include "executables/rt_profiling.h"
 #include "nfapi_nr_interface_scf.h"
 #include "openair2/NR_PHY_INTERFACE/NR_IF_Module.h"
 
@@ -560,8 +559,6 @@ typedef struct PHY_VARS_gNB_s {
   int L1_tx_thread_core;
   struct processingData_L1tx *msgDataTx;
   void *scopeData;
-  /// structure for analyzing high-level RT measurements
-  rt_L1_profiling_t rt_L1_profiling;
 } PHY_VARS_gNB;
 
 struct puschSymbolReqId {
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index dd035a73e3b5111609e0f4ddc35467c62697e43f..ae6bbbc2cd978d04b34e5dd1f3de7d605a13301b 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -56,16 +56,12 @@
 #include "actor.h"
 //#include "openair1/SCHED_NR_UE/defs.h"
 
-#ifdef MEX
-  #define msg mexPrintf
-#else
-    #if ENABLE_RAL
-      #include "common/utils/hashtable/hashtable.h"
-      #include "COMMON/ral_messages_types.h"
-      #include "UTIL/queue.h"
-    #endif
-    #define msg(aRGS...) LOG_D(PHY, ##aRGS)
+#if ENABLE_RAL
+#include "common/utils/hashtable/hashtable.h"
+#include "COMMON/ral_messages_types.h"
+#include "UTIL/queue.h"
 #endif
+#define msg(aRGS...) LOG_D(PHY, ##aRGS)
 // use msg in the real-time thread context
 #define msg_nrt printf
 // use msg_nrt in the non real-time context (for initialization, ...)
@@ -631,8 +627,6 @@ typedef struct nr_rxtx_thread_data_s {
   PHY_VARS_NR_UE    *UE;
   int writeBlockSize;
   nr_phy_data_t phy_data;
-  int tx_wait_for_dlsch;
-  int rx_offset;
 } nr_rxtx_thread_data_t;
 
 typedef struct LDPCDecode_ue_s {
diff --git a/openair1/PHY/impl_defs_lte_NB_IoT.h b/openair1/PHY/impl_defs_lte_NB_IoT.h
index 50b66409ed1ce06f9614865c5046d11c68fb604d..b9e5965452d8212b0b939268b4aedf4ff4fcf5c8 100644
--- a/openair1/PHY/impl_defs_lte_NB_IoT.h
+++ b/openair1/PHY/impl_defs_lte_NB_IoT.h
@@ -748,12 +748,6 @@ typedef struct {
   /// \brief llr values.
   /// - first index: ? [0..1179743] (hard coded)
   int16_t *llr;
-#ifdef LOCALIZATION
-  /// number of active subcarrier for a specific UE
-  int32_t active_subcarrier;
-  /// subcarrier power in dBm
-  int32_t *subcarrier_power;
-#endif
 } NB_IoT_eNB_PUSCH;
 
 #define PBCH_A_NB_IoT 24
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index 27384532c56d46c10e21fcbd68c568b5983dc032..178549e5cc656826eea2da3b93dbbfe586227205 100644
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -268,7 +268,6 @@
 #if 1
 
 #define NB_NUMEROLOGIES_NR                       (5)
-#define TDD_CONFIG_NB_FRAMES                     (2)
 #define NR_MAX_SLOTS_PER_FRAME                   (160)                    /* number of slots per frame */
 
 /* FFS_NR_TODO it defines ue capability which is the number of slots        */
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 06747c9a2e531ae5545e2523ee24549932e3e6f5..949011a6f56b65673b9245417af5215f310c7951 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -66,44 +66,6 @@ void handle_nr_nfapi_ssb_pdu(processingData_L1tx_t *msgTx,int frame,int slot,
   }
 }
 
-/*void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int subframe,gNB_L1_rxtx_proc_t *proc,
-                            uint8_t codeword_index,
-                            uint8_t *sdu)
-{
-
-	int UE_id = 0; //Hardcode UE_id for now
-	int harq_pid;
-
-	NR_gNB_DLSCH_t *dlsch0=NULL, *dlsch1=NULL;
-	NR_DL_gNB_HARQ_t *dlsch0_harq=NULL,*dlsch1_harq=NULL;
-
-    // Based on nr_fill_dci_and_dlsch only gNB->dlsch[0][0] gets filled now. So maybe we do not need dlsch1.
-	dlsch0 = gNB->dlsch[UE_id][0];
-	dlsch1 = gNB->dlsch[UE_id][1];
-
-	harq_pid        = dlsch0->harq_ids[subframe];
-	dlsch0_harq     = dlsch0->harq_processes[harq_pid];
-	dlsch1_harq     = dlsch1->harq_processes[harq_pid];
-
-
-	//if (dlsch0_harq->round==0) {  //get pointer to SDU if this a new SDU
-    if(sdu == NULL) {
-      LOG_E(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0 \n",
-            frame,subframe,
-            proc->frame_tx,proc->slot_tx);
-      return;
-    }
-    //AssertFatal(sdu!=NULL,"NFAPI: SFN/SF:%04d%d proc:TX:[frame %d subframe %d]: programming dlsch for round 0, rnti %x, UE_id %d, harq_pid %d : sdu is null for pdu_index %d dlsch0_harq[round:%d SFN/SF:%d%d pdu:%p mcs:%d ndi:%d pdschstart:%d]\n",
-    //            frame,subframe,
-    //            proc->frame_tx,proc->subframe_tx,rel8->rnti,UE_id,harq_pid,
-    //            dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel8.pdu_index,dlsch0_harq->round,dlsch0_harq->frame,dlsch0_harq->subframe,dlsch0_harq->pdu,dlsch0_harq->mcs,dlsch0_harq->ndi,dlsch0_harq->pdsch_start);
-    if (codeword_index == 0) dlsch0_harq->pdu                    = sdu;
-    else                     dlsch1_harq->pdu                    = sdu;
-    LOG_I(PHY, "SFN/SF: %d/%d DLSCH PDU filled \n",frame, subframe);
-//  }
-
-}*/
-
 void handle_nfapi_nr_csirs_pdu(processingData_L1tx_t *msgTx, int frame, int slot, nfapi_nr_dl_tti_csi_rs_pdu *csirs_pdu)
 {
   int found = 0;
@@ -122,165 +84,173 @@ void handle_nfapi_nr_csirs_pdu(processingData_L1tx_t *msgTx, int frame, int slot
     LOG_E(MAC,"CSI-RS list is full\n");
 }
 
-void handle_nr_nfapi_pdsch_pdu(processingData_L1tx_t *msgTx,
-                            nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
-                            uint8_t *sdu)
+void nr_schedule_dl_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_dl_tti_request_t *DL_req)
 {
+  DevAssert(gNB != NULL);
+  DevAssert(DL_req != NULL);
+  nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
+
+  int frame = DL_req->SFN;
+  int slot = DL_req->Slot;
 
-  nr_fill_dlsch(msgTx,pdsch_pdu,sdu);
+  int slot_type = nr_slot_select(cfg, frame, slot);
+  DevAssert(slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT);
 
+  processingData_L1tx_t *msgTx = gNB->msgDataTx;
+  msgTx->slot = slot;
+  msgTx->frame = frame;
+
+  uint8_t number_dl_pdu = DL_req->dl_tti_request_body.nPDUs;
+
+  for (int i = 0; i < number_dl_pdu; i++) {
+    nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
+    LOG_D(NR_PHY, "NFAPI: dl_pdu %d : type %d\n", i, dl_tti_pdu->PDUType);
+    switch (dl_tti_pdu->PDUType) {
+      case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
+        handle_nr_nfapi_ssb_pdu(msgTx, frame, slot, dl_tti_pdu);
+        break;
+
+      case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+        LOG_D(NR_PHY, "frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE for %d.%d\n", frame, slot, DL_req->SFN, DL_req->Slot);
+        msgTx->pdcch_pdu[msgTx->num_dl_pdcch] = dl_tti_pdu->pdcch_pdu;
+        msgTx->num_dl_pdcch++;
+        break;
+
+      case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+        LOG_D(NR_PHY, "frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n", frame, slot, DL_req->SFN, DL_req->Slot);
+        handle_nfapi_nr_csirs_pdu(msgTx, frame, slot, &dl_tti_pdu->csi_rs_pdu);
+        break;
+
+      case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+        LOG_D(NR_PHY, "frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n", frame, slot, DL_req->SFN, DL_req->Slot);
+        nr_fill_dlsch_dl_tti_req(msgTx, &dl_tti_pdu->pdsch_pdu);
+    }
+  }
+}
+
+void nr_schedule_ul_tti_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_tti_request_t *UL_tti_req)
+{
+  DevAssert(gNB != NULL);
+  DevAssert(UL_tti_req != NULL);
+
+  int frame = UL_tti_req->SFN;
+  int slot = UL_tti_req->Slot;
+
+  for (int i = 0; i < UL_tti_req->n_pdus; i++) {
+    switch (UL_tti_req->pdus_list[i].pdu_type) {
+      case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
+        LOG_D(NR_PHY,
+              "frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n",
+              frame,
+              slot,
+              UL_tti_req->SFN,
+              UL_tti_req->Slot);
+        nr_fill_ulsch(gNB, UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu);
+        break;
+      case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
+        LOG_D(NR_PHY,
+              "frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n",
+              frame,
+              slot,
+              UL_tti_req->SFN,
+              UL_tti_req->Slot);
+        nr_fill_pucch(gNB, UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pucch_pdu);
+        break;
+      case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
+        LOG_D(NR_PHY,
+              "frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n",
+              frame,
+              slot,
+              UL_tti_req->SFN,
+              UL_tti_req->Slot);
+        nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu;
+        nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
+        if (gNB->RU_list[0]->if_south == LOCAL_RF || gNB->RU_list[0]->if_south == REMOTE_IF5)
+          nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
+        break;
+      case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
+        LOG_D(NR_PHY,
+              "frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE for %d.%d\n",
+              frame,
+              slot,
+              UL_tti_req->SFN,
+              UL_tti_req->Slot);
+        nr_fill_srs(gNB, UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].srs_pdu);
+        break;
+    }
+  }
+}
+
+void nr_schedule_tx_req(PHY_VARS_gNB *gNB, nfapi_nr_tx_data_request_t *TX_req)
+{
+  DevAssert(gNB != NULL);
+  DevAssert(TX_req != NULL);
+  processingData_L1tx_t *msgTx = gNB->msgDataTx;
+
+  for (int idx = 0; idx < TX_req->Number_of_PDUs; ++idx) {
+    uint8_t *sdu = (uint8_t *)TX_req->pdu_list[idx].TLVs[0].value.direct;
+    nr_fill_dlsch_tx_req(msgTx, idx, sdu);
+  }
+}
+
+void nr_schedule_ul_dci_req(PHY_VARS_gNB *gNB, nfapi_nr_ul_dci_request_t *UL_dci_req)
+{
+  DevAssert(gNB != NULL);
+  DevAssert(UL_dci_req != NULL);
+  processingData_L1tx_t *msgTx = gNB->msgDataTx;
+
+  msgTx->num_ul_pdcch = UL_dci_req->numPdus;
+  for (int i = 0; i < UL_dci_req->numPdus; i++)
+    msgTx->ul_pdcch_pdu[i] = UL_dci_req->ul_dci_pdu_list[i];
 }
 
 void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO)
 {
   // copy data from L2 interface into L1 structures
-  module_id_t                   Mod_id       = Sched_INFO->module_id;
-  nfapi_nr_dl_tti_request_t     *DL_req      = &Sched_INFO->DL_req;
-  nfapi_nr_tx_data_request_t    *TX_req      = &Sched_INFO->TX_req;
-  nfapi_nr_ul_tti_request_t     *UL_tti_req  = &Sched_INFO->UL_tti_req;
-  nfapi_nr_ul_dci_request_t     *UL_dci_req  = &Sched_INFO->UL_dci_req;
-  frame_t                       frame        = Sched_INFO->frame;
-  sub_frame_t                   slot         = Sched_INFO->slot;
+  module_id_t Mod_id = Sched_INFO->module_id;
+  frame_t frame = Sched_INFO->frame;
+  sub_frame_t slot = Sched_INFO->slot;
 
-  AssertFatal(RC.gNB!=NULL,"RC.gNB is null\n");
-  AssertFatal(RC.gNB[Mod_id]!=NULL,"RC.gNB[%d] is null\n",Mod_id);
+  AssertFatal(RC.gNB != NULL, "RC.gNB is null\n");
+  AssertFatal(RC.gNB[Mod_id] != NULL, "RC.gNB[%d] is null\n", Mod_id);
 
   PHY_VARS_gNB *gNB = RC.gNB[Mod_id];
   start_meas(&gNB->schedule_response_stats);
 
   nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
 
-  int slot_type = nr_slot_select(cfg,frame,slot);
-
-  uint8_t number_dl_pdu             = (DL_req==NULL) ? 0 : DL_req->dl_tti_request_body.nPDUs;
-  uint8_t number_ul_dci_pdu         = (UL_dci_req==NULL) ? 0 : UL_dci_req->numPdus;
-  uint8_t number_ul_tti_pdu         = (UL_tti_req==NULL) ? 0 : UL_tti_req->n_pdus;
-  uint8_t number_tx_data_pdu        = (TX_req == NULL) ? 0 : TX_req->Number_of_PDUs;
+  int slot_type = nr_slot_select(cfg, frame, slot);
 
   clear_slot_beamid(gNB, slot);  // reset beam_id information for the slot to be processed
+  DevAssert(NFAPI_MODE == NFAPI_MONOLITHIC);
+  bool is_dl = slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT;
 
-  if (NFAPI_MODE == NFAPI_MONOLITHIC) {
-    if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) {
-      processingData_L1tx_t *msgTx = gNB->msgDataTx;
-      msgTx->num_pdsch_slot = 0;
-      msgTx->num_dl_pdcch = 0;
-      msgTx->num_ul_pdcch = number_ul_dci_pdu;
-      msgTx->slot = slot;
-      msgTx->frame = frame;
-      /* store the sched_response_id for the TX thread to release it when done */
-      msgTx->sched_response_id = Sched_INFO->sched_response_id;
-
-      for (int i=0;i<number_dl_pdu;i++) {
-        nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu = &DL_req->dl_tti_request_body.dl_tti_pdu_list[i];
-        LOG_D(NR_PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_tti_pdu->PDUType);
-        switch (dl_tti_pdu->PDUType) {
-          case NFAPI_NR_DL_TTI_SSB_PDU_TYPE:
-            handle_nr_nfapi_ssb_pdu(msgTx,frame,slot,
-                                    dl_tti_pdu);
-            break;
-
-          case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
-            LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-            msgTx->pdcch_pdu[msgTx->num_dl_pdcch] = dl_tti_pdu->pdcch_pdu;
-            msgTx->num_dl_pdcch++;
-            break;
-
-          case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
-            LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-            handle_nfapi_nr_csirs_pdu(msgTx,frame,slot,&dl_tti_pdu->csi_rs_pdu);
-            break;
-
-          case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
-            LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE for %d.%d\n",frame,slot,DL_req->SFN,DL_req->Slot);
-            nfapi_nr_dl_tti_pdsch_pdu_rel15_t *pdsch_pdu_rel15 = &dl_tti_pdu->pdsch_pdu.pdsch_pdu_rel15;
-            uint16_t pduIndex = pdsch_pdu_rel15->pduIndex;
-            AssertFatal(TX_req->pdu_list[pduIndex].num_TLV == 1, "TX_req->pdu_list[%d].num_TLV %d != 1\n",
-            pduIndex,TX_req->pdu_list[pduIndex].num_TLV);
-            uint8_t *sdu = (uint8_t *)TX_req->pdu_list[pduIndex].TLVs[0].value.direct;
-            AssertFatal(msgTx->num_pdsch_slot < gNB->max_nb_pdsch,
-                        "Number of PDSCH PDUs %d exceeded the limit %d\n",
-                        msgTx->num_pdsch_slot,
-                        gNB->max_nb_pdsch);
-            handle_nr_nfapi_pdsch_pdu(msgTx,&dl_tti_pdu->pdsch_pdu, sdu);
-        }
-      }
-
-      for (int i=0; i<number_ul_dci_pdu; i++)
-        msgTx->ul_pdcch_pdu[i] = UL_dci_req->ul_dci_pdu_list[i];
-
-      /* Both the current thread and the TX thread will access the sched_info
-       * at the same time, so increase its reference counter, so that it is
-       * released only when both threads are done with it.
-       */
-      inc_ref_sched_response(Sched_INFO->sched_response_id);
-    }
+  processingData_L1tx_t *msgTx = gNB->msgDataTx;
+  /* store the sched_response_id for the TX thread to release it when done */
+  msgTx->sched_response_id = Sched_INFO->sched_response_id;
 
-    for (int i = 0; i < number_ul_tti_pdu; i++) {
-      switch (UL_tti_req->pdus_list[i].pdu_type) {
-        case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE:
-          LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUSCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-          nr_fill_ulsch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pusch_pdu);
-          break;
-        case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE:
-          LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PUCCH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-          nr_fill_pucch(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].pucch_pdu);
-          break;
-        case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
-          LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_TTI_PRACH_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-          nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu;
-          nr_fill_prach(gNB, UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
-          if (gNB->RU_list[0]->if_south == LOCAL_RF || gNB->RU_list[0]->if_south == REMOTE_IF5)
-            nr_fill_prach_ru(gNB->RU_list[0], UL_tti_req->SFN, UL_tti_req->Slot, prach_pdu);
-          break;
-        case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE:
-          LOG_D(NR_PHY,"frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE for %d.%d\n", frame, slot, UL_tti_req->SFN, UL_tti_req->Slot);
-          nr_fill_srs(gNB,UL_tti_req->SFN, UL_tti_req->Slot, &UL_tti_req->pdus_list[i].srs_pdu);
-          break;
-      }
-    }
-  }
-
-  if (NFAPI_MODE == NFAPI_MODE_VNF) { // If VNF, oai_nfapi functions send respective p7 msgs to PNF for which nPDUs > 0
-
-    if (number_ul_tti_pdu > 0)
-      oai_nfapi_ul_tti_req(UL_tti_req);
+  DevAssert(Sched_INFO->DL_req.SFN == frame);
+  DevAssert(Sched_INFO->DL_req.Slot == slot);
 
-    if (number_ul_dci_pdu > 0)
-      oai_nfapi_ul_dci_req(UL_dci_req);
+  if (is_dl) {
+    nr_schedule_dl_tti_req(gNB, &Sched_INFO->DL_req);
+  }
 
-    if (number_dl_pdu > 0)
-      oai_nfapi_dl_tti_req(DL_req);
+  nr_schedule_ul_tti_req(gNB, &Sched_INFO->UL_tti_req);
 
-    if (number_tx_data_pdu > 0)
-      oai_nfapi_tx_data_req(TX_req);
+  if (is_dl) {
+    nr_schedule_tx_req(gNB, &Sched_INFO->TX_req);
 
-  } else if (NFAPI_MODE == NFAPI_MODE_AERIAL) {
-#ifdef ENABLE_AERIAL
-    bool send_slt_resp = false;
-    if (number_dl_pdu > 0) {
-      oai_fapi_dl_tti_req(DL_req);
-      send_slt_resp = true;
-    }
-    if (number_ul_tti_pdu > 0) {
-      oai_fapi_ul_tti_req(UL_tti_req);
-      send_slt_resp = true;
-    }
-    if (number_tx_data_pdu > 0) {
-      oai_fapi_tx_data_req(TX_req);
-      send_slt_resp = true;
-    }
-    if (number_ul_dci_pdu > 0) {
-      oai_fapi_ul_dci_req(UL_dci_req);
-      send_slt_resp = true;
-    }
-    if (send_slt_resp) {
-      oai_fapi_send_end_request(0,frame,slot);
-    }
-#endif
+    nr_schedule_ul_dci_req(gNB, &Sched_INFO->UL_dci_req);
+    /* Both the current thread and the TX thread will access the sched_info
+     * at the same time, so increase its reference counter, so that it is
+     * released only when both threads are done with it.
+     */
+    inc_ref_sched_response(Sched_INFO->sched_response_id);
   }
 
   /* this thread is done with the sched_info, decrease the reference counter */
-  if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) {
+  if ((slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT) && NFAPI_MODE == NFAPI_MONOLITHIC) {
     LOG_D(NR_PHY, "Calling dref_sched_response for id %d in %d.%d (sched_response)\n", Sched_INFO->sched_response_id, frame, slot);
     deref_sched_response(Sched_INFO->sched_response_id);
   }
diff --git a/openair1/SCHED_NR/phy_frame_config_nr.c b/openair1/SCHED_NR/phy_frame_config_nr.c
index da7cc26e1adc5f5afc37836e8a163044396f0995..ad672bccb8a9f680bbc656e879476c8240b27659 100644
--- a/openair1/SCHED_NR/phy_frame_config_nr.c
+++ b/openair1/SCHED_NR/phy_frame_config_nr.c
@@ -67,96 +67,84 @@ int set_tdd_config_nr(nfapi_nr_config_request_scf_t *cfg,
                       int nrofUplinkSlots,
                       int nrofUplinkSymbols)
 {
-
   int slot_number = 0;
   int nb_periods_per_frame = get_nb_periods_per_frame(cfg->tdd_table.tdd_period.value);
-  int nb_slots_to_set = TDD_CONFIG_NB_FRAMES*(1<<mu)*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
 
-  int nb_slots_per_period = ((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME)/nb_periods_per_frame;
+  int nb_slots_per_period = ((1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) / nb_periods_per_frame;
 
-  if ( (nrofDownlinkSymbols + nrofUplinkSymbols) == 0 )
+  if ((nrofDownlinkSymbols + nrofUplinkSymbols) == 0)
     AssertFatal(nb_slots_per_period == (nrofDownlinkSlots + nrofUplinkSlots),
-                "set_tdd_configuration_nr: given period is inconsistent with current tdd configuration, nrofDownlinkSlots %d, nrofUplinkSlots %d, nb_slots_per_period %d \n",
-                nrofDownlinkSlots,nrofUplinkSlots,nb_slots_per_period);
+                "set_tdd_configuration_nr: given period is inconsistent with current tdd configuration, nrofDownlinkSlots %d, "
+                "nrofUplinkSlots %d, nb_slots_per_period %d \n",
+                nrofDownlinkSlots,
+                nrofUplinkSlots,
+                nb_slots_per_period);
   else {
-    AssertFatal(nrofDownlinkSymbols + nrofUplinkSymbols < 14,"illegal symbol configuration DL %d, UL %d\n",nrofDownlinkSymbols,nrofUplinkSymbols);
+    AssertFatal(nrofDownlinkSymbols + nrofUplinkSymbols < 14,
+                "illegal symbol configuration DL %d, UL %d\n",
+                nrofDownlinkSymbols,
+                nrofUplinkSymbols);
     AssertFatal(nb_slots_per_period == (nrofDownlinkSlots + nrofUplinkSlots + 1),
-                "set_tdd_configuration_nr: given period is inconsistent with current tdd configuration, nrofDownlinkSlots %d, nrofUplinkSlots %d, nrofMixed slots 1, nb_slots_per_period %d \n",
-                nrofDownlinkSlots,nrofUplinkSlots,nb_slots_per_period);
+                "set_tdd_configuration_nr: given period is inconsistent with current tdd configuration, nrofDownlinkSlots %d, "
+                "nrofUplinkSlots %d, nrofMixed slots 1, nb_slots_per_period %d \n",
+                nrofDownlinkSlots,
+                nrofUplinkSlots,
+                nb_slots_per_period);
   }
 
-  cfg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *) malloc(nb_slots_to_set*sizeof(nfapi_nr_max_tdd_periodicity_t));
+  cfg->tdd_table.max_tdd_periodicity_list = calloc(nb_slots_to_set, sizeof(nfapi_nr_max_tdd_periodicity_t));
 
-  for(int memory_alloc =0 ; memory_alloc<nb_slots_to_set; memory_alloc++)
-    cfg->tdd_table.max_tdd_periodicity_list[memory_alloc].max_num_of_symbol_per_slot_list = (nfapi_nr_max_num_of_symbol_per_slot_t *) malloc(NR_NUMBER_OF_SYMBOLS_PER_SLOT*sizeof(
-          nfapi_nr_max_num_of_symbol_per_slot_t));
+  for (int slot = 0; slot < nb_slots_to_set; slot++) {
+    nfapi_nr_max_tdd_periodicity_t *p_list = &cfg->tdd_table.max_tdd_periodicity_list[slot];
+    p_list->max_num_of_symbol_per_slot_list =
+        calloc(NR_NUMBER_OF_SYMBOLS_PER_SLOT, sizeof(*p_list->max_num_of_symbol_per_slot_list));
+    for (int sym = 0; sym < NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) {
+      // for each symbol, assign the TLV tag for usage when packing
+      p_list->max_num_of_symbol_per_slot_list[sym].slot_config.tl.tag = NFAPI_NR_CONFIG_SLOT_CONFIG_TAG;
+    }
+  }
 
-  while(slot_number != nb_slots_to_set) {
-    if(nrofDownlinkSlots != 0) {
-      for (int number_of_symbol = 0; number_of_symbol < nrofDownlinkSlots*NR_NUMBER_OF_SYMBOLS_PER_SLOT; number_of_symbol++) {
-        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol%NR_NUMBER_OF_SYMBOLS_PER_SLOT].slot_config.value= 0;
+  while (slot_number != nb_slots_to_set) {
+    if (nrofDownlinkSlots != 0) {
+      for (int sym = 0; sym < nrofDownlinkSlots * NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) {
+        cfg->tdd_table.max_tdd_periodicity_list[slot_number]
+            .max_num_of_symbol_per_slot_list[sym % NR_NUMBER_OF_SYMBOLS_PER_SLOT]
+            .slot_config.value = 0;
 
-        if((number_of_symbol+1)%NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0)
+        if ((sym + 1) % NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0)
           slot_number++;
       }
     }
 
     if (nrofDownlinkSymbols != 0 || nrofUplinkSymbols != 0) {
-      for(int number_of_symbol =0; number_of_symbol < nrofDownlinkSymbols; number_of_symbol++) {
-        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol].slot_config.value= 0;
+      for (int sym = 0; sym < nrofDownlinkSymbols; sym++) {
+        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[sym].slot_config.value = 0;
       }
 
-      for(int number_of_symbol = nrofDownlinkSymbols; number_of_symbol < NR_NUMBER_OF_SYMBOLS_PER_SLOT-nrofUplinkSymbols; number_of_symbol++) {
-        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol].slot_config.value= 2;
+      for (int sym = nrofDownlinkSymbols; sym < NR_NUMBER_OF_SYMBOLS_PER_SLOT - nrofUplinkSymbols; sym++) {
+        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[sym].slot_config.value = 2;
       }
 
-      for(int number_of_symbol = NR_NUMBER_OF_SYMBOLS_PER_SLOT-nrofUplinkSymbols; number_of_symbol < NR_NUMBER_OF_SYMBOLS_PER_SLOT; number_of_symbol++) {
-        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol].slot_config.value= 1;
+      for (int sym = NR_NUMBER_OF_SYMBOLS_PER_SLOT - nrofUplinkSymbols; sym < NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) {
+        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[sym].slot_config.value = 1;
       }
 
       slot_number++;
     }
 
-    if(nrofUplinkSlots != 0) {
-      for (int number_of_symbol = 0; number_of_symbol < nrofUplinkSlots*NR_NUMBER_OF_SYMBOLS_PER_SLOT; number_of_symbol++) {
-        cfg->tdd_table.max_tdd_periodicity_list[slot_number].max_num_of_symbol_per_slot_list[number_of_symbol%NR_NUMBER_OF_SYMBOLS_PER_SLOT].slot_config.value= 1;
+    if (nrofUplinkSlots != 0) {
+      for (int sym = 0; sym < nrofUplinkSlots * NR_NUMBER_OF_SYMBOLS_PER_SLOT; sym++) {
+        cfg->tdd_table.max_tdd_periodicity_list[slot_number]
+            .max_num_of_symbol_per_slot_list[sym % NR_NUMBER_OF_SYMBOLS_PER_SLOT]
+            .slot_config.value = 1;
 
-        if((number_of_symbol+1)%NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0)
+        if ((sym + 1) % NR_NUMBER_OF_SYMBOLS_PER_SLOT == 0)
           slot_number++;
       }
     }
   }
 
-  /*
-  while(slot_number != nb_slots_to_set) {
-    for (int number_of_slot = 0; number_of_slot < nrofDownlinkSlots; number_of_slot++) {
-      frame_parms->tdd_uplink_nr[slot_number] = NR_TDD_DOWNLINK_SLOT;
-      printf("slot %d set as downlink\n",slot_number);
-      slot_number++;
-    }
-
-    if (nrofDownlinkSymbols != 0 || nrofUplinkSymbols != 0) {
-       frame_parms->tdd_uplink_nr[slot_number] = (1<<nrofUplinkSymbols) - 1;
-       printf("slot %d set as SL\n",slot_number);
-       slot_number++;
-    }
-
-    for (int number_of_slot = 0; number_of_slot < nrofUplinkSlots; number_of_slot++) {
-      frame_parms->tdd_uplink_nr[slot_number] = NR_TDD_UPLINK_SLOT;
-      printf("slot %d set as uplink\n",slot_number);
-      slot_number++;
-    }
-
-    if (p_tdd_ul_dl_configuration->nrofUplinkSymbols != 0) {
-      LOG_E(PHY,"set_tdd_configuration_nr: uplink symbol for slot is not supported for tdd configuration \n");
-      return (-1);
-    }
-  }
-
-  if (frame_parms->p_tdd_UL_DL_ConfigurationCommon2 != NULL) {
-    LOG_E(PHY,"set_tdd_configuration_nr: additionnal tdd configuration 2 is not supported for tdd configuration \n");
-    return (-1);
-  }*/
   return (nb_periods_per_frame);
 }
 
@@ -230,7 +218,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms) {
   while(p_current_TDD_UL_DL_SlotConfig != NULL) {
     int slot_index = p_current_TDD_UL_DL_SlotConfig->slotIndex;
 
-    if (slot_index < TDD_CONFIG_NB_FRAMES * frame_parms->slots_per_frame) {
+    if (slot_index < frame_parms->slots_per_frame) {
       if (p_current_TDD_UL_DL_SlotConfig->nrofDownlinkSymbols != 0) {
         if (p_current_TDD_UL_DL_SlotConfig->nrofDownlinkSymbols == NR_TDD_SET_ALL_SYMBOLS) {
           if (p_current_TDD_UL_DL_SlotConfig->nrofUplinkSymbols == 0) {
@@ -301,62 +289,39 @@ int get_next_downlink_slot(PHY_VARS_gNB *gNB, nfapi_nr_config_request_scf_t *cfg
   }
 }
 
-int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot) {
+int nr_slot_select(nfapi_nr_config_request_scf_t *cfg, int nr_frame, int nr_slot)
+{
+  (void) nr_frame;
+
   /* for FFD all slot can be considered as an uplink */
-  int mu = cfg->ssb_config.scs_common.value,check_slot=0;
+  int check_slot = 0;
 
   if (cfg->cell_config.frame_duplex_type.value == FDD) {
-    return (NR_UPLINK_SLOT | NR_DOWNLINK_SLOT );
+    return (NR_UPLINK_SLOT | NR_DOWNLINK_SLOT);
   }
 
-  if (nr_frame%2 == 0) {
-    for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
-      if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
-        check_slot++;
-      }
+  for (int symbol_count = 0; symbol_count < NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
+    if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 1) {
+      check_slot++;
     }
+  }
 
-    if(check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) {
-      return (NR_UPLINK_SLOT);
-    }
+  if (check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) {
+    return (NR_UPLINK_SLOT);
+  }
 
-    check_slot = 0;
+  check_slot = 0;
 
-    for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
-      if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
-        check_slot++;
-      }
+  for (int symbol_count = 0; symbol_count < NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
+    if (cfg->tdd_table.max_tdd_periodicity_list[nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0) {
+      check_slot++;
     }
+  }
 
-    if(check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) {
-      return (NR_DOWNLINK_SLOT);
-    } else {
-      return (NR_MIXED_SLOT);
-    }
+  if (check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) {
+    return (NR_DOWNLINK_SLOT);
   } else {
-    for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
-      if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==1) {
-        check_slot++;
-      }
-    }
-
-    if(check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) {
-      return (NR_UPLINK_SLOT);
-    }
-
-    check_slot = 0;
-
-    for(int symbol_count=0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
-      if (cfg->tdd_table.max_tdd_periodicity_list[((1<<mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value==0) {
-        check_slot++;
-      }
-    }
-
-    if(check_slot == NR_NUMBER_OF_SYMBOLS_PER_SLOT) {
-      return (NR_DOWNLINK_SLOT);
-    } else {
-      return (NR_MIXED_SLOT);
-    }
+    return (NR_MIXED_SLOT);
   }
 }
 
diff --git a/openair1/SCHED_NR/phy_frame_config_nr.h b/openair1/SCHED_NR/phy_frame_config_nr.h
index 487e2aaea796ac6f49f047751e882e8cf7dbc24c..b477b435f1eafecc258b2e19e994a9db70f7b4f3 100644
--- a/openair1/SCHED_NR/phy_frame_config_nr.h
+++ b/openair1/SCHED_NR/phy_frame_config_nr.h
@@ -34,10 +34,6 @@
 #ifndef PHY_FRAME_CONFIG_NR_H
 #define PHY_FRAME_CONFIG_NR_H
 
-/************** DEFINE ********************************************/
-
-#define TDD_CONFIG_NB_FRAMES           (2)
-
 /*************** FUNCTIONS *****************************************/
 
 /** \brief This function processes tdd dedicated configuration for nr
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 8b78cd579b67ae4f776202338bfdbfab0eafecdd..9e1ec84d9c3c0b00208d3004657b9418ec981464 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -242,6 +242,8 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,0);
   }
+  msgTx->num_dl_pdcch = 0;
+  msgTx->num_ul_pdcch = 0;
  
   if (msgTx->num_pdsch_slot > 0) {
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,1);
@@ -249,6 +251,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx,
     nr_generate_pdsch(msgTx, frame, slot);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
   }
+  msgTx->num_pdsch_slot = 0;
 
   for (int i = 0; i < NR_SYMBOLS_PER_SLOT; i++){
     NR_gNB_CSIRS_t *csirs = &msgTx->csirs_pdu[i];
@@ -730,8 +733,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, N
   for (int i = 0; i < gNB->max_nb_pucch; i++) {
     NR_gNB_PUCCH_t *pucch = &gNB->pucch[i];
     if (pucch) {
-      if (NFAPI_MODE == NFAPI_MODE_PNF)
-        pucch->frame = frame_rx;
       if (pucch->active && (pucch->frame == frame_rx) && (pucch->slot == slot_rx)) {
         c16_t **rxdataF = gNB->common_vars.rxdataF[pucch->beam_nb];
         pucch_decode_done = 1;
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index c6a477a8eef0d7e5a023aa43393ad5eccadc730e..6dffd4ad8cf0f203dde07dceaf5091807ee6099e 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -178,10 +178,11 @@ int8_t nr_ue_scheduled_response_stub(nr_scheduled_response_t *scheduled_response
               crc_ind->crc_list[j].tb_crc_status = 0;
               crc_ind->crc_list[j].timing_advance = 31;
               crc_ind->crc_list[j].ul_cqi = 255;
-              AssertFatal(mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot == -1,
+              emul_l1_harq_t *harq = &mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id];
+              AssertFatal(harq->active_ul_harq_sfn == -1 && harq->active_ul_harq_slot == -1,
                           "We did not send an active CRC when we should have!\n");
-              mac->nr_ue_emul_l1.harq[crc_ind->crc_list[j].harq_id].active_ul_harq_sfn_slot =
-                  NFAPI_SFNSLOT2HEX(crc_ind->sfn, crc_ind->slot);
+              harq->active_ul_harq_sfn = crc_ind->sfn;
+              harq->active_ul_harq_slot = crc_ind->slot;
               LOG_D(NR_MAC,
                     "This is sched sfn/sl [%d %d] and crc sfn/sl [%d %d] with mcs_index in ul_cqi -> %d\n",
                     frame,
diff --git a/openair1/SCHED_UE/phy_procedures_lte_ue.c b/openair1/SCHED_UE/phy_procedures_lte_ue.c
index 1f165380d4a7edcc2ddde19654df44fee548c2e9..32e248d52b5f0d36de26e660bb6949fc7b313977 100644
--- a/openair1/SCHED_UE/phy_procedures_lte_ue.c
+++ b/openair1/SCHED_UE/phy_procedures_lte_ue.c
@@ -1145,7 +1145,7 @@ void ulsch_common_procedures(PHY_VARS_UE *ue,
   int dummy_tx_buffer[frame_parms->samples_per_tti] __attribute__((aligned(16)));
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_COMMON,VCD_FUNCTION_IN);
 
-  if ( LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->ofdm_mod_stats);
   }
 
@@ -1211,7 +1211,7 @@ void ulsch_common_procedures(PHY_VARS_UE *ue,
     }
   } //nb_antennas_tx
 
-  if ( LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->ofdm_mod_stats);
   }
 
@@ -1544,7 +1544,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
             ue->prach_resources[eNB_id]->Msg3[7],
             ue->prach_resources[eNB_id]->Msg3[8]);
 
-      if ( LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->ulsch_encoding_stats);
       }
 
@@ -1556,7 +1556,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
                                  ue->transmission_mode[eNB_id],0,0)==0,
                   "ulsch_coding.c: FATAL ERROR: returning\n");
 
-      if ( LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->phy_proc_tx);
         LOG_I(PHY,"------FULL TX PROC : %5.2f ------\n",ue->phy_proc_tx.p_time/(cpuf*1000.0));
         stop_meas(&ue->ulsch_encoding_stats);
@@ -1605,7 +1605,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
           ulsch_input_buffer[i]= (uint8_t)(taus()&0xff);
       }
 
-      if ( LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->ulsch_encoding_stats);
       }
 
@@ -1620,7 +1620,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
           LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
           VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
 
-          if (LOG_DEBUGFLAG(UE_TIMING)) {
+          if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
             stop_meas(&ue->phy_proc_tx);
           }
 
@@ -1628,7 +1628,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
         }
       }
 
-      if(LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->ulsch_encoding_stats);
       }
     }
@@ -1656,7 +1656,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
               Mod_id,harq_pid,frame_tx%1024,subframe_tx,ue->tx_power_dBm[subframe_tx],ue->tx_power_max_dBm, tx_amp);
       }
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->ulsch_modulation_stats);
       }
 
@@ -1679,7 +1679,7 @@ void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,
                            nb_rb,
                            aa);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->ulsch_modulation_stats);
       }
     }
@@ -2123,7 +2123,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,
   T(T_UE_PHY_UL_TICK, T_INT(ue->Mod_id), T_INT(frame_tx%1024), T_INT(subframe_tx));
   ue->generate_ul_signal[eNB_id] = 0;
 
-  if ( LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->phy_proc_tx);
   }
 
@@ -2208,7 +2208,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *ue,
   LOG_D(PHY,"****** end TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, subframe_tx);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
 
-  if ( LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->phy_proc_tx);
   }
 }
@@ -2489,7 +2489,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,
   LOG_D(PHY,"DCI Decoding procedure in %d.%d\n",frame_rx,subframe_rx);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_IN);
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->dlsch_rx_pdcch_stats);
   }
 
@@ -2790,7 +2790,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,
     }
   }
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->dlsch_rx_pdcch_stats);
   }
 
@@ -3086,7 +3086,7 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue,
       else
         first_symbol_flag = 0;
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         uint8_t slot = 0;
 
         if(m >= ue->frame_parms.symbols_per_tti>>1)
@@ -3108,7 +3108,7 @@ void ue_pdsch_procedures(PHY_VARS_UE *ue,
                i_mod,
                dlsch0->current_harq_pid);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         uint8_t slot = 0;
 
         if(m >= ue->frame_parms.symbols_per_tti>>1)
@@ -3299,7 +3299,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
                                           subframe_rx,
                                           ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]);
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->dlsch_unscrambling_stats);
     }
 
@@ -3311,7 +3311,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
                        0,
                        subframe_rx<<1);
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->dlsch_unscrambling_stats);
     }
 
@@ -3326,7 +3326,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
     LOG_D(PHY,"start turbo decode for CW 0 for AbsSubframe %d.%d / %d  --> Pdcch Sym  %d \n", frame_rx, subframe_rx, harq_pid,
           ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols);
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]);
     }
 
@@ -3341,7 +3341,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
                          pdsch==PDSCH?1:0,
                          dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]);
       LOG_I(PHY, " --> Unscrambling for CW0 %5.3f\n",
             (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
@@ -3361,7 +3361,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
                                             subframe_rx,
                                             ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id]);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->dlsch_unscrambling_stats);
       }
 
@@ -3373,7 +3373,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
                          1,
                          subframe_rx<<1);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->dlsch_unscrambling_stats);
       }
 
@@ -3386,7 +3386,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
       LOG_D(PHY,"start turbo decode for CW 1 for AbsSubframe %d.%d / %d  --> Pdcch Sym  %d \n", frame_rx, subframe_rx, harq_pid,
             ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]);
       }
 
@@ -3401,7 +3401,7 @@ void ue_dlsch_procedures(PHY_VARS_UE *ue,
                             pdsch==PDSCH?1:0,
                             dlsch1->harq_processes[harq_pid]->TBS>256?1:0);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->dlsch_decoding_stats[ue->current_thread_id[subframe_rx]]);
         LOG_I(PHY, " --> Unscrambling for CW1 %5.3f\n",
               (ue->dlsch_unscrambling_stats.p_time)/(cpuf*1000.0));
@@ -3653,7 +3653,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
     }
 
     /**** Slot1 FE Processing ****/
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]);
     }
 
@@ -3680,7 +3680,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
     for (int l=1; l<ue->frame_parms.symbols_per_tti>>1; l++) {
       //if( (l != pilot0) && (l != pilot1))
       {
-        if (LOG_DEBUGFLAG(UE_TIMING)) {
+        if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
           start_meas(&ue->ofdm_demod_stats);
         }
 
@@ -3693,7 +3693,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
                       0);
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
 
-        if (LOG_DEBUGFLAG(UE_TIMING)) {
+        if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
           stop_meas(&ue->ofdm_demod_stats);
         }
       }
@@ -3746,7 +3746,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
 
     //printf(" [slot1 dl processing] ==> Start LLR Comuptation slot1 for AbsSubframe %d.%d \n", proc->frame_rx, proc->subframe_rx);
 
-    if ( LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1]);
       LOG_D(PHY, "[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0));
     }
@@ -3766,7 +3766,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
     // do procedures for C-RNTI
     //printf("AbsSubframe %d.%d Pdsch Procedure (slot1)\n",frame_rx,subframe_rx);
 
-    if ( LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]);
     }
 
@@ -3840,7 +3840,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
     proc->llr_slot1_available=1;
     //printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,subframe_rx);
 
-    if ( LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1]);
       LOG_D(PHY, "[AbsSFN %d.%d] Slot1: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][1].p_time/(cpuf*1000.0));
     }
@@ -3891,7 +3891,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
     LOG_D(PHY," ****** start RX-Chain for AbsSubframe %d.%d ******  \n", frame_rx%1024, subframe_rx);
   }
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]);
     start_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]);
   }
@@ -3994,7 +3994,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
 
   /**** Slot0 FE Processing ****/
   // I- start main thread for FFT/ChanEst symbol: 0/1 --> 7
-  if ( LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]);
   }
 
@@ -4028,7 +4028,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
   for (l=first_ofdm_sym; l<=l2; l++) {
     if( (l != pilot0) && (l != pilot1)) {
       //printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,subframe_rx,slot0,l);
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->ofdm_demod_stats);
       }
 
@@ -4040,7 +4040,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
                     0);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->ofdm_demod_stats);
       }
     }
@@ -4060,14 +4060,14 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
   }
 
   if (do_pdcch_flag) {
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]);
     }
 
     if (ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) {
       LOG_E(PHY,"[UE  %d] Frame %d, subframe %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,subframe_rx);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         LOG_D(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
       }
 
@@ -4076,7 +4076,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
     }
 
     //proc->dci_slot0_available=1;
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]]);
       LOG_D(PHY, "[AbsSFN %d.%d] Slot0: PDCCH %5.2f \n",frame_rx,subframe_rx,ue->pdcch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
     }
@@ -4085,7 +4085,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
   //printf("num_pdcch_symbols %d\n",ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->num_pdcch_symbols);
 
   // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH)
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0]);
     LOG_D(PHY, "[AbsSFN %d.%d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",frame_rx,subframe_rx,
           ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0));
@@ -4099,7 +4099,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
     wait++;
   }
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]);
     LOG_D(PHY, "[AbsSFN %d.%d] FULL FE Processing %5.2f \n",frame_rx,subframe_rx,ue->ue_front_end_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0));
   }
@@ -4116,11 +4116,11 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
   //printf("AbsSubframe %d.%d Pdsch Procedure (slot0)\n",frame_rx%1024,subframe_rx);
   //printf("AbsSubframe %d.%d Pdsch Procedure PDSCH Active %d \n",frame_rx%1024,subframe_rx, ue->dlsch[ue->current_thread_id[subframe_rx]][0][0]->active);
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
   }
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]);
   }
 
@@ -4187,7 +4187,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
   proc->dci_slot0_available=1;
   //printf("Set available dci slot0 to 1 AbsSubframe %d.%d \n",frame_rx%1024,subframe_rx);
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0]);
     LOG_D(PHY, "[AbsSFN %d.%d] Slot0: LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_per_slot_stat[ue->current_thread_id[subframe_rx]][0].p_time/(cpuf*1000.0));
   }
@@ -4200,13 +4200,13 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
     wait++;
   }
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
     LOG_D(PHY, "[AbsSFN %d.%d] Full LLR Computation %5.2f \n",frame_rx,subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
   }
 
   //=====================================================================//
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
   }
 
@@ -4272,7 +4272,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
     ue->dlsch_ra[eNB_id]->active = 0;
   }
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
     LOG_D(PHY, "[AbsSFN %d.%d] Channel Decoder: %5.2f \n",frame_rx,subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
   }
@@ -4332,7 +4332,7 @@ int phy_procedures_slot_parallelization_UE_RX(PHY_VARS_UE *ue,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
 
-  if (LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]);
     LOG_I(PHY, "------FULL RX PROC [AbsSFN %d.%d]: %5.2f ------\n",frame_rx,subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
   }
@@ -4371,7 +4371,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
     LOG_I(PHY," ****** start RX-Chain for AbsSubframe->0 %d.%d ******  \n", frame_rx%1024, subframe_rx);
   }
 
-  if(LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     start_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]);
     start_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]);
   }
@@ -4447,7 +4447,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
 
     for (; l<=l2; l++) {
       if (abstraction_flag == 0) {
-        if (LOG_DEBUGFLAG(UE_TIMING)) {
+        if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
           start_meas(&ue->ofdm_demod_stats);
         }
 
@@ -4460,7 +4460,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
                  0);
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
 
-        if (LOG_DEBUGFLAG(UE_TIMING)) {
+        if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
           stop_meas(&ue->ofdm_demod_stats);
         }
       }
@@ -4516,14 +4516,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
              0);
 
     // first slot has been processed (FFTs + Channel Estimation, PCFICH/PHICH/PDCCH)
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]]);
       LOG_I(PHY, "[SFN %d] Slot0: FFT + Channel Estimate + PCFICH/PHICH/PDCCH %5.2f \n",subframe_rx,ue->ue_front_end_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
     }
 
     LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------  \n", frame_rx%1024, subframe_rx);
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->generic_stat);
       start_meas(&ue->crnti_procedures_stats);
     }
@@ -4543,7 +4543,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
     }
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->crnti_procedures_stats);
     }
 
@@ -4600,7 +4600,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
     if (subframe_select(&ue->frame_parms,subframe_rx) != SF_S) {  // do front-end processing for second slot, and first symbol of next subframe
       for (l=1; l<ue->frame_parms.symbols_per_tti>>1; l++) {
         if (abstraction_flag == 0) {
-          if (LOG_DEBUGFLAG(UE_TIMING)) {
+          if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
             start_meas(&ue->ofdm_demod_stats);
           }
 
@@ -4613,7 +4613,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
                    0);
           VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
 
-          if (LOG_DEBUGFLAG(UE_TIMING)) {
+          if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
             stop_meas(&ue->ofdm_demod_stats);
           }
         }
@@ -4635,7 +4635,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
       }
     } // not an S-subframe
 
-    if(LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       stop_meas(&ue->generic_stat);
       LOG_I(PHY, "[SFN %d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f \n",subframe_rx,ue->generic_stat.p_time/(cpuf*1000.0));
     }
@@ -4652,7 +4652,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
     if (ue->dlsch[ue->current_thread_id[subframe_rx]][eNB_id][0]->active == 1) {
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_IN);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         start_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
       }
 
@@ -4668,7 +4668,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
       LOG_D(PHY," ------ end PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------  \n", frame_rx%1024, subframe_rx);
       LOG_D(PHY," ------ --> PDSCH Turbo Decoder slot 0/1: AbsSubframe %d.%d ------  \n", frame_rx%1024, subframe_rx);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
         start_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
       }
@@ -4683,7 +4683,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
                           mode,
                           abstraction_flag);
 
-      if (LOG_DEBUGFLAG(UE_TIMING)) {
+      if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
         stop_meas(&ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]]);
         LOG_I(PHY, "[SFN %d] Slot1:       Pdsch Proc %5.2f\n",subframe_rx,ue->pdsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
         LOG_I(PHY, "[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f\n",subframe_rx,ue->dlsch_procedures_stat[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
@@ -4692,7 +4692,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC, VCD_FUNCTION_OUT);
     }
 
-    if (LOG_DEBUGFLAG(UE_TIMING)) {
+    if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
       start_meas(&ue->generic_stat);
     }
 
@@ -4818,14 +4818,14 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,
     }
   }
 
-  if ( LOG_DEBUGFLAG(UE_TIMING)) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->generic_stat);
     LOG_I(PHY,"after tubo until end of Rx %5.2f \n",ue->generic_stat.p_time/(cpuf*1000.0));
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
 
-  if ( LOG_DEBUGFLAG(UE_TIMING) ) {
+  if (LOG_DEBUGFLAG(DEBUG_UE_TIMING)) {
     stop_meas(&ue->phy_proc_rx[ue->current_thread_id[subframe_rx]]);
     LOG_I(PHY, "------FULL RX PROC [SFN %d]: %5.2f ------\n",subframe_rx,ue->phy_proc_rx[ue->current_thread_id[subframe_rx]].p_time/(cpuf*1000.0));
   }
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 40d35c4a00891e0148d917f16830ec4042bc0be5..5cfb21f8b0305491971053b08a4e26871d56fc2a 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -892,7 +892,7 @@ int main(int argc, char **argv) {
   set_glog_onlinelog(true);
   // enable these lines if you need debug info
   set_glog(loglvl);
-  SET_LOG_DEBUG(UE_TIMING);
+  SET_LOG_DEBUG(DEBUG_UE_TIMING);
   // moreover you need to init itti with the following line
   // however itti will catch all signals, so ctrl-c won't work anymore
   // alternatively you can disable ITTI completely in CMakeLists.txt
diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c
index f10c287a1a7fc2823e194703cc9fb20303dcb3c9..ac50bf62bd6e85a1cc1e6e925aca5ae1966f1059 100644
--- a/openair1/SIMULATION/LTE_PHY/mbmssim.c
+++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c
@@ -989,7 +989,7 @@ int main(int argc, char **argv) {
   set_glog_onlinelog(true);
   // enable these lines if you need debug info
   set_glog(loglvl);
-  SET_LOG_DEBUG(UE_TIMING);
+  set_log_debug("UE_TIMING", true);
   // moreover you need to init itti with the following line
   // however itti will catch all signals, so ctrl-c won't work anymore
   // alternatively you can disable ITTI completely in CMakeLists.txt
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 14e3c696965093522c24b7709050f445b6157827..d17f767a2a26d32a673f6c196136e28e30853ac8 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -938,7 +938,7 @@ int main(int argc, char **argv) {
       ndi=0;
       phy_reset_ue(0,0,0);
       UE->UE_mode[eNB_id]=PUSCH;
-      SET_LOG_DEBUG(UE_TIMING);
+      set_log_debug("UE_TIMING", true);
 
       for (trials = 0; trials<n_frames; trials++) {
         //      printf("*");
diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c
index 1730c9181685656535b3ae01f105fbac10aaef73..4b3a12821146e9e1954cd6ae06f21836f73fa60c 100644
--- a/openair1/SIMULATION/NR_PHY/dlschsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlschsim.c
@@ -497,7 +497,8 @@ int main(int argc, char **argv)
   dlsch0_ue->dlsch_config.tbslbrm = Tbslbrm;
 	printf("harq process ue mcs = %d Qm = %d, symb %d\n", dlsch0_ue->dlsch_config.mcs, dlsch0_ue->dlsch_config.qamModOrder, nb_symb_sch);
 
-	unsigned char *test_input=dlsch->harq_process.pdu;
+  uint8_t test_input[TBS / 8 + 4]; // + 3 for CRC + 1 additional byte, see nr_dlsch_encoding()
+  dlsch->harq_process.pdu = test_input;
 	//unsigned char test_input[TBS / 8]  __attribute__ ((aligned(16)));
 	for (i = 0; i < TBS / 8; i++)
 		test_input[i] = (unsigned char) rand();
@@ -656,13 +657,11 @@ int main(int argc, char **argv)
 
   reset_DLSCH_struct(gNB, &msgDataTx);
 
-  int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
   for (int i = 0; i < nb_slots_to_set; ++i)
     free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list);
   free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list);
 
-  free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface);
-
   abortTpool(&gNB->threadPool);
 
   phy_free_nr_gNB(gNB);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 95a5b9ea647ea467bd9fc54e946cbe1a30b71a69..236913d3f89b2dc97bed7d8e1e03808d8ca37e37 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -107,7 +107,6 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
 double cpuf;
 char *uecap_file;
 
-int sl_ahead = 0;
 //uint8_t nfapi_mode = 0;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
 THREAD_STRUCT thread_struct;
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
index ba5c2bf025d7d4881f1185767a50bbf4624625fa..d55322156b3a2a3a5b53d9f48a62f5a460ce30d7 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
@@ -15,6 +15,8 @@ int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) { return (0); }
 int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) { return (0); }
 int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return 0; }
 
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) { }
+
 int pack_nr_srs_beamforming_report(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen) { return 0; }
 int unpack_nr_srs_beamforming_report(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen) { return 0; }
 int pack_nr_srs_normalized_channel_iq_matrix(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen) { return 0; }
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index b6d92b9b8109d7d2a3bb6376b027d78cfb94b37f..b77b4ad7866af936b7c15cea185fb574432856eb 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -782,7 +782,7 @@ int main(int argc, char **argv)
 
   free_channel_desc_scm(gNB2UE);
 
-  int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
   for (int i = 0; i < nb_slots_to_set; ++i)
     free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list);
   free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list);
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index 5eab1c69748086522f58f0e6bd3b7df2d186900c..db3631276c8f2077af8badebace559bf169fa9dd 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -83,7 +83,6 @@ openair0_config_t openair0_cfg[MAX_CARDS];
 //uint8_t nfapi_mode=0;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
 int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
-int sl_ahead = 0;
 uint32_t N_RB_DL = 106;
 
 NR_IF_Module_t *NR_IF_Module_init(int Mod_id) { return (NULL); }
@@ -403,7 +402,7 @@ int main(int argc, char **argv){
   // Configure log
   logInit();
   set_glog(loglvl);
-  SET_LOG_DEBUG(PRACH); 
+  SET_LOG_DEBUG(DEBUG_PRACH);
 
   // Configure gNB and RU
   RC.gNB = (PHY_VARS_gNB**) malloc(2*sizeof(PHY_VARS_gNB *));
@@ -825,7 +824,7 @@ int main(int argc, char **argv){
 
   phy_free_nr_gNB(gNB);
   // allocated in set_tdd_config_nr()
-  int nb_slots_to_set = TDD_CONFIG_NB_FRAMES*(1<<mu)*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int nb_slots_to_set = (1<<mu)*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
   free(gNB->gNB_config.prach_config.num_prach_fd_occasions_list);
   for (int i = 0; i < nb_slots_to_set; ++i)
     free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list);
diff --git a/openair1/SIMULATION/NR_PHY/pucchsim.c b/openair1/SIMULATION/NR_PHY/pucchsim.c
index ab73a13626b55c0ccc45ae23f70897c4e869092a..62aa21f5f768f5b52d927ddb5557480e0a6895ac 100644
--- a/openair1/SIMULATION/NR_PHY/pucchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pucchsim.c
@@ -762,7 +762,7 @@ int main(int argc, char **argv)
   free_channel_desc_scm(UE2gNB);
   term_freq_channel();
 
-  int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
   for (int i = 0; i < nb_slots_to_set; ++i)
     free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list);
   free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list);
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index 8a398529959dcbc6c4b86e8466a66b9b6774ddb3..19f48c5d3cc6e9b578199ec2555a137dccc71ed4 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -598,13 +598,11 @@ int main(int argc, char **argv)
 
   free_nr_ue_ul_harq(UE->ul_harq_processes, NR_MAX_ULSCH_HARQ_PROCESSES, UE->frame_parms.N_RB_UL, UE->frame_parms.nb_antennas_tx);
 
-  int nb_slots_to_set = TDD_CONFIG_NB_FRAMES * (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
   for (int i = 0; i < nb_slots_to_set; ++i)
     free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list);
   free(gNB->gNB_config.tdd_table.max_tdd_periodicity_list);
 
-  free_nrLDPC_coding_interface(&gNB->nrLDPC_coding_interface);
-
   term_nr_ue_signal(UE, 1);
   free(UE);
 
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index ffc6690b42461213b13857cdeafbf651d6176e27..301beb19f5adaaed52090e08fac914698df19019 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -106,9 +106,6 @@ RAN_CONTEXT_t RC;
 char *uecap_file;
 int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
 
-int sf_ahead = 4;
-int slot_ahead=6 ;
-int sl_ahead = 0;
 double cpuf;
 //uint8_t nfapi_mode = 0;
 uint64_t downlink_frequency[MAX_NUM_CCs][4];
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c
index 093bb2d0006c6a7bd5f1d0a41adafe9e63a210a9..6e0f78d3abf41fb58c2e179ea60143a1871f96fd 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c
@@ -54,9 +54,9 @@ void display_frame_configuration(NR_DL_FRAME_PARMS *frame_parms) {
   printf("\nTdd configuration tti %d downlink %d uplink %d period %d \n", frame_parms->slots_per_subframe, frame_parms->p_tdd_UL_DL_Configuration->nrofDownlinkSlots,
       frame_parms->p_tdd_UL_DL_Configuration->nrofUplinkSlots, frame_parms->p_tdd_UL_DL_Configuration->dl_UL_TransmissionPeriodicity);
 
-  int k = (TDD_CONFIG_NB_FRAMES * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) - 1; //19;
+  int k = NR_NUMBER_OF_SUBFRAMES_PER_FRAME - 1;
   int tti = 0;
-  for (int j = 0; j < TDD_CONFIG_NB_FRAMES * frame_parms->slots_per_frame; j++) {
+  for (int j = 0; j < frame_parms->slots_per_frame; j++) {
     int frame = 0;
     if (j != 0) {
       frame = j / frame_parms->slots_per_frame;
@@ -81,7 +81,7 @@ void display_frame_configuration(NR_DL_FRAME_PARMS *frame_parms) {
     }
     if (j == k) {
       printf("\n");
-      k += (TDD_CONFIG_NB_FRAMES * NR_NUMBER_OF_SUBFRAMES_PER_FRAME); // 20
+      k += NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
     }
   }
   printf("\n");
diff --git a/openair2/COMMON/e1ap_messages_def.h b/openair2/COMMON/e1ap_messages_def.h
index 5001f72885bc834f94c480ef12e474a819e0ba7b..a5b9422f1499ad6dcddc113d9657ccc678c92e47 100644
--- a/openair2/COMMON/e1ap_messages_def.h
+++ b/openair2/COMMON/e1ap_messages_def.h
@@ -26,11 +26,11 @@ MESSAGE_DEF(E1AP_REGISTER_REQ, MESSAGE_PRIORITY_MED, e1ap_register_req_t, e1ap_r
 MESSAGE_DEF(E1AP_LOST_CONNECTION, MESSAGE_PRIORITY_MED, e1ap_lost_connection_t, e1ap_lost_connection)
 
 /* E1AP Interface Management Messages */
-/* E1AP Setup Request: gNB-CU-UP -> gNB-CU-CP */
+/* GNB-CU-UP E1 Setup Request: gNB-CU-UP -> gNB-CU-CP */
 MESSAGE_DEF(E1AP_SETUP_REQ  , MESSAGE_PRIORITY_MED , e1ap_setup_req_t , e1ap_setup_req)
-/* E1AP Setup Response: gNB-CU-CP -> gNB-CU-UP */
+/* GNB-CU-UP E1 Setup Response: gNB-CU-CP -> gNB-CU-UP */
 MESSAGE_DEF(E1AP_SETUP_RESP , MESSAGE_PRIORITY_MED, e1ap_setup_resp_t , e1ap_setup_resp)
-/* E1AP Setup Failure: gNB-CU-CP -> gNB-CU-UP */
+/* GNB-CU-UP E1 Setup Failure: gNB-CU-CP -> gNB-CU-UP */
 MESSAGE_DEF(E1AP_SETUP_FAIL, MESSAGE_PRIORITY_MED, e1ap_setup_fail_t, e1ap_setup_fail)
 
 /* E1AP Bearer Context Management Procedures */
diff --git a/openair2/COMMON/e1ap_messages_types.h b/openair2/COMMON/e1ap_messages_types.h
index 3d096c33e0b9804b14405d3ff8880810111f1552..7fed0969710c4c8727d599e2b7e4222cabd93d87 100644
--- a/openair2/COMMON/e1ap_messages_types.h
+++ b/openair2/COMMON/e1ap_messages_types.h
@@ -40,6 +40,9 @@
 #define E1AP_MAX_NUM_DRBS 32
 #define E1AP_MAX_NUM_UP_PARAM 4
 #define E1AP_SECURITY_KEY_SIZE 16 // keys have 128 bits length
+#define E1AP_MAX_TL_ADDRESSES 16
+#define E1AP_MAX_GTP_TL_ADDRESSES 16
+#define E1AP_MAX_NUM_ERRORS 256
 
 #define E1AP_REGISTER_REQ(mSGpTR)                         (mSGpTR)->ittiMsg.e1ap_register_req
 #define E1AP_SETUP_REQ(mSGpTR)                            (mSGpTR)->ittiMsg.e1ap_setup_req
@@ -55,6 +58,80 @@
 
 typedef net_ip_address_t e1ap_net_ip_address_t;
 
+typedef enum {
+    E1AP_RADIO_CAUSE_UNSPECIFIED = 0,
+    E1AP_RADIO_CAUSE_UNKNOWN_ALREADY_ALLOCATED_GNB_CU_CP_UE_E1AP_ID,
+    E1AP_RADIO_CAUSE_UNKNOWN_ALREADY_ALLOCATED_GNB_CU_UP_UE_E1AP_ID,
+    E1AP_RADIO_CAUSE_UNKNOWN_INCONSISTENT_PAIR_UE_E1AP_ID,
+    E1AP_RADIO_CAUSE_INTERACTION_WITH_OTHER_PROCEDURE,
+    E1AP_RADIO_CAUSE_PDCP_COUNT_WRAP_AROUND,
+    E1AP_RADIO_CAUSE_UNSUPPORTED_QCI_VALUE,
+    E1AP_RADIO_CAUSE_UNSUPPORTED_5QI_VALUE,
+    E1AP_RADIO_CAUSE_ENCRYPTION_ALGORITHMS_NOT_SUPPORTED,
+    E1AP_RADIO_CAUSE_INTEGRITY_PROTECTION_ALGORITHMS_NOT_SUPPORTED,
+    E1AP_RADIO_CAUSE_UP_INTEGRITY_PROTECTION_NOT_POSSIBLE,
+    E1AP_RADIO_CAUSE_UP_CONFIDENTIALITY_PROTECTION_NOT_POSSIBLE,
+    E1AP_RADIO_CAUSE_MULTIPLE_PDU_SESSION_ID_INSTANCES,
+    E1AP_RADIO_CAUSE_UNKNOWN_PDU_SESSION_ID,
+    E1AP_RADIO_CAUSE_MULTIPLE_QOS_FLOW_ID_INSTANCES,
+    E1AP_RADIO_CAUSE_UNKNOWN_QOS_FLOW_ID,
+    E1AP_RADIO_CAUSE_MULTIPLE_DRB_ID_INSTANCES,
+    E1AP_RADIO_CAUSE_UNKNOWN_DRB_ID,
+    E1AP_RADIO_CAUSE_INVALID_QOS_COMBINATION,
+    E1AP_RADIO_CAUSE_PROCEDURE_CANCELLED,
+    E1AP_RADIO_CAUSE_NORMAL_RELEASE,
+    E1AP_RADIO_CAUSE_NO_RADIO_RESOURCES_AVAILABLE,
+    E1AP_RADIO_CAUSE_ACTION_DESIRABLE_FOR_RADIO_REASONS,
+    E1AP_RADIO_CAUSE_RESOURCES_NOT_AVAILABLE_FOR_SLICE,
+    E1AP_RADIO_CAUSE_PDCP_CONFIG_NOT_SUPPORTED,
+    E1AP_RADIO_CAUSE_UE_DL_MAX_INTEGRITY_PROTECTED_DATA_RATE_REASON,
+    E1AP_RADIO_CAUSE_UP_INTEGRITY_PROTECTION_FAILURE,
+    E1AP_RADIO_CAUSE_RELEASE_DUE_TO_PREEMPTION,
+    E1AP_RADIO_CAUSE_RSN_NOT_AVAILABLE_FOR_UP,
+    E1AP_RADIO_CAUSE_NPN_NOT_SUPPORTED,
+    E1AP_RADIO_CAUSE_OTHER
+} e1ap_cause_radio_t;
+
+typedef enum {
+    E1AP_TRANSPORT_CAUSE_UNSPECIFIED = 0,
+    E1AP_TRANSPORT_CAUSE_RESOURCE_UNAVAILABLE,
+    E1AP_TRANSPORT_CAUSE_UNKNOWN_TNL_ADDRESS_FOR_IAB,
+    E1AP_TRANSPORT_CAUSE_OTHER
+} e1ap_cause_transport_t;
+
+typedef enum {
+    E1AP_PROTOCOL_CAUSE_TRANSFER_SYNTAX_ERROR = 0,
+    E1AP_PROTOCOL_CAUSE_ABSTRACT_SYNTAX_ERROR_REJECT,
+    E1AP_PROTOCOL_CAUSE_ABSTRACT_SYNTAX_ERROR_IGNORE_NOTIFY,
+    E1AP_PROTOCOL_CAUSE_MESSAGE_NOT_COMPATIBLE_WITH_RECEIVER_STATE,
+    E1AP_PROTOCOL_CAUSE_SEMANTIC_ERROR,
+    E1AP_PROTOCOL_CAUSE_ABSTRACT_SYNTAX_ERROR_FALSELY_CONSTRUCTED_MESSAGE,
+    E1AP_PROTOCOL_CAUSE_UNSPECIFIED,
+    E1AP_PROTOCOL_CAUSE_OTHER
+} e1ap_cause_protocol_t;
+
+typedef enum {
+    E1AP_MISC_CAUSE_CONTROL_PROCESSING_OVERLOAD,
+    E1AP_MISC_CAUSE_NOT_ENOUGH_USER_PLANE_PROCESSING_RESOURCES,
+    E1AP_MISC_CAUSE_HARDWARE_FAILURE,
+    E1AP_MISC_CAUSE_OM_INTERVENTION,
+    E1AP_MISC_CAUSE_UNSPECIFIED,
+    E1AP_MISC_CAUSE_OTHER
+} e1ap_cause_misc_t;
+
+typedef enum e1ap_cause_group_e {
+  E1AP_CAUSE_NOTHING,
+  E1AP_CAUSE_RADIO_NETWORK,
+  E1AP_CAUSE_TRANSPORT,
+  E1AP_CAUSE_PROTOCOL,
+  E1AP_CAUSE_MISC
+} e1ap_cause_group_t;
+
+typedef struct e1ap_cause_s {
+  e1ap_cause_group_t type;
+  uint8_t value;
+} e1ap_cause_t;
+
 typedef enum BEARER_CONTEXT_STATUS_e {
   BEARER_ACTIVE = 0,
   BEARER_SUSPEND,
@@ -72,12 +149,59 @@ typedef enum cell_group_id_e {
   SCG,
 } cell_group_id_t;
 
+typedef enum CN_Support_e {
+  cn_support_EPC = 0,
+  cn_support_5GC,
+} cn_Support_t;
+
 typedef struct PLMN_ID_s {
   int mcc;
   int mnc;
   int mnc_digit_length;
 } PLMN_ID_t;
 
+typedef enum { CRITICALITY_REJECT = 0, CRITICALITY_IGNORE, CRITICALITY_NOTIFY } criticality_t;
+
+typedef enum {
+  ERROR_TYPE_NOT_UNDERSTOOD = 0,
+  ERROR_TYPE_MISSING,
+} error_type_t;
+
+typedef enum {
+  TRIGGERING_MSG_INITIATING = 0,
+  TRIGGERING_MSG_SUCCESSFUL_OUTCOME,
+  TRIGGERING_MSG_UNSUCCESSFUL_OUTCOME
+} triggering_msg_t;
+
+typedef struct criticality_diagnostics_ie_s {
+  criticality_t criticality;
+  int ie_id;
+  error_type_t error_type;
+} criticality_diagnostics_ie_t;
+
+typedef struct criticality_diagnostics_s {
+  int *procedure_code;
+  triggering_msg_t *triggering_msg;
+  criticality_t *procedure_criticality;
+  int num_errors;
+  criticality_diagnostics_ie_t errors[E1AP_MAX_NUM_ERRORS];
+} criticality_diagnostics_t;
+
+typedef struct {
+  in_addr_t ipsec_tl_address;
+  uint8_t num_gtp_tl_addresses;
+  in_addr_t gtp_tl_addresses[E1AP_MAX_GTP_TL_ADDRESSES];
+} tnl_address_info_item_t;
+
+typedef struct {
+  // Transport UP LayerAddresses Info to Add List
+  tnl_address_info_item_t addresses_to_add[E1AP_MAX_TL_ADDRESSES];
+  uint8_t num_addresses_to_add;
+  // Transport UP Layer Addresses Info to Remove List
+  tnl_address_info_item_t addresses_to_remove[E1AP_MAX_TL_ADDRESSES];
+  uint8_t num_addresses_to_remove;
+} tnl_address_info_t;
+
 typedef nssai_t e1ap_nssai_t;
 
 typedef struct e1ap_net_config_t {
@@ -91,11 +215,14 @@ typedef struct e1ap_net_config_t {
   uint16_t remotePortN3;
 } e1ap_net_config_t;
 
+/* GNB-CU-UP E1 Setup Request */
 typedef struct e1ap_setup_req_s {
   uint64_t              gNB_cu_up_id;
   char *                gNB_cu_up_name;
   uint64_t              transac_id;
   int                   supported_plmns;
+  // CN Support
+  cn_Support_t cn_support;
   struct {
     PLMN_ID_t id;
     int supported_slices;
@@ -103,6 +230,11 @@ typedef struct e1ap_setup_req_s {
   } plmn[E1AP_MAX_NUM_PLMNS];
 } e1ap_setup_req_t;
 
+typedef struct e1ap_cucp_setup_req_s {
+  char* gNB_cu_cp_name;
+  uint64_t transac_id;
+} e1ap_cucp_setup_req_t;
+
 typedef struct e1ap_register_req_t {
   e1ap_setup_req_t setup_req;
   e1ap_net_config_t net_config;
@@ -110,12 +242,20 @@ typedef struct e1ap_register_req_t {
 } e1ap_register_req_t;
 
 typedef struct e1ap_setup_resp_s {
+  // Transaction ID
   long transac_id;
+  // gNB-CU-CP Name
+  char* gNB_cu_cp_name;
+  // Transport Network Layer Address Info
+  tnl_address_info_t* tnla_info;
 } e1ap_setup_resp_t;
 
 /* E1AP Setup Failure */
 typedef struct e1ap_setup_fail_s {
   long transac_id;
+  e1ap_cause_t cause;
+  long *time_to_wait;
+  criticality_diagnostics_t *crit_diag;
 } e1ap_setup_fail_t;
 
 typedef struct up_params_s {
diff --git a/openair2/COMMON/ngap_messages_def.h b/openair2/COMMON/ngap_messages_def.h
index 87d8a59fbad58e2a637ca762c29efd5182582752..62498698f2b9f520a9bb2d825685ad00318a9c86 100644
--- a/openair2/COMMON/ngap_messages_def.h
+++ b/openair2/COMMON/ngap_messages_def.h
@@ -69,7 +69,6 @@ MESSAGE_DEF(NGAP_UE_CONTEXT_RELEASE_COMPLETE, MESSAGE_PRIORITY_MED, ngap_ue_rele
 MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_RESP , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_resp_t , ngap_ue_ctxt_modification_resp)
 MESSAGE_DEF(NGAP_UE_CTXT_MODIFICATION_FAIL , MESSAGE_PRIORITY_MED, ngap_ue_ctxt_modification_fail_t , ngap_ue_ctxt_modification_fail)
 MESSAGE_DEF(NGAP_PDUSESSION_SETUP_RESP          , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_resp_t          , ngap_pdusession_setup_resp)
-MESSAGE_DEF(NGAP_PDUSESSION_SETUP_REQUEST_FAIL  , MESSAGE_PRIORITY_MED, ngap_pdusession_setup_req_fail_t      , ngap_pdusession_setup_request_fail)
 MESSAGE_DEF(NGAP_PDUSESSION_MODIFY_RESP          , MESSAGE_PRIORITY_MED, ngap_pdusession_modify_resp_t          , ngap_pdusession_modify_resp)
 MESSAGE_DEF(NGAP_PDUSESSION_RELEASE_RESPONSE    , MESSAGE_PRIORITY_MED, ngap_pdusession_release_resp_t        , ngap_pdusession_release_resp)
 MESSAGE_DEF(NGAP_PATH_SWITCH_REQ           , MESSAGE_PRIORITY_MED, ngap_path_switch_req_t           , ngap_path_switch_req)
diff --git a/openair2/COMMON/ngap_messages_types.h b/openair2/COMMON/ngap_messages_types.h
index c4d2cd011a7fa11c0da77198ec09880d2ff7b04b..31b7abd3f856b8a2f9300bc7f7974cf2962dd8d3 100644
--- a/openair2/COMMON/ngap_messages_types.h
+++ b/openair2/COMMON/ngap_messages_types.h
@@ -51,7 +51,6 @@
 #define NGAP_UE_CTXT_MODIFICATION_RESP(mSGpTR)  (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_resp
 #define NGAP_UE_CTXT_MODIFICATION_FAIL(mSGpTR)  (mSGpTR)->ittiMsg.ngap_ue_ctxt_modification_fail
 #define NGAP_PDUSESSION_SETUP_RESP(mSGpTR)           (mSGpTR)->ittiMsg.ngap_pdusession_setup_resp
-#define NGAP_PDUSESSION_SETUP_FAIL(mSGpTR) (mSGpTR)->ittiMsg.ngap_pdusession_setup_request_fail
 #define NGAP_PDUSESSION_MODIFY_RESP(mSGpTR)           (mSGpTR)->ittiMsg.ngap_pdusession_modify_resp
 #define NGAP_PATH_SWITCH_REQ(mSGpTR)            (mSGpTR)->ittiMsg.ngap_path_switch_req
 #define NGAP_PATH_SWITCH_REQ_ACK(mSGpTR)        (mSGpTR)->ittiMsg.ngap_path_switch_req_ack
@@ -336,19 +335,21 @@ typedef struct pdusession_modify_s {
   qos_flow_tobe_modified_t qos[QOSFLOW_MAX_VALUE];
 } pdusession_modify_t;
 
-typedef enum ngap_Cause_e {
-  NGAP_CAUSE_NOTHING,  /* No components present */
+/* Cause (9.3.1.2 of 3GPP TS 38.413) */
+typedef enum ngap_cause_group_e {
+  NGAP_CAUSE_NOTHING, /* No components present */
   NGAP_CAUSE_RADIO_NETWORK,
   NGAP_CAUSE_TRANSPORT,
   NGAP_CAUSE_NAS,
   NGAP_CAUSE_PROTOCOL,
   NGAP_CAUSE_MISC,
-  NGAP_Cause_PR_choice_ExtensionS,
-  //Evilish manual duplicate of asn.1 grammar
-  //because it is human work, whereas it can be generated by machine
-  //and because humans manual copy creates bugs
-  //and we create multiple names for the same thing, that is a source of confusion
-} ngap_Cause_t; 
+} ngap_cause_group_t;
+
+/* Cause (9.3.1.2 of 3GPP TS 38.413) */
+typedef struct ngap_cause_s {
+  ngap_cause_group_t type;
+  uint8_t value;
+} ngap_cause_t;
 
 typedef enum ngap_Cause_radio_network_e {
   NGAP_CAUSE_RADIO_NETWORK_UNSPECIFIED,
@@ -378,7 +379,7 @@ typedef enum ngap_Cause_radio_network_e {
   NGAP_CAUSE_RADIO_NETWORK_FAILURE_IN_RADIO_INTERFACE_PROCEDURE,
   NGAP_CAUSE_RADIO_NETWORK_INTERACTION_WITH_OTHER_PROCEDURE,
   NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID,
-  NGAP_CAUSE_RADIO_NETWORK_UNKOWN_QOS_FLOW_ID,
+  NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_QOS_FLOW_ID,
   NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_PDU_SESSION_ID_INSTANCES,
   NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_QOS_FLOW_ID_INSTANCES,
   NGAP_CAUSE_RADIO_NETWORK_ENCRYPTION_AND_OR_INTEGRITY_PROTECTION_ALGORITHMS_NOT_SUPPORTED,
@@ -398,8 +399,12 @@ typedef enum ngap_Cause_radio_network_e {
   NGAP_CAUSE_RADIO_NETWORK_RELEASE_DUE_TO_CN_DETECTED_MOBILITY,
   NGAP_CAUSE_RADIO_NETWORK_N26_INTERFACE_NOT_AVAILABLE,
   NGAP_CAUSE_RADIO_NETWORK_RELEASE_DUE_TO_PRE_EMPTION,
-  NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_LOCATION_REPORTING_REFERENCE_ID_INSTANCES
-} ngap_Cause_radio_network_t;
+  NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_LOCATION_REPORTING_REFERENCE_ID_INSTANCES,
+  NGAP_CAUSE_RADIO_NETWORK_RSN_NOT_AVAILABLE_FOR_THE_UP,
+  NGAP_CAUSE_RADIO_NETWORK_NPN_ACCESS_DENIED,
+  NGAP_CAUSE_RADIO_NETWORK_CAG_ONLY_ACCESS_DENIED,
+  NGAP_CAUSE_RADIO_NETWORK_INSUFFICIENT_UE_CAPABILITIES
+} ngap_cause_radio_network_t;
 
 /**
  * NGAP protocol cause values as per 9.3.1.2 `Cause` section in 3GPP TS 38.413.
@@ -418,8 +423,7 @@ typedef struct pdusession_failed_s {
   /* Unique pdusession_id for the UE. */
   uint8_t pdusession_id;
   /* Cause of the failure */
-  ngap_Cause_t cause;
-  uint8_t cause_value;
+  ngap_cause_t cause;
 } pdusession_failed_t;
 
 typedef enum ngap_ue_ctxt_modification_present_s {
@@ -557,9 +561,8 @@ typedef struct ngap_initial_context_setup_fail_s {
 
   uint64_t amf_ue_ngap_id;
 
-  ngap_Cause_t cause;
-  long cause_value;
-} ngap_initial_context_setup_fail_t, ngap_ue_ctxt_modification_fail_t, ngap_pdusession_setup_req_fail_t;
+  ngap_cause_t cause;
+} ngap_initial_context_setup_fail_t, ngap_ue_ctxt_modification_fail_t;
 
 typedef struct ngap_nas_non_delivery_ind_s {
   uint32_t     gNB_ue_ngap_id;
@@ -803,8 +806,7 @@ typedef struct ngap_ue_release_req_s {
   uint8_t              nb_of_pdusessions;
   /* list of pdusession resource by RRC layers */
   pdusession_release_t pdusessions[NGAP_MAX_PDUSESSION];
-  ngap_Cause_t cause;
-  long                 cause_value;
+  ngap_cause_t cause;
 } ngap_ue_release_req_t, ngap_ue_release_resp_t;
 
 typedef struct ngap_pdusession_modify_req_s {
diff --git a/openair2/COMMON/sctp_messages_types.h b/openair2/COMMON/sctp_messages_types.h
index 313cdfa899e436be4f70bd798088b3533b9555fb..f311fd118a07e773cc46cd3634b925f2e9964d71 100644
--- a/openair2/COMMON/sctp_messages_types.h
+++ b/openair2/COMMON/sctp_messages_types.h
@@ -36,11 +36,22 @@
 #define SCTP_INIT_MSG_MULTI_CNF(mSGpTR)        (mSGpTR)->ittiMsg.sctp_init_msg_multi_cnf
 #define SCTP_CLOSE_ASSOCIATION(mSGpTR)         (mSGpTR)->ittiMsg.sctp_close_association
 
-enum sctp_state_e {
-  SCTP_STATE_CLOSED,
-  SCTP_STATE_SHUTDOWN,
-  SCTP_STATE_ESTABLISHED,
-  SCTP_STATE_UNREACHABLE
+#define SCTP_STATES \
+    ITEM(SCTP_STATE_CLOSED) \
+    ITEM(SCTP_STATE_SHUTDOWN) \
+    ITEM(SCTP_STATE_ESTABLISHED) \
+    ITEM(SCTP_STATE_UNREACHABLE)
+
+typedef enum {
+#define ITEM(state) state,
+    SCTP_STATES
+#undef ITEM
+} sctp_state_e;
+
+static const char *sctp_state_s[] __attribute__((unused)) = {
+#define ITEM(state) #state,
+    SCTP_STATES
+#undef ITEM
 };
 
 typedef struct sctp_new_association_req_s {
@@ -112,7 +123,7 @@ typedef struct sctp_new_association_resp_s {
   uint16_t in_streams;
 
   /* State of the association at SCTP level */
-  enum sctp_state_e sctp_state;
+  sctp_state_e sctp_state;
 } sctp_new_association_resp_t;
 
 typedef struct sctp_data_ind_s {
diff --git a/openair2/E1AP/e1ap.c b/openair2/E1AP/e1ap.c
index 79b326593b00271e94296a84658a14306b348ec6..95046cb65297866a45c71992c55b92c433ad2e50 100644
--- a/openair2/E1AP/e1ap.c
+++ b/openair2/E1AP/e1ap.c
@@ -34,6 +34,7 @@
 #include "gtp_itf.h"
 #include "openair2/LAYER2/nr_pdcp/cucp_cuup_handler.h"
 #include "lib/e1ap_bearer_context_management.h"
+#include "lib/e1ap_interface_management.h"
 
 #define E1AP_NUM_MSG_HANDLERS 14
 typedef int (*e1ap_message_processing_t)(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst, const E1AP_E1AP_PDU_t *message_p);
@@ -161,221 +162,20 @@ int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *Erro
   return -1;
 }
 
-/*
-    E1 Setup: can be sent on both ways, to be refined
-*/
-static void fill_SETUP_REQUEST(e1ap_setup_req_t *setup, E1AP_E1AP_PDU_t *pdu)
-{
-  /* Create */
-  /* 0. pdu Type */
-  pdu->present = E1AP_E1AP_PDU_PR_initiatingMessage;
-  asn1cCalloc(pdu->choice.initiatingMessage, initMsg);
-  initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
-  initMsg->criticality   = E1AP_Criticality_reject;
-  initMsg->value.present       = E1AP_InitiatingMessage__value_PR_GNB_CU_UP_E1SetupRequest;
-  E1AP_GNB_CU_UP_E1SetupRequest_t *e1SetupUP = &initMsg->value.choice.GNB_CU_UP_E1SetupRequest;
-  /* mandatory */
-  /* c1. Transaction ID (integer value) */
-  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC1);
-  ieC1->id                         = E1AP_ProtocolIE_ID_id_TransactionID;
-  ieC1->criticality                = E1AP_Criticality_reject;
-  ieC1->value.present              = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_TransactionID;
-  setup->transac_id = E1AP_get_next_transaction_identifier();
-  ieC1->value.choice.TransactionID = setup->transac_id;
-  LOG_D(E1AP, "Transaction ID of setup request %ld\n", setup->transac_id);
-  /* mandatory */
-  /* c2. GNB_CU_ID (integer value) */
-  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC2);
-  ieC2->id                       = E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID;
-  ieC2->criticality              = E1AP_Criticality_reject;
-  ieC2->value.present            = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_GNB_CU_UP_ID;
-  asn_int642INTEGER(&ieC2->value.choice.GNB_CU_UP_ID, setup->gNB_cu_up_id);
-
-  /* optional */
-  if (setup->gNB_cu_up_name) {
-    asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC3);
-    ieC3->id = E1AP_ProtocolIE_ID_id_gNB_CU_UP_Name;
-    ieC3->criticality = E1AP_Criticality_ignore;
-    ieC3->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_GNB_CU_UP_Name;
-    OCTET_STRING_fromBuf(&ieC3->value.choice.GNB_CU_UP_Name, setup->gNB_cu_up_name, strlen(setup->gNB_cu_up_name));
-  }
-
-  /* mandatory */
-  /* c4. CN Support */
-  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC4);
-  ieC4->id = E1AP_ProtocolIE_ID_id_CNSupport;
-  ieC4->criticality = E1AP_Criticality_reject;
-  ieC4->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport;
-  ieC4->value.choice.CNSupport = E1AP_CNSupport_c_5gc; /* only 5GC supported */
-
-  /* mandatory */
-  /* c5. Supported PLMNs */
-  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC5);
-  ieC5->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs;
-  ieC5->criticality = E1AP_Criticality_reject;
-  ieC5->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List;
-
-  int numSupportedPLMNs = setup->supported_plmns;
-
-  for (int i = 0; i < numSupportedPLMNs; i++) {
-    asn1cSequenceAdd(ieC5->value.choice.SupportedPLMNs_List.list, E1AP_SupportedPLMNs_Item_t, supportedPLMN);
-    /* 5.1 PLMN Identity */
-    PLMN_ID_t *id = &setup->plmn[i].id;
-    MCC_MNC_TO_PLMNID(id->mcc, id->mnc, id->mnc_digit_length, &supportedPLMN->pLMN_Identity);
-
-    int n = setup->plmn[i].supported_slices;
-    if (setup->plmn[i].slice != NULL && n > 0) {
-      supportedPLMN->slice_Support_List = calloc(1, sizeof(*supportedPLMN->slice_Support_List));
-      AssertFatal(supportedPLMN->slice_Support_List != NULL, "out of memory\n");
-      for (int s = 0; s < n; ++s) {
-        asn1cSequenceAdd(supportedPLMN->slice_Support_List->list, E1AP_Slice_Support_Item_t, slice);
-        e1ap_nssai_t *nssai = &setup->plmn[i].slice[s];
-        INT8_TO_OCTET_STRING(nssai->sst, &slice->sNSSAI.sST);
-        if (nssai->sd != 0xffffff) {
-          slice->sNSSAI.sD = malloc(sizeof(*slice->sNSSAI.sD));
-          AssertFatal(slice->sNSSAI.sD != NULL, "out of memory\n");
-          INT24_TO_OCTET_STRING(nssai->sd, slice->sNSSAI.sD);
-        }
-      }
-    }
-  }
-}
-
-static void fill_SETUP_RESPONSE(const e1ap_setup_resp_t *e1ap_setup_resp, E1AP_E1AP_PDU_t *pdu)
-{
-  /* Create */
-  /* 0. pdu Type */
-  pdu->present = E1AP_E1AP_PDU_PR_successfulOutcome;
-  asn1cCalloc(pdu->choice.successfulOutcome, initMsg);
-  initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
-  initMsg->criticality = E1AP_Criticality_reject;
-  initMsg->value.present = E1AP_SuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupResponse;
-  E1AP_GNB_CU_UP_E1SetupResponse_t *out = &pdu->choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse;
-  /* mandatory */
-  /* c1. Transaction ID (integer value) */
-  asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ieC1);
-  ieC1->id                         = E1AP_ProtocolIE_ID_id_TransactionID;
-  ieC1->criticality                = E1AP_Criticality_reject;
-  ieC1->value.present              = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID;
-  ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id;
-}
-
 void e1ap_send_SETUP_RESPONSE(sctp_assoc_t assoc_id, const e1ap_setup_resp_t *e1ap_setup_resp)
 {
-  E1AP_E1AP_PDU_t pdu = {0};
-  fill_SETUP_RESPONSE(e1ap_setup_resp, &pdu);
-  e1ap_encode_send(CPtype, assoc_id, &pdu, 0, __func__);
-}
-
-/**
- * @brief E1 Setup Failure ASN1 messager builder
- * @ref 9.2.1.6 GNB-CU-UP E1 SETUP FAILURE of 3GPP TS 38.463
- */
-static void fill_SETUP_FAILURE(long transac_id, E1AP_E1AP_PDU_t *pdu)
-{
-  /* Create */
-  /* 0. pdu Type */
-  pdu->present = E1AP_E1AP_PDU_PR_unsuccessfulOutcome;
-  asn1cCalloc(pdu->choice.unsuccessfulOutcome, initMsg);
-  /* mandatory */
-  /**
-   * Message Type IE
-   * -  procedureCode (integer)
-   * -  Type of Message (choice)
-   * @ref clause 9.3.1.1 of 3GPP TS 38.463
-   */
-  initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
-  initMsg->criticality = E1AP_Criticality_reject;
-  initMsg->value.present = E1AP_UnsuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupFailure;
-  E1AP_GNB_CU_UP_E1SetupFailure_t *out = &pdu->choice.unsuccessfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure;
-  /* mandatory */
-  /* c1. Transaction ID (integer value), clause 9.3.1.53 of 3GPP TS 38.463 */
-  asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ieC1);
-  ieC1->id                         = E1AP_ProtocolIE_ID_id_TransactionID;
-  ieC1->criticality                = E1AP_Criticality_reject;
-  ieC1->value.present              = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_TransactionID;
-  ieC1->value.choice.TransactionID = transac_id;
-  /* mandatory */
-  /* c2. cause (integer value), clause 9.3.1.2 of 3GPP TS 38.463 */
-  asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ieC2);
-  ieC2->id                         = E1AP_ProtocolIE_ID_id_Cause;
-  ieC2->criticality                = E1AP_Criticality_ignore;
-  ieC2->value.present              = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_Cause;
-  ieC2->value.choice.Cause.present = E1AP_Cause_PR_radioNetwork; //choose this accordingly
-  ieC2->value.choice.Cause.choice.radioNetwork = E1AP_CauseRadioNetwork_unspecified;
+  E1AP_E1AP_PDU_t *pdu = encode_e1ap_cuup_setup_response(e1ap_setup_resp);
+  e1ap_encode_send(CPtype, assoc_id, pdu, 0, __func__);
 }
 
 /**
  * @brief E1 Setup Failure ASN1 messager encoder
  */
-void e1apCUCP_send_SETUP_FAILURE(sctp_assoc_t assoc_id, long transac_id)
+static void e1apCUCP_send_SETUP_FAILURE(sctp_assoc_t assoc_id, const e1ap_setup_fail_t *msg)
 {
-  LOG_D(E1AP, "CU-CP: Encoding E1AP Setup Failure for transac_id %ld...\n", transac_id);
-  E1AP_E1AP_PDU_t pdu = {0};
-  fill_SETUP_FAILURE(transac_id, &pdu);
-  e1ap_encode_send(CPtype, assoc_id, &pdu, 0, __func__);
-}
-
-static void extract_SETUP_REQUEST(const E1AP_E1AP_PDU_t *pdu, e1ap_setup_req_t *req)
-{
-  E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie;
-  E1AP_GNB_CU_UP_E1SetupRequest_t *in = &pdu->choice.initiatingMessage->value.choice.GNB_CU_UP_E1SetupRequest;
-
-  /* transac_id */
-  F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true);
-  req->transac_id = ie->value.choice.TransactionID;
-  LOG_D(E1AP, "gNB CU UP E1 setup request transaction ID: %ld\n", req->transac_id);
-
-  /* gNB CU UP ID */
-  F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID, true);
-  asn_INTEGER2ulong(&ie->value.choice.GNB_CU_UP_ID, &req->gNB_cu_up_id);
-  LOG_D(E1AP, "gNB CU UP ID: %ld\n", req->gNB_cu_up_id);
-
-  /* gNB CU UP name */
-  F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_gNB_CU_UP_Name, false);
-  req->gNB_cu_up_name = NULL;
-  if (ie != NULL) {
-    req->gNB_cu_up_name = calloc(ie->value.choice.GNB_CU_UP_Name.size + 1, sizeof(char));
-    AssertFatal(req->gNB_cu_up_name != NULL, "out of memory\n");
-    memcpy(req->gNB_cu_up_name, ie->value.choice.GNB_CU_UP_Name.buf, ie->value.choice.GNB_CU_UP_Name.size);
-    LOG_D(E1AP, "req->gNB_cu_up_name %s\n", req->gNB_cu_up_name);
-  }
-
-  /* CN Support */
-  F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_CNSupport, true);
-  AssertFatal(ie->value.choice.CNSupport == E1AP_CNSupport_c_5gc, "only 5GC CN Support supported\n");
-
-  /* Supported PLMNs */
-  F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_SupportedPLMNs, true);
-  req->supported_plmns = ie->value.choice.SupportedPLMNs_List.list.count;
-  LOG_D(E1AP, "Number of supported PLMNs: %d\n", req->supported_plmns);
-
-  for (int i = 0; i < req->supported_plmns; i++) {
-    E1AP_SupportedPLMNs_Item_t *supported_plmn_item =
-        (E1AP_SupportedPLMNs_Item_t *)(ie->value.choice.SupportedPLMNs_List.list.array[i]);
-
-    /* PLMN Identity */
-    PLMN_ID_t *id = &req->plmn[i].id;
-    PLMNID_TO_MCC_MNC(&supported_plmn_item->pLMN_Identity, id->mcc, id->mnc, id->mnc_digit_length);
-    LOG_D(E1AP, "MCC %d MNC %d\n", id->mcc, id->mnc);
-
-    /* NSSAI */
-    if (supported_plmn_item->slice_Support_List) {
-      int n = supported_plmn_item->slice_Support_List->list.count;
-      req->plmn[i].supported_slices = n;
-      req->plmn[i].slice = calloc(n, sizeof(*req->plmn[i].slice));
-      AssertFatal(req->plmn[i].slice != NULL, "out of memory\n");
-      for (int s = 0; s < n; ++s) {
-        e1ap_nssai_t *slice = &req->plmn[i].slice[s];
-        const E1AP_SNSSAI_t *es = &supported_plmn_item->slice_Support_List->list.array[s]->sNSSAI;
-        OCTET_STRING_TO_INT8(&es->sST, slice->sst);
-        slice->sd = 0xffffff;
-        if (es->sD != NULL)
-          OCTET_STRING_TO_INT24(es->sD, slice->sd);
-        LOG_D(E1AP, "SST %d SD %06x\n", slice->sst, slice->sd);
-      }
-    }
-  }
+  LOG_D(E1AP, "CU-CP: Encoding E1AP Setup Failure for transac_id %ld...\n", msg->transac_id);
+  E1AP_E1AP_PDU_t *pdu = encode_e1ap_cuup_setup_failure(msg);
+  e1ap_encode_send(CPtype, assoc_id, pdu, 0, __func__);
 }
 
 int e1apCUCP_handle_SETUP_REQUEST(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst, const E1AP_E1AP_PDU_t *pdu)
@@ -383,13 +183,20 @@ int e1apCUCP_handle_SETUP_REQUEST(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst,
   DevAssert(pdu != NULL);
   /* Create ITTI message and send to queue */
   MessageDef *msg_p = itti_alloc_new_message(TASK_CUCP_E1, 0 /*unused by callee*/, E1AP_SETUP_REQ);
-  extract_SETUP_REQUEST(pdu, &E1AP_SETUP_REQ(msg_p));
+  // Decode E1 CU-UP Setup Request
+  if (!decode_e1ap_cuup_setup_request(pdu, &E1AP_SETUP_REQ(msg_p))) {
+    free_e1ap_cuup_setup_request(&E1AP_SETUP_REQ(msg_p));
+    return -1;
+  }
+
   msg_p->ittiMsgHeader.originInstance = assoc_id;
 
   if (E1AP_SETUP_REQ(msg_p).supported_plmns > 0) {
     itti_send_msg_to_task(TASK_RRC_GNB, 0 /*unused by callee*/, msg_p);
   } else {
-    e1apCUCP_send_SETUP_FAILURE(assoc_id, E1AP_SETUP_REQ(msg_p).transac_id);
+    e1ap_cause_t cause = { .type = E1AP_CAUSE_PROTOCOL, .value = E1AP_PROTOCOL_CAUSE_SEMANTIC_ERROR};
+    e1ap_setup_fail_t setup_fail = {.transac_id = E1AP_SETUP_REQ(msg_p).transac_id, .cause = cause};
+    e1apCUCP_send_SETUP_FAILURE(assoc_id, &setup_fail);
     itti_free(TASK_CUCP_E1, msg_p);
     return -1;
   }
@@ -399,28 +206,19 @@ int e1apCUCP_handle_SETUP_REQUEST(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst,
 
 int e1apCUUP_handle_SETUP_RESPONSE(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst, const E1AP_E1AP_PDU_t *pdu)
 {
-  LOG_D(E1AP, "%s\n", __func__);
-  DevAssert(pdu->present == E1AP_E1AP_PDU_PR_successfulOutcome);
-  DevAssert(pdu->choice.successfulOutcome->procedureCode  == E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup);
-  DevAssert(pdu->choice.successfulOutcome->criticality  == E1AP_Criticality_reject);
-  DevAssert(pdu->choice.successfulOutcome->value.present  == E1AP_SuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupResponse);
-  const E1AP_GNB_CU_UP_E1SetupResponse_t  *in = &pdu->choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse;
-  E1AP_GNB_CU_UP_E1SetupResponseIEs_t *ie;
-
-  /* transac_id */
-  long transaction_id;
+  // Decode E1 CU-UP Setup Response
+  e1ap_setup_resp_t out = {0};
+  if (!decode_e1ap_cuup_setup_response(pdu, &out)) {
+    free_e1ap_cuup_setup_response(&out);
+    return -1;
+  }
   long old_transaction_id = inst->cuup.setupReq.transac_id;
-  F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true);
-  transaction_id = ie->value.choice.TransactionID;
-  LOG_D(E1AP, "gNB CU UP E1 setup response transaction ID: %ld\n", transaction_id);
-
-  if (old_transaction_id != transaction_id)
-    LOG_E(E1AP, "Transaction IDs do not match %ld != %ld\n", old_transaction_id, transaction_id);
-
-  E1AP_free_transaction_identifier(transaction_id);
-
-  /* do the required processing */
-
+  if (old_transaction_id != out.transac_id) {
+    LOG_E(E1AP, "Transaction IDs do not match %ld != %ld\n", old_transaction_id, out.transac_id);
+    free_e1ap_cuup_setup_response(&out);
+    return -1;
+  }
+  free_e1ap_cuup_setup_response(&out);
   return 0;
 }
 
@@ -1276,11 +1074,19 @@ static void e1_task_send_sctp_association_req(long task_id, instance_t instance,
 
 static void e1apCUUP_send_SETUP_REQUEST(sctp_assoc_t assoc_id, e1ap_setup_req_t *setup)
 {
-  E1AP_E1AP_PDU_t pdu = {0};
-  fill_SETUP_REQUEST(setup, &pdu);
-  e1ap_encode_send(UPtype, assoc_id, &pdu, 0, __func__);
+  setup->transac_id = E1AP_get_next_transaction_identifier();
+  LOG_D(E1AP, "Transaction ID of setup request %ld\n", setup->transac_id);
+  E1AP_E1AP_PDU_t *pdu = encode_e1ap_cuup_setup_request(setup);
+  e1ap_encode_send(UPtype, assoc_id, pdu, 0, __func__);
 }
 
+/**
+ * @brief SCTP association response handler (CU-CP to/from CU-UP)
+ * it behaves differently depending on the type of E1 instance,
+ * CUCP: informs RRC of E1 connection loss with CU-UP
+ * CUUP: triggers a new SCTP association request by sending an ITTI to the CU-UP task
+ * @param type indicates whether the handler is for the CU-CP or CU-UP
+ */
 static void e1_task_handle_sctp_association_resp(E1_t type,
                                                  instance_t instance,
                                                  sctp_new_association_resp_t *sctp_new_association_resp)
@@ -1288,24 +1094,26 @@ static void e1_task_handle_sctp_association_resp(E1_t type,
   DevAssert(sctp_new_association_resp != NULL);
   getCxtE1(instance)->sockState = sctp_new_association_resp->sctp_state;
 
-  if (sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN) {
-    LOG_I(E1AP, "Received SCTP shutdown for assoc_id %d, removing CUCP endpoint\n", sctp_new_association_resp->assoc_id);
-    /* inform RRC that the CU-UP is gone */
-    MessageDef *message_p = itti_alloc_new_message(TASK_CUCP_E1, 0, E1AP_LOST_CONNECTION);
-    message_p->ittiMsgHeader.originInstance = sctp_new_association_resp->assoc_id;
-    itti_send_msg_to_task(TASK_RRC_GNB, instance, message_p);
-    return;
-  }
-
+  // Handle SCTP establishment failure
   if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) {
-    LOG_W(E1AP,
-          "Received unsuccessful result for SCTP association (%u), instance "
-          "%ld, cnx_id %u\n",
-          sctp_new_association_resp->sctp_state,
-          instance,
-          sctp_new_association_resp->ulp_cnx_id);
-    long timer_id; // if we want to cancel timer
-    timer_setup(1, 0, TASK_CUUP_E1, 0, TIMER_ONE_SHOT, NULL, &timer_id);
+    if (type == CPtype) {
+      // Inform RRC that the CU-UP is gone
+      LOG_W(E1AP,
+            "Lost connection (%s) with CU-UP (assoc_id %d)\n",
+            sctp_state_s[sctp_new_association_resp->sctp_state],
+            sctp_new_association_resp->assoc_id);
+      MessageDef *message_p = itti_alloc_new_message(TASK_CUCP_E1, 0, E1AP_LOST_CONNECTION);
+      message_p->ittiMsgHeader.originInstance = sctp_new_association_resp->assoc_id;
+      itti_send_msg_to_task(TASK_RRC_GNB, instance, message_p);
+    } else if (type == UPtype) {
+      // Trigger new E1 association when no CU-CP is connected
+      LOG_W(E1AP,
+            "Lost connection (%s) with CU-CP (assoc_id %d): trigger new E1 association\n",
+            sctp_state_s[sctp_new_association_resp->sctp_state],
+            sctp_new_association_resp->assoc_id);
+      long timer_id;
+      timer_setup(1, 0, TASK_CUUP_E1, 0, TIMER_ONE_SHOT, NULL, &timer_id);
+    }
     return;
   }
 
@@ -1373,7 +1181,11 @@ void e1_task_handle_sctp_association_ind(E1_t type, instance_t instance, sctp_ne
     inst->cuup.assoc_id = sctp_new_ind->assoc_id;
 }
 
-void e1apHandleTimer(instance_t myInstance)
+/**
+ * @brief Handle the timer triggered by a connection loss with CU-CP
+ *        it uses a stored network configuration and send a new SCTP association request
+ */
+static void e1apHandleTimer(instance_t myInstance)
 {
   LOG_W(E1AP, "Try to reconnect to CP\n");
   if (getCxtE1(myInstance)->sockState != SCTP_STATE_ESTABLISHED)
@@ -1430,10 +1242,12 @@ void *E1AP_CUCP_task(void *arg)
 
       case E1AP_SETUP_RESP:
         e1ap_send_SETUP_RESPONSE(assoc_id, &E1AP_SETUP_RESP(msg));
+        free_e1ap_cuup_setup_response(&E1AP_SETUP_RESP(msg));
         break;
 
       case E1AP_SETUP_FAIL:
-        e1apCUCP_send_SETUP_FAILURE(assoc_id, E1AP_SETUP_FAIL(msg).transac_id);
+        e1apCUCP_send_SETUP_FAILURE(assoc_id, &E1AP_SETUP_FAIL(msg));
+        free_e1ap_cuup_setup_failure(&E1AP_SETUP_FAIL(msg));
         break;
 
       case E1AP_BEARER_CONTEXT_SETUP_REQ:
@@ -1483,6 +1297,8 @@ void *E1AP_CUUP_task(void *arg)
     LOG_D(E1AP, "CUUP received %s for instance %ld\n", messages_info[msgType].name, myInstance);
     switch (msgType) {
       case E1AP_REGISTER_REQ: {
+        /* E1AP Register Request triggered at startup
+        create a new E1 instance and send the first association request */
         e1ap_register_req_t *reg_req = &E1AP_REGISTER_REQ(msg);
         createE1inst(UPtype, myInstance, reg_req->gnb_id, &reg_req->net_config, &reg_req->setup_req);
         e1_task_send_sctp_association_req(TASK_CUUP_E1, myInstance, &reg_req->net_config);
@@ -1490,6 +1306,8 @@ void *E1AP_CUUP_task(void *arg)
 
       case SCTP_NEW_ASSOCIATION_RESP:
         e1_task_handle_sctp_association_resp(UPtype, myInstance, &msg->ittiMsg.sctp_new_association_resp);
+        if (getCxtE1(myInstance)->sockState == SCTP_STATE_ESTABLISHED)
+          LOG_A(E1AP, "E1 connection established (%s)\n", sctp_state_s[getCxtE1(myInstance)->sockState]);
         break;
 
       case SCTP_DATA_IND:
@@ -1497,6 +1315,7 @@ void *E1AP_CUUP_task(void *arg)
         break;
 
       case TIMER_HAS_EXPIRED:
+        // Timer triggered by a connection loss with CU-CP
         e1apHandleTimer(myInstance);
         break;
 
diff --git a/openair2/E1AP/e1ap_common.h b/openair2/E1AP/e1ap_common.h
index 4acc606bec08b09e0931c799d48ebacb673ab35d..452762965c8a9af04169773eb0df63db9900beb9 100644
--- a/openair2/E1AP/e1ap_common.h
+++ b/openair2/E1AP/e1ap_common.h
@@ -31,7 +31,7 @@ typedef struct e1ap_upcp_inst_s {
   instance_t instance;
   uint32_t gnb_id; // associated gNB's ID, unused in E1 but necessary for e.g. E2 agent
   E1_t type;
-  enum sctp_state_e sockState;
+  sctp_state_e sockState;
   struct {
     sctp_assoc_t assoc_id;
     e1ap_setup_req_t setupReq;
diff --git a/openair2/E1AP/e1ap_setup.c b/openair2/E1AP/e1ap_setup.c
index fc59a881fa8a38f5a93d5a920cb2f6f18e713df2..b1654a1788a5df8455cbe8b1b026c81fea01b3b5 100644
--- a/openair2/E1AP/e1ap_setup.c
+++ b/openair2/E1AP/e1ap_setup.c
@@ -67,6 +67,17 @@ static void get_NGU_S1U_addr(char **addr, uint16_t *port)
   return;
 }
 
+/**
+ * @brief Prepares an E1AP_REGISTER_REQ message for gNB-CU-UP/CP registration
+ *
+ * This function creates and populates an E1AP_REGISTER_REQ message using system
+ * configuration parameters. It supports both integrated CU-CP/UP and E1 splits,
+ * fetching RAN, PLMN, NSSAIs, and network configuration.
+ *
+ * @param entity Specifies the entity type (CU-CP or CU-UP. If NULL, assumes integrated CU-CP/UP
+ *
+ * @return A pointer to the E1AP_REGISTER_REQ message or NULL on allocation failure
+ */
 MessageDef *RCconfig_NR_CU_E1(const E1_t *entity)
 {
   MessageDef *msgConfig = itti_alloc_new_message(TASK_GNB_APP, 0, E1AP_REGISTER_REQ);
@@ -90,6 +101,9 @@ MessageDef *RCconfig_NR_CU_E1(const E1_t *entity)
     if (*gnbParms[GNB_GNB_NAME_IDX].strptr)
       e1Setup->gNB_cu_up_name = *(gnbParms[GNB_GNB_NAME_IDX].strptr);
 
+    // Only 5GC supported
+    e1Setup->cn_support = cn_support_5GC;
+
     paramdef_t PLMNParams[] = GNBPLMNPARAMS_DESC;
     paramlist_def_t PLMNParamList = {GNB_CONFIG_STRING_PLMN_LIST, NULL, 0};
     /* map parameter checking array instances to parameter definition array instances */
diff --git a/openair2/E1AP/lib/CMakeLists.txt b/openair2/E1AP/lib/CMakeLists.txt
index 6e766581fa8d01e8f8478d5eb4198262a5638650..27bfbcc8a27f139cdab5529f384c8062931007a9 100644
--- a/openair2/E1AP/lib/CMakeLists.txt
+++ b/openair2/E1AP/lib/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_library(e1ap_lib OBJECT
             e1ap_bearer_context_management.c
+            e1ap_interface_management.c
 )
 
 target_link_libraries(e1ap_lib PRIVATE asn1_e1ap)
diff --git a/openair2/E1AP/lib/e1ap_interface_management.c b/openair2/E1AP/lib/e1ap_interface_management.c
new file mode 100644
index 0000000000000000000000000000000000000000..8f29ba07c5aff24bc6184b1185e3d516255beb86
--- /dev/null
+++ b/openair2/E1AP/lib/e1ap_interface_management.c
@@ -0,0 +1,727 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "common/utils/assertions.h"
+#include "openair3/UTILS/conversions.h"
+#include "common/utils/oai_asn1.h"
+#include "common/utils/utils.h"
+
+#include "e1ap_lib_common.h"
+#include "e1ap_lib_includes.h"
+#include "e1ap_messages_types.h"
+#include "e1ap_interface_management.h"
+
+void encode_criticality_diagnostics(const criticality_diagnostics_t *msg, E1AP_CriticalityDiagnostics_t *out)
+{
+  // Procedure Code (O)
+  if (msg->procedure_code) {
+    out->procedureCode = calloc_or_fail(1, sizeof(*out->procedureCode));
+    *out->procedureCode = *msg->procedure_code;
+  }
+  // Triggering Message (O)
+  if (msg->triggering_msg) {
+    out->triggeringMessage = calloc_or_fail(1, sizeof(*out->triggeringMessage));
+    *out->triggeringMessage = *msg->triggering_msg;
+  }
+  // Procedure Criticality (O)
+  if (msg->procedure_criticality) {
+    out->procedureCriticality = calloc_or_fail(1, sizeof(*out->procedureCriticality));
+    *out->procedureCriticality = *msg->procedure_criticality;
+  }
+  for (int i = 0; i < msg->num_errors; i++) {
+    out->iEsCriticalityDiagnostics = calloc_or_fail(1, sizeof(*out->iEsCriticalityDiagnostics));
+    asn1cSequenceAdd(out->iEsCriticalityDiagnostics->list, struct E1AP_CriticalityDiagnostics_IE_List__Member, ieC0);
+    ieC0->iE_ID = msg->errors[i].ie_id;
+    ieC0->typeOfError = msg->errors[i].error_type;
+    ieC0->iECriticality = msg->errors[i].criticality;
+  }
+}
+
+bool decode_criticality_diagnostics(const E1AP_CriticalityDiagnostics_t *in, criticality_diagnostics_t *out)
+{
+  // Procedure Code (O)
+  if (in->procedureCode) {
+    out->procedure_code = malloc_or_fail(sizeof(*out->procedure_code));
+    *out->procedure_code = *in->procedureCode;
+  }
+  // Triggering Message (O)
+  if (in->triggeringMessage) {
+    out->triggering_msg = malloc_or_fail(sizeof(*out->triggering_msg));
+    *out->triggering_msg = *in->triggeringMessage;
+  }
+  // Procedure Criticality (O)
+  if (in->procedureCriticality) {
+    out->procedure_criticality = malloc_or_fail(sizeof(*out->procedure_criticality));
+    *out->procedure_criticality = *in->procedureCriticality;
+  }
+  // Criticality Diagnostics IE list
+  if (in->iEsCriticalityDiagnostics) {
+    for (int i = 0; i < in->iEsCriticalityDiagnostics->list.count; i++) {
+      struct E1AP_CriticalityDiagnostics_IE_List__Member *ie = in->iEsCriticalityDiagnostics->list.array[i];
+      out->num_errors++;
+      out->errors[i].ie_id = ie->iE_ID;
+      out->errors[i].error_type = ie->typeOfError;
+      out->errors[i].criticality = ie->iECriticality;
+    }
+  }
+
+  return true;
+}
+
+/* ====================================
+ *      GNB-CU-UP E1 SETUP REQUEST
+ * ==================================== */
+
+/**
+ * @brief Encode GNB-CU-UP E1 Setup Request
+ */
+E1AP_E1AP_PDU_t *encode_e1ap_cuup_setup_request(const e1ap_setup_req_t *msg)
+{
+  E1AP_E1AP_PDU_t *pdu = calloc_or_fail(1, sizeof(*pdu));
+  // Message Type (M)
+  pdu->present = E1AP_E1AP_PDU_PR_initiatingMessage;
+  asn1cCalloc(pdu->choice.initiatingMessage, m);
+  m->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
+  m->criticality = E1AP_Criticality_reject;
+  m->value.present = E1AP_InitiatingMessage__value_PR_GNB_CU_UP_E1SetupRequest;
+  E1AP_GNB_CU_UP_E1SetupRequest_t *e1SetupUP = &m->value.choice.GNB_CU_UP_E1SetupRequest;
+  // Transaction ID (M)
+  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC1);
+  ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID;
+  ieC1->criticality = E1AP_Criticality_reject;
+  ieC1->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_TransactionID;
+  ieC1->value.choice.TransactionID = msg->transac_id;
+  // gNB-CU-UP ID (M)
+  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC2);
+  ieC2->id = E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID;
+  ieC2->criticality = E1AP_Criticality_reject;
+  ieC2->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_GNB_CU_UP_ID;
+  asn_int642INTEGER(&ieC2->value.choice.GNB_CU_UP_ID, msg->gNB_cu_up_id);
+  // gNB-CU-UP Name (O)
+  if (msg->gNB_cu_up_name) {
+    asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC3);
+    ieC3->id = E1AP_ProtocolIE_ID_id_gNB_CU_UP_Name;
+    ieC3->criticality = E1AP_Criticality_ignore;
+    ieC3->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_GNB_CU_UP_Name;
+    OCTET_STRING_fromBuf(&ieC3->value.choice.GNB_CU_UP_Name, msg->gNB_cu_up_name, strlen(msg->gNB_cu_up_name));
+  }
+  // CN Support (M)
+  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC4);
+  ieC4->id = E1AP_ProtocolIE_ID_id_CNSupport;
+  ieC4->criticality = E1AP_Criticality_reject;
+  ieC4->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport;
+  DevAssert(msg->cn_support == cn_support_5GC); /* only 5GC supported */
+  ieC4->value.choice.CNSupport = msg->cn_support == cn_support_5GC ? E1AP_CNSupport_c_5gc : E1AP_CNSupport_c_epc;
+  // Supported PLMNs (1..<maxnoofSPLMNs>)
+  asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC5);
+  ieC5->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs;
+  ieC5->criticality = E1AP_Criticality_reject;
+  ieC5->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List;
+  for (int i = 0; i < msg->supported_plmns; i++) {
+    asn1cSequenceAdd(ieC5->value.choice.SupportedPLMNs_List.list, E1AP_SupportedPLMNs_Item_t, supportedPLMN);
+    // PLMN Identity (M)
+    const PLMN_ID_t *id = &msg->plmn[i].id;
+    MCC_MNC_TO_PLMNID(id->mcc, id->mnc, id->mnc_digit_length, &supportedPLMN->pLMN_Identity);
+    // Slice Support List (O)
+    int n = msg->plmn[i].supported_slices;
+    if (msg->plmn[i].slice != NULL && n > 0) {
+      supportedPLMN->slice_Support_List = calloc_or_fail(1, sizeof(*supportedPLMN->slice_Support_List));
+      for (int s = 0; s < n; ++s) {
+        asn1cSequenceAdd(supportedPLMN->slice_Support_List->list, E1AP_Slice_Support_Item_t, slice);
+        e1ap_nssai_t *nssai = &msg->plmn[i].slice[s];
+        INT8_TO_OCTET_STRING(nssai->sst, &slice->sNSSAI.sST);
+        if (nssai->sd != 0xffffff) {
+          slice->sNSSAI.sD = malloc_or_fail(sizeof(*slice->sNSSAI.sD));
+          INT24_TO_OCTET_STRING(nssai->sd, slice->sNSSAI.sD);
+        }
+      }
+    }
+  }
+  return pdu;
+}
+
+bool decode_e1ap_cuup_setup_request(const E1AP_E1AP_PDU_t *pdu, e1ap_setup_req_t *out)
+{
+  E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie;
+  E1AP_GNB_CU_UP_E1SetupRequest_t *in = &pdu->choice.initiatingMessage->value.choice.GNB_CU_UP_E1SetupRequest;
+  // Transaction ID (M)
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true);
+  // gNB-CU-UP ID (M)
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID, true);
+  // CN Support (M)
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_CNSupport, true);
+  // Supported PLMNs (1..<maxnoofSPLMNs>)
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_SupportedPLMNs, true);
+  // Loop over all IEs
+  for (int i = 0; i < in->protocolIEs.list.count; i++) {
+    ie = in->protocolIEs.list.array[i];
+    AssertFatal(ie != NULL, "in->protocolIEs.list.array[i] shall not be null");
+    switch (ie->id) {
+      case E1AP_ProtocolIE_ID_id_TransactionID:
+        _E1_EQ_CHECK_INT(ie->value.present, E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_TransactionID);
+        out->transac_id = ie->value.choice.TransactionID;
+        break;
+      case E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID:
+        _E1_EQ_CHECK_INT(ie->value.present, E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_GNB_CU_UP_ID);
+        asn_INTEGER2ulong(&ie->value.choice.GNB_CU_UP_ID, &out->gNB_cu_up_id);
+        break;
+      case E1AP_ProtocolIE_ID_id_gNB_CU_UP_Name:
+        _E1_EQ_CHECK_INT(ie->value.present, E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_GNB_CU_UP_Name);
+        // gNB-CU-UP Name (O)
+        E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_gNB_CU_UP_Name, false);
+        if (ie != NULL) {
+          out->gNB_cu_up_name = calloc_or_fail(ie->value.choice.GNB_CU_UP_Name.size + 1, sizeof(char));
+          memcpy(out->gNB_cu_up_name, ie->value.choice.GNB_CU_UP_Name.buf, ie->value.choice.GNB_CU_UP_Name.size);
+        }
+        break;
+      case E1AP_ProtocolIE_ID_id_CNSupport:
+        _E1_EQ_CHECK_INT(ie->value.present, E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport);
+        _E1_EQ_CHECK_INT(ie->value.choice.CNSupport, E1AP_CNSupport_c_5gc); // only 5GC CN Support supported
+        out->cn_support = ie->value.choice.CNSupport;
+        break;
+      case E1AP_ProtocolIE_ID_id_SupportedPLMNs:
+        _E1_EQ_CHECK_INT(ie->value.present, E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List);
+        out->supported_plmns = ie->value.choice.SupportedPLMNs_List.list.count;
+
+        for (int i = 0; i < out->supported_plmns; i++) {
+          E1AP_SupportedPLMNs_Item_t *supported_plmn_item =
+              (E1AP_SupportedPLMNs_Item_t *)(ie->value.choice.SupportedPLMNs_List.list.array[i]);
+
+          /* PLMN Identity */
+          PLMN_ID_t *id = &out->plmn[i].id;
+          PLMNID_TO_MCC_MNC(&supported_plmn_item->pLMN_Identity, id->mcc, id->mnc, id->mnc_digit_length);
+
+          /* NSSAI */
+          if (supported_plmn_item->slice_Support_List) {
+            int n = supported_plmn_item->slice_Support_List->list.count;
+            out->plmn[i].supported_slices = n;
+            out->plmn[i].slice = calloc_or_fail(n, sizeof(*out->plmn[i].slice));
+            for (int s = 0; s < n; ++s) {
+              e1ap_nssai_t *slice = &out->plmn[i].slice[s];
+              const E1AP_SNSSAI_t *es = &supported_plmn_item->slice_Support_List->list.array[s]->sNSSAI;
+              OCTET_STRING_TO_INT8(&es->sST, slice->sst);
+              slice->sd = 0xffffff;
+              if (es->sD != NULL)
+                OCTET_STRING_TO_INT24(es->sD, slice->sd);
+            }
+          }
+        }
+        break;
+      default:
+        PRINT_ERROR("Handle for this IE %ld is not implemented (or) invalid IE detected\n", ie->id);
+        break;
+    }
+  }
+  return true;
+}
+
+/**
+ * @brief Deep copy function for E1 CUUP Setup Request
+ */
+e1ap_setup_req_t cp_e1ap_cuup_setup_request(const e1ap_setup_req_t *msg)
+{
+  e1ap_setup_req_t cp = {0};
+  cp = *msg;
+  if (msg->gNB_cu_up_name) {
+    cp.gNB_cu_up_name = strdup(msg->gNB_cu_up_name);
+  }
+  for (int i = 0; i < msg->supported_plmns; i++) {
+    if (msg->plmn[i].slice && msg->plmn[i].supported_slices > 0) {
+      cp.plmn[i].slice = calloc_or_fail(msg->plmn[i].supported_slices, sizeof(*cp.plmn[i].slice));
+      for (int s = 0; s < msg->plmn[i].supported_slices; ++s) {
+        cp.plmn[i].slice[s] = msg->plmn[i].slice[s];
+      }
+    }
+  }
+  return cp;
+}
+
+/**
+ * @brief Free memory allocated for E1 CUUP Setup Request
+ */
+void free_e1ap_cuup_setup_request(e1ap_setup_req_t *msg)
+{
+  // gNB-CU-UP Name
+  free(msg->gNB_cu_up_name);
+  // Slice support lists within PLMNs
+  for (int i = 0; i < msg->supported_plmns; i++) {
+    free(msg->plmn[i].slice);
+  }
+}
+
+/**
+ * @brief Equality check function for E1 CUUP Setup Request
+ */
+bool eq_e1ap_cuup_setup_request(const e1ap_setup_req_t *a, const e1ap_setup_req_t *b)
+{
+  _E1_EQ_CHECK_INT(a->transac_id, b->transac_id);
+  _E1_EQ_CHECK_INT(a->gNB_cu_up_id, b->gNB_cu_up_id);
+  if (a->gNB_cu_up_name && b->gNB_cu_up_name)
+    _E1_EQ_CHECK_STR(a->gNB_cu_up_name, b->gNB_cu_up_name)
+  _E1_EQ_CHECK_INT(a->supported_plmns, b->supported_plmns);
+  for (int i = 0; i < a->supported_plmns; i++) {
+    _E1_EQ_CHECK_INT(a->plmn[i].id.mcc, b->plmn[i].id.mcc);
+    _E1_EQ_CHECK_INT(a->plmn[i].id.mnc, b->plmn[i].id.mnc);
+    _E1_EQ_CHECK_INT(a->plmn[i].id.mnc_digit_length, b->plmn[i].id.mnc_digit_length);
+    _E1_EQ_CHECK_INT(a->plmn[i].supported_slices, b->plmn[i].supported_slices);
+    for (int s = 0; s < a->plmn[i].supported_slices; ++s) {
+      _E1_EQ_CHECK_INT(a->plmn[i].slice[s].sst, b->plmn[i].slice[s].sst);
+      _E1_EQ_CHECK_INT(a->plmn[i].slice[s].sd, b->plmn[i].slice[s].sd);
+    }
+  }
+  return true;
+}
+
+/* ====================================
+ *     GNB-CU-UP E1 SETUP RESPONSE
+ * ==================================== */
+
+/**
+ * @brief Encode GNB-CU-UP E1 Setup Response
+ */
+E1AP_E1AP_PDU_t *encode_e1ap_cuup_setup_response(const e1ap_setup_resp_t *msg)
+{
+  E1AP_E1AP_PDU_t *pdu = calloc_or_fail(1, sizeof(*pdu));
+  /* Create */
+  /* 0. pdu Type */
+  pdu->present = E1AP_E1AP_PDU_PR_successfulOutcome;
+  asn1cCalloc(pdu->choice.successfulOutcome, initMsg);
+  initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
+  initMsg->criticality = E1AP_Criticality_reject;
+  initMsg->value.present = E1AP_SuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupResponse;
+  E1AP_GNB_CU_UP_E1SetupResponse_t *out = &pdu->choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse;
+  // Transaction ID (M)
+  asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ieC1);
+  ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID;
+  ieC1->criticality = E1AP_Criticality_reject;
+  ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID;
+  ieC1->value.choice.TransactionID = msg->transac_id;
+  // Encode gNB_CU_CP_Name (O)
+  if (msg->gNB_cu_cp_name) {
+    asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ieC2);
+    ieC2->id = E1AP_ProtocolIE_ID_id_gNB_CU_CP_Name;
+    ieC2->criticality = E1AP_Criticality_ignore;
+    ieC2->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_GNB_CU_CP_Name;
+    OCTET_STRING_fromBuf(&ieC2->value.choice.GNB_CU_CP_Name, msg->gNB_cu_cp_name, strlen(msg->gNB_cu_cp_name));
+  }
+  // Encode TNLA Info (O)
+  if (msg->tnla_info) {
+    asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ieC3);
+    ieC3->id = E1AP_ProtocolIE_ID_id_Transport_Layer_Address_Info;
+    ieC3->criticality = E1AP_Criticality_ignore;
+    ieC3->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_Transport_Layer_Address_Info;
+    // Transport UP Layer Addresses Info to Add List
+    for (int i = 0; i < msg->tnla_info->num_addresses_to_add; i++) {
+      E1AP_Transport_UP_Layer_Addresses_Info_To_Add_List_t *a = calloc_or_fail(1, sizeof(*a));
+      ieC3->value.choice.Transport_Layer_Address_Info.transport_UP_Layer_Addresses_Info_To_Add_List =
+          (struct E1AP_Transport_UP_Layer_Addresses_Info_To_Add_List *)a;
+      asn1cSequenceAdd(a->list, E1AP_Transport_UP_Layer_Addresses_Info_To_Add_Item_t, ieC4);
+      in_addr_t *ipsec = &msg->tnla_info->addresses_to_add[i].ipsec_tl_address;
+      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(*ipsec, &ieC4->iP_SecTransportLayerAddress);
+      for (int j = 0; j < msg->tnla_info->addresses_to_add[i].num_gtp_tl_addresses; j++) {
+        E1AP_GTPTLAs_t *g = calloc_or_fail(1, sizeof(*g));
+        ieC4->gTPTransportLayerAddressesToAdd = (struct E1AP_GTPTLAs *)g;
+        asn1cSequenceAdd(g->list, E1AP_GTPTLA_Item_t, ieC5);
+        in_addr_t *gtp_tlna = &msg->tnla_info->addresses_to_add[i].gtp_tl_addresses[j];
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(*gtp_tlna, &ieC5->gTPTransportLayerAddresses);
+      }
+    }
+    // Transport UP Layer Addresses Info to Remove List
+    for (int i = 0; i < msg->tnla_info->num_addresses_to_remove; i++) {
+      E1AP_Transport_UP_Layer_Addresses_Info_To_Remove_List_t *a = calloc_or_fail(1, sizeof(*a));
+      ieC3->value.choice.Transport_Layer_Address_Info.transport_UP_Layer_Addresses_Info_To_Remove_List =
+          (struct E1AP_Transport_UP_Layer_Addresses_Info_To_Remove_List *)a;
+      asn1cSequenceAdd(a->list, E1AP_Transport_UP_Layer_Addresses_Info_To_Remove_Item_t, ieC4);
+      in_addr_t *ipsec = &msg->tnla_info->addresses_to_remove[i].ipsec_tl_address;
+      TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(*ipsec, &ieC4->iP_SecTransportLayerAddress);
+      for (int j = 0; j < msg->tnla_info->addresses_to_remove[i].num_gtp_tl_addresses; j++) {
+        E1AP_GTPTLAs_t *g = calloc_or_fail(1, sizeof(*g));
+        ieC4->gTPTransportLayerAddressesToRemove = (struct E1AP_GTPTLAs *)g;
+        asn1cSequenceAdd(g->list, E1AP_GTPTLA_Item_t, ieC5);
+        in_addr_t *gtp_tlna = &msg->tnla_info->addresses_to_remove[i].gtp_tl_addresses[j];
+        TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(*gtp_tlna, &ieC5->gTPTransportLayerAddresses);
+      }
+    }
+  }
+  return pdu;
+}
+
+/**
+ * @brief Decode GNB-CU-UP E1 Setup Response
+ */
+bool decode_e1ap_cuup_setup_response(const E1AP_E1AP_PDU_t *pdu, e1ap_setup_resp_t *out)
+{
+  _E1_EQ_CHECK_INT(pdu->present, E1AP_E1AP_PDU_PR_successfulOutcome);
+  _E1_EQ_CHECK_INT(pdu->choice.successfulOutcome->procedureCode, E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup);
+  _E1_EQ_CHECK_INT(pdu->choice.successfulOutcome->value.present, E1AP_SuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupResponse);
+  const E1AP_GNB_CU_UP_E1SetupResponse_t *in = &pdu->choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse;
+  E1AP_GNB_CU_UP_E1SetupResponseIEs_t *ie;
+  // Transaction ID (M)
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true);
+  // Decode TNLA Info (O)
+  for (int i = 0; i < in->protocolIEs.list.count; i++) {
+    ie = in->protocolIEs.list.array[i];
+    AssertFatal(ie != NULL, "in->protocolIEs.list.array[i] shall not be null");
+    switch (ie->id) {
+      case E1AP_ProtocolIE_ID_id_TransactionID:
+        out->transac_id = ie->value.choice.TransactionID;
+        break;
+
+      case E1AP_ProtocolIE_ID_id_gNB_CU_CP_Name:
+        // gNB-CU-CP Name (O)
+        E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ie, in, E1AP_ProtocolIE_ID_id_gNB_CU_CP_Name, false);
+        _E1_EQ_CHECK_INT(ie->value.present, E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_GNB_CU_CP_Name);
+        if (ie != NULL) {
+          out->gNB_cu_cp_name = calloc_or_fail(ie->value.choice.GNB_CU_CP_Name.size + 1, sizeof(char));
+          memcpy(out->gNB_cu_cp_name, ie->value.choice.GNB_CU_CP_Name.buf, ie->value.choice.GNB_CU_CP_Name.size);
+        }
+        break;
+
+      case E1AP_ProtocolIE_ID_id_Transport_Layer_Address_Info:
+        E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ie, in, E1AP_ProtocolIE_ID_id_Transport_Layer_Address_Info, false);
+        out->tnla_info = calloc_or_fail(1, sizeof(*out->tnla_info));
+        // Transport UP Layer Addresses Info to Add List
+        const E1AP_Transport_UP_Layer_Addresses_Info_To_Add_List_t *a =
+            ie->value.choice.Transport_Layer_Address_Info.transport_UP_Layer_Addresses_Info_To_Add_List;
+        out->tnla_info->num_addresses_to_add = a->list.count;
+        for (int i = 0; i < a->list.count; i++) {
+          const E1AP_Transport_UP_Layer_Addresses_Info_To_Add_Item_t *item = a->list.array[i];
+          tnl_address_info_item_t *to_add = &out->tnla_info->addresses_to_add[i];
+          BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&item->iP_SecTransportLayerAddress, to_add->ipsec_tl_address);
+          const E1AP_GTPTLAs_t *gtp_list = item->gTPTransportLayerAddressesToAdd;
+          to_add->num_gtp_tl_addresses = gtp_list->list.count;
+          for (int j = 0; j < gtp_list->list.count; j++) {
+            const E1AP_GTPTLA_Item_t *gtp_item = gtp_list->list.array[j];
+            BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&gtp_item->gTPTransportLayerAddresses, to_add->gtp_tl_addresses[j]);
+          }
+        }
+        // Transport UP Layer Addresses Info to Remove List
+        const E1AP_Transport_UP_Layer_Addresses_Info_To_Remove_List_t *r =
+            ie->value.choice.Transport_Layer_Address_Info.transport_UP_Layer_Addresses_Info_To_Remove_List;
+        out->tnla_info->num_addresses_to_remove = r->list.count;
+
+        for (int i = 0; i < r->list.count; i++) {
+          const E1AP_Transport_UP_Layer_Addresses_Info_To_Remove_Item_t *item = r->list.array[i];
+          tnl_address_info_item_t *to_remove = &out->tnla_info->addresses_to_remove[i];
+          BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&item->iP_SecTransportLayerAddress, to_remove->ipsec_tl_address);
+
+          const E1AP_GTPTLAs_t *gtp_list = item->gTPTransportLayerAddressesToRemove;
+          to_remove->num_gtp_tl_addresses = gtp_list->list.count;
+          for (int j = 0; j < gtp_list->list.count; j++) {
+            const E1AP_GTPTLA_Item_t *gtp_item = gtp_list->list.array[j];
+            BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&gtp_item->gTPTransportLayerAddresses, to_remove->gtp_tl_addresses[j]);
+          }
+        }
+        break;
+
+      default:
+        PRINT_ERROR("Handle for this IE %ld is not implemented (or) invalid IE detected\n", ie->id);
+        break;
+    }
+  }
+  return true;
+}
+
+/**
+ * @brief Deep copy GNB-CU-UP E1 Setup Response
+ */
+e1ap_setup_resp_t cp_e1ap_cuup_setup_response(const e1ap_setup_resp_t *msg)
+{
+  e1ap_setup_resp_t cp = {0};
+  cp.transac_id = msg->transac_id;
+  if (msg->gNB_cu_cp_name) {
+    cp.gNB_cu_cp_name = strdup(msg->gNB_cu_cp_name);
+  }
+  if (msg->tnla_info) {
+    cp.tnla_info = calloc_or_fail(1, sizeof(*cp.tnla_info));
+    *cp.tnla_info = *msg->tnla_info;
+  }
+  return cp;
+}
+
+/**
+ * @brief Free GNB-CU-UP E1 Setup Response
+ */
+void free_e1ap_cuup_setup_response(e1ap_setup_resp_t *msg)
+{
+  free(msg->gNB_cu_cp_name);
+  free(msg->tnla_info);
+}
+
+/**
+ * @brief Equality check for GNB-CU-UP E1 Setup Response
+ */
+bool eq_e1ap_cuup_setup_response(const e1ap_setup_resp_t *a, const e1ap_setup_resp_t *b)
+{
+  _E1_EQ_CHECK_LONG(a->transac_id, b->transac_id);
+  if ((a->gNB_cu_cp_name && !b->gNB_cu_cp_name) || (!a->gNB_cu_cp_name && b->gNB_cu_cp_name))
+    return false;
+  if (a->gNB_cu_cp_name && b->gNB_cu_cp_name)
+    _E1_EQ_CHECK_STR(a->gNB_cu_cp_name, b->gNB_cu_cp_name);
+  if ((a->tnla_info && !b->tnla_info) || (!a->tnla_info && b->tnla_info))
+    return false;
+  if (a->tnla_info && b->tnla_info) {
+    _E1_EQ_CHECK_INT(a->tnla_info->num_addresses_to_add, b->tnla_info->num_addresses_to_add);
+    _E1_EQ_CHECK_INT(a->tnla_info->num_addresses_to_remove, b->tnla_info->num_addresses_to_remove);
+    for (int i = 0; i < a->tnla_info->num_addresses_to_add; i++) {
+      tnl_address_info_item_t *a_to_add = &a->tnla_info->addresses_to_add[i];
+      tnl_address_info_item_t *b_to_add = &b->tnla_info->addresses_to_add[i];
+      _E1_EQ_CHECK_LONG(a_to_add->ipsec_tl_address, b_to_add->ipsec_tl_address);
+      for (int j = 0; j < a_to_add->num_gtp_tl_addresses; j++) {
+        _E1_EQ_CHECK_LONG(a_to_add->gtp_tl_addresses[j], b_to_add->gtp_tl_addresses[j]);
+      }
+    }
+    for (int i = 0; i < a->tnla_info->num_addresses_to_remove; i++) {
+      tnl_address_info_item_t *a_to_rem = &a->tnla_info->addresses_to_remove[i];
+      tnl_address_info_item_t *b_to_rem = &b->tnla_info->addresses_to_remove[i];
+      _E1_EQ_CHECK_LONG(a_to_rem->ipsec_tl_address, b_to_rem->ipsec_tl_address);
+      for (int j = 0; j < a_to_rem->num_gtp_tl_addresses; j++) {
+        _E1_EQ_CHECK_LONG(a_to_rem->gtp_tl_addresses[j], b_to_rem->gtp_tl_addresses[j]);
+      }
+    }
+  }
+  return true;
+}
+
+/* ====================================
+ *     GNB-CU-UP E1 SETUP FAILURE
+ * ==================================== */
+
+static E1AP_Cause_t encode_e1ap_cause_ie(const e1ap_cause_t *cause)
+{
+  E1AP_Cause_t ie;
+  switch (cause->type) {
+    case E1AP_CAUSE_RADIO_NETWORK:
+      ie.present = E1AP_Cause_PR_radioNetwork;
+      ie.choice.radioNetwork = cause->value;
+      break;
+    case E1AP_CAUSE_TRANSPORT:
+      ie.present = E1AP_Cause_PR_transport;
+      ie.choice.transport = cause->value;
+      break;
+    case E1AP_CAUSE_PROTOCOL:
+      ie.present = E1AP_Cause_PR_protocol;
+      ie.choice.protocol = cause->value;
+      break;
+    case E1AP_CAUSE_MISC:
+      ie.present = E1AP_Cause_PR_misc;
+      ie.choice.misc = cause->value;
+      break;
+    default:
+      ie.present = E1AP_Cause_PR_NOTHING;
+      break;
+  }
+  return ie;
+}
+
+static e1ap_cause_t decode_e1ap_cause_ie(const E1AP_Cause_t *ie)
+{
+  e1ap_cause_t cause;
+  // Decode the 'choice' field based on the 'present' value
+  switch (ie->present) {
+    case E1AP_Cause_PR_radioNetwork:
+      cause.value = ie->choice.radioNetwork;
+      cause.type = E1AP_CAUSE_RADIO_NETWORK;
+      break;
+    case E1AP_Cause_PR_transport:
+      cause.value = ie->choice.transport;
+      cause.type = E1AP_CAUSE_TRANSPORT;
+      break;
+    case E1AP_Cause_PR_protocol:
+      cause.value = ie->choice.protocol;
+      cause.type = E1AP_CAUSE_PROTOCOL;
+      break;
+    case E1AP_Cause_PR_misc:
+      cause.value = ie->choice.misc;
+      cause.type = E1AP_CAUSE_MISC;
+      break;
+    default:
+      cause.type = E1AP_CAUSE_NOTHING;
+      break;
+  }
+  return cause;
+}
+
+/**
+ * @brief Encoder for GNB-CU-UP E1 Setup Failure
+ * @ref 9.2.1.6 GNB-CU-UP E1 SETUP FAILURE of 3GPP TS 38.463
+ */
+E1AP_E1AP_PDU_t *encode_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *msg)
+{
+  E1AP_E1AP_PDU_t *pdu = calloc_or_fail(1, sizeof(E1AP_E1AP_PDU_t));
+  // Allocate and populate the unsuccessfulOutcome structure
+  pdu->present = E1AP_E1AP_PDU_PR_unsuccessfulOutcome;
+  asn1cCalloc(pdu->choice.unsuccessfulOutcome, initMsg);
+  initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
+  initMsg->criticality = E1AP_Criticality_reject;
+  initMsg->value.present = E1AP_UnsuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupFailure;
+  E1AP_GNB_CU_UP_E1SetupFailure_t *out = &pdu->choice.unsuccessfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure;
+  // Transaction ID
+  asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie1);
+  ie1->id = E1AP_ProtocolIE_ID_id_TransactionID;
+  ie1->criticality = E1AP_Criticality_reject;
+  ie1->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_TransactionID;
+  ie1->value.choice.TransactionID = msg->transac_id;
+  // Cause
+  asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie2);
+  ie2->id = E1AP_ProtocolIE_ID_id_Cause;
+  ie2->criticality = E1AP_Criticality_ignore;
+  ie2->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_Cause;
+  ie2->value.choice.Cause = encode_e1ap_cause_ie(&msg->cause);
+  // Time To Wait (O)
+  if (msg->time_to_wait) {
+    asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie3);
+    ie3->id = E1AP_ProtocolIE_ID_id_TimeToWait;
+    ie3->criticality = E1AP_Criticality_ignore;
+    ie3->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_TimeToWait;
+    ie3->value.choice.TimeToWait = *msg->time_to_wait;
+  }
+  // Criticality Diagnostics (O)
+  if (msg->crit_diag) {
+    asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie4);
+    ie4->id = E1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
+    ie4->criticality = E1AP_Criticality_ignore;
+    ie4->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_CriticalityDiagnostics;
+    encode_criticality_diagnostics(msg->crit_diag, &ie4->value.choice.CriticalityDiagnostics);
+  }
+  return pdu;
+}
+
+/**
+ * @brief Decoder for GNB-CU-UP E1 Setup Failure
+ */
+bool decode_e1ap_cuup_setup_failure(const E1AP_E1AP_PDU_t *pdu, e1ap_setup_fail_t *out)
+{
+  _E1_EQ_CHECK_INT(pdu->present, E1AP_E1AP_PDU_PR_unsuccessfulOutcome);
+  _E1_EQ_CHECK_INT(pdu->choice.unsuccessfulOutcome->procedureCode, E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup);
+  const E1AP_GNB_CU_UP_E1SetupFailure_t *in = &pdu->choice.unsuccessfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure;
+  E1AP_GNB_CU_UP_E1SetupFailureIEs_t *ie;
+  // Check mandatory IEs first
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true);
+  E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_Cause, true);
+  for (int i = 0; i < in->protocolIEs.list.count; i++) {
+    ie = in->protocolIEs.list.array[i];
+    AssertFatal(ie != NULL, "in->protocolIEs.list.array[i] shall not be null");
+    switch (ie->id) {
+      case E1AP_ProtocolIE_ID_id_TransactionID:
+        out->transac_id = ie->value.choice.TransactionID;
+        break;
+      case E1AP_ProtocolIE_ID_id_Cause:
+        // Cause
+        E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_Cause, true);
+        out->cause = decode_e1ap_cause_ie(&ie->value.choice.Cause);
+        break;
+      case E1AP_ProtocolIE_ID_id_Transport_Layer_Address_Info:
+        // Time To Wait (O)
+        E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TimeToWait, false);
+        out->time_to_wait = calloc_or_fail(1, sizeof(*out->time_to_wait));
+        *out->time_to_wait = ie->value.choice.TimeToWait;
+        break;
+      case E1AP_ProtocolIE_ID_id_CriticalityDiagnostics:
+        // Criticality Diagnostics (O)
+        E1AP_LIB_FIND_IE(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_CriticalityDiagnostics, false);
+        out->crit_diag = calloc_or_fail(1, sizeof(*out->crit_diag));
+        decode_criticality_diagnostics(&ie->value.choice.CriticalityDiagnostics, out->crit_diag);
+        break;
+      default:
+        PRINT_ERROR("Handle for this IE %ld is not implemented (or) invalid IE detected\n", ie->id);
+        break;
+    }
+  }
+  return true;
+}
+
+/**
+ * @brief Deep copy of GNB-CU-UP E1 Setup Failure message
+ */
+e1ap_setup_fail_t cp_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *msg)
+{
+  e1ap_setup_fail_t cp = {0};
+  cp.transac_id = msg->transac_id;
+  cp.cause = msg->cause;
+  if (msg->time_to_wait) {
+    cp.time_to_wait = calloc_or_fail(1, sizeof(*cp.time_to_wait));
+    *cp.time_to_wait = *msg->time_to_wait;
+  }
+  if (msg->crit_diag) {
+    cp.crit_diag = calloc_or_fail(1, sizeof(*cp.crit_diag));
+    *cp.crit_diag = *msg->crit_diag;
+    if (msg->crit_diag->procedure_code) {
+      cp.crit_diag->procedure_code = calloc_or_fail(1, sizeof(*cp.crit_diag->procedure_code));
+      *cp.crit_diag->procedure_code = *msg->crit_diag->procedure_code;
+    }
+    if (msg->crit_diag->procedure_criticality) {
+      cp.crit_diag->procedure_criticality = calloc_or_fail(1, sizeof(*cp.crit_diag->procedure_criticality));
+      *cp.crit_diag->procedure_criticality = *msg->crit_diag->procedure_criticality;
+    }
+    if (msg->crit_diag->triggering_msg) {
+      cp.crit_diag->triggering_msg = calloc_or_fail(1, sizeof(*cp.crit_diag->triggering_msg));
+      *cp.crit_diag->triggering_msg = *msg->crit_diag->triggering_msg;
+    }
+  }
+  return cp;
+}
+
+/**
+ * @brief Free memory allocated for GNB-CU-UP E1 Setup Failure message
+ */
+void free_e1ap_cuup_setup_failure(e1ap_setup_fail_t *msg)
+{
+  free(msg->time_to_wait);
+  if (msg->crit_diag) {
+    free(msg->crit_diag->triggering_msg);
+    free(msg->crit_diag->procedure_code);
+    free(msg->crit_diag->procedure_criticality);
+  }
+  free(msg->crit_diag);
+}
+
+/**
+ * @brief Equality check for GNB-CU-UP E1 Setup Failure message
+ */
+bool eq_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *a, const e1ap_setup_fail_t *b)
+{
+  _E1_EQ_CHECK_LONG(a->transac_id, b->transac_id);
+  _E1_EQ_CHECK_INT(a->cause.type, b->cause.type);
+  _E1_EQ_CHECK_INT(a->cause.value, b->cause.value);
+  if (a->time_to_wait && b->time_to_wait)
+    _E1_EQ_CHECK_LONG(*a->time_to_wait, *b->time_to_wait);
+  if (a->crit_diag && b->crit_diag) {
+    if (a->crit_diag->procedure_code && b->crit_diag->procedure_code)
+      _E1_EQ_CHECK_LONG(*(a->crit_diag->procedure_code), *(b->crit_diag->procedure_code));
+    if (a->crit_diag->triggering_msg && b->crit_diag->triggering_msg)
+      _E1_EQ_CHECK_LONG(*(a->crit_diag->triggering_msg), *(b->crit_diag->triggering_msg));
+    if (a->crit_diag->procedure_criticality && b->crit_diag->procedure_criticality)
+      _E1_EQ_CHECK_LONG(*(a->crit_diag->procedure_criticality), *(b->crit_diag->procedure_criticality));
+    _E1_EQ_CHECK_INT(a->crit_diag->num_errors, b->crit_diag->num_errors);
+    for (int i = 0; i < a->crit_diag->num_errors; i++) {
+      const criticality_diagnostics_ie_t *a_err = &a->crit_diag->errors[i];
+      const criticality_diagnostics_ie_t *b_err = &b->crit_diag->errors[i];
+      _E1_EQ_CHECK_INT(a_err->ie_id, b_err->ie_id);
+      _E1_EQ_CHECK_INT(a_err->error_type, b_err->error_type);
+      _E1_EQ_CHECK_INT(a_err->criticality, b_err->criticality);
+    }
+  }
+  return true;
+}
diff --git a/openair2/E1AP/lib/e1ap_interface_management.h b/openair2/E1AP/lib/e1ap_interface_management.h
new file mode 100644
index 0000000000000000000000000000000000000000..353b9adf2fcba1f5093f6076d06c4a92264b1b54
--- /dev/null
+++ b/openair2/E1AP/lib/e1ap_interface_management.h
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef E1AP_INTERFACE_MANAGEMENT_H_
+#define E1AP_INTERFACE_MANAGEMENT_H_
+
+#include <stdbool.h>
+#include "openair2/COMMON/e1ap_messages_types.h"
+#include "common/platform_types.h"
+
+/* GNB-CU-UP E1 Setup Request */
+struct E1AP_E1AP_PDU *encode_e1ap_cuup_setup_request(const e1ap_setup_req_t *msg);
+bool decode_e1ap_cuup_setup_request(const struct E1AP_E1AP_PDU *pdu, e1ap_setup_req_t *out);
+e1ap_setup_req_t cp_e1ap_cuup_setup_request(const e1ap_setup_req_t *msg);
+void free_e1ap_cuup_setup_request(e1ap_setup_req_t *msg);
+bool eq_e1ap_cuup_setup_request(const e1ap_setup_req_t *a, const e1ap_setup_req_t *b);
+
+/* GNB-CU-UP E1 Setup Response */
+struct E1AP_E1AP_PDU *encode_e1ap_cuup_setup_response(const e1ap_setup_resp_t *msg);
+bool decode_e1ap_cuup_setup_response(const struct E1AP_E1AP_PDU *pdu, e1ap_setup_resp_t *out);
+e1ap_setup_resp_t cp_e1ap_cuup_setup_response(const e1ap_setup_resp_t *msg);
+void free_e1ap_cuup_setup_response(e1ap_setup_resp_t *msg);
+bool eq_e1ap_cuup_setup_response(const e1ap_setup_resp_t *a, const e1ap_setup_resp_t *b);
+
+/* GNB-CU-UP E1 Setup Failure */
+struct E1AP_E1AP_PDU *encode_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *msg);
+bool decode_e1ap_cuup_setup_failure(const struct E1AP_E1AP_PDU *pdu, e1ap_setup_fail_t *out);
+e1ap_setup_fail_t cp_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *msg);
+void free_e1ap_cuup_setup_failure(e1ap_setup_fail_t *msg);
+bool eq_e1ap_cuup_setup_failure(const e1ap_setup_fail_t *a, const e1ap_setup_fail_t *b);
+
+#endif /* E1AP_INTERFACE_MANAGEMENT_H_ */
diff --git a/openair2/E1AP/lib/e1ap_lib_includes.h b/openair2/E1AP/lib/e1ap_lib_includes.h
index 58da8f6c3001bc2e26824000dc98b9df5537e43a..443d59e19eeeac228b3b7bafc02313336f145710 100644
--- a/openair2/E1AP/lib/e1ap_lib_includes.h
+++ b/openair2/E1AP/lib/e1ap_lib_includes.h
@@ -25,6 +25,8 @@
 #include "E1AP_E1AP-PDU.h"
 #include "E1AP_ProcedureCode.h"
 #include "E1AP_SuccessfulOutcome.h"
+#include "E1AP_UnsuccessfulOutcome.h"
+#include "E1AP_CriticalityDiagnostics-IE-List.h"
 #include "E1AP_InitiatingMessage.h"
 #include "E1AP_ProtocolIE-ID.h"
 #include "E1AP_ProtocolIE-Field.h"
@@ -53,5 +55,16 @@
 #include "E1AP_QoS-Flow-Item.h"
 #include "E1AP_DRB-Failed-List-NG-RAN.h"
 #include "E1AP_DRB-Failed-Item-NG-RAN.h"
+// E1 Setup
+#include "E1AP_SupportedPLMNs-Item.h"
+#include "E1AP_Slice-Support-List.h"
+#include "E1AP_Slice-Support-Item.h"
+#include "E1AP_ProtocolIE-Field.h"
+#include "E1AP_Transport-UP-Layer-Addresses-Info-To-Add-List.h"
+#include "E1AP_Transport-UP-Layer-Addresses-Info-To-Add-Item.h"
+#include "E1AP_Transport-UP-Layer-Addresses-Info-To-Remove-List.h"
+#include "E1AP_Transport-UP-Layer-Addresses-Info-To-Remove-Item.h"
+#include "E1AP_GTPTLAs.h"
+#include "E1AP_GTPTLA-Item.h"
 
 #endif /* E1AP_LIB_INCLUDES_H_ */
diff --git a/openair2/E1AP/tests/e1ap_lib_test.c b/openair2/E1AP/tests/e1ap_lib_test.c
index 9e3a1035d8227426ed65dc0d0790ba69d2a83019..91eab080a92a961376020097793838486279327c 100644
--- a/openair2/E1AP/tests/e1ap_lib_test.c
+++ b/openair2/E1AP/tests/e1ap_lib_test.c
@@ -30,8 +30,10 @@
 #include <stdint.h>
 #include <stdio.h>
 
-#include "E1AP/lib/e1ap_bearer_context_management.h"
-#include "E1AP/lib/e1ap_lib_includes.h"
+#include "common/utils/utils.h"
+#include "e1ap_bearer_context_management.h"
+#include "e1ap_interface_management.h"
+#include "e1ap_lib_includes.h"
 #include "common/utils/assertions.h"
 
 void exit_function(const char *file, const char *function, const int line, const char *s, const int assert)
@@ -216,10 +218,131 @@ static void test_bearer_context_setup_response(void)
   free_e1ap_context_setup_response(&orig);
 }
 
+/**
+ * @brief Test CU-UP Setup Request encoding/decoding
+ */
+static void test_e1_cuup_setup_request(void)
+{
+  e1ap_setup_req_t orig = {.gNB_cu_up_id = 1234,
+                           .gNB_cu_up_name = strdup("OAI CU-UP"),
+                           .transac_id = 42,
+                           .supported_plmns = 1,
+                           .cn_support = cn_support_5GC,
+                           .plmn[0] = {.id = {.mcc = 001, .mnc = 01, .mnc_digit_length = 2},
+                                       .supported_slices = 1}};
+  orig.plmn[0].slice = malloc_or_fail(sizeof(*orig.plmn[0].slice));
+  orig.plmn[0].slice->sst = 0x01;
+  orig.plmn[0].slice->sd = 0x01;
+
+  E1AP_E1AP_PDU_t *encoded = encode_e1ap_cuup_setup_request(&orig);
+  E1AP_E1AP_PDU_t *decoded_msg = e1ap_encode_decode(encoded);
+  e1ap_msg_free(encoded);
+
+  e1ap_setup_req_t decoded = {0};
+  bool ret = decode_e1ap_cuup_setup_request(decoded_msg, &decoded);
+  AssertFatal(ret, "Failed to decode setup request");
+  e1ap_msg_free(decoded_msg);
+
+  ret = eq_e1ap_cuup_setup_request(&orig, &decoded);
+  AssertFatal(ret, "Decoded setup request doesn't match original");
+  free_e1ap_cuup_setup_request(&decoded);
+
+  e1ap_setup_req_t cp = cp_e1ap_cuup_setup_request(&orig);
+  ret = eq_e1ap_cuup_setup_request(&orig, &cp);
+  AssertFatal(ret, "eq_e1ap_cuup_setup_request(): copied message doesn't match\n");
+
+  free_e1ap_cuup_setup_request(&orig);
+  free_e1ap_cuup_setup_request(&cp);
+}
+
+/**
+ * @brief Test CU-UP Setup Response encoding/decoding
+ */
+static void test_e1_cuup_setup_response(void)
+{
+  e1ap_setup_resp_t orig = {.transac_id = 42,
+                            .gNB_cu_cp_name = strdup("OAI CU-CP"),
+                            .tnla_info = malloc(sizeof(tnl_address_info_t))};
+  orig.tnla_info->num_addresses_to_add = 1;
+  orig.tnla_info->num_addresses_to_remove = 1;
+  orig.tnla_info->addresses_to_add[0].num_gtp_tl_addresses = 1;
+  orig.tnla_info->addresses_to_add[0].ipsec_tl_address = 0xC0A80001;
+  orig.tnla_info->addresses_to_add[0].gtp_tl_addresses[0] = 0xC0A80002;
+  orig.tnla_info->num_addresses_to_remove = 1;
+  orig.tnla_info->addresses_to_remove[0].num_gtp_tl_addresses = 1;
+  orig.tnla_info->addresses_to_remove[0].ipsec_tl_address = 0xC0A80003;
+  orig.tnla_info->addresses_to_remove[0].gtp_tl_addresses[0] = 0xC0A80004;
+
+  E1AP_E1AP_PDU_t *encoded = encode_e1ap_cuup_setup_response(&orig);
+  E1AP_E1AP_PDU_t *decoded_msg = e1ap_encode_decode(encoded);
+  e1ap_msg_free(encoded);
+
+  e1ap_setup_resp_t decoded = {0};
+  bool ret = decode_e1ap_cuup_setup_response(decoded_msg, &decoded);
+  AssertFatal(ret, "Failed to decode setup response");
+  e1ap_msg_free(decoded_msg);
+
+  ret = eq_e1ap_cuup_setup_response(&orig, &decoded);
+  AssertFatal(ret, "Decoded setup response doesn't match original");
+  free_e1ap_cuup_setup_response(&decoded);
+
+  e1ap_setup_resp_t cp = cp_e1ap_cuup_setup_response(&orig);
+  ret = eq_e1ap_cuup_setup_response(&orig, &cp);
+  AssertFatal(ret, "eq_e1ap_cuup_setup_response(): copied message doesn't match\n");
+
+  free_e1ap_cuup_setup_response(&orig);
+  free_e1ap_cuup_setup_response(&cp);
+}
+
+// Test for E1AP CU-UP Setup Failure
+static void test_e1_cuup_setup_failure(void)
+{
+  e1ap_setup_fail_t orig = {.transac_id = 42,
+                            .cause.type = E1AP_CAUSE_RADIO_NETWORK,
+                            .cause.value = E1AP_RADIO_CAUSE_NORMAL_RELEASE,
+                            .time_to_wait = malloc_or_fail(sizeof(long)),
+                            .crit_diag = malloc_or_fail(sizeof(criticality_diagnostics_t))};
+  *orig.time_to_wait = 5;
+  orig.crit_diag->procedure_code = malloc_or_fail(sizeof(*orig.crit_diag->procedure_code));
+  *orig.crit_diag->procedure_code = 99;
+  orig.crit_diag->triggering_msg = malloc_or_fail(sizeof(*orig.crit_diag->triggering_msg));
+  *orig.crit_diag->triggering_msg = TRIGGERING_MSG_SUCCESSFUL_OUTCOME;
+  orig.crit_diag->procedure_criticality = malloc_or_fail(sizeof(*orig.crit_diag->procedure_criticality));
+  *orig.crit_diag->procedure_criticality = CRITICALITY_IGNORE;
+  orig.crit_diag->num_errors = 1;
+  orig.crit_diag->errors[0].ie_id = 66;
+  orig.crit_diag->errors[0].error_type = ERROR_TYPE_MISSING;
+  orig.crit_diag->errors[0].criticality = CRITICALITY_IGNORE;
+
+  E1AP_E1AP_PDU_t *encoded = encode_e1ap_cuup_setup_failure(&orig);
+  E1AP_E1AP_PDU_t *decoded_msg = e1ap_encode_decode(encoded);
+  e1ap_msg_free(encoded);
+
+  e1ap_setup_fail_t decoded = {0};
+  bool ret = decode_e1ap_cuup_setup_failure(decoded_msg, &decoded);
+  AssertFatal(ret, "Failed to decode setup failure");
+  e1ap_msg_free(decoded_msg);
+
+  ret = eq_e1ap_cuup_setup_failure(&orig, &decoded);
+  AssertFatal(ret, "Decoded setup failure doesn't match original");
+  free_e1ap_cuup_setup_failure(&decoded);
+
+  e1ap_setup_fail_t cp = cp_e1ap_cuup_setup_failure(&orig);
+  ret = eq_e1ap_cuup_setup_failure(&orig, &cp);
+  AssertFatal(ret, "eq_e1ap_cuup_setup_failure(): copied message doesn't match\n");
+
+  free_e1ap_cuup_setup_failure(&cp);
+  free_e1ap_cuup_setup_failure(&orig);
+}
+
 int main()
 {
   // E1 Bearer Context Setup
   test_bearer_context_setup_request();
   test_bearer_context_setup_response();
+  // E1 Interface Management
+  test_e1_cuup_setup_request();
+  test_e1_cuup_setup_response();
+  test_e1_cuup_setup_failure();
   return 0;
 }
diff --git a/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt b/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
index 1d47f029d9115779cec3e6e8feab35dcf076f2ba..578bf489dfc3c6a1a1b70a5bc5c7e08a390aef40 100644
--- a/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
+++ b/openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
@@ -12,7 +12,7 @@ add_library(e2_ran_func_cuup STATIC
             ../flexric/test/rnd/fill_rnd_data_tc.c
             )
 
-target_link_libraries(e2_ran_func_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj sm_common_ie_obj)
+target_link_libraries(e2_ran_func_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj sm_common_ie_obj ds)
 target_compile_definitions(e2_ran_func_cuup PUBLIC ${E2AP_VERSION}  ${KPM_VERSION}  NGRAN_GNB_CUUP)
 
 
@@ -35,7 +35,7 @@ add_library(e2_ran_func_du_cucp_cuup STATIC
             ../flexric/test/rnd/fill_rnd_data_tc.c
             )
 
-target_link_libraries(e2_ran_func_du_cucp_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj e2sm_rc_ir_obj sm_common_ie_obj)
+target_link_libraries(e2_ran_func_du_cucp_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj e2sm_rc_ir_obj sm_common_ie_obj ds)
 target_compile_definitions(e2_ran_func_du_cucp_cuup PUBLIC ${E2AP_VERSION}  ${KPM_VERSION} NGRAN_GNB_DU NGRAN_GNB_CUCP NGRAN_GNB_CUUP)
 
 # Current implementation:
diff --git a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
index 40371df046815d266c9b0d33eb7f88d748ec0e7c..c9620e871f44705e8883d5d2d688deb5e400a1aa 100644
--- a/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
+++ b/openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_kpm.c
@@ -23,6 +23,7 @@
 #include "ran_func_kpm_subs.h"
 #include "ran_e2sm_ue_id.h"
 
+#include "common/utils/ds/byte_array.h"
 #include "openair2/E1AP/e1ap_common.h"
 #include "openair2/E2AP/flexric/src/util/time_now_us.h"
 #include "openair2/F1AP/f1ap_ids.h"
diff --git a/openair2/F1AP/f1ap_cu_interface_management.c b/openair2/F1AP/f1ap_cu_interface_management.c
index bc5480a11b8b1926cde0d3eb4ebeb70d084baee2..9e25aeb63e57edda0d27344e77cf3f1f5a84dbc2 100644
--- a/openair2/F1AP/f1ap_cu_interface_management.c
+++ b/openair2/F1AP/f1ap_cu_interface_management.c
@@ -160,7 +160,7 @@ int CU_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(sctp_assoc_t assoc_id, f1ap_
     LOG_E(F1AP, "Failed to encode F1 gNB-DU Configuration Update Acknowledge\n");
     return -1;
   }
-  LOG_DUMPMSG(F1AP, LOG_DUMP_CHAR, buffer, len, "F1AP gNB-DU CONFIGURATION UPDATE : ");
+  LOG_DUMPMSG(F1AP, DEBUG_F1AP, buffer, len, "F1AP gNB-DU CONFIGURATION UPDATE : ");
   ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
   f1ap_itti_send_sctp_data_req(assoc_id, buffer, len);
   return 0;
@@ -185,7 +185,7 @@ int CU_send_gNB_CU_CONFIGURATION_UPDATE(sctp_assoc_t assoc_id, f1ap_gnb_cu_confi
     LOG_E(F1AP, "Failed to encode F1 gNB-CU Configuration Update\n");
     return -1;
   }
-  LOG_DUMPMSG(F1AP, LOG_DUMP_CHAR, buffer, len, "F1AP gNB-CU CONFIGURATION UPDATE : ");
+  LOG_DUMPMSG(F1AP, DEBUG_F1AP, buffer, len, "F1AP gNB-CU CONFIGURATION UPDATE : ");
   ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
   f1ap_itti_send_sctp_data_req(assoc_id, buffer, len);
   return 0;
diff --git a/openair2/F1AP/f1ap_cu_task.c b/openair2/F1AP/f1ap_cu_task.c
index 59e4bb29af98600eddd92961c9acc83fc902c294..fa77f818ead41b3f540d63edfbfc6b7d6096f2f0 100644
--- a/openair2/F1AP/f1ap_cu_task.c
+++ b/openair2/F1AP/f1ap_cu_task.c
@@ -65,7 +65,7 @@ static void cu_task_handle_sctp_association_ind(instance_t instance,
 static void cu_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) {
   DevAssert(sctp_new_association_resp != NULL);
 
-  enum sctp_state_e state = sctp_new_association_resp->sctp_state;
+  sctp_state_e state = sctp_new_association_resp->sctp_state;
   if (state != SCTP_STATE_ESTABLISHED) {
     f1ap_cudu_inst_t *f1ap_cu_data = getCxt(instance);
     AssertFatal(f1ap_cu_data != NULL, "illegal state: SCTP shutdown for non-existing F1AP endpoint\n");
diff --git a/openair2/F1AP/f1ap_ids.c b/openair2/F1AP/f1ap_ids.c
index 64d4b0b938b56ff8df8fc55401bc681003d9b751..5569d60c48eb625889908987464cd9d39958cacb 100644
--- a/openair2/F1AP/f1ap_ids.c
+++ b/openair2/F1AP/f1ap_ids.c
@@ -29,6 +29,23 @@
 #include "common/utils/assertions.h"
 
 
+static f1_ue_data_t *get_hashtable_data(hash_table_t *ht, uint64_t ue_id)
+{
+  void *data = NULL;
+  hashtable_rc_t ret = hashtable_get(ht, ue_id, &data);
+  AssertFatal(ret == HASH_TABLE_OK && data != NULL, "element for ue_id %ld not found\n", ue_id);
+  return data;
+}
+
+static bool add_hashtable_data(hash_table_t *ht, uint64_t ue_id, const f1_ue_data_t *data)
+{
+  f1_ue_data_t *idata = malloc(sizeof(*idata));
+  AssertFatal(idata, "cannot allocate memory\n");
+  *idata = *data;
+  hashtable_rc_t ret = hashtable_insert(ht, ue_id, idata);
+  return ret == HASH_TABLE_OK;
+}
+
 /* we have separate versions for CU and DU, as both CU&DU might coexist in the
  * same process */
 static hash_table_t *cu2du_ue_mapping;
@@ -52,12 +69,9 @@ bool cu_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
     pthread_mutex_unlock(&cu2du_mutex);
     return false;
   }
-  f1_ue_data_t *idata = malloc(sizeof(*idata));
-  AssertFatal(idata, "cannot allocate memory\n");
-  *idata = *data;
-  hashtable_rc_t ret = hashtable_insert(cu2du_ue_mapping, key, idata);
+  bool ret = add_hashtable_data(cu2du_ue_mapping, key, data);
   pthread_mutex_unlock(&cu2du_mutex);
-  return ret == HASH_TABLE_OK;
+  return ret;
 }
 
 bool cu_exists_f1_ue_data(uint32_t ue_id)
@@ -70,15 +84,23 @@ bool cu_exists_f1_ue_data(uint32_t ue_id)
   return ret == HASH_TABLE_OK;
 }
 
-f1_ue_data_t cu_get_f1_ue_data(uint32_t ue_id)
+bool cu_update_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
 {
   pthread_mutex_lock(&cu2du_mutex);
   DevAssert(cu2du_ue_mapping != NULL);
   uint64_t key = ue_id;
-  void *data = NULL;
-  hashtable_rc_t ret = hashtable_get(cu2du_ue_mapping, key, &data);
-  AssertFatal(ret == HASH_TABLE_OK && data != NULL, "element for ue_id %d not found\n", ue_id);
-  f1_ue_data_t ued = *(f1_ue_data_t *)data;
+  hashtable_rc_t retrm = hashtable_remove(cu2du_ue_mapping, key);
+  AssertFatal(retrm == HASH_TABLE_OK, "could not remove UE %d, ret %d\n", ue_id, retrm);
+  bool ret = add_hashtable_data(cu2du_ue_mapping, key, data);
+  pthread_mutex_unlock(&cu2du_mutex);
+  return ret;
+}
+
+f1_ue_data_t cu_get_f1_ue_data(uint32_t ue_id)
+{
+  pthread_mutex_lock(&cu2du_mutex);
+  DevAssert(cu2du_ue_mapping != NULL);
+  f1_ue_data_t ued = *get_hashtable_data(cu2du_ue_mapping, ue_id);
   pthread_mutex_unlock(&cu2du_mutex);
   return ued;
 }
@@ -115,12 +137,9 @@ bool du_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data)
     pthread_mutex_unlock(&du2cu_mutex);
     return false;
   }
-  f1_ue_data_t *idata = malloc(sizeof(*idata));
-  AssertFatal(idata, "cannot allocate memory\n");
-  *idata = *data;
-  hashtable_rc_t ret = hashtable_insert(du2cu_ue_mapping, key, idata);
+  bool ret = add_hashtable_data(du2cu_ue_mapping, key, data);
   pthread_mutex_unlock(&du2cu_mutex);
-  return ret == HASH_TABLE_OK;
+  return ret;
 }
 
 bool du_exists_f1_ue_data(uint32_t ue_id)
@@ -137,11 +156,7 @@ f1_ue_data_t du_get_f1_ue_data(uint32_t ue_id)
 {
   pthread_mutex_lock(&du2cu_mutex);
   DevAssert(du2cu_ue_mapping != NULL);
-  uint64_t key = ue_id;
-  void *data = NULL;
-  hashtable_rc_t ret = hashtable_get(du2cu_ue_mapping, key, &data);
-  AssertFatal(ret == HASH_TABLE_OK && data != NULL, "element for ue_id %d not found\n", ue_id);
-  f1_ue_data_t ued = *(f1_ue_data_t *)data;
+  f1_ue_data_t ued = *get_hashtable_data(du2cu_ue_mapping, ue_id);
   pthread_mutex_unlock(&du2cu_mutex);
   return ued;
 }
diff --git a/openair2/F1AP/f1ap_ids.h b/openair2/F1AP/f1ap_ids.h
index 54d17243c54222600dd753d344cd72aaf7b8db8a..585ed33322d23cb1aacbed3ddb34a4bfe6192857 100644
--- a/openair2/F1AP/f1ap_ids.h
+++ b/openair2/F1AP/f1ap_ids.h
@@ -40,6 +40,7 @@ typedef struct f1_ue_data_t {
 void cu_init_f1_ue_data(void);
 bool cu_add_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data);
 bool cu_exists_f1_ue_data(uint32_t ue_id);
+bool cu_update_f1_ue_data(uint32_t ue_id, const f1_ue_data_t *data);
 f1_ue_data_t cu_get_f1_ue_data(uint32_t ue_id);
 bool cu_remove_f1_ue_data(uint32_t ue_id);
 
diff --git a/openair2/F1AP/f1ap_ids_test.c b/openair2/F1AP/f1ap_ids_test.c
index 3007db566a15a81a5f66626e046a97d7d3905ff4..a58059339d8f808dd29838167c73a56469a9d16a 100644
--- a/openair2/F1AP/f1ap_ids_test.c
+++ b/openair2/F1AP/f1ap_ids_test.c
@@ -25,7 +25,7 @@
 #include "common/utils/assertions.h"
 #include "f1ap_ids.h"
 
-int main()
+void du_data_test()
 {
   du_init_f1_ue_data();
   int rnti = 13;
@@ -38,5 +38,37 @@ int main()
   DevAssert(exists);
   f1_ue_data_t rdata = du_get_f1_ue_data(rnti);
   DevAssert(rdata.secondary_ue == data.secondary_ue);
+}
+
+void cu_data_test()
+{
+  cu_init_f1_ue_data();
+  int ue_id = 13;
+  f1_ue_data_t data = {.secondary_ue = 1};
+  bool ret = cu_add_f1_ue_data(ue_id, &data);
+  DevAssert(ret);
+  ret = cu_add_f1_ue_data(ue_id, &data);
+  DevAssert(!ret);
+  data.secondary_ue = 2;
+  ret = cu_update_f1_ue_data(ue_id, &data);
+  bool exists = cu_exists_f1_ue_data(ue_id);
+  DevAssert(exists);
+  f1_ue_data_t rdata = cu_get_f1_ue_data(ue_id);
+  DevAssert(rdata.secondary_ue == data.secondary_ue);
+
+  rdata.secondary_ue = 3;
+  // overwrite once more
+  ret = cu_update_f1_ue_data(ue_id, &rdata);
+  DevAssert(ret);
+  exists = cu_exists_f1_ue_data(ue_id);
+  DevAssert(exists);
+  f1_ue_data_t r2data = cu_get_f1_ue_data(ue_id);
+  DevAssert(r2data.secondary_ue == rdata.secondary_ue);
+}
+
+int main()
+{
+  du_data_test();
+  cu_data_test();
   return 0;
 }
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index baeca1aa7239a8a52f6a286a2ca28a16fe4419e2..39c8014adc9a5183370afdef7333897db3b85029 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -2202,7 +2202,7 @@ void NRRCConfig(void)
 
   // Set num of gNBs instances
   RC.nb_nr_inst = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
-  AssertFatal(RC.nb_nr_inst == NUMBER_OF_gNB_MAX,
+  AssertFatal(RC.nb_nr_inst <= NUMBER_OF_gNB_MAX,
               "Configuration error: RC.nb_nr_inst (%d) must equal NUMBER_OF_gNB_MAX (%d).\n"
               "Currently, only one instance of each layer (L1, L2, L3) is supported.\n"
               "Ensure that nb_nr_inst matches the maximum allowed gNB instances in this configuration.",
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 6d78d6616ad1ca07248b666dfcef9f3b9659b6d4..143d4623d70f51419369374dd31c77ab83954dcb 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -325,7 +325,8 @@ typedef struct {
      NRUE MAC layer already does in get_downlink_ack(). */
   int active_dl_harq_sfn;
   int active_dl_harq_slot;
-  int active_ul_harq_sfn_slot;
+  int active_ul_harq_sfn;
+  int active_ul_harq_slot;
   bool active;
 } emul_l1_harq_t;
 
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index ee81d2a95dc4bc236bccbbbc2f1e47a5e3b45faf..732b4738b502d35445ece4ce311fba2bd2c886cc 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -246,6 +246,56 @@ static void config_common_ue_sa(NR_UE_MAC_INST_t *mac,
 
 }
 
+// computes delay between ue and sat based on SIB19 ephemeris data
+static double calculate_ue_sat_ta(const position_t *position_params, NR_PositionVelocity_r17_t *sat_pos)
+{
+  // get UE position coordinates
+  double posx = position_params->positionX;
+  double posy = position_params->positionY;
+  double posz = position_params->positionZ;
+
+  // get sat position coordinates
+  double posx_0 = (double)sat_pos->positionX_r17 * 1.3;
+  double posy_0 = (double)sat_pos->positionY_r17 * 1.3;
+  double posz_0 = (double)sat_pos->positionZ_r17 * 1.3;
+
+  double distance = sqrt(pow(posx - posx_0, 2) + pow(posy - posy_0, 2) + pow(posz - posz_0, 2));
+  // this computation will ensure 3 decimal precision
+  double ta_ms = round(((distance / SPEED_OF_LIGHT) * 1000) * 1000.0) / 1000.0;
+
+  return ta_ms;
+}
+
+// populate ntn_ta structure from mac
+void configure_ntn_ta(module_id_t module_id, ntn_timing_advance_componets_t *ntn_ta, NR_NTN_Config_r17_t *ntn_Config_r17)
+{
+  position_t position_params = {0};
+  get_position_coordinates(module_id, &position_params);
+
+  // if ephemerisInfo_r17 present in SIB19
+  NR_EphemerisInfo_r17_t *ephemeris_info = ntn_Config_r17->ephemerisInfo_r17;
+  if (ephemeris_info) {
+    NR_PositionVelocity_r17_t *position_velocity = ephemeris_info->choice.positionVelocity_r17;
+    if (position_velocity
+        && (position_velocity->positionX_r17 != 0 || position_velocity->positionY_r17 != 0
+            || position_velocity->positionZ_r17 != 0)) {
+      ntn_ta->N_UE_TA_adj = calculate_ue_sat_ta(&position_params, position_velocity);
+    }
+  }
+  // if cellSpecificKoffset_r17 is present
+  if (ntn_Config_r17->cellSpecificKoffset_r17) {
+    ntn_ta->cell_specific_k_offset = *ntn_Config_r17->cellSpecificKoffset_r17;
+  }
+  // Check if ta_Info_r17 is present and convert directly ta_Common_r17 (is in units of 4.072e-3 µs)
+  if (ntn_Config_r17->ta_Info_r17) {
+    ntn_ta->N_common_ta_adj = ntn_Config_r17->ta_Info_r17->ta_Common_r17 * 4.072e-6;
+    // ta_CommonDrift_r17 (is in units of 0.2e-3 µs/s)
+    if (ntn_Config_r17->ta_Info_r17->ta_CommonDrift_r17)
+      ntn_ta->ntn_ta_commondrift = *ntn_Config_r17->ta_Info_r17->ta_CommonDrift_r17 * 0.2e-3;
+  }
+  ntn_ta->ntn_params_changed = true;
+}
+
 static void config_common_ue(NR_UE_MAC_INST_t *mac,
                              NR_ServingCellConfigCommon_t *scc,
                              int cc_idP)
@@ -421,6 +471,7 @@ static void config_common_ue(NR_UE_MAC_INST_t *mac,
   // NTN Config
   if (scc->ext2) {
     UPDATE_IE(mac->sc_info.ntn_Config_r17, scc->ext2->ntn_Config_r17, NR_NTN_Config_r17_t);
+    configure_ntn_ta(mac->ue_id, &mac->ntn_ta, mac->sc_info.ntn_Config_r17);
   } else {
     asn1cFreeStruc(asn_DEF_NR_NTN_Config_r17, mac->sc_info.ntn_Config_r17);
   }
@@ -1750,64 +1801,18 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, int cc_idP, NR_SIB1_t *si
   AssertFatal(!ret, "mutex failed %d\n", ret);
 }
 
-// computes delay between ue and sat based on SIB19 ephemeris data
-static double calculate_ue_sat_ta(const position_t *position_params, NR_PositionVelocity_r17_t *sat_pos)
-{
-  // get UE position coordinates
-  double posx = position_params->positionX;
-  double posy = position_params->positionY;
-  double posz = position_params->positionZ;
-
-  // get sat position coordinates
-  double posx_0 = (double)sat_pos->positionX_r17 * 1.3;
-  double posy_0 = (double)sat_pos->positionY_r17 * 1.3;
-  double posz_0 = (double)sat_pos->positionZ_r17 * 1.3;
-
-  double distance = sqrt(pow(posx - posx_0, 2) + pow(posy - posy_0, 2) + pow(posz - posz_0, 2));
-  // this computation will ensure 3 decimal precision
-  double ta_ms = round(((distance / SPEED_OF_LIGHT) * 1000) * 1000.0) / 1000.0;
-
-  return ta_ms;
-}
-
 void nr_rrc_mac_config_other_sib(module_id_t module_id, NR_SIB19_r17_t *sib19)
 {
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
   int ret = pthread_mutex_lock(&mac->if_mutex);
   AssertFatal(!ret, "mutex failed %d\n", ret);
-  
+
   if (sib19) {
     // update ntn_Config_r17 with received values
     NR_NTN_Config_r17_t *ntn_Config_r17 = mac->sc_info.ntn_Config_r17;
     UPDATE_IE(ntn_Config_r17, sib19->ntn_Config_r17, NR_NTN_Config_r17_t);
 
-    position_t position_params = {0};
-    get_position_coordinates(module_id, &position_params);
-
-    // populate ntn_ta structure from mac
-    // if ephemerisInfo_r17 present in SIB19
-    NR_EphemerisInfo_r17_t *ephemeris_info = ntn_Config_r17->ephemerisInfo_r17;
-    if (ephemeris_info) {
-      NR_PositionVelocity_r17_t *position_velocity = ephemeris_info->choice.positionVelocity_r17;
-      if (position_velocity
-          && (position_velocity->positionX_r17 != 0
-          || position_velocity->positionY_r17 != 0
-          || position_velocity->positionZ_r17 != 0)) {
-        mac->ntn_ta.N_UE_TA_adj = calculate_ue_sat_ta(&position_params, position_velocity);
-      }
-    }
-    // if cellSpecificKoffset_r17 is present
-    if (ntn_Config_r17->cellSpecificKoffset_r17) {
-      mac->ntn_ta.cell_specific_k_offset = *ntn_Config_r17->cellSpecificKoffset_r17;
-    }
-    // Check if ta_Info_r17 is present and convert directly ta_Common_r17 (is in units of 4.072e-3 µs)
-    if (ntn_Config_r17->ta_Info_r17) {
-      mac->ntn_ta.N_common_ta_adj = ntn_Config_r17->ta_Info_r17->ta_Common_r17 * 4.072e-6;
-      // ta_CommonDrift_r17 (is in units of 0.2e-3 µs/s)
-      if (ntn_Config_r17->ta_Info_r17->ta_CommonDrift_r17)
-        mac->ntn_ta.ntn_ta_commondrift = *ntn_Config_r17->ta_Info_r17->ta_CommonDrift_r17 * 0.2e-3;
-    }
-    mac->ntn_ta.ntn_params_changed = true;
+    configure_ntn_ta(mac->ue_id, &mac->ntn_ta, ntn_Config_r17);
   }
   ret = pthread_mutex_unlock(&mac->if_mutex);
   AssertFatal(!ret, "mutex failed %d\n", ret);
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c b/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c
index babdd96f1028c2d898f957a7377a38f794686490..58db78ea831812cba3c73ff0eae4d676349d6664 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue_sl.c
@@ -43,7 +43,7 @@ void sl_ue_mac_free(NR_UE_MAC_INST_t *mac)
   // @todo: maybe this should be done by phy
   if (tdd_list) {
     int mu = sl_config->sl_bwp_config.sl_scs;
-    int nb_slots_to_set = TDD_CONFIG_NB_FRAMES*(1<<mu)*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
+    int nb_slots_to_set = (1 << mu) * NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
     for (int i=0; i<nb_slots_to_set; i++) {
       free_and_zero(tdd_list[i].max_num_of_symbol_per_slot_list);
     }
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 300789084459b2366859f0b1756309c30a9caa10..aa00daf9c9cf25fab5925ca1bfb82f85bbd1180d 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -2523,7 +2523,9 @@ void nr_ue_pucch_scheduler(NR_UE_MAC_INST_t *mac, frame_t frameP, int slotP)
         LOG_E(NR_MAC, "Error in pucch allocation\n");
         return;
       }
-      mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2HEX(frameP, slotP);
+      DevAssert(mac->current_DL_BWP != NULL);
+      int mu = mac->current_DL_BWP->scs;
+      mac->nr_ue_emul_l1.active_uci_sfn_slot = NFAPI_SFNSLOT2DEC(mu, frameP, slotP);
       int ret = nr_ue_configure_pucch(mac,
                                       slotP,
                                       frameP,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 7b010ad5bc531a801e236f66dd9713bc9bc49670..5ac48f13748edb515567b9b246f65f92dd840404 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -1538,15 +1538,25 @@ static void nr_generate_Msg2(module_id_t module_idP,
   pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].pm_idx = 0;
   pdsch_pdu_rel15->precodingAndBeamforming.prgs_list[0].dig_bf_interface_list[0].beam_idx = ra->beam_id;
 
+  // Distance calculation according to SCF222.10.02 RACH.indication (table 3-74) and 38.213 4.2/38.211 4.3.1
+  // T_c according to 38.211 4.1
+  float T_c_ns = 0.509;
+  int numerology = ra->UL_BWP.scs;
+  float rtt_ns = T_c_ns * 16 * 64 / (1 << numerology) * ra->timing_offset;
+  float speed_of_light_in_meters_per_second = 299792458.0f;
+  float distance_in_meters = speed_of_light_in_meters_per_second * rtt_ns / 1000 / 1000 / 1000 / 2;
   LOG_A(NR_MAC,
-        "UE %04x: %d.%d Generating RA-Msg2 DCI, RA RNTI 0x%x, state %d, CoreSetType %d, RAPID %d\n",
+        "UE %04x: %d.%d Generating RA-Msg2 DCI, RA RNTI 0x%x, state %d, CoreSetType %d, preamble_index(RAPID) %d, "
+        "timing_offset = %d (estimated distance %.1f [m])\n",
         ra->rnti,
         frameP,
         slotP,
         ra->RA_rnti,
         ra->ra_state,
         pdcch_pdu_rel15->CoreSetType,
-        ra->preamble_index);
+        ra->preamble_index,
+        ra->timing_offset,
+        distance_in_meters);
 
   // SCF222: PDU index incremented for each PDSCH PDU sent in TX control message. This is used to associate control
   // information to data and is reset every slot.
@@ -2126,7 +2136,7 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP,
 
     harq->tb_size = tb_size;
 
-    uint8_t *buf = (uint8_t *) harq->transportBlock;
+    uint8_t *buf = allocate_transportBlock_buffer(&harq->transportBlock, tb_size);
     // Bytes to be transmitted
     if (harq->round == 0) {
       uint16_t mac_pdu_length = 0;
@@ -2206,11 +2216,11 @@ static void nr_generate_Msg4_MsgB(module_id_t module_idP,
     }
 
     T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_idP), T_INT(CC_id), T_INT(ra->rnti),
-      T_INT(frameP), T_INT(slotP), T_INT(current_harq_pid), T_BUFFER(harq->transportBlock, harq->tb_size));
+      T_INT(frameP), T_INT(slotP), T_INT(current_harq_pid), T_BUFFER(harq->transportBlock.buf, harq->tb_size));
 
     // DL TX request
     nfapi_nr_pdu_t *tx_req = &TX_req->pdu_list[TX_req->Number_of_PDUs];
-    memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock, sizeof(uint8_t) * harq->tb_size);
+    memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock.buf, sizeof(uint8_t) * harq->tb_size);
     tx_req->PDU_index = pduindex;
     tx_req->num_TLV = 1;
     tx_req->TLVs[0].length =  harq->tb_size;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 9c69c2660cc9d9a5508f60e128f69cf560d7d272..fb239c48e44101af2e2d469d2a64577c22c1259b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -731,7 +731,8 @@ void schedule_nr_sib1(module_id_t module_idP,
 
       nfapi_nr_dl_tti_request_body_t *dl_req = &DL_req->dl_tti_request_body;
       int pdu_index = gNB_mac->pdu_index[0]++;
-      nr_fill_nfapi_dl_SIB_pdu(module_idP, 
+      LOG_D(NR_MAC, "%s() %4d.%2d\n", __func__, frameP, slotP);
+      nr_fill_nfapi_dl_SIB_pdu(module_idP,
                               NULL,
                               gNB_mac->sched_ctrlCommon,
                               dl_req,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index ce5bbfe9fd708f32480db8bd503ddb382e19089f..48a72b527bde774001d493d178abd47586856e9c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -1280,12 +1280,12 @@ void nr_schedule_ue_spec(module_id_t module_id,
                   UE->rnti,
                   current_harq_pid);
       T(T_GNB_MAC_RETRANSMISSION_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
-        T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->transportBlock, TBS));
+        T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_INT(harq->round), T_BUFFER(harq->transportBlock.buf, TBS));
       UE->mac_stats.dl.total_rbs_retx += sched_pdsch->rbSize;
       gNB_mac->mac_stats.used_prb_aggregate += sched_pdsch->rbSize;
     } else { /* initial transmission */
       LOG_D(NR_MAC, "Initial HARQ transmission in %d.%d\n", frame, slot);
-      uint8_t *buf = (uint8_t *) harq->transportBlock;
+      uint8_t *buf = allocate_transportBlock_buffer(&harq->transportBlock, TBS);
       /* first, write all CEs that might be there */
       int written = nr_write_ce_dlsch_pdu(module_id,
                                           sched_ctrl,
@@ -1420,7 +1420,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
       }
 
       T(T_GNB_MAC_DL_PDU_WITH_DATA, T_INT(module_id), T_INT(CC_id), T_INT(rnti),
-        T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_BUFFER(harq->transportBlock, TBS));
+        T_INT(frame), T_INT(slot), T_INT(current_harq_pid), T_BUFFER(harq->transportBlock.buf, TBS));
     }
 
     const int ntx_req = TX_req->Number_of_PDUs;
@@ -1429,7 +1429,7 @@ void nr_schedule_ue_spec(module_id_t module_id,
     tx_req->num_TLV = 1;
     tx_req->TLVs[0].length = TBS;
     tx_req->PDU_length = compute_PDU_length(tx_req->num_TLV, tx_req->TLVs[0].length);
-    memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock, TBS);
+    memcpy(tx_req->TLVs[0].value.direct, harq->transportBlock.buf, TBS);
     TX_req->Number_of_PDUs++;
     TX_req->SFN = frame;
     TX_req->Slot = slot;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 708337640c272802f9f4838d50044c8f014d997a..ec243fcd86a71a758e3a4313cc630d9326977462 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -2079,12 +2079,35 @@ void delete_nr_ue_data(NR_UE_info_t *UE, NR_COMMON_channels_t *ccPtr, uid_alloca
   destroy_nr_list(&sched_ctrl->available_ul_harq);
   destroy_nr_list(&sched_ctrl->feedback_ul_harq);
   destroy_nr_list(&sched_ctrl->retrans_ul_harq);
+  for (int i = 0; i < NR_MAX_HARQ_PROCESSES; ++i)
+    free_transportBlock_buffer(&sched_ctrl->harq_processes[i].transportBlock);
   free_sched_pucch_list(sched_ctrl);
   uid_linear_allocator_free(uia, UE->uid);
   LOG_I(NR_MAC, "Remove NR rnti 0x%04x\n", UE->rnti);
   free(UE);
 }
 
+#define TB_SINGLE_LAYER (32 * 1024)
+uint8_t *allocate_transportBlock_buffer(byte_array_t *tb, uint32_t needed)
+{
+  DevAssert(needed > 0);
+  if (tb->buf != NULL && needed <= tb->len)
+    return tb->buf; // nothing to do, current is enough
+
+  uint32_t size = TB_SINGLE_LAYER;
+  while (needed > size)
+    size *= 2;
+  LOG_D(NR_MAC, "allocating new TB block of size %d\n", size);
+  free(tb->buf);
+  tb->buf = malloc_or_fail(size);
+  tb->len = size;
+  return tb->buf;
+}
+
+void free_transportBlock_buffer(byte_array_t *tb)
+{
+  free_byte_array(*tb);
+}
 
 void set_max_fb_time(NR_UE_UL_BWP_t *UL_BWP, const NR_UE_DL_BWP_t *DL_BWP)
 {
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index d8c876439b5abcbff1ec90620613389111ae94d8..46deef46e894725e1786dcfa11f38535f132260c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -381,6 +381,9 @@ void handle_nr_ul_harq(const int CC_idP,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu);
 
+uint8_t *allocate_transportBlock_buffer(byte_array_t *tb, uint32_t needed);
+void free_transportBlock_buffer(byte_array_t *tb);
+
 void handle_nr_srs_measurements(const module_id_t module_id,
                                 const frame_t frame,
                                 const sub_frame_t slot,
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
index 9c6f5f4b273fc83c38edbca47ee049194695d098..124d63d293baf0578f38378f5f5fb47820c671b0 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_rrc_dl_handler.c
@@ -482,7 +482,8 @@ static NR_UE_info_t *create_new_UE(gNB_MAC_INST *mac, uint32_t cu_id)
     return NULL;
 
   f1_ue_data_t new_ue_data = {.secondary_ue = cu_id};
-  du_add_f1_ue_data(rnti, &new_ue_data);
+  bool success = du_add_f1_ue_data(rnti, &new_ue_data);
+  DevAssert(success);
 
   const NR_ServingCellConfigCommon_t *scc = mac->common_channels[CC_id].ServingCellConfigCommon;
   const NR_ServingCellConfig_t *sccd = mac->common_channels[CC_id].pre_ServingCellConfig;
@@ -826,7 +827,8 @@ void dl_rrc_message_transfer(const f1ap_dl_rrc_message_t *dl_rrc)
   if (!du_exists_f1_ue_data(dl_rrc->gNB_DU_ue_id)) {
     LOG_D(NR_MAC, "No CU UE ID stored for UE RNTI %04x, adding CU UE ID %d\n", dl_rrc->gNB_DU_ue_id, dl_rrc->gNB_CU_ue_id);
     f1_ue_data_t new_ue_data = {.secondary_ue = dl_rrc->gNB_CU_ue_id};
-    du_add_f1_ue_data(dl_rrc->gNB_DU_ue_id, &new_ue_data);
+    bool success = du_add_f1_ue_data(dl_rrc->gNB_DU_ue_id, &new_ue_data);
+    DevAssert(success);
   }
 
   if (UE->expect_reconfiguration && dl_rrc->srb_id == 1) {
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index c94f64dfefbbf1f93429cac0624bfbedf45d4814..bb1fba0fe8f04e2d12c666c0713a43704dc58243 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -44,6 +44,7 @@
 #include <pthread.h>
 #include "common/utils/ds/seq_arr.h"
 #include "common/utils/nr/nr_common.h"
+#include "common/utils/ds/byte_array.h"
 
 #define NR_SCHED_LOCK(lock)                                        \
   do {                                                             \
@@ -481,10 +482,9 @@ typedef struct NR_UE_harq {
   uint16_t feedback_frame;
   uint16_t feedback_slot;
 
-  /* Transport block to be sent using this HARQ process, its size is in
-   * sched_pdsch */
-  uint32_t transportBlock[38016]; // valid up to 4 layers
-  uint32_t tb_size;
+  /* Transport block to be sent using this HARQ process */
+  byte_array_t transportBlock;
+  uint32_t tb_size;  // size of currently stored TB
 
   /// sched_pdsch keeps information on MCS etc used for the initial transmission
   NR_sched_pdsch_t sched_pdsch;
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index c86e44b60747c70de872305f9052fca9fa5ed480..aeac4b3b98827f813d4e4d90f839a5b3b35c820c 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -495,11 +495,7 @@ int pdcp_fifo_read_input_sdus_fromnetlinksock (const protocol_ctxt_t *const  ctx
             }
           } else { // ctxt.enb_flag => UE
             if (NFAPI_MODE == NFAPI_UE_STUB_PNF || NFAPI_MODE == NFAPI_MODE_STANDALONE_PNF) {
-#ifdef UESIM_EXPANSION
-              ctxt.module_id = inst_pdcp_list[pdcp_read_header_g.inst];
-#else
               ctxt.module_id = pdcp_read_header_g.inst;
-#endif
             } else {
               ctxt.module_id = 0;
             }
diff --git a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
index 1d3394e7888f5fbd0e0cbd1c3d2d669716a733f1..380ae1f60a4eec4ebd704abbd477b77848090baf 100644
--- a/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
+++ b/openair2/LAYER2/nr_pdcp/cucp_cuup_handler.c
@@ -150,7 +150,8 @@ void e1_bearer_context_setup(const e1ap_bearer_setup_req_t *req)
   uint32_t cu_up_ue_id = req->gNB_cu_cp_ue_id;
   f1_ue_data_t ued = {.secondary_ue = req->gNB_cu_cp_ue_id};
   if (need_ue_id_mgmt) {
-    cu_add_f1_ue_data(cu_up_ue_id, &ued);
+    bool success = cu_add_f1_ue_data(cu_up_ue_id, &ued);
+    DevAssert(success);
     LOG_I(E1AP, "adding UE with CU-CP UE ID %d and CU-UP UE ID %d\n", req->gNB_cu_cp_ue_id, cu_up_ue_id);
   }
 
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index 1ef2365573f8b70739437eb253ec9f9a7a7f0b29..f23460c994daa04699fc0b13ff18b57c1b2bb557 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -73,34 +73,26 @@ static void handle_nr_rach(NR_UL_IND_t *UL_info)
     return;
   }
   if (UL_info->rach_ind.number_of_pdus) {
-    int frame_diff = UL_info->frame - UL_info->rach_ind.sfn;
-    if (frame_diff < 0) {
-      frame_diff += 1024;
-    }
-    bool in_timewindow = frame_diff == 0 || (frame_diff == 1 && UL_info->slot < 7);
-
-    if (in_timewindow) {
-      LOG_D(MAC,
-            "UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",
-            UL_info->frame,
-            UL_info->slot,
-            UL_info->rach_ind.sfn,
-            UL_info->rach_ind.slot);
-      for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) {
-        nfapi_nr_prach_indication_pdu_t *rach = UL_info->rach_ind.pdu_list + i;
-        if (rach->num_preamble > 1) {
-          LOG_E(MAC, "Not more than 1 preamble per RACH PDU supported, ignoring the rest\n");
-        }
-        nr_initiate_ra_proc(UL_info->module_id,
-                            UL_info->CC_id,
-                            UL_info->rach_ind.sfn,
-                            UL_info->rach_ind.slot,
-                            rach->preamble_list[0].preamble_index,
-                            rach->freq_index,
-                            rach->symbol_index,
-                            rach->preamble_list[0].timing_advance,
-                            rach->preamble_list[0].preamble_pwr);
+    LOG_D(MAC,
+          "UL_info[Frame %d, Slot %d] Calling initiate_ra_proc RACH:SFN/SLOT:%d/%d\n",
+          UL_info->frame,
+          UL_info->slot,
+          UL_info->rach_ind.sfn,
+          UL_info->rach_ind.slot);
+    for (int i = 0; i < UL_info->rach_ind.number_of_pdus; i++) {
+      nfapi_nr_prach_indication_pdu_t *rach = UL_info->rach_ind.pdu_list + i;
+      if (rach->num_preamble > 1) {
+        LOG_E(MAC, "Not more than 1 preamble per RACH PDU supported, ignoring the rest\n");
       }
+      nr_initiate_ra_proc(UL_info->module_id,
+                          UL_info->CC_id,
+                          UL_info->rach_ind.sfn,
+                          UL_info->rach_ind.slot,
+                          rach->preamble_list[0].preamble_index,
+                          rach->freq_index,
+                          rach->symbol_index,
+                          rach->preamble_list[0].timing_advance,
+                          rach->preamble_list[0].preamble_pwr);
     }
   }
 }
@@ -149,15 +141,19 @@ static void handle_nr_uci(NR_UL_IND_t *UL_info)
 
 }
 
+struct sfn_slot {
+  int sfn;
+  int slot;
+};
 static bool crc_sfn_slot_matcher(void *wanted, void *candidate)
 {
   nfapi_nr_p7_message_header_t *msg = candidate;
-  int sfn_sf = *(int *)wanted;
+  struct sfn_slot *sfn_sf = (struct sfn_slot *)wanted;
 
   switch (msg->message_id) {
     case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION: {
       nfapi_nr_crc_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+      return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot;
     }
 
     default:
@@ -396,7 +392,15 @@ static void match_crc_rx_pdu(nfapi_nr_rx_data_indication_t *rx_ind, nfapi_nr_crc
   }
 }
 
-static void run_scheduler(module_id_t module_id, int CC_id, int frame, int slot)
+extern void handle_nr_slot_ind(uint16_t sfn, uint16_t slot);
+static void pnf_send_slot_ind(module_id_t module_id, int CC_id, int frame, int slot)
+{
+  (void)module_id;
+  (void)CC_id;
+  handle_nr_slot_ind(frame, slot);
+}
+
+static void run_scheduler_monolithic(module_id_t module_id, int CC_id, int frame, int slot)
 {
   NR_IF_Module_t *ifi = nr_if_inst[module_id];
 
@@ -449,7 +453,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
   nfapi_nr_uci_indication_t *uci_ind = NULL;
   nfapi_nr_rx_data_indication_t *rx_ind = NULL;
   nfapi_nr_crc_indication_t *crc_ind = NULL;
-  if (get_softmodem_params()->emulate_l1 || NFAPI_MODE == NFAPI_MODE_AERIAL)
+  if (NFAPI_MODE == NFAPI_MODE_VNF || NFAPI_MODE == NFAPI_MODE_AERIAL)
   {
     if (gnb_rach_ind_queue.num_items > 0) {
       LOG_D(NR_MAC, "gnb_rach_ind_queue size = %zu\n", gnb_rach_ind_queue.num_items);
@@ -467,7 +471,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
       LOG_D(NR_MAC, "gnb_rx_ind_queue size = %zu and gnb_crc_ind_queue size = %zu\n",
             gnb_rx_ind_queue.num_items, gnb_crc_ind_queue.num_items);
       rx_ind = get_queue(&gnb_rx_ind_queue);
-      int sfn_slot = NFAPI_SFNSLOT2HEX(rx_ind->sfn, rx_ind->slot);
+      struct sfn_slot sfn_slot = {.sfn = rx_ind->sfn, .slot = rx_ind->slot};
       crc_ind = unqueue_matching(&gnb_crc_ind_queue,
                                  MAX_QUEUE_SIZE,
                                  crc_sfn_slot_matcher,
@@ -487,12 +491,13 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
     }
   }
 
-  handle_nr_rach(UL_info);
+  if (UL_info->rach_ind.number_of_pdus > 0)
+    handle_nr_rach(UL_info);
   handle_nr_uci(UL_info);
   handle_nr_ulsch(UL_info);
   handle_nr_srs(UL_info);
 
-  if (get_softmodem_params()->emulate_l1 || NFAPI_MODE == NFAPI_MODE_AERIAL) {
+  if (NFAPI_MODE == NFAPI_MODE_VNF || NFAPI_MODE == NFAPI_MODE_AERIAL) {
     free_unqueued_nfapi_indications(rach_ind, uci_ind, rx_ind, crc_ind);
   }
 }
@@ -509,7 +514,12 @@ NR_IF_Module_t *NR_IF_Module_init(int Mod_id) {
 
     nr_if_inst[Mod_id]->CC_mask=0;
     nr_if_inst[Mod_id]->NR_UL_indication = NR_UL_indication;
-    nr_if_inst[Mod_id]->NR_slot_indication = run_scheduler;
+    if (NFAPI_MODE == NFAPI_MONOLITHIC)
+      nr_if_inst[Mod_id]->NR_slot_indication = run_scheduler_monolithic;
+    else if (NFAPI_MODE == NFAPI_MODE_PNF)
+      nr_if_inst[Mod_id]->NR_slot_indication = pnf_send_slot_ind;
+    else // NFAPI_MODE_VNF
+      NULL;
     AssertFatal(pthread_mutex_init(&nr_if_inst[Mod_id]->if_mutex,NULL)==0,
                 "allocation of nr_if_inst[%d]->if_mutex fails\n",Mod_id);
   }
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 00f3b303e9d0928e0c6e945b20d439c067b90fe0..a8c06604d736da0686090d63081571edb165f04c 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -275,59 +275,59 @@ void send_nsa_standalone_msg(NR_UL_IND_t *UL_INFO, uint16_t msg_id)
   }
 }
 
-bool sfn_slot_matcher(void *wanted, void *candidate)
+bool sfn_slot_matcher(void *sfn_slot_s, void *candidate)
 {
   nfapi_p7_message_header_t *msg = candidate;
-  int sfn_sf = *(int*)wanted;
+  const struct sfn_slot_s *sfn_sf = (const struct sfn_slot_s *)sfn_slot_s;
 
   switch (msg->message_id)
   {
     case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
     {
       nfapi_nr_rach_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+      return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
     {
       nfapi_nr_rx_data_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+      return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
     {
       nfapi_nr_crc_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+      return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
     {
       nfapi_nr_uci_indication_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->sfn && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->slot;
+      return sfn_sf->sfn == ind->sfn && sfn_sf->slot == ind->slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
     {
       nfapi_nr_dl_tti_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+      return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
     {
       nfapi_nr_tx_data_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+      return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
     {
       nfapi_nr_ul_dci_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+      return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot;
     }
 
     case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
     {
       nfapi_nr_ul_tti_request_t *ind = candidate;
-      return NFAPI_SFNSLOT2SFN(sfn_sf) == ind->SFN && NFAPI_SFNSLOT2SLOT(sfn_sf) == ind->Slot;
+      return sfn_sf->sfn == ind->SFN && sfn_sf->slot == ind->Slot;
     }
 
     default:
@@ -630,10 +630,11 @@ static void copy_ul_dci_data_req_to_dl_info(nr_downlink_indication_t *dl_info, n
     dl_info->slot = ul_dci_req->Slot;
 }
 
-static bool send_crc_ind_and_rx_ind(int sfn_slot)
+static bool send_crc_ind_and_rx_ind(int sfn, int slot)
 {
   bool sent_crc_rx = true;
 
+  struct sfn_slot_s sfn_slot = {.sfn = sfn, .slot = slot};
   nfapi_nr_rx_data_indication_t *rx_ind = unqueue_matching(&nr_rx_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
   nfapi_nr_crc_indication_t *crc_ind = unqueue_matching(&nr_crc_ind_queue, MAX_QUEUE_SIZE, sfn_slot_matcher, &sfn_slot);
 
@@ -642,8 +643,9 @@ static bool send_crc_ind_and_rx_ind(int sfn_slot)
     NR_UE_MAC_INST_t *mac = get_mac_inst(0);
     for (int i = 0; i < crc_ind->number_crcs; i++) {
         int harq_pid = crc_ind->crc_list[i].harq_id;
-        LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn_slot\n", harq_pid);
-        mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn_slot = -1;
+        LOG_T(NR_MAC, "Resetting harq_pid %d active_ul_harq_sfn/slot\n", harq_pid);
+        mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_sfn = -1;
+        mac->nr_ue_emul_l1.harq[harq_pid].active_ul_harq_slot = -1;
     }
     NR_UL_IND_t UL_INFO = {
       .crc_ind = *crc_ind,
@@ -671,12 +673,11 @@ static bool send_crc_ind_and_rx_ind(int sfn_slot)
 static void copy_ul_tti_data_req_to_dl_info(nr_downlink_indication_t *dl_info, nfapi_nr_ul_tti_request_t *ul_tti_req)
 {
     int num_pdus = ul_tti_req->n_pdus;
-    int sfn_slot = NFAPI_SFNSLOT2HEX(ul_tti_req->SFN, ul_tti_req->Slot);
     AssertFatal(num_pdus >= 0, "Invalid ul_tti_request number of PDUS\n");
     AssertFatal(num_pdus <= sizeof(ul_tti_req->pdus_list) / sizeof(ul_tti_req->pdus_list[0]),
                 "Too many pdus %d in ul_tti_req\n", num_pdus);
 
-    if (!send_crc_ind_and_rx_ind(sfn_slot))
+    if (!send_crc_ind_and_rx_ind(ul_tti_req->SFN, ul_tti_req->Slot))
     {
         LOG_T(NR_MAC, "CRC_RX ind not sent\n");
         if (!put_queue(&nr_ul_tti_req_queue, ul_tti_req))
@@ -1018,8 +1019,7 @@ void *nrue_standalone_pnf_task(void *context)
       uint16_t *sfn_slot = CALLOC(1, sizeof(*sfn_slot));
       memcpy(sfn_slot, buffer, sizeof(*sfn_slot));
 
-      LOG_D(NR_PHY, "Received from proxy sfn %d slot %d\n",
-            NFAPI_SFNSLOT2SFN(*sfn_slot), NFAPI_SFNSLOT2SLOT(*sfn_slot));
+      LOG_D(NR_PHY, "Received from proxy sfn_slot %x\n", *sfn_slot);
 
       if (!put_queue(&nr_sfn_slot_queue, sfn_slot))
       {
@@ -1043,11 +1043,13 @@ void *nrue_standalone_pnf_task(void *context)
       // TODO: Update sinr field of slot_rnti_mcs to be array.
       for (int i = 0; i < ch_info->nb_of_csi; ++i)
       {
-        slot_rnti_mcs[NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)].sinr = ch_info->csi[i].sinr;
-        slot_rnti_mcs[NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot)].area_code = ch_info->csi[i].area_code;
+        int mu = 1; // NR-UE emul-L1 is hardcoded to 30kHZ, see check_and_process_dci()
+        int frame = NFAPI_SFNSLOTDEC2SFN(mu, ch_info->sfn_slot);
+        int slot = NFAPI_SFNSLOTDEC2SLOT(mu, ch_info->sfn_slot);
+        slot_rnti_mcs[slot].sinr = ch_info->csi[i].sinr;
+        slot_rnti_mcs[slot].area_code = ch_info->csi[i].area_code;
 
-        LOG_D(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n",
-              i, ch_info->csi[i].sinr, NFAPI_SFNSLOT2SFN(ch_info->sfn_slot), NFAPI_SFNSLOT2SLOT(ch_info->sfn_slot));
+        LOG_D(NR_PHY, "Received_SINR[%d] = %f, sfn:slot %d:%d\n", i, ch_info->csi[i].sinr, frame, slot);
       }
 
       if (!put_queue(&nr_chan_param_queue, ch_info))
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index c43eef87a32ee0596c62893b7c68e25a638479f9..e6a4bfa80b136bfb03e0ac7ad9b14f4b519b71ff 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -312,7 +312,11 @@ void check_and_process_dci(nfapi_nr_dl_tti_request_t *dl_tti_request,
                            nfapi_nr_ul_dci_request_t *ul_dci_request,
                            nfapi_nr_ul_tti_request_t *ul_tti_request);
 
-bool sfn_slot_matcher(void *wanted, void *candidate);
+struct sfn_slot_s {
+  int sfn;
+  int slot;
+};
+bool sfn_slot_matcher(void *sfn_slot_s, void *candidate);
 
 /**\brief interface between L1/L2, indicating the downlink related information, like dci_ind and rx_req
    \param dl_info including dci_ind and rx_request messages*/
diff --git a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h
index 3ed4428db6a122c656b83c45ea1ce5e452a87913..4a26bc8a2826160531d648e4453254771065ad6e 100644
--- a/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h
+++ b/openair2/RRC/L2_INTERFACE/openair_rrc_L2_interface.h
@@ -45,46 +45,6 @@ mac_rrc_data_req(
   const uint8_t         mbsfn_sync_areaP
 );
 
-/*int8_t
-mac_rrc_data_ind(
-  const module_id_t     module_idP,
-  const int             CC_id,
-  const frame_t         frameP,
-  const sub_frame_t     sub_frameP,
-  const int             UE_id,
-  const rnti_t          rntiP,
-  const rb_id_t         srb_idP,
-  const uint8_t*        sduP,
-  const sdu_size_t      sdu_lenP,
-  const uint8_t         mbsfn_sync_areaP
-);
-
-int8_t
-mac_rrc_data_req_ue(
-  const module_id_t     module_idP,
-  const int             CC_idP,
-  const frame_t         frameP,
-  const rb_id_t         srb_idP,
-  const uint8_t         nb_tbP,
-  uint8_t* const        buffer_pP,
-  const mac_enb_index_t eNB_indexP,
-  const uint8_t         mbsfn_sync_areaP
-);
-
-int8_t
-mac_rrc_data_ind_ue(
-  const module_id_t     module_idP,
-  const int             CC_idP,
-  const frame_t         frameP,
-  const sub_frame_t     sub_frameP,
-  const rnti_t          rntiP,
-  const rb_id_t         srb_idP,
-  const uint8_t        *sduP,
-  const sdu_size_t      sdu_lenP,
-  const mac_enb_index_t eNB_indexP,
-  const uint8_t         mbsfn_sync_area
-);*/
-
 void mac_lite_sync_ind(
   const module_id_t module_idP,
   const uint8_t statusP);
@@ -128,10 +88,6 @@ void mac_out_of_sync_ind(
 char openair_rrc_eNB_init(
   const module_id_t module_idP);
 
-char openair_rrc_ue_init(
-  const module_id_t module_idP,
-  const unsigned char eNB_indexP);
-
 int
 mac_eNB_get_rrc_status(
   const module_id_t module_idP,
@@ -143,12 +99,6 @@ mac_UE_get_rrc_status(
   const uint8_t     sig_indexP
 );
 
-char
-openair_rrc_ue_init(
-  const module_id_t   module_idP,
-  const unsigned char eNB_indexP
-);
-
 void mac_in_sync_ind(
   const module_id_t module_idP,
   const frame_t frameP,
diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c
index 105153ed879436d8c51e631c8c17216c1c9cbdd6..1e125436049edc3a93c6e48eba07342ccafe784d 100644
--- a/openair2/RRC/LTE/rrc_UE.c
+++ b/openair2/RRC/LTE/rrc_UE.c
@@ -241,18 +241,24 @@ static int rrc_set_sub_state( module_id_t ue_mod_idP, Rrc_Sub_State_t subState )
   if (!IS_SOFTMODEM_NOS1) {
     switch (UE_rrc_inst[ue_mod_idP].RrcState) {
       case RRC_STATE_INACTIVE:
-        AssertFatal ((RRC_SUB_STATE_INACTIVE_FIRST <= subState) && (subState <= RRC_SUB_STATE_INACTIVE_LAST),
-                     "Invalid sub state %d for state %d!\n", subState, UE_rrc_inst[ue_mod_idP].RrcState);
+        AssertFatal(RRC_SUB_STATE_INACTIVE <= subState,
+                    "Invalid sub state %d for state %d!\n",
+                    subState,
+                    UE_rrc_inst[ue_mod_idP].RrcState);
         break;
 
       case RRC_STATE_IDLE:
-        AssertFatal ((RRC_SUB_STATE_IDLE_FIRST <= subState) && (subState <= RRC_SUB_STATE_IDLE_LAST),
-                     "Invalid sub state %d for state %d!\n", subState, UE_rrc_inst[ue_mod_idP].RrcState);
+        AssertFatal((RRC_SUB_STATE_IDLE_SEARCHING <= subState) && (subState <= RRC_SUB_STATE_IDLE),
+                    "Invalid sub state %d for state %d!\n",
+                    subState,
+                    UE_rrc_inst[ue_mod_idP].RrcState);
         break;
 
       case RRC_STATE_CONNECTED:
-        AssertFatal ((RRC_SUB_STATE_CONNECTED_FIRST <= subState) && (subState <= RRC_SUB_STATE_CONNECTED_LAST),
-                     "Invalid sub state %d for state %d!\n", subState, UE_rrc_inst[ue_mod_idP].RrcState);
+        AssertFatal(RRC_SUB_STATE_CONNECTED <= subState,
+                    "Invalid sub state %d for state %d!\n",
+                    subState,
+                    UE_rrc_inst[ue_mod_idP].RrcState);
         break;
     }
   }
@@ -6295,10 +6301,6 @@ rrc_rx_tx_ue(
 )
 //-----------------------------------------------------------------------------
 {
-#ifdef LOCALIZATION
-  double                         estimated_distance;
-  protocol_ctxt_t                ctxt;
-#endif
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX,VCD_FUNCTION_IN);
 
   // check timers
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index d180c47c8728df35a78e5b5118474876b0b40189..959abc11f9c8a422d05bf28a377869bfdb207ac2 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -752,17 +752,6 @@ typedef struct eNB_RRC_INST_s {
   hash_table_t                      *initial_id2_s1ap_ids; // key is    content is rrc_ue_s1ap_ids_t
   hash_table_t                      *s1ap_id2_s1ap_ids   ; // key is    content is rrc_ue_s1ap_ids_t
 
-#ifdef LOCALIZATION
-  /// localization type, 0: power based, 1: time based
-  uint8_t loc_type;
-  /// epoch timestamp in millisecond, RRC
-  int32_t reference_timestamp_ms;
-  /// aggregate physical states every n millisecond
-  int32_t aggregation_period_ms;
-  /// localization list for aggregated measurements from PHY
-  struct list loc_list;
-#endif
-
   //RRC configuration
   RrcConfigurationReq configuration;
 
diff --git a/openair2/RRC/LTE/rrc_types.h b/openair2/RRC/LTE/rrc_types.h
index 6b339af563beebf27f07da9ea182c7bc93ec47c8..ffd2f306bbb349ff3f98c992209d3a0f857bda0d 100644
--- a/openair2/RRC/LTE/rrc_types.h
+++ b/openair2/RRC/LTE/rrc_types.h
@@ -41,7 +41,7 @@ typedef enum Rrc_State_e {
 } Rrc_State_t;
 
 typedef enum Rrc_Sub_State_e {
-  RRC_SUB_STATE_INACTIVE=0,
+  RRC_SUB_STATE_INACTIVE = 0,
 
   RRC_SUB_STATE_IDLE_SEARCHING,
   RRC_SUB_STATE_IDLE_RECEIVING_SIB,
@@ -50,15 +50,6 @@ typedef enum Rrc_Sub_State_e {
   RRC_SUB_STATE_IDLE,
 
   RRC_SUB_STATE_CONNECTED,
-
-  RRC_SUB_STATE_INACTIVE_FIRST = RRC_SUB_STATE_INACTIVE,
-  RRC_SUB_STATE_INACTIVE_LAST = RRC_SUB_STATE_INACTIVE,
-
-  RRC_SUB_STATE_IDLE_FIRST = RRC_SUB_STATE_IDLE_SEARCHING,
-  RRC_SUB_STATE_IDLE_LAST = RRC_SUB_STATE_IDLE,
-
-  RRC_SUB_STATE_CONNECTED_FIRST = RRC_SUB_STATE_CONNECTED,
-  RRC_SUB_STATE_CONNECTED_LAST = RRC_SUB_STATE_CONNECTED,
 } Rrc_Sub_State_t;
 
 typedef enum Rrc_Msg_Type_e {
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index b33b2c158ce2780e39b382c3d3c1eba2fb29f32d..953f7238534cb68949518fdec47212221ffc3157 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -116,8 +116,7 @@ typedef struct pdu_session_param_s {
   pdusession_t param;
   pdu_session_status_t status;
   uint8_t xid; // transaction_id
-  ngap_Cause_t cause;
-  uint8_t cause_value;
+  ngap_cause_t cause;
 } rrc_pdu_session_param_t;
 
 /**
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index ab2a95ecdea72eaffbd66d24ac58942c6639312b..e874e29bfb40bc7b16e7b82c5cd33dcaada22ff7 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -85,7 +85,8 @@ void rrc_gNB_generate_dedicatedRRCReconfiguration_release(gNB_RRC_INST *rrc,
 bool ue_associated_to_cuup(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue);
 sctp_assoc_t get_existing_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue);
 sctp_assoc_t get_new_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue, int sst, int sd);
-int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, e1ap_setup_req_t *req);
+int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, const e1ap_setup_req_t *req);
+bool is_cuup_associated(gNB_RRC_INST *rrc);
 
 /* Process indication of E1 connection loss on CU-CP */
 void rrc_gNB_process_e1_lost_connection(gNB_RRC_INST *rrc, e1ap_lost_connection_t *lc, sctp_assoc_t assoc_id);
@@ -104,7 +105,8 @@ void ue_cxt_mod_direct(MessageDef *msg,
 
 void prepare_and_send_ue_context_modification_f1(rrc_gNB_ue_context_t *ue_context_p,
                                                  e1ap_bearer_setup_resp_t *e1ap_resp);
-void trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession_t *sessions, uint64_t ueAggMaxBitRateDownlink);
+bool trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession_t *sessions, uint64_t ueAggMaxBitRateDownlink)
+    __attribute__((warn_unused_result));
 
 int rrc_gNB_generate_pcch_msg(sctp_assoc_t assoc_id, const NR_SIB1_t *sib, uint32_t tmsi, uint8_t paging_drx);
 
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 2456a851de220cc02c9a7b429b50f154f8c0993d..b4d33b16f05e7d6b7e01fcfcb9b9f199d657de64 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -95,6 +95,7 @@
 #include "x2ap_messages_types.h"
 #include "xer_encoder.h"
 #include "E1AP/lib/e1ap_bearer_context_management.h"
+#include "E1AP/lib/e1ap_interface_management.h"
 
 #ifdef E2_AGENT
 #include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h"
@@ -594,7 +595,7 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t
       continue;
     }
 
-    if (ue_p->pduSession[i].cause != NGAP_CAUSE_NOTHING) {
+    if (ue_p->pduSession[i].cause.type != NGAP_CAUSE_NOTHING) {
       // set xid of failure pdu session
       ue_p->pduSession[i].xid = xid;
       ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED;
@@ -610,10 +611,10 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t
     }
 
     if (j == MAX_DRBS_PER_UE) {
+      ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CauseRadioNetwork_unspecified};
       ue_p->pduSession[i].xid = xid;
       ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED;
-      ue_p->pduSession[i].cause = NGAP_CAUSE_RADIO_NETWORK;
-      ue_p->pduSession[i].cause_value = NGAP_CauseRadioNetwork_unspecified;
+      ue_p->pduSession[i].cause = cause;
       continue;
     }
 
@@ -634,10 +635,10 @@ void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t
 
         default:
           LOG_E(NR_RRC, "not supported 5qi %lu\n", ue_p->pduSession[i].param.qos[qos_flow_index].fiveQI);
+          ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CauseRadioNetwork_not_supported_5QI_value};
           ue_p->pduSession[i].status = PDU_SESSION_STATUS_FAILED;
           ue_p->pduSession[i].xid = xid;
-          ue_p->pduSession[i].cause = NGAP_CAUSE_RADIO_NETWORK;
-          ue_p->pduSession[i].cause_value = NGAP_CauseRadioNetwork_not_supported_5QI_value;
+          ue_p->pduSession[i].cause = cause;
           continue;
       }
         LOG_I(NR_RRC,
@@ -766,6 +767,10 @@ static void cuup_notify_reestablishment(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p)
       .gNB_cu_cp_ue_id = ue_p->rrc_ue_id,
       .gNB_cu_up_ue_id = ue_p->rrc_ue_id,
   };
+  // Quit re-establishment notification if no CU-UP is associated
+  if (!is_cuup_associated(rrc)) {
+    return;
+  }
   if (!ue_associated_to_cuup(rrc, ue_p))
     return;
   /* loop through active DRBs */
@@ -1181,8 +1186,8 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
     /* update to old DU assoc id -- RNTI + secondary DU UE ID further below */
     f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
     ue_data.du_assoc_id = source_ctx->du->assoc_id;
-    cu_remove_f1_ue_data(UE->rrc_ue_id);
-    cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data);
+    bool success = cu_update_f1_ue_data(UE->rrc_ue_id, &ue_data);
+    DevAssert(success);
     nr_rrc_finalize_ho(UE);
   } else if (physCellId != cell_info->nr_pci) {
     /* UE was moving from previous cell so quickly that RRCReestablishment for previous cell was received in this cell */
@@ -1212,8 +1217,8 @@ static void rrc_handle_RRCReestablishmentRequest(gNB_RRC_INST *rrc,
   UE->nr_cellid = msg->nr_cellid;
   f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
   ue_data.secondary_ue = msg->gNB_DU_ue_id;
-  cu_remove_f1_ue_data(UE->rrc_ue_id);
-  cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data);
+  bool success = cu_update_f1_ue_data(UE->rrc_ue_id, &ue_data);
+  DevAssert(success);
 
   rrc_gNB_generate_RRCReestablishment(ue_context_p, msg->du2cu_rrc_container, old_rnti, du);
   return;
@@ -1222,9 +1227,10 @@ fallback_rrc_setup:
   fill_random(&random_value, sizeof(random_value));
   random_value = random_value & 0x7fffffffff; /* random value is 39 bits */
 
+  ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = ngap_cause};
   /* request release of the "old" UE in case it exists */
   if (ue_context_p != NULL)
-    rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, ue_context_p, NGAP_CAUSE_RADIO_NETWORK, ngap_cause);
+    rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, ue_context_p, cause);
 
   rrc_gNB_ue_context_t *new = rrc_gNB_create_ue_context(assoc_id, msg->crnti, rrc, random_value, msg->gNB_DU_ue_id);
   activate_srb(&new->ue_context, 1);
@@ -1402,6 +1408,14 @@ static int handle_rrcReestablishmentComplete(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
   return 0;
 }
 
+/**
+ * @brief Forward stored NAS PDU to UE (3GPP TS 38.413)
+ *        - 8.2.1.2: If the NAS-PDU IE is included in the PDU SESSION RESOURCE SETUP REQUEST message,
+ *        the NG-RAN node shall pass it to the UE.
+ *        - 8.3.1.2: If the NAS-PDU IE is included in the INITIAL CONTEXT SETUP REQUEST message,
+ *        the NG-RAN node shall pass it transparently towards the UE.
+ *        - 8.6.2: The NAS-PDU IE contains an AMF–UE message that is transferred without interpretation in the NG-RAN node.
+ */
 void rrc_forward_ue_nas_message(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE)
 {
   if (UE->nas_pdu.buffer == NULL || UE->nas_pdu.length == 0)
@@ -1522,7 +1536,12 @@ static void handle_ueCapabilityInformation(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE,
      * up security and request capabilities, so trigger PDU sessions now. The
      * UE NAS message will be forwarded in the corresponding reconfiguration,
      * the Initial context setup response after reconfiguration complete. */
-    trigger_bearer_setup(rrc, UE, UE->n_initial_pdu, UE->initial_pdus, 0);
+    if (!trigger_bearer_setup(rrc, UE, UE->n_initial_pdu, UE->initial_pdus, 0)) {
+      LOG_W(NR_RRC, "Failed to setup bearers for UE %d: send Initial Context Setup Response\n", UE->rrc_ue_id);
+      rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(rrc, UE);
+      rrc_forward_ue_nas_message(rrc, UE);
+      return;
+    }
   } else {
     rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(rrc, UE);
     rrc_forward_ue_nas_message(rrc, UE);
@@ -1734,7 +1753,11 @@ static int rrc_gNB_decode_dcch(gNB_RRC_INST *rrc, const f1ap_ul_rrc_message_t *m
            * to set up security, so trigger PDU sessions now. The UE NAS
            * message will be forwarded in the corresponding reconfiguration,
            * the Initial context setup response after reconfiguration complete. */
-          trigger_bearer_setup(rrc, UE, UE->n_initial_pdu, UE->initial_pdus, 0);
+          if (!trigger_bearer_setup(rrc, UE, UE->n_initial_pdu, UE->initial_pdus, 0)) {
+            LOG_W(NR_RRC, "Failed to setup bearers for UE %d: send Initial Context Setup Response\n", UE->rrc_ue_id);
+            rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(rrc, UE);
+            rrc_forward_ue_nas_message(rrc, UE);
+          }
         } else {
           /* we already have capabilities, and no PDU sessions to setup, ack
            * this UE */
@@ -1882,6 +1905,11 @@ static void f1u_ul_gtp_update(f1u_tunnel_t *f1u, const up_params_t *p)
  * E1 to the CU of this UE. Also updates TEID info internally */
 static void e1_send_bearer_updates(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, f1ap_drb_to_be_setup_t *drbs)
 {
+  // Quit bearer updates if no CU-UP is associated
+  if (!is_cuup_associated(rrc)) {
+    return;
+  }
+
   // we assume the same UE ID in CU-UP and CU-CP
   e1ap_bearer_mod_req_t req = {
     .gNB_cu_cp_ue_id = UE->rrc_ue_id,
@@ -2031,10 +2059,8 @@ static void rrc_CU_process_ue_context_release_request(MessageDef *msg_p, sctp_as
 
   /* TODO: marshall types correctly */
   LOG_I(NR_RRC, "received UE Context Release Request for UE %u, forwarding to AMF\n", req->gNB_CU_ue_id);
-  rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(instance,
-                                           ue_context_p,
-                                           NGAP_CAUSE_RADIO_NETWORK,
-                                           NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST);
+  ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST};
+  rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(instance, ue_context_p, cause);
 }
 
 static void rrc_delete_ue_data(gNB_RRC_UE_t *UE)
@@ -2125,8 +2151,8 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
     f1_ue_data_t ue_data = cu_get_f1_ue_data(UE->rrc_ue_id);
     ue_data.secondary_ue = target_ctx->du_ue_id;
     ue_data.du_assoc_id = target_ctx->du->assoc_id;
-    cu_remove_f1_ue_data(UE->rrc_ue_id);
-    cu_add_f1_ue_data(UE->rrc_ue_id, &ue_data);
+    bool success = cu_update_f1_ue_data(UE->rrc_ue_id, &ue_data);
+    DevAssert(success);
     LOG_I(NR_RRC, "UE %d handover: update RNTI from %04x to %04x\n", UE->rrc_ue_id, UE->rnti, target_ctx->new_rnti);
     nr_ho_source_cu_t *source_ctx = UE->ho_context->source;
     DevAssert(source_ctx->old_rnti == UE->rnti);
@@ -2618,6 +2644,7 @@ void *rrc_gnb_task(void *args_p) {
 
       case E1AP_SETUP_REQ:
         rrc_gNB_process_e1_setup_req(msg_p->ittiMsgHeader.originInstance, &E1AP_SETUP_REQ(msg_p));
+        free_e1ap_cuup_setup_request(&E1AP_SETUP_REQ(msg_p));
         break;
 
       case E1AP_BEARER_CONTEXT_SETUP_RESP:
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.c b/openair2/RRC/NR/rrc_gNB_NGAP.c
index 2d5ff73446b9fa4d5b5d5a16fa71a14444b9e086..08f83ea5c87f5562fd4f8751e7d524f504c0658d 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.c
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.c
@@ -320,11 +320,29 @@ static int decodePDUSessionResourceSetup(pdusession_t *session)
   return 0;
 }
 
-void trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession_t *sessions, uint64_t ueAggMaxBitRateDownlink)
+/**
+ * @brief Triggers bearer setup for the specified UE.
+ *
+ * This function initiates the setup of bearer contexts for a given UE
+ * by preparing and sending an E1AP Bearer Setup Request message to the CU-UP.
+ *
+ * @return True if bearer setup was successfully initiated, false otherwise
+ * @retval true Bearer setup was initiated successfully
+ * @retval false No CU-UP is associated, so bearer setup could not be initiated
+ *
+ * @note the return value is expected to be used (as per declaration)
+ *
+ */
+bool trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession_t *sessions, uint64_t ueAggMaxBitRateDownlink)
 {
   AssertFatal(UE->as_security_active, "logic bug: security should be active when activating DRBs\n");
   e1ap_bearer_setup_req_t bearer_req = {0};
 
+  // Reject bearers setup if there's no CU-UP associated
+  if (!is_cuup_associated(rrc)) {
+    return false;
+  }
+
   e1ap_nssai_t cuup_nssai = {0};
   for (int i = 0; i < n; i++) {
     rrc_pdu_session_param_t *pduSession = find_pduSession(UE, sessions[i].pdusession_id, true);
@@ -419,27 +437,60 @@ void trigger_bearer_setup(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, pdusession
    * CU-UPs, and send them to the different CU-UPs. */
   sctp_assoc_t assoc_id = get_new_cuup_for_ue(rrc, UE, cuup_nssai.sst, cuup_nssai.sd);
   rrc->cucp_cuup.bearer_context_setup(assoc_id, &bearer_req);
+  return true;
+}
+
+/**
+ * @brief Fill PDU Session Resource Failed to Setup Item of the
+ *        PDU Session Resource Failed to Setup List for either:
+ *        - NGAP PDU Session Resource Setup Response
+ *        - NGAP Initial Context Setup Response
+ */
+static void fill_pdu_session_resource_failed_to_setup_item(pdusession_failed_t *f, int pdusession_id, ngap_cause_t cause)
+{
+  f->pdusession_id = pdusession_id;
+  f->cause = cause;
+}
+
+/**
+ * @brief Fill Initial Context Setup Response with a PDU Session Resource Failed to Setup List
+ *        and send ITTI message to TASK_NGAP
+ */
+static void send_ngap_initial_context_setup_resp_fail(instance_t instance,
+                                                      ngap_initial_context_setup_req_t *msg,
+                                                      ngap_cause_t cause)
+{
+  MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_GNB, instance, NGAP_INITIAL_CONTEXT_SETUP_RESP);
+  ngap_initial_context_setup_resp_t *resp = &NGAP_INITIAL_CONTEXT_SETUP_RESP(msg_p);
+  resp->gNB_ue_ngap_id = msg->gNB_ue_ngap_id;
+
+  for (int i = 0; i < msg->nb_of_pdusessions; i++) {
+    fill_pdu_session_resource_failed_to_setup_item(&resp->pdusessions_failed[i], msg->pdusession_param[i].pdusession_id, cause);
+  }
+  resp->nb_of_pdusessions = 0;
+  resp->nb_of_pdusessions_failed = msg->nb_of_pdusessions;
+  itti_send_msg_to_task(TASK_NGAP, instance, msg_p);
 }
 
 //------------------------------------------------------------------------------
 int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t instance)
 //------------------------------------------------------------------------------
 {
+  gNB_RRC_INST *rrc = RC.nrrrc[instance];
   ngap_initial_context_setup_req_t *req = &NGAP_INITIAL_CONTEXT_SETUP_REQ(msg_p);
 
-  rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], req->gNB_ue_ngap_id);
-  gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
-
+  rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, req->gNB_ue_ngap_id);
   if (ue_context_p == NULL) {
     /* Can not associate this message to an UE index, send a failure to NGAP and discard it! */
     LOG_W(NR_RRC, "[gNB %ld] In NGAP_INITIAL_CONTEXT_SETUP_REQ: unknown UE from NGAP ids (%u)\n", instance, req->gNB_ue_ngap_id);
+    ngap_cause_t cause = { .type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_LOCAL_UE_NGAP_ID};
     rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_FAIL(req->gNB_ue_ngap_id,
                                                  NULL,
-                                                 NGAP_CAUSE_RADIO_NETWORK,
-                                                 NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_LOCAL_UE_NGAP_ID);
+                                                 cause);
     return (-1);
   }
-  gNB_RRC_INST *rrc = RC.nrrrc[instance];
+  gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
+
   UE->amf_ue_ngap_id = req->amf_ue_ngap_id;
 
   /* store guami in gNB_RRC_UE_t context;
@@ -485,7 +536,13 @@ int rrc_gNB_process_NGAP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, instance_t
       // do not remove the above allocation which is reused here: this is used
       // in handle_rrcReconfigurationComplete() to know that we need to send a
       // Initial context setup response message
-      trigger_bearer_setup(rrc, UE, UE->n_initial_pdu, UE->initial_pdus, 0);
+      if (!trigger_bearer_setup(rrc, UE, UE->n_initial_pdu, UE->initial_pdus, 0)) {
+        LOG_W(NR_RRC, "UE %d: reject PDU Session Setup in Initial Context Setup Response\n", UE->rrc_ue_id);
+        ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_RESOURCES_NOT_AVAILABLE_FOR_THE_SLICE};
+        send_ngap_initial_context_setup_resp_fail(rrc->module_id, req, cause);
+        rrc_forward_ue_nas_message(rrc, UE);
+        return -1;
+      }
     } else {
       /* no PDU sesion to setup: acknowledge this message, and forward NAS
        * message, if required */
@@ -528,10 +585,10 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_
       }
     } else if (session->status != PDU_SESSION_STATUS_ESTABLISHED) {
       session->status = PDU_SESSION_STATUS_FAILED;
-      pdusession_failed_t *fail = &resp->pdusessions_failed[pdu_sessions_failed];
-      fail->pdusession_id = session->param.pdusession_id;
-      fail->cause = NGAP_CAUSE_RADIO_NETWORK;
-      fail->cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
+      ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID};
+      fill_pdu_session_resource_failed_to_setup_item(&resp->pdusessions_failed[pdu_sessions_failed],
+                                                     session->param.pdusession_id,
+                                                     cause);
       pdu_sessions_failed++;
     }
   }
@@ -543,15 +600,13 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_
 
 void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_FAIL(uint32_t gnb,
                                                   const rrc_gNB_ue_context_t *const ue_context_pP,
-                                                  const ngap_Cause_t causeP,
-                                                  const long cause_valueP)
+                                                  const ngap_cause_t causeP)
 {
   MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_INITIAL_CONTEXT_SETUP_FAIL);
   ngap_initial_context_setup_fail_t *fail = &NGAP_INITIAL_CONTEXT_SETUP_FAIL(msg_p);
   memset(fail, 0, sizeof(*fail));
   fail->gNB_ue_ngap_id = gnb;
   fail->cause = causeP;
-  fail->cause_value = cause_valueP;
   itti_send_msg_to_task(TASK_NGAP, 0, msg_p);
 }
 
@@ -738,8 +793,8 @@ void rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
       session->status = PDU_SESSION_STATUS_FAILED;
       pdusession_failed_t *fail = &resp->pdusessions_failed[pdu_sessions_failed];
       fail->pdusession_id = session->param.pdusession_id;
-      fail->cause = NGAP_CAUSE_RADIO_NETWORK;
-      fail->cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
+      fail->cause.type = NGAP_CAUSE_RADIO_NETWORK;
+      fail->cause.value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID;
       pdu_sessions_failed++;
     }
     resp->nb_of_pdusessions = pdu_sessions_done;
@@ -762,47 +817,72 @@ void rrc_gNB_send_NGAP_PDUSESSION_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
   return;
 }
 
-//------------------------------------------------------------------------------
-void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t instance)
-//------------------------------------------------------------------------------
+/**
+ * @brief Fill PDU Session Resource Setup Response with a list of PDU Session Resources Failed to Setup
+ *        and send ITTI message to TASK_NGAP
+ */
+static void send_ngap_pdu_session_setup_resp_fail(instance_t instance, ngap_pdusession_setup_req_t *msg, ngap_cause_t cause)
 {
+  MessageDef *msg_resp = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_PDUSESSION_SETUP_RESP);
+  ngap_pdusession_setup_resp_t *resp = &NGAP_PDUSESSION_SETUP_RESP(msg_resp);
+  resp->gNB_ue_ngap_id = msg->gNB_ue_ngap_id;
+  resp->nb_of_pdusessions_failed = msg->nb_pdusessions_tosetup;
+  resp->nb_of_pdusessions = 0;
+  for (int i = 0; i < resp->nb_of_pdusessions_failed; ++i) {
+    fill_pdu_session_resource_failed_to_setup_item(&resp->pdusessions_failed[i],
+                                                   msg->pdusession_setup_params[i].pdusession_id,
+                                                   cause);
+  }
+  itti_send_msg_to_task(TASK_NGAP, instance, msg_resp);
+}
 
-  ngap_pdusession_setup_req_t* msg=&NGAP_PDUSESSION_SETUP_REQ(msg_p);
-  rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(RC.nrrrc[instance], msg->gNB_ue_ngap_id);
-  gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
+void rrc_gNB_process_NGAP_PDUSESSION_SETUP_REQ(MessageDef *msg_p, instance_t instance)
+{
   gNB_RRC_INST *rrc = RC.nrrrc[instance];
-
+  ngap_pdusession_setup_req_t* msg=&NGAP_PDUSESSION_SETUP_REQ(msg_p);
+  rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, msg->gNB_ue_ngap_id);
+  // Reject PDU Session Resource setup if no UE context is found
   if (ue_context_p == NULL) {
-    MessageDef *msg_fail_p = NULL;
-    LOG_W(NR_RRC, "[gNB %ld] In NGAP_PDUSESSION_SETUP_REQ: unknown UE from NGAP ids (%u)\n", instance, msg->gNB_ue_ngap_id);
-    msg_fail_p = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_PDUSESSION_SETUP_REQUEST_FAIL);
-    NGAP_PDUSESSION_SETUP_FAIL(msg_fail_p).gNB_ue_ngap_id = msg->gNB_ue_ngap_id;
-    // TODO add failure cause when defined!
-    itti_send_msg_to_task (TASK_NGAP, instance, msg_fail_p);
-    return ;
+    LOG_W(NR_RRC,
+          "[gNB %ld] In NGAP_PDUSESSION_SETUP_REQ: no UE context found from UE NGAP ID (%u)\n",
+          instance,
+          msg->gNB_ue_ngap_id);
+    ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_LOCAL_UE_NGAP_ID};
+    send_ngap_pdu_session_setup_resp_fail(instance, msg, cause);
+    return;
   }
 
-  DevAssert(UE->rrc_ue_id == msg->gNB_ue_ngap_id);
-  LOG_I(NR_RRC, "UE %d: received PDU session setup request\n", UE->rrc_ue_id);
+  gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
+  LOG_I(NR_RRC, "UE %d: received PDU Session Resource Setup Request\n", UE->rrc_ue_id);
+
+  // Reject PDU Session Resource setup if gNB_ue_ngap_id is not matching
+  if (UE->rrc_ue_id != msg->gNB_ue_ngap_id) {
+    LOG_W(NR_RRC, "[gNB %ld] In NGAP_PDUSESSION_SETUP_REQ: unknown UE NGAP ID (%u)\n", instance, msg->gNB_ue_ngap_id);
+    ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_LOCAL_UE_NGAP_ID};
+    send_ngap_pdu_session_setup_resp_fail(instance, msg, cause);
+    rrc_forward_ue_nas_message(rrc, UE);
+    return;
+  }
 
+  // Reject PDU Session Resource setup if there is no security context active
   if (!UE->as_security_active) {
-    LOG_E(NR_RRC, "UE %d: no security context active for UE, rejecting PDU session setup request\n", UE->rrc_ue_id);
-    MessageDef *msg_resp = itti_alloc_new_message(TASK_RRC_GNB, 0, NGAP_PDUSESSION_SETUP_RESP);
-    ngap_pdusession_setup_resp_t *resp = &NGAP_PDUSESSION_SETUP_RESP(msg_resp);
-    resp->gNB_ue_ngap_id = UE->rrc_ue_id;
-    resp->nb_of_pdusessions_failed = msg->nb_pdusessions_tosetup;
-    for (int i = 0; i < resp->nb_of_pdusessions_failed; ++i) {
-      pdusession_failed_t *f = &resp->pdusessions_failed[i];
-      f->pdusession_id = msg->pdusession_setup_params[i].pdusession_id;
-      f->cause = NGAP_CAUSE_PROTOCOL;
-      f->cause_value = NGAP_CAUSE_PROTOCOL_MSG_NOT_COMPATIBLE_WITH_RECEIVER_STATE;
-    }
-    itti_send_msg_to_task(TASK_NGAP, instance, msg_resp);
+    LOG_E(NR_RRC, "UE %d: no security context active for UE, rejecting PDU Session Resource Setup Request\n", UE->rrc_ue_id);
+    ngap_cause_t cause = {.type = NGAP_CAUSE_PROTOCOL, .value = NGAP_CAUSE_PROTOCOL_MSG_NOT_COMPATIBLE_WITH_RECEIVER_STATE};
+    send_ngap_pdu_session_setup_resp_fail(instance, msg, cause);
+    rrc_forward_ue_nas_message(rrc, UE);
     return;
   }
 
   UE->amf_ue_ngap_id = msg->amf_ue_ngap_id;
-  trigger_bearer_setup(rrc, UE, msg->nb_pdusessions_tosetup, msg->pdusession_setup_params, msg->ueAggMaxBitRateDownlink);
+
+  if (!trigger_bearer_setup(rrc, UE, msg->nb_pdusessions_tosetup, msg->pdusession_setup_params, msg->ueAggMaxBitRateDownlink)) {
+    // Reject PDU Session Resource setup if there's no CU-UP associated
+    LOG_W(NR_RRC, "UE %d: reject PDU Session Setup in PDU Session Resource Setup Response\n", UE->rrc_ue_id);
+    ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_RESOURCES_NOT_AVAILABLE_FOR_THE_SLICE};
+    send_ngap_pdu_session_setup_resp_fail(instance, msg, cause);
+    rrc_forward_ue_nas_message(rrc, UE);
+  }
+
   return;
 }
 
@@ -926,17 +1006,18 @@ int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t ins
       UE->nb_of_pdusessions++;
       sess->status = PDU_SESSION_STATUS_FAILED;
       sess->param.pdusession_id = sessMod->pdusession_id;
-      sess->cause = NGAP_CAUSE_RADIO_NETWORK;
-      UE->pduSession[i].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
+      sess->cause.type = NGAP_CAUSE_RADIO_NETWORK;
+      UE->pduSession[i].cause.type = NGAP_CAUSE_RADIO_NETWORK;
+      UE->pduSession[i].cause.value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID;
     } else {
       all_failed = false;
       sess->status = PDU_SESSION_STATUS_NEW;
       sess->param.pdusession_id = sessMod->pdusession_id;
-      sess->cause = NGAP_CAUSE_RADIO_NETWORK;
-      sess->cause_value = NGAP_CauseRadioNetwork_multiple_PDU_session_ID_instances;
+      sess->cause.type = NGAP_CAUSE_RADIO_NETWORK;
+      sess->cause.value = NGAP_CAUSE_RADIO_NETWORK_MULTIPLE_PDU_SESSION_ID_INSTANCES;
       sess->status = PDU_SESSION_STATUS_NEW;
       sess->param.pdusession_id = sessMod->pdusession_id;
-      sess->cause = NGAP_CAUSE_NOTHING;
+      sess->cause.type = NGAP_CAUSE_NOTHING;
       if (sessMod->nas_pdu.buffer != NULL) {
         UE->pduSession[i].param.nas_pdu = sessMod->nas_pdu;
       }
@@ -964,8 +1045,8 @@ int rrc_gNB_process_NGAP_PDUSESSION_MODIFY_REQ(MessageDef *msg_p, instance_t ins
     for (int i = 0; i < UE->nb_of_pdusessions; i++) {
       if (UE->pduSession[i].status == PDU_SESSION_STATUS_FAILED) {
         msg->pdusessions_failed[i].pdusession_id = UE->pduSession[i].param.pdusession_id;
-        msg->pdusessions_failed[i].cause = UE->pduSession[i].cause;
-        msg->pdusessions_failed[i].cause_value = UE->pduSession[i].cause_value;
+        msg->pdusessions_failed[i].cause.type = UE->pduSession[i].cause.type;
+        msg->pdusessions_failed[i].cause.value = UE->pduSession[i].cause.value;
       }
     }
     itti_send_msg_to_task(TASK_NGAP, instance, msg_fail_p);
@@ -1000,7 +1081,7 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
         LOG_I(NR_RRC, "update pdu session %d \n", pduSession->param.pdusession_id);
         // Update UE->pduSession
         pduSession->status = PDU_SESSION_STATUS_ESTABLISHED;
-        pduSession->cause = NGAP_CAUSE_NOTHING;
+        pduSession->cause.type = NGAP_CAUSE_NOTHING;
         for (int qos_flow_index = 0; qos_flow_index < UE->pduSession[i].param.nb_qos; qos_flow_index++) {
           pduSession->param.qos[qos_flow_index] = UE->pduSession[i].param.qos[qos_flow_index];
         }
@@ -1022,16 +1103,16 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
       } else {
         LOG_W(NR_RRC, "PDU SESSION modify of a not existing pdu session %d \n", UE->pduSession[i].param.pdusession_id);
         resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->pduSession[i].param.pdusession_id;
-        resp->pdusessions_failed[pdu_sessions_failed].cause = NGAP_CAUSE_RADIO_NETWORK;
-        resp->pdusessions_failed[pdu_sessions_failed].cause_value = NGAP_CauseRadioNetwork_unknown_PDU_session_ID;
+        ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID};
+        resp->pdusessions_failed[pdu_sessions_failed].cause = cause;
         pdu_sessions_failed++;
       }
     } else if ((UE->pduSession[i].status == PDU_SESSION_STATUS_NEW) || (UE->pduSession[i].status == PDU_SESSION_STATUS_ESTABLISHED)) {
       LOG_D(NR_RRC, "PDU SESSION is NEW or already ESTABLISHED\n");
     } else if (UE->pduSession[i].status == PDU_SESSION_STATUS_FAILED) {
       resp->pdusessions_failed[pdu_sessions_failed].pdusession_id = UE->pduSession[i].param.pdusession_id;
-      resp->pdusessions_failed[pdu_sessions_failed].cause = UE->pduSession[i].cause;
-      resp->pdusessions_failed[pdu_sessions_failed].cause_value = UE->pduSession[i].cause_value;
+      resp->pdusessions_failed[pdu_sessions_failed].cause.type = UE->pduSession[i].cause.type;
+      resp->pdusessions_failed[pdu_sessions_failed].cause.value = UE->pduSession[i].cause.value;
       pdu_sessions_failed++;
     }
     else
@@ -1055,7 +1136,9 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
 }
 
 //------------------------------------------------------------------------------
-void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, const rrc_gNB_ue_context_t *const ue_context_pP, const ngap_Cause_t causeP, const long cause_valueP)
+void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP,
+                                              const rrc_gNB_ue_context_t *const ue_context_pP,
+                                              const ngap_cause_t causeP)
 //------------------------------------------------------------------------------
 {
   if (ue_context_pP == NULL) {
@@ -1066,8 +1149,8 @@ void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, con
     ngap_ue_release_req_t *req = &NGAP_UE_CONTEXT_RELEASE_REQ(msg);
     memset(req, 0, sizeof(*req));
     req->gNB_ue_ngap_id = UE->rrc_ue_id;
-    req->cause = causeP;
-    req->cause_value = cause_valueP;
+    req->cause.type = causeP.type;
+    req->cause.value = causeP.value;
     for (int i = 0; i < UE->nb_of_pdusessions; i++) {
       req->pdusessions[i].pdusession_id = UE->pduSession[i].param.pdusession_id;
       req->nb_of_pdusessions++;
@@ -1268,8 +1351,8 @@ int rrc_gNB_process_NGAP_PDUSESSION_RELEASE_COMMAND(MessageDef *msg_p, instance_
       int j=UE->nb_of_pdusessions++;
       UE->pduSession[j].status = PDU_SESSION_STATUS_FAILED;
       UE->pduSession[j].param.pdusession_id = cmd->pdusession_release_params[pdusession].pdusession_id;
-      UE->pduSession[j].cause = NGAP_CAUSE_RADIO_NETWORK;
-      UE->pduSession[j].cause_value = 30;
+      ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_UNKNOWN_PDU_SESSION_ID};
+      UE->pduSession[j].cause = cause;
       continue;
     }
     if (pduSession->status == PDU_SESSION_STATUS_FAILED) {
diff --git a/openair2/RRC/NR/rrc_gNB_NGAP.h b/openair2/RRC/NR/rrc_gNB_NGAP.h
index 0a0c97654940b29ae19afc81a55195f958eb87d1..a4ccaaa41bbb679284c023e84398fa68eb5e51d9 100644
--- a/openair2/RRC/NR/rrc_gNB_NGAP.h
+++ b/openair2/RRC/NR/rrc_gNB_NGAP.h
@@ -48,8 +48,7 @@ void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_
 
 void rrc_gNB_send_NGAP_INITIAL_CONTEXT_SETUP_FAIL(uint32_t gnb,
                                                   const rrc_gNB_ue_context_t *const ue_context_pP,
-                                                  const ngap_Cause_t causeP,
-                                                  const long cause_valueP);
+                                                  const ngap_cause_t causeP);
 
 int rrc_gNB_process_NGAP_DOWNLINK_NAS(MessageDef *msg_p, instance_t instance, mui_t *rrc_gNB_mui);
 
@@ -65,7 +64,9 @@ int rrc_gNB_send_NGAP_PDUSESSION_MODIFY_RESP(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE
 
 void rrc_gNB_modify_dedicatedRRCReconfiguration(gNB_RRC_INST *rrc, gNB_RRC_UE_t *ue_p);
 
-void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP, const rrc_gNB_ue_context_t *const ue_context_pP, const ngap_Cause_t causeP, const long cause_valueP);
+void rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(const module_id_t gnb_mod_idP,
+                                              const rrc_gNB_ue_context_t *const ue_context_pP,
+                                              const ngap_cause_t causeP);
 
 int rrc_gNB_process_NGAP_UE_CONTEXT_RELEASE_REQ(MessageDef *msg_p, instance_t instance);
 
diff --git a/openair2/RRC/NR/rrc_gNB_UE_context.c b/openair2/RRC/NR/rrc_gNB_UE_context.c
index eae5c0706edeb65bb9b605258c5a2de1f0c78305..9b02eaa1f4d013c73f7f15edcf8d000b9ea66fdd 100644
--- a/openair2/RRC/NR/rrc_gNB_UE_context.c
+++ b/openair2/RRC/NR/rrc_gNB_UE_context.c
@@ -204,7 +204,8 @@ rrc_gNB_ue_context_t *rrc_gNB_create_ue_context(sctp_assoc_t assoc_id,
   AssertFatal(!cu_exists_f1_ue_data(ue->rrc_ue_id),
               "UE F1 Context for ID %d already exists, logic bug\n",
               ue->rrc_ue_id);
-  cu_add_f1_ue_data(ue->rrc_ue_id, &ue_data);
+  bool success = cu_add_f1_ue_data(ue->rrc_ue_id, &ue_data);
+  DevAssert(success);
 
   RB_INSERT(rrc_nr_ue_tree_s, &rrc_instance_pP->rrc_ue_head, ue_context_p);
   LOG_UE_EVENT(ue,
diff --git a/openair2/RRC/NR/rrc_gNB_cuup.c b/openair2/RRC/NR/rrc_gNB_cuup.c
index 621ebca56e0566d2e5c967f8cd4183e3d74e8e64..b2ef792ac5bdd672e12bd84a4449ab777a1b46b1 100644
--- a/openair2/RRC/NR/rrc_gNB_cuup.c
+++ b/openair2/RRC/NR/rrc_gNB_cuup.c
@@ -37,6 +37,7 @@
 #include "openair2/F1AP/f1ap_ids.h"
 #include "rrc_messages_types.h"
 #include "tree.h"
+#include "e1ap_interface_management.h"
 
 static int cuup_compare(const nr_rrc_cuup_container_t *a, const nr_rrc_cuup_container_t *b)
 {
@@ -90,6 +91,16 @@ static const nr_rrc_cuup_container_t *select_cuup_round_robin(size_t n_t, const
   return NULL;
 }
 
+bool is_cuup_associated(gNB_RRC_INST *rrc)
+{
+  nr_rrc_cuup_container_t *cuup = NULL;
+  RB_FOREACH(cuup, rrc_cuup_tree, &rrc->cuups) {
+    return true;
+  }
+  LOG_W(NR_RRC, "no CU-UP associated to CU-CP\n");
+  return false;
+}
+
 bool ue_associated_to_cuup(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue)
 {
   f1_ue_data_t ue_data = cu_get_f1_ue_data(ue->rrc_ue_id);
@@ -132,8 +143,8 @@ sctp_assoc_t get_new_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue
 
   /* update the association for the UE so it will be picked up later */
   ue_data.e1_assoc_id = selected->assoc_id;
-  cu_remove_f1_ue_data(ue->rrc_ue_id);
-  cu_add_f1_ue_data(ue->rrc_ue_id, &ue_data);
+  bool success = cu_update_f1_ue_data(ue->rrc_ue_id, &ue_data);
+  DevAssert(success);
   LOG_I(RRC, "UE %d associating to CU-UP assoc_id %d out of %ld CU-UPs\n", ue->rrc_ue_id, ue_data.e1_assoc_id, rrc->num_cuups);
 
   return ue_data.e1_assoc_id;
@@ -144,12 +155,13 @@ sctp_assoc_t get_new_cuup_for_ue(const gNB_RRC_INST *rrc, const gNB_RRC_UE_t *ue
 /**
  * @brief Trigger E1AP Setup Failure on CU-CP
 */
-static void e1ap_setup_failure(sctp_assoc_t assoc_id, uint64_t transac_id)
+static void e1ap_setup_failure(sctp_assoc_t assoc_id, uint64_t transac_id, e1ap_cause_t cause)
 {
   MessageDef *msg_p = itti_alloc_new_message(TASK_RRC_GNB, 0, E1AP_SETUP_FAIL);
   msg_p->ittiMsgHeader.originInstance = assoc_id;
   e1ap_setup_fail_t *setup_fail = &E1AP_SETUP_FAIL(msg_p);
   setup_fail->transac_id = transac_id;
+  setup_fail->cause = cause;
   LOG_I(NR_RRC, "Triggering E1AP Setup Failure for transac_id %ld, assoc_id %ld\n",
         transac_id,
         msg_p->ittiMsgHeader.originInstance);
@@ -159,7 +171,7 @@ static void e1ap_setup_failure(sctp_assoc_t assoc_id, uint64_t transac_id)
 /**
  * @brief E1AP Setup Request processing on CU-CP
 */
-int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, e1ap_setup_req_t *req)
+int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, const e1ap_setup_req_t *req)
 {
   AssertFatal(req->supported_plmns <= PLMN_LIST_MAX_SIZE, "Supported PLMNs is more than PLMN_LIST_MAX_SIZE\n");
   gNB_RRC_INST *rrc = RC.nrrrc[0];
@@ -175,13 +187,14 @@ int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, e1ap_setup_req_t *req)
             c->setup_req->gNB_cu_up_id,
             c->setup_req->gNB_cu_up_name,
             c->assoc_id);
-      e1ap_setup_failure(assoc_id, req->transac_id);
+      e1ap_cause_t cause = { .type = E1AP_CAUSE_RADIO_NETWORK, .value = E1AP_RADIO_CAUSE_UNKNOWN_ALREADY_ALLOCATED_GNB_CU_UP_UE_E1AP_ID};
+      e1ap_setup_failure(assoc_id, req->transac_id, cause);
       return -1;
     }
   }
 
   for (int i = 0; i < req->supported_plmns; i++) {
-    PLMN_ID_t *id = &req->plmn[i].id;
+    const PLMN_ID_t *id = &req->plmn[i].id;
     if (rrc->configuration.mcc[i] != id->mcc || rrc->configuration.mnc[i] != id->mnc) {
       LOG_E(NR_RRC,
             "PLMNs received from CUUP (mcc:%d, mnc:%d) did not match with PLMNs in RRC (mcc:%d, mnc:%d)\n",
@@ -189,16 +202,16 @@ int rrc_gNB_process_e1_setup_req(sctp_assoc_t assoc_id, e1ap_setup_req_t *req)
             id->mnc,
             rrc->configuration.mcc[i],
             rrc->configuration.mnc[i]);
-      e1ap_setup_failure(assoc_id, req->transac_id);
+      e1ap_cause_t cause = { .type = E1AP_CAUSE_RADIO_NETWORK, .value = E1AP_RADIO_CAUSE_OTHER};
+      e1ap_setup_failure(assoc_id, req->transac_id, cause);
       return -1;
     }
   }
 
   LOG_I(NR_RRC, "Accepting new CU-UP ID %ld name %s (assoc_id %d)\n", req->gNB_cu_up_id, req->gNB_cu_up_name, assoc_id);
-  nr_rrc_cuup_container_t *cuup = malloc(sizeof(*cuup));
-  AssertFatal(cuup, "out of memory\n");
-  cuup->setup_req = malloc(sizeof(*cuup->setup_req));
-  *cuup->setup_req = *req;
+  nr_rrc_cuup_container_t *cuup = malloc_or_fail(sizeof(*cuup));
+  cuup->setup_req = malloc_or_fail(sizeof(*cuup->setup_req));
+  *cuup->setup_req = cp_e1ap_cuup_setup_request(req);
   cuup->assoc_id = assoc_id;
   RB_INSERT(rrc_cuup_tree, &rrc->cuups, cuup);
   rrc->num_cuups++;
diff --git a/openair2/RRC/NR/rrc_gNB_du.c b/openair2/RRC/NR/rrc_gNB_du.c
index 654ef04be1e54ee45fa870c1372955a8f4354f5e..802735ee85b41dd668434341ae2f18fbb80bd961 100644
--- a/openair2/RRC/NR/rrc_gNB_du.c
+++ b/openair2/RRC/NR/rrc_gNB_du.c
@@ -426,13 +426,11 @@ static int invalidate_du_connections(gNB_RRC_INST *rrc, sctp_assoc_t assoc_id)
     if (ue_data.du_assoc_id == assoc_id) {
       /* this UE belongs to the DU that disconnected, set du_assoc_id to 0,
        * meaning DU is offline, then trigger release request */
-      cu_remove_f1_ue_data(ue_id);
       ue_data.du_assoc_id = 0;
-      cu_add_f1_ue_data(ue_id, &ue_data);
-      rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0,
-                                               ue_context_p,
-                                               NGAP_CAUSE_RADIO_NETWORK,
-                                               NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST);
+      bool success = cu_update_f1_ue_data(ue_id, &ue_data);
+      DevAssert(success);
+      ngap_cause_t cause = {.type = NGAP_CAUSE_RADIO_NETWORK, .value = NGAP_CAUSE_RADIO_NETWORK_RADIO_CONNECTION_WITH_UE_LOST};
+      rrc_gNB_send_NGAP_UE_CONTEXT_RELEASE_REQ(0, ue_context_p, cause);
       count++;
     }
   }
diff --git a/openair2/RRC/NR/rrc_gNB_nsa.c b/openair2/RRC/NR/rrc_gNB_nsa.c
index bae7c451808fa128f31abb3e7407cdcf1b3bb48f..595e3808464bc4469f2d7789df746827a6d9e4b7 100644
--- a/openair2/RRC/NR/rrc_gNB_nsa.c
+++ b/openair2/RRC/NR/rrc_gNB_nsa.c
@@ -355,9 +355,11 @@ void rrc_add_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context_p, x2a
   uint32_t du_ue_id = ue_context_p->ue_context.rnti;
   uint32_t rrc_ue_id = ue_context_p->ue_context.rrc_ue_id;
   f1_ue_data_t du_ue_data = {.secondary_ue = rrc_ue_id};
-  du_add_f1_ue_data(du_ue_id, &du_ue_data);
+  bool success = du_add_f1_ue_data(du_ue_id, &du_ue_data);
+  DevAssert(success);
   f1_ue_data_t cu_ue_data = {.secondary_ue = du_ue_id};
-  cu_add_f1_ue_data(rrc_ue_id, &cu_ue_data);
+  success = cu_add_f1_ue_data(rrc_ue_id, &cu_ue_data);
+  DevAssert(success);
   LOG_I(RRC, "Assign CU UE ID %d and DU UE ID %d to UE RNTI %04x\n", rrc_ue_id, du_ue_id, ue_context_p->ue_context.rnti);
 
   // configure MAC and RLC
diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.c b/openair3/NAS/COMMON/API/NETWORK/nas_message.c
index 80551c5b5c662b2146b3c3b94e5880867681a86a..a3bb781f9287921cf3580d2a2d11496a271573f8 100644
--- a/openair3/NAS/COMMON/API/NETWORK/nas_message.c
+++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.c
@@ -47,7 +47,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer
 #include <stdlib.h> // malloc, free
 #include <string.h> // memcpy
 
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
+#if defined(NAS_BUILT_IN_UE)
 # include "nas_itti_messaging.h"
 #endif
 #include "secu_defs.h"
@@ -158,15 +158,12 @@ nas_message_encrypt(
     LOG_FUNC_RETURN (TLV_ENCODE_BUFFER_TOO_SHORT);
   } else if (size > 1) {
     /* Encrypt the plain NAS message */
-    bytes = _nas_message_encrypt(outbuf + size, inbuf,
+    bytes = _nas_message_encrypt(outbuf + size,
+                                 inbuf,
                                  header->security_header_type,
                                  header->message_authentication_code,
                                  header->sequence_number,
-#ifdef NAS_MME
-                                 SECU_DIRECTION_DOWNLINK,
-#else
                                  SECU_DIRECTION_UPLINK,
-#endif
                                  length - size,
                                  emm_security_context);
 
@@ -175,15 +172,7 @@ nas_message_encrypt(
       /* Compute offset of the sequence number field */
       int offset = size - sizeof(uint8_t);
       /* Compute the NAS message authentication code */
-      uint32_t mac = _nas_message_get_mac(
-                       outbuf + offset,
-                       bytes + size - offset,
-#ifdef NAS_MME
-                       SECU_DIRECTION_DOWNLINK,
-#else
-                       SECU_DIRECTION_UPLINK,
-#endif
-                       emm_security_context);
+      uint32_t mac = _nas_message_get_mac(outbuf + offset, bytes + size - offset, SECU_DIRECTION_UPLINK, emm_security_context);
       /* Set the message authentication code of the NAS message */
       *(uint32_t*)(outbuf + sizeof(uint8_t)) = htonl(mac);
     }
@@ -191,29 +180,6 @@ nas_message_encrypt(
     /* The input buffer does not need to be encrypted */
     memcpy(outbuf, inbuf, length);
   }
-
-#ifdef NAS_MME
-  /* TS 124.301, section 4.4.3.1
-   * The NAS sequence number part of the NAS COUNT shall be
-   * exchanged between the UE and the MME as part of the
-   * NAS signalling. After each new or retransmitted outbound
-   * security protected NAS message, the sender shall increase
-   * the NAS COUNT number by one. Specifically, on the sender
-   * side, the NAS sequence number shall be increased by one,
-   * and if the result is zero (due to wrap around), the NAS
-   * overflow counter shall also be incremented by one (see
-   * subclause 4.4.3.5).
-   */
-  emm_security_context->dl_count.seq_num += 1;
-
-  if ( ! emm_security_context->dl_count.seq_num) {
-    emm_security_context->dl_count.overflow += 1;
-  }
-
-  LOG_TRACE(DEBUG,
-            "Incremented emm_security_context.dl_count.seq_num -> %u",
-            emm_security_context->dl_count.seq_num);
-#else
   emm_security_context->ul_count.seq_num += 1;
 
   if ( ! emm_security_context->ul_count.seq_num) {
@@ -223,8 +189,6 @@ nas_message_encrypt(
   LOG_TRACE(DEBUG,
             "Incremented emm_security_context.ul_count.seq_num -> %u",
             emm_security_context->ul_count.seq_num);
-#endif
-
   if (bytes < 0) {
     LOG_FUNC_RETURN (bytes);
   }
@@ -276,48 +240,30 @@ int nas_message_decrypt(
     LOG_FUNC_RETURN (TLV_DECODE_BUFFER_TOO_SHORT);
   } else if (size > 1) {
     if (security) {
-      emm_security_context   = (emm_security_context_t*)security;
-#if defined(NAS_MME)
-
-      if (emm_security_context->ul_count.seq_num > header->sequence_number) {
-        emm_security_context->ul_count.overflow += 1;
-      }
-
-      emm_security_context->ul_count.seq_num = header->sequence_number;
-#else
+      emm_security_context = (emm_security_context_t *)security;
 
       if (emm_security_context->dl_count.seq_num > header->sequence_number) {
         emm_security_context->dl_count.overflow += 1;
       }
 
       emm_security_context->dl_count.seq_num = header->sequence_number;
-#endif
     }
 
     /* Compute offset of the sequence number field */
     int offset = size - sizeof(uint8_t);
     /* Compute the NAS message authentication code */
-    uint32_t mac = _nas_message_get_mac(
-                     inbuf + offset,
-                     length - offset,
-#ifdef NAS_MME
-                     SECU_DIRECTION_UPLINK,
-#else
-                     SECU_DIRECTION_DOWNLINK,
-#endif
-                     emm_security_context);
+    uint32_t mac = _nas_message_get_mac(inbuf + offset, length - offset, SECU_DIRECTION_DOWNLINK, emm_security_context);
 
     /* Check NAS message integrity */
     if (mac != header->message_authentication_code) {
-
       LOG_TRACE(DEBUG,
                 "MAC Failure MSG:%08X(%u) <> INT ALGO:%08X(%u) Type of security context %u",
-                header->message_authentication_code,header->message_authentication_code,
-                mac,mac, (emm_security_context!=NULL)?emm_security_context->type:88);
-#if defined(NAS_MME)
-      LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH);
-#else
-//#warning "added test on integrity algorithm because of SECURITY_MODE_COMMAND not correctly handled in UE (check integrity)"
+                header->message_authentication_code,
+                header->message_authentication_code,
+                mac,
+                mac,
+                (emm_security_context != NULL) ? emm_security_context->type : 88);
+      // #warning "added test on integrity algorithm because of SECURITY_MODE_COMMAND not correctly handled in UE (check integrity)"
 
       if (emm_security_context->selected_algorithms.integrity !=
           NAS_SECURITY_ALGORITHMS_EIA0) {
@@ -326,8 +272,6 @@ int nas_message_decrypt(
         LOG_TRACE(WARNING,
                   "MAC failure but continue due to EIA0 selected");
       }
-
-#endif
     } else {
       LOG_TRACE(DEBUG, "Integrity: MAC Success");
     }
@@ -385,38 +329,19 @@ int nas_message_decode(
     LOG_FUNC_RETURN (TLV_DECODE_BUFFER_TOO_SHORT);
   } else if (size > 1) {
     if (security) {
-      emm_security_context   = (emm_security_context_t*)security;
-#if defined(NAS_MME)
-
-      if (emm_security_context->ul_count.seq_num > msg->header.sequence_number) {
-        emm_security_context->ul_count.overflow += 1;
-      }
-
-      emm_security_context->ul_count.seq_num = msg->header.sequence_number;
-
-#else
+      emm_security_context = (emm_security_context_t *)security;
 
       if (emm_security_context->dl_count.seq_num > msg->header.sequence_number) {
         emm_security_context->dl_count.overflow += 1;
       }
 
       emm_security_context->dl_count.seq_num = msg->header.sequence_number;
-#endif
     }
 
     /* Compute offset of the sequence number field */
     int offset = size - sizeof(uint8_t);
     /* Compute the NAS message authentication code */
-    uint32_t mac = _nas_message_get_mac(
-                     buffer + offset,
-                     length - offset,
-#ifdef NAS_MME
-                     SECU_DIRECTION_UPLINK,
-#else
-                     SECU_DIRECTION_DOWNLINK,
-#endif
-                     emm_security_context
-                   );
+    uint32_t mac = _nas_message_get_mac(buffer + offset, length - offset, SECU_DIRECTION_DOWNLINK, emm_security_context);
 
 #define NAS_CODE_TO_BE_MODIFIED 1
 #ifdef NAS_CODE_TO_BE_MODIFIED
@@ -445,10 +370,6 @@ int nas_message_decode(
       LOG_FUNC_RETURN (TLV_DECODE_MAC_MISMATCH);
     }
 
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-    /* Log message header */
-#endif
-
     /* Decode security protected NAS message */
     bytes = _nas_message_protected_decode(buffer + size,
                                           &msg->header,
@@ -525,62 +446,24 @@ int nas_message_encode(
                 "offset %d = %d - %d, hdr encode = %d, length = %d bytes = %d",
                 offset, size, (int)sizeof(uint8_t),
                 size, length, bytes);
-      uint32_t mac = _nas_message_get_mac(
-                       buffer + offset,
-                       bytes + size - offset,
-#ifdef NAS_MME
-                       SECU_DIRECTION_DOWNLINK,
-#else
-                       SECU_DIRECTION_UPLINK,
-#endif
-                       emm_security_context);
+      uint32_t mac = _nas_message_get_mac(buffer + offset, bytes + size - offset, SECU_DIRECTION_UPLINK, emm_security_context);
       /* Set the message authentication code of the NAS message */
       uint32_t mac_nl = htonl(mac);
       memcpy(buffer + sizeof(uint8_t), &mac_nl, sizeof(mac_nl));
 
       if (emm_security_context) {
-#ifdef NAS_MME
-        /* TS 124.301, section 4.4.3.1
-         * The NAS sequence number part of the NAS COUNT shall be
-         * exchanged between the UE and the MME as part of the
-         * NAS signalling. After each new or retransmitted outbound
-         * security protected NAS message, the sender shall increase
-         * the NAS COUNT number by one. Specifically, on the sender
-         * side, the NAS sequence number shall be increased by one,
-         * and if the result is zero (due to wrap around), the NAS
-         * overflow counter shall also be incremented by one (see
-         * subclause 4.4.3.5).
-         */
-
-        emm_security_context->dl_count.seq_num += 1;
-
-        if ( ! emm_security_context->dl_count.seq_num) {
-          emm_security_context->dl_count.overflow += 1;
-        }
-
-        LOG_TRACE(DEBUG,
-                  "Incremented emm_security_context.dl_count.seq_num -> %u",
-                  emm_security_context->dl_count.seq_num);
-#else
         emm_security_context->ul_count.seq_num += 1;
 
         if ( ! emm_security_context->ul_count.seq_num) {
           emm_security_context->ul_count.overflow += 1;
         }
 
-        LOG_TRACE(DEBUG,
-                  "Incremented emm_security_context.ul_count.seq_num -> %u",
-                  emm_security_context->ul_count.seq_num);
-#endif
+        LOG_TRACE(DEBUG, "Incremented emm_security_context.ul_count.seq_num -> %u", emm_security_context->ul_count.seq_num);
       } else {
         LOG_TRACE(DEBUG,
                   "Did not increment emm_security_context.dl_count.seq_num because no security context");
       }
     }
-
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-    /* Log message header */
-#endif
   } else {
     /* Encode plain NAS message */
     bytes = _nas_message_plain_encode(buffer, &msg->header,
@@ -907,11 +790,7 @@ static int _nas_message_protected_encode(
                                    msg->header.security_header_type,
                                    msg->header.message_authentication_code,
                                    msg->header.sequence_number,
-#ifdef NAS_MME
-                                   SECU_DIRECTION_DOWNLINK,
-#else
                                    SECU_DIRECTION_UPLINK,
-#endif
                                    size,
                                    emm_security_context);
       //seq, size);
@@ -967,11 +846,7 @@ static int _nas_message_decrypt(
   int size = 0;
   nas_message_security_header_t header;
 
-#ifdef NAS_MME
-  direction = SECU_DIRECTION_UPLINK;
-#else
   direction = SECU_DIRECTION_DOWNLINK;
-#endif
   if (emm_security_context == NULL)
     LOG_FUNC_RETURN (0);
 
@@ -1287,7 +1162,7 @@ static uint32_t _nas_message_get_mac(
   if (!emm_security_context) {
     LOG_TRACE(DEBUG,
               "No security context set for integrity protection algorithm");
-#if defined(NAS_BUILT_IN_EPC) || defined(NAS_BUILT_IN_UE)
+#if defined(NAS_BUILT_IN_UE)
     LOG_FUNC_RETURN (0);
 #else
     LOG_FUNC_RETURN (0xabababab);
@@ -1415,7 +1290,7 @@ static uint32_t _nas_message_get_mac(
               (direction == SECU_DIRECTION_UPLINK) ? emm_security_context->ul_count.seq_num:emm_security_context->dl_count.seq_num
              );
 
-#if defined(NAS_BUILT_IN_EPC) || defined(NAS_BUILT_IN_UE)
+#if defined(NAS_BUILT_IN_UE)
     LOG_FUNC_RETURN (0);
 #else
     LOG_FUNC_RETURN (0xabababab);
diff --git a/openair3/NAS/COMMON/API/NETWORK/nas_message.h b/openair3/NAS/COMMON/API/NETWORK/nas_message.h
index 8fde6eb97df57f3c17615e7912ad082d12ff1e9c..19dbf38fe61a943b08a6935e487562c08f5f00af 100644
--- a/openair3/NAS/COMMON/API/NETWORK/nas_message.h
+++ b/openair3/NAS/COMMON/API/NETWORK/nas_message.h
@@ -42,11 +42,7 @@ Description Defines the layer 3 messages supported by the NAS sublayer
 
 #include "commonDef.h"
 #include "emm_msg.h"
-#if defined(NAS_BUILT_IN_EPC)
-#include "emmData.h"
-#endif
 #include "esm_msg.h"
-
 /****************************************************************************/
 /*********************  G L O B A L    C O N S T A N T S  *******************/
 /****************************************************************************/
diff --git a/openair3/NAS/COMMON/API/NETWORK/network_api.c b/openair3/NAS/COMMON/API/NETWORK/network_api.c
index a2ef101e92cc2762839089e8fab49e65cfe308b1..0d99c8c5706c7564b87cdcb3a529035a18bc6026 100644
--- a/openair3/NAS/COMMON/API/NETWORK/network_api.c
+++ b/openair3/NAS/COMMON/API/NETWORK/network_api.c
@@ -129,13 +129,7 @@ int network_api_initialize(const char* host, const char* port)
   _network_api_id.send  = socket_send;
   _network_api_id.close = socket_close;
   /* Initialize UDP communication channel with the network layer */
-#ifdef NAS_UE
   _network_api_id.endpoint = NETWORK_API_OPEN(SOCKET_CLIENT, host, port);
-#endif
-#ifdef NAS_MME
-  _network_api_id.endpoint = NETWORK_API_OPEN(SOCKET_SERVER, NULL, port);
-#endif
-
   if (_network_api_id.endpoint == NULL) {
     LOG_TRACE(ERROR, "NET-API   - Failed to open connection endpoint, %s",
               ((errno < 0) ? gai_strerror(errno) : strerror(errno)));
diff --git a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c
index cd55a3fffb9e1de70685bd89c33d2c5f26e438b5..8ce145deec8edc03371d31cce6038837dc3f861a 100644
--- a/openair3/NAS/COMMON/EMM/MSG/emm_msg.c
+++ b/openair3/NAS/COMMON/EMM/MSG/emm_msg.c
@@ -86,14 +86,6 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len) {
   LOG_FUNC_IN;
   int header_result;
   int decode_result;
-  uint8_t *buffer_log = buffer;
-  uint32_t len_log = len;
-  int down_link;
-# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
-  down_link = 0;
-# else
-  down_link = 1;
-# endif
   /* First decode the EMM message header */
   header_result = _emm_msg_decode_header(&msg->header, buffer, len);
 
@@ -247,14 +239,13 @@ int emm_msg_decode(EMM_msg *msg, uint8_t *buffer, uint32_t len) {
   if (decode_result < 0) {
     LOG_TRACE(ERROR, "EMM-MSG   - Failed to decode L3 EMM message 0x%x "
               "(%d)", msg->header.message_type, decode_result);
-    LOG_FUNC_RETURN (decode_result);
+    LOG_FUNC_RETURN(decode_result);
   } else {
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
     /* Message has been decoded and security header removed, handle it has a plain message */
-    nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
+#if defined(NAS_BUILT_IN_EPC)
+    nas_itti_plain_msg((char *)buffer_log, (nas_message_t *)msg, len_log, 0);
 #endif
   }
-
   LOG_FUNC_RETURN (header_result + decode_result);
 }
 
@@ -279,13 +270,6 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len) {
   LOG_FUNC_IN;
   int header_result;
   int encode_result;
-  uint8_t *buffer_log = buffer;
-  int down_link;
-# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
-  down_link = 1;
-# else
-  down_link = 0;
-# endif
   /* First encode the EMM message header */
   header_result = _emm_msg_encode_header(&msg->header, buffer, len);
 
@@ -443,8 +427,8 @@ int emm_msg_encode(EMM_msg *msg, uint8_t *buffer, uint32_t len) {
     LOG_TRACE(ERROR, "EMM-MSG   - Failed to encode L3 EMM message 0x%x "
               "(%d)", msg->header.message_type, encode_result);
   } else {
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-    nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
+#if defined(NAS_BUILT_IN_EPC)
+    nas_itti_plain_msg((char *)buffer_log, (nas_message_t *)msg, header_result + encode_result, 1);
 #endif
   }
 
diff --git a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c
index f4d3dd94ddca5ac0a1a44b5eeb903d159814d1ee..599120355e2ab00ba5d1fd659112ba0d1e3d3c3a 100644
--- a/openair3/NAS/COMMON/ESM/MSG/esm_msg.c
+++ b/openair3/NAS/COMMON/ESM/MSG/esm_msg.c
@@ -43,10 +43,6 @@ Description Defines EPS Session Management messages
 #include "TLVDecoder.h"
 #include "TLVEncoder.h"
 
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-# include "nas_itti_messaging.h"
-#endif
-
 /****************************************************************************/
 /****************  E X T E R N A L    D E F I N I T I O N S  ****************/
 /****************************************************************************/
@@ -84,19 +80,6 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
 {
   int header_result;
   int decode_result;
-
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-  uint8_t *buffer_log = buffer;
-  uint32_t len_log = len;
-  int down_link;
-
-# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
-  down_link = 0;
-# else
-  down_link = 1;
-# endif
-#endif
-
   LOG_FUNC_IN;
 
   /* First decode the ESM message header */
@@ -210,14 +193,12 @@ int esm_msg_decode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
   if (decode_result < 0) {
     LOG_TRACE(ERROR, "ESM-MSG   - Failed to decode L3 ESM message 0x%x "
               "(%u)", msg->header.message_type, decode_result);
-    LOG_FUNC_RETURN (decode_result);
+    LOG_FUNC_RETURN(decode_result);
   } else {
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-    /* Message has been decoded and security header removed, handle it has a plain message */
-    nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, len_log, down_link);
+#if defined(NAS_BUILT_IN_EPC)
+    nas_itti_plain_msg((char *)buffer_log, (nas_message_t *)msg, len_log, 0);
 #endif
   }
-
   LOG_FUNC_RETURN (header_result + decode_result);
 }
 
@@ -245,17 +226,6 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
   int header_result;
   int encode_result;
 
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-  uint8_t *buffer_log = buffer;
-  int down_link;
-
-# if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)))
-  down_link = 1;
-# else
-  down_link = 0;
-# endif
-#endif
-
   /* First encode the ESM message header */
   header_result = _esm_msg_encode_header(&msg->header, buffer, len);
 
@@ -371,11 +341,10 @@ int esm_msg_encode(ESM_msg *msg, uint8_t *buffer, uint32_t len)
     LOG_TRACE(ERROR, "ESM-MSG   - Failed to encode L3 ESM message 0x%x "
               "(%d)", msg->header.message_type, encode_result);
   } else {
-#if ((defined(NAS_BUILT_IN_EPC) && defined(NAS_MME)) || (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) && defined(NAS_UE)))
-    nas_itti_plain_msg((char *) buffer_log, (nas_message_t *) msg, header_result + encode_result, down_link);
+#if defined(NAS_BUILT_IN_EPC)
+    nas_itti_plain_msg((char *)buffer_log, (nas_message_t *)msg, header_result + encode_result, 1);
 #endif
   }
-
   LOG_FUNC_RETURN (header_result + encode_result);
 }
 
diff --git a/openair3/NAS/COMMON/UTIL/nas_log.h b/openair3/NAS/COMMON/UTIL/nas_log.h
index d1531fa6db11a3dc4d074ae289880adf0161d80d..710c165440d14cc5c30ceb7c979666ac35e22fdb 100644
--- a/openair3/NAS/COMMON/UTIL/nas_log.h
+++ b/openair3/NAS/COMMON/UTIL/nas_log.h
@@ -38,7 +38,7 @@ Description Usefull logging functions
 #ifndef __NAS_LOG_H__
 #define __NAS_LOG_H__
 
-#if defined(NAS_BUILT_IN_UE) && defined(NAS_UE)
+#if defined(NAS_BUILT_IN_UE)
 # include "common/utils/LOG/log.h"
 # undef LOG_TRACE
 #endif
diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c
index b67a3bc232f8d8402c891e327658ab2a41b8a346..0a521ceeb45703e64bddc5af382f21bf14bd3bbd 100644
--- a/openair3/NAS/COMMON/UTIL/nas_timer.c
+++ b/openair3/NAS/COMMON/UTIL/nas_timer.c
@@ -216,11 +216,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args)
 
   /* Insert the new entry into the timer queue */
   _nas_timer_db_insert_entry(id, te);
-# if defined(NAS_MME)
-  ret = timer_setup(sec, 0, TASK_NAS_MME, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
-# else
   ret = timer_setup(sec, 0, TASK_NAS_UE, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
-# endif
 
   if (ret == -1) {
     return NAS_TIMER_INACTIVE_ID;
@@ -295,39 +291,6 @@ int nas_timer_restart(int id)
   return (NAS_TIMER_INACTIVE_ID);
 }
 
-/****************************************************************************/
-/*********************  L O C A L    F U N C T I O N S  *********************/
-/****************************************************************************/
-
-/****************************************************************************
- **                                                                        **
- ** Name:    _nas_timer_handler()                                      **
- **                                                                        **
- ** Description: The timer handler is executed whenever the system deli-   **
- **      vers signal SIGALARM. It starts execution of the callback **
- **      function of the first entry within the queue of active    **
- **      timer entries. The entry is not removed from the queue of **
- **      active timer entries and shall be explicitly removed when **
- **      the timer expires.                                        **
- **                                                                        **
- ** Inputs:  None                                                      **
- **      Others:    None                                       **
- **                                                                        **
- ** Outputs:     None                                                      **
- **      Return:    None                                       **
- **      Others:    _nas_timer_db                              **
- **                                                                        **
- ***************************************************************************/
-
-void nas_timer_handle_signal_expiry(long timer_id, void *arg_p)
-{
-  /* Get the timer entry for which the system timer expired */
-  nas_timer_entry_t *te = _nas_timer_db.head->entry;
-
-  te->cb(te->args);
-}
-
-
 /*
  * -----------------------------------------------------------------------------
  *      Functions used to manage the timer database
diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.h b/openair3/NAS/COMMON/UTIL/nas_timer.h
index b1149f21c0035e7a00635c5c2e38859dee8180cb..2af27f63dd4655cb252770ac54e0e29519131edf 100644
--- a/openair3/NAS/COMMON/UTIL/nas_timer.h
+++ b/openair3/NAS/COMMON/UTIL/nas_timer.h
@@ -74,8 +74,4 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args);
 int nas_timer_stop(int id);
 int nas_timer_restart(int id);
 
-#if defined(NAS_BUILT_IN_EPC)
-void nas_timer_handle_signal_expiry(long timer_id, void *arg_p);
-#endif
-
 #endif /* __NAS_TIMER_H__ */
diff --git a/openair3/NAS/UE/nas_itti_messaging.c b/openair3/NAS/UE/nas_itti_messaging.c
index e7707a8ccd11f0abbb9ac7170cf8e114fad8ba5f..6f64413b70995dfc61b783a8920cd76459f68b1e 100644
--- a/openair3/NAS/UE/nas_itti_messaging.c
+++ b/openair3/NAS/UE/nas_itti_messaging.c
@@ -27,8 +27,7 @@
 
 #   define TASK_ORIGIN  TASK_NAS_UE
 
-
-#if (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE) )
+#if defined(NAS_BUILT_IN_UE)
 __attribute__ ((unused)) static const uint8_t emm_message_ids[] = {
   ATTACH_REQUEST,
   ATTACH_ACCEPT,
diff --git a/openair3/NAS/UE/nas_itti_messaging.h b/openair3/NAS/UE/nas_itti_messaging.h
index 79b70394f0e57318070016e2b8806e3360620013..7fdda3296052ec3b3c8f74c6bb1f98988ef2ab28 100644
--- a/openair3/NAS/UE/nas_itti_messaging.h
+++ b/openair3/NAS/UE/nas_itti_messaging.h
@@ -30,22 +30,13 @@
 #ifndef NAS_ITTI_MESSAGING_H_
 #define NAS_ITTI_MESSAGING_H_
 
-# if (defined(ENABLE_NAS_UE_LOGGING) && defined(NAS_BUILT_IN_UE))
 int nas_itti_plain_msg(
   const char *buffer,
   const nas_message_t *msg,
   const int lengthP,
   const int instance);
 
-int nas_itti_protected_msg(
-  const char *buffer,
-  const nas_message_t *msg,
-  const int lengthP,
-  const int instance);
-# endif
-
-
-# if defined(NAS_BUILT_IN_UE)
+int nas_itti_protected_msg(const char *buffer, const nas_message_t *msg, const int lengthP, const int instance);
 
 int nas_itti_kenb_refresh_req(const Byte_t kenb[32], int user_id);
 
@@ -56,5 +47,4 @@ int nas_itti_nas_establish_req(as_cause_t cause, as_call_type_t type, as_stmsi_t
 int nas_itti_ul_data_req(const uint32_t ue_idP, void *const data_pP, const uint32_t lengthP, int user_id);
 
 int nas_itti_rab_establish_rsp(const as_stmsi_t s_tmsi, const as_rab_id_t rabID, const nas_error_code_t errCode, int user_id);
-# endif
 #endif /* NAS_ITTI_MESSAGING_H_ */
diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c
index dfb4a98d4f9884ede6a7406ea92082f5657f6826..473ca468347267dc064c6ea8d074f956d7b66c89 100644
--- a/openair3/NAS/UE/nas_ue_task.c
+++ b/openair3/NAS/UE/nas_ue_task.c
@@ -34,8 +34,6 @@
 
 #include "nas_user.h"
 #include "common/ran_context.h"
-// FIXME make command line option for NAS_UE_AUTOSTART
-# define NAS_UE_AUTOSTART 1
 
 // FIXME review these externs
 extern uint16_t NB_UE_INST;
@@ -203,15 +201,12 @@ void *nas_ue_task(void *args_p)
 
       switch (ITTI_MSG_ID(msg_p)) {
       case INITIALIZE_MESSAGE:
-        LOG_I(NAS, "[UE %d] Received %s\n", Mod_id,  ITTI_MSG_NAME (msg_p));
-#if (NAS_UE_AUTOSTART != 0)
+        LOG_I(NAS, "[UE %d] Received %s\n", Mod_id, ITTI_MSG_NAME(msg_p));
         {
           /* Send an activate modem command to NAS like UserProcess should do it */
           char *user_data = "at+cfun=1\r";
-
           nas_user_receive_and_process (user, user_data);
         }
-#endif
         break;
 
       case TERMINATE_MESSAGE:
diff --git a/openair3/NGAP/ngap_common.c b/openair3/NGAP/ngap_common.c
index bded329570186c7f9ad0ce2f780470a017f6a153..385730f70d31253f06b58a93e018d0675c7f39fa 100644
--- a/openair3/NGAP/ngap_common.c
+++ b/openair3/NGAP/ngap_common.c
@@ -31,3 +31,38 @@
 #include "ngap_common.h"
 
 int asn1_xer_print = 0;
+
+void encode_ngap_cause(NGAP_Cause_t *out, const ngap_cause_t *in)
+{
+  switch (in->type) {
+    case NGAP_CAUSE_RADIO_NETWORK:
+      out->present = NGAP_Cause_PR_radioNetwork;
+      out->choice.radioNetwork = in->value;
+      break;
+
+    case NGAP_CAUSE_TRANSPORT:
+      out->present = NGAP_Cause_PR_transport;
+      out->choice.transport = in->value;
+      break;
+
+    case NGAP_CAUSE_NAS:
+      out->present = NGAP_Cause_PR_nas;
+      out->choice.nas = in->value;
+      break;
+
+    case NGAP_CAUSE_PROTOCOL:
+      out->present = NGAP_Cause_PR_protocol;
+      out->choice.protocol = in->value;
+      break;
+
+    case NGAP_CAUSE_MISC:
+      out->present = NGAP_Cause_PR_misc;
+      out->choice.misc = in->value;
+      break;
+
+    case NGAP_CAUSE_NOTHING:
+    default:
+      AssertFatal(false, "Unknown failure cause %d\n", in->type);
+      break;
+  }
+}
diff --git a/openair3/NGAP/ngap_common.h b/openair3/NGAP/ngap_common.h
index f83414e2bb08bd849eb2f20b0a71e49672e6d59f..259f0cbb183dbf402641ccad4c29affe1f565a3b 100644
--- a/openair3/NGAP/ngap_common.h
+++ b/openair3/NGAP/ngap_common.h
@@ -36,10 +36,10 @@
 #ifndef NGAP_COMMON_H_
 #define NGAP_COMMON_H_
 
-#include <netinet/sctp.h>
 #include "common/utils/LOG/log.h"
 #include "oai_asn1.h"
 #include "ngap_msg_includes.h"
+#include "openair2/COMMON/ngap_messages_types.h"
 
 /* Checking version of ASN1C compiler */
 #if (ASN1C_ENVIRONMENT_VERSION < ASN1C_MINIMUM_VERSION)
@@ -84,6 +84,8 @@ extern int asn1_xer_print;
  **/
 typedef int (*ngap_message_decoded_callback)(sctp_assoc_t assoc_id, uint32_t stream, NGAP_NGAP_PDU_t *pdu);
 
+void encode_ngap_cause(NGAP_Cause_t *out, const ngap_cause_t *in);
+
 /** @}*/
 
 #endif /* NGAP_COMMON_H_ */
diff --git a/openair3/NGAP/ngap_gNB_context_management_procedures.c b/openair3/NGAP/ngap_gNB_context_management_procedures.c
index 524fcee6c46f591be109842d184cc9b9f1e86234..7abbec2592741951f803b1b59bc41c31ab57a245 100644
--- a/openair3/NGAP/ngap_gNB_context_management_procedures.c
+++ b/openair3/NGAP/ngap_gNB_context_management_procedures.c
@@ -200,32 +200,8 @@ int ngap_ue_context_release_req(instance_t instance,
     ie->id = NGAP_ProtocolIE_ID_id_Cause;
     ie->criticality = NGAP_Criticality_ignore;
     ie->value.present = NGAP_UEContextReleaseRequest_IEs__value_PR_Cause;
-    DevAssert(ue_release_req_p->cause <= NGAP_Cause_PR_choice_ExtensionS);
-    switch(ue_release_req_p->cause){
-      case NGAP_CAUSE_RADIO_NETWORK:
-	ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork;
-	ie->value.choice.Cause.choice.radioNetwork = ue_release_req_p->cause_value;
-	break;
-      case NGAP_CAUSE_TRANSPORT:
-	ie->value.choice.Cause.present = NGAP_Cause_PR_transport;
-	ie->value.choice.Cause.choice.transport = ue_release_req_p->cause_value;
-	break;
-      case NGAP_CAUSE_NAS:
-	ie->value.choice.Cause.present = NGAP_Cause_PR_nas;
-	ie->value.choice.Cause.choice.nas = ue_release_req_p->cause_value;
-	break;
-      case NGAP_CAUSE_PROTOCOL:
-	ie->value.choice.Cause.present = NGAP_Cause_PR_protocol;
-	ie->value.choice.Cause.choice.protocol = ue_release_req_p->cause_value;
-	break;
-      case NGAP_CAUSE_MISC:
-	ie->value.choice.Cause.present = NGAP_Cause_PR_misc;
-	ie->value.choice.Cause.choice.misc = ue_release_req_p->cause_value;
-	break;
-      default:
-        NGAP_WARN("Received NG Error indication cause NGAP_Cause_PR_choice_Extensions\n");
-        break;
-    }
+    DevAssert(ue_release_req_p->cause.type <= NGAP_CAUSE_MISC);
+    encode_ngap_cause(&ie->value.choice.Cause, &ue_release_req_p->cause);
   }
 
   if (ngap_gNB_encode_pdu(&pdu, &buffer, &length) < 0) {
diff --git a/openair3/NGAP/ngap_gNB_handlers.c b/openair3/NGAP/ngap_gNB_handlers.c
index 2916967b83943ebbf798795e5d1d95cf1ae9b0af..6309485e2db2097c93bf0a75793c355debe36f7c 100644
--- a/openair3/NGAP/ngap_gNB_handlers.c
+++ b/openair3/NGAP/ngap_gNB_handlers.c
@@ -1141,8 +1141,8 @@ static int ngap_gNB_handle_pdusession_modify_request(sctp_assoc_t assoc_id, uint
         item_p = (NGAP_PDUSessionResourceModifyItemModReq_t *)ie->value.choice.PDUSessionResourceModifyListModReq.list.array[nb_of_pdusessions_failed];
         pdusession_failed_t *tmp = &msg->pdusessions_failed[nb_of_pdusessions_failed];
         tmp->pdusession_id = item_p->pDUSessionID;
-        tmp->cause = NGAP_CAUSE_RADIO_NETWORK;
-        tmp->cause_value = NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID;
+        tmp->cause.type = NGAP_CAUSE_RADIO_NETWORK;
+        tmp->cause.value = NGAP_CauseRadioNetwork_unknown_local_UE_NGAP_ID;
       }
     msg->nb_of_pdusessions_failed = ie->value.choice.PDUSessionResourceModifyListModReq.list.count;
     ngap_gNB_pdusession_modify_resp(amf_desc_p->ngap_gNB_instance->instance,msg);
diff --git a/openair3/NGAP/ngap_gNB_nas_procedures.c b/openair3/NGAP/ngap_gNB_nas_procedures.c
index 86ecd6eead563553add4f1bf579664443729c603..83daacf758676579fe54d980dcf5c520cc82f56c 100644
--- a/openair3/NGAP/ngap_gNB_nas_procedures.c
+++ b/openair3/NGAP/ngap_gNB_nas_procedures.c
@@ -681,37 +681,7 @@ int ngap_gNB_initial_ctxt_resp(instance_t instance, ngap_initial_context_setup_r
       item->pDUSessionID = initial_ctxt_resp_p->pdusessions_failed[i].pdusession_id;
 
       /* cause */
-      switch(initial_ctxt_resp_p->pdusessions_failed[i].cause) {
-        case NGAP_CAUSE_RADIO_NETWORK:
-          pdusessionUnTransfer.cause.present = NGAP_Cause_PR_radioNetwork;
-          pdusessionUnTransfer.cause.choice.radioNetwork = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
-          break;
-
-        case NGAP_CAUSE_TRANSPORT:
-          pdusessionUnTransfer.cause.present = NGAP_Cause_PR_transport;
-          pdusessionUnTransfer.cause.choice.transport = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
-          break;
-
-        case NGAP_CAUSE_NAS:
-          pdusessionUnTransfer.cause.present = NGAP_Cause_PR_nas;
-          pdusessionUnTransfer.cause.choice.nas = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
-          break;
-
-        case NGAP_CAUSE_PROTOCOL:
-          pdusessionUnTransfer.cause.present = NGAP_Cause_PR_protocol;
-          pdusessionUnTransfer.cause.choice.protocol = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
-          break;
-
-        case NGAP_CAUSE_MISC:
-          pdusessionUnTransfer.cause.present = NGAP_Cause_PR_misc;
-          pdusessionUnTransfer.cause.choice.misc = initial_ctxt_resp_p->pdusessions_failed[i].cause_value;
-          break;
-
-        case NGAP_CAUSE_NOTHING:
-        default:
-          AssertFatal(false, "Unknown PDU session failure cause %d\n", initial_ctxt_resp_p->pdusessions_failed[i].cause);
-          break;
-      }
+      encode_ngap_cause(&pdusessionUnTransfer.cause, &initial_ctxt_resp_p->pdusessions_failed[i].cause);
 
       NGAP_INFO("initial context setup response: failed pdusession ID %ld\n", item->pDUSessionID);
       asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, &pdusessionUnTransfer);
@@ -812,33 +782,7 @@ int ngap_gNB_initial_ctxt_fail(instance_t instance, ngap_initial_context_setup_f
     ie->id = NGAP_ProtocolIE_ID_id_Cause;
     ie->criticality = NGAP_Criticality_ignore;
     ie->value.present = NGAP_InitialContextSetupFailureIEs__value_PR_Cause;
-
-    switch (initial_ctxt_fail->cause) {
-      case NGAP_CAUSE_RADIO_NETWORK:
-        ie->value.choice.Cause.present = NGAP_Cause_PR_radioNetwork;
-        ie->value.choice.Cause.choice.radioNetwork = initial_ctxt_fail->cause_value;
-        break;
-      case NGAP_CAUSE_TRANSPORT:
-        ie->value.choice.Cause.present = NGAP_Cause_PR_transport;
-        ie->value.choice.Cause.choice.transport = initial_ctxt_fail->cause_value;
-        break;
-      case NGAP_CAUSE_NAS:
-        ie->value.choice.Cause.present = NGAP_Cause_PR_nas;
-        ie->value.choice.Cause.choice.nas = initial_ctxt_fail->cause_value;
-        break;
-      case NGAP_CAUSE_PROTOCOL:
-        ie->value.choice.Cause.present = NGAP_Cause_PR_protocol;
-        ie->value.choice.Cause.choice.protocol = initial_ctxt_fail->cause_value;
-        break;
-      case NGAP_CAUSE_MISC:
-        ie->value.choice.Cause.present = NGAP_Cause_PR_misc;
-        ie->value.choice.Cause.choice.misc = initial_ctxt_fail->cause_value;
-        break;
-      case NGAP_CAUSE_NOTHING:
-      default:
-        AssertFatal(false, "Unknown NGAP Initial Context Setup failure cause %d\n", initial_ctxt_fail->cause);
-        break;
-    }
+    encode_ngap_cause(&ie->value.choice.Cause, &initial_ctxt_fail->cause);
   }
   if (asn1_xer_print) {
     xer_fprint(stdout, &asn_DEF_NGAP_NGAP_PDU, &pdu);
@@ -1058,37 +1002,7 @@ int ngap_gNB_pdusession_setup_resp(instance_t instance, ngap_pdusession_setup_re
       item->pDUSessionID = pdusession_failed->pdusession_id;
 
       /* cause */
-      switch(pdusession_failed->cause) {
-        case NGAP_CAUSE_RADIO_NETWORK:
-          pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_radioNetwork;
-          pdusessionUnTransfer_p.cause.choice.radioNetwork = pdusession_failed->cause_value;
-          break;
-
-        case NGAP_CAUSE_TRANSPORT:
-          pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_transport;
-          pdusessionUnTransfer_p.cause.choice.transport = pdusession_failed->cause_value;
-          break;
-
-        case NGAP_CAUSE_NAS:
-          pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_nas;
-          pdusessionUnTransfer_p.cause.choice.nas = pdusession_failed->cause_value;
-          break;
-
-        case NGAP_CAUSE_PROTOCOL:
-          pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_protocol;
-          pdusessionUnTransfer_p.cause.choice.protocol = pdusession_failed->cause_value;
-          break;
-
-        case NGAP_CAUSE_MISC:
-          pdusessionUnTransfer_p.cause.present = NGAP_Cause_PR_misc;
-          pdusessionUnTransfer_p.cause.choice.misc = pdusession_failed->cause_value;
-          break;
-
-        case NGAP_CAUSE_NOTHING:
-        default:
-          AssertFatal(false, "Unknown PDU session failure cause %d\n", pdusession_failed->cause);
-          break;
-      }
+      encode_ngap_cause(&pdusessionUnTransfer_p.cause, &pdusession_failed->cause);
       NGAP_INFO("pdusession setup response: failed pdusession ID %ld\n", item->pDUSessionID);
 
       asn_encode_to_new_buffer_result_t res = asn_encode_to_new_buffer(NULL, ATS_ALIGNED_CANONICAL_PER, &asn_DEF_NGAP_PDUSessionResourceSetupUnsuccessfulTransfer, &pdusessionUnTransfer_p);
@@ -1222,37 +1136,8 @@ int ngap_gNB_pdusession_modify_resp(instance_t instance, ngap_pdusession_modify_
 
       NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t pdusessionTransfer = {0};
 
-      switch(pdusession_modify_resp_p->pdusessions_failed[i].cause) {
-      case NGAP_CAUSE_RADIO_NETWORK:
-        pdusessionTransfer.cause.present = NGAP_Cause_PR_radioNetwork;
-        pdusessionTransfer.cause.choice.radioNetwork = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
-        break;
-
-      case NGAP_CAUSE_TRANSPORT:
-        pdusessionTransfer.cause.present = NGAP_Cause_PR_transport;
-        pdusessionTransfer.cause.choice.transport = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
-        break;
-
-      case NGAP_CAUSE_NAS:
-        pdusessionTransfer.cause.present = NGAP_Cause_PR_nas;
-        pdusessionTransfer.cause.choice.nas = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
-        break;
-
-      case NGAP_CAUSE_PROTOCOL:
-        pdusessionTransfer.cause.present = NGAP_Cause_PR_protocol;
-        pdusessionTransfer.cause.choice.protocol = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
-        break;
-
-      case NGAP_CAUSE_MISC:
-        pdusessionTransfer.cause.present = NGAP_Cause_PR_misc;
-        pdusessionTransfer.cause.choice.misc = pdusession_modify_resp_p->pdusessions_failed[i].cause_value;
-        break;
-
-      case NGAP_CAUSE_NOTHING:
-      default:
-        AssertFatal(false, "Unknown PDU session failure cause %d\n", pdusession_modify_resp_p->pdusessions_failed[i].cause);
-        break;
-      }
+      // NGAP cause
+      encode_ngap_cause(&pdusessionTransfer.cause, &pdusession_modify_resp_p->pdusessions_failed[i].cause);
 
       asn_encode_to_new_buffer_result_t res = {0};
       NGAP_PDUSessionResourceModifyUnsuccessfulTransfer_t *pdusessionTransfer_p = NULL;
diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.c b/openair3/SCTP/sctp_eNB_itti_messaging.c
index 40472ed923aac71dc94b20da6337fe15ee54e412..bdfa2b0e016f15f0399b9e4b6b05ba3602e57e75 100644
--- a/openair3/SCTP/sctp_eNB_itti_messaging.c
+++ b/openair3/SCTP/sctp_eNB_itti_messaging.c
@@ -68,7 +68,7 @@ int sctp_itti_send_association_resp(task_id_t task_id,
                                     instance_t instance,
                                     sctp_assoc_t assoc_id,
                                     uint16_t cnx_id,
-                                    enum sctp_state_e state,
+                                    sctp_state_e state,
                                     uint16_t out_streams,
                                     uint16_t in_streams)
 {
diff --git a/openair3/SCTP/sctp_eNB_itti_messaging.h b/openair3/SCTP/sctp_eNB_itti_messaging.h
index a91e95493c5aaedf5e9257c778c643aa48d7c852..a9fa20c10a49e9a5bd7c568c4f3a755eb4f79825 100644
--- a/openair3/SCTP/sctp_eNB_itti_messaging.h
+++ b/openair3/SCTP/sctp_eNB_itti_messaging.h
@@ -35,7 +35,7 @@ int sctp_itti_send_association_resp(task_id_t task_id,
                                     instance_t instance,
                                     sctp_assoc_t assoc_id,
                                     uint16_t cnx_id,
-                                    enum sctp_state_e state,
+                                    sctp_state_e state,
                                     uint16_t out_streams,
                                     uint16_t in_streams);
 
diff --git a/openair3/SECU/key_nas_deriver.c b/openair3/SECU/key_nas_deriver.c
index 8a7b32ee2fb08ef19f653ff0037f61525ec27c0e..20aba64e1e40cc6a3164d690eb4535223e8aecc4 100644
--- a/openair3/SECU/key_nas_deriver.c
+++ b/openair3/SECU/key_nas_deriver.c
@@ -139,7 +139,6 @@ void nr_derive_key(algorithm_type_dist_t alg_type, uint8_t alg_id, const uint8_t
  * NOTE: knas is dynamically allocated by the KDF function
  */
 
-#ifndef NAS_UE
 void derive_keNB(const uint8_t kasme[32], const uint32_t nas_count, uint8_t *keNB)
 {
   uint8_t s[7] = {0};
@@ -159,7 +158,6 @@ void derive_keNB(const uint8_t kasme[32], const uint32_t nas_count, uint8_t *keN
   byte_array_t data = {.buf = s, .len = 7};
   kdf(kasme, data, 32, keNB);
 }
-#endif
 
 void derive_keNB_star(const uint8_t *kenb_32,
                       const uint16_t pci,
diff --git a/radio/COMMON/common_lib.c b/radio/COMMON/common_lib.c
index 87bae83f62097ec5a643c117e686a07a64e7e697..14b66d7060ceacafc025b0fc91bb6cb67228477a 100644
--- a/radio/COMMON/common_lib.c
+++ b/radio/COMMON/common_lib.c
@@ -222,7 +222,7 @@ static void writerProcessWaitingQueue(openair0_device *device)
           if (wroteSamples != nsamps)
             LOG_E(HW, "Failed to write to rf\n");
         }
-        ctx->nextTS += nsamps;
+        ctx->nextTS = timestamp + nsamps;
         pthread_mutex_lock(&ctx->mutex_store);
       }
     }
@@ -253,7 +253,7 @@ int openair0_write_reorder(openair0_device *device, openair0_timestamp timestamp
         wroteSamples = device->trx_write_func(device, timestamp, txp, nsamps, nbAnt, flags);
       else
         wroteSamples = nsamps;
-      ctx->nextTS += nsamps;
+      ctx->nextTS = timestamp + nsamps;
 
     } else {
       writerEnqueue(ctx, timestamp, txp, nsamps, nbAnt, flags);
diff --git a/radio/ETHERNET/benetel/5g/benetel.c b/radio/ETHERNET/benetel/5g/benetel.c
index 90fce2e206d7336fa310d9aa9bd4204aad11da4e..996d56876762f3708d796a9464023f61056e253f 100644
--- a/radio/ETHERNET/benetel/5g/benetel.c
+++ b/radio/ETHERNET/benetel/5g/benetel.c
@@ -257,7 +257,6 @@ printf("rxdata in benetel_fh_if4p5_south_in %p\n", &ru->common.rxdataF[antenna][
   //printf("BENETEL: %s (f.sf %d.%d)\n", __FUNCTION__, *frame, *slot);
 
   RU_proc_t *proc = &ru->proc;
-  extern int sl_ahead;
   int f = *frame;
   int sl = *slot;
 
@@ -272,8 +271,8 @@ printf("rxdata in benetel_fh_if4p5_south_in %p\n", &ru->common.rxdataF[antenna][
 
   if (get_nprocs()<=4) {
     // why? what if there are more?
-    proc->tti_tx   = (sl+sl_ahead)%20;
-    proc->frame_tx = (sl>(19-sl_ahead)) ? (f+1)&1023 : f;
+    proc->tti_tx   = (sl+ru->sl_ahead)%20;
+    proc->frame_tx = (sl>(19-ru->sl_ahead)) ? (f+1)&1023 : f;
   }
 }
 
diff --git a/radio/fhi_72/oaioran.c b/radio/fhi_72/oaioran.c
index 02487e93005617cc9456e3e18fc3491864882d27..35c03560052b406fee67c97f1e0d5cdabdbbfc6c 100644
--- a/radio/fhi_72/oaioran.c
+++ b/radio/fhi_72/oaioran.c
@@ -263,6 +263,22 @@ int read_prach_data(ru_info_t *ru, int frame, int slot)
   return (0);
 }
 
+static bool is_tdd_ul_symbol(const struct xran_frame_config *frame_conf, int slot, int sym_idx)
+{
+  /* in FDD, every symbol is also UL */
+  if (frame_conf->nFrameDuplexType == XRAN_FDD)
+    return true;
+  int tdd_period = frame_conf->nTddPeriod;
+  int slot_in_period = slot % tdd_period;
+  /* check if symbol is UL */
+  return frame_conf->sSlotConfig[slot_in_period].nSymbolType[sym_idx] == 1 /* UL */;
+}
+
+static bool is_tdd_dl_guard_slot(const struct xran_frame_config *frame_conf, int slot)
+{
+  return !is_tdd_ul_symbol(frame_conf, slot, XRAN_NUM_OF_SYMBOL_PER_SLOT - 1);
+}
+
 int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot)
 {
   void *ptr = NULL;
@@ -328,18 +344,15 @@ int xran_fh_rx_read_slot(ru_info_t *ru, int *frame, int *slot)
       rx_data = (uint8_t *)ru->rxdataF[ant_id];
       start_ptr = rx_data + (slot_size * slot_offset_rxdata);
       xran_ctx = xran_dev_get_ctx_by_id(ant_id / nb_rx_per_ru);
-      const struct xran_fh_config *fh_config = &xran_ctx->fh_cfg;
-      int tdd_period = fh_config->frame_conf.nTddPeriod;
-      int slot_in_period = *slot % tdd_period;
-      if (fh_config->frame_conf.sSlotConfig[slot_in_period].nSymbolType[XRAN_NUM_OF_SYMBOL_PER_SLOT - 1] == 0)
+      const struct xran_frame_config *frame_conf = &xran_ctx->fh_cfg.frame_conf;
+      // skip processing this slot is TX (no RX in this slot)
+      if (is_tdd_dl_guard_slot(frame_conf, *slot))
         continue;
-      // skip processing this slot if the last symbol in the slot is TX
-      // (no RX in this slot)
       // This loop would better be more inner to avoid confusion and maybe also errors.
       for (int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
         /* the callback is for mixed and UL slots. In mixed, we have to
          * skip DL and guard symbols. */
-        if (fh_config->frame_conf.sSlotConfig[slot_in_period].nSymbolType[sym_idx] != 1 /* UL */)
+        if (!is_tdd_ul_symbol(frame_conf, *slot, sym_idx))
           continue;
 
         uint8_t *pData;
diff --git a/radio/fhi_72/oran-config.c b/radio/fhi_72/oran-config.c
index 34da6f58908560931cabcf50e10f318cc30562e4..2f2032c30a8ff0cef8c7aeb692b8d1926d5ff038 100644
--- a/radio/fhi_72/oran-config.c
+++ b/radio/fhi_72/oran-config.c
@@ -770,7 +770,6 @@ static bool set_fh_config(int ru_idx, int num_rus, enum xran_category xran_cat,
   for (int i = 1; i < oai0->rx_num_channels; ++i)
     DevAssert(oai0->rx_freq[0] == oai0->rx_freq[i]);
   DevAssert(oai0->nr_band > 0);
-  DevAssert(oai0->nr_scs_for_raster > 0);
   AssertFatal(oai0->threequarter_fs == 0, "cannot use three-quarter sampling with O-RAN 7.2 split\n");
 
   paramdef_t FHconfigs[] = ORAN_FH_DESC;
diff --git a/radio/fhi_72/oran-init.c b/radio/fhi_72/oran-init.c
index 8072c5852ea870e67f71dc5d6a51a52f510ea600..a5c620e9958a09db37728c7db16cd5aab9ef8565 100644
--- a/radio/fhi_72/oran-init.c
+++ b/radio/fhi_72/oran-init.c
@@ -79,10 +79,10 @@ static uint32_t get_nFpgaToSW_FTH_RxBufferLen(int mu)
   }
 }
 
-static struct xran_prb_map get_xran_prb_map_dl(const struct xran_fh_config *f)
+static struct xran_prb_map get_xran_prb_map(const struct xran_fh_config *f, const uint8_t dir, const int16_t start_sym, const int16_t num_sym)
 {
   struct xran_prb_map prbmap = {
-      .dir = XRAN_DIR_DL,
+      .dir = dir,
       .xran_port = 0,
       .band_id = 0,
       .cc_id = 0,
@@ -91,33 +91,10 @@ static struct xran_prb_map get_xran_prb_map_dl(const struct xran_fh_config *f)
       .nPrbElm = 1,
   };
   struct xran_prb_elm *e = &prbmap.prbMap[0];
-  e->nStartSymb = 0;
-  e->numSymb = 14;
+  e->nStartSymb = start_sym;
+  e->numSymb = num_sym;
   e->nRBStart = 0;
-  e->nRBSize = f->nDLRBs;
-  e->nBeamIndex = 0;
-  e->compMethod = f->ru_conf.compMeth;
-  e->iqWidth = f->ru_conf.iqWidth;
-  return prbmap;
-}
-
-static struct xran_prb_map get_xran_prb_map_ul(const struct xran_fh_config *f)
-{
-  struct xran_prb_map prbmap = {
-      .dir = XRAN_DIR_UL,
-      .xran_port = 0,
-      .band_id = 0,
-      .cc_id = 0,
-      .ru_port_id = 0,
-      .tti_id = 0,
-      .start_sym_id = 0,
-      .nPrbElm = 1,
-  };
-  struct xran_prb_elm *e = &prbmap.prbMap[0];
-  e->nStartSymb = 0;
-  e->numSymb = 14;
-  e->nRBStart = 0;
-  e->nRBSize = f->nULRBs;
+  e->nRBSize = (dir == XRAN_DIR_DL) ? f->nDLRBs : f->nULRBs;
   e->nBeamIndex = 0;
   e->compMethod = f->ru_conf.compMeth;
   e->iqWidth = f->ru_conf.iqWidth;
@@ -263,7 +240,8 @@ static void oran_allocate_cplane_buffers(void *instHandle,
       fb->pCtrl = mb;
 
       struct xran_prb_map *src = &prb_conf->slotMap;
-      if ((j % prb_conf->nTddPeriod) == prb_conf->mixed_slot_index)
+      // get mixed slot map if in TDD and in mixed slot
+      if (prb_conf->nTddPeriod != 0 && (j % prb_conf->nTddPeriod) == prb_conf->mixed_slot_index)
         src = &prb_conf->mixedSlotMap;
 #ifdef E_RELEASE
       /* as per E release sample app, the memory is copied up to size_of_prb_map
@@ -338,28 +316,43 @@ static void oran_allocate_buffers(void *handle,
   printf("-> hInstance %p\n", pi->instanceHandle);
   AssertFatal(status == XRAN_STATUS_SUCCESS, "get sector instance failed for XRAN nInstanceNum %d\n", xran_inst);
 
-  const uint32_t txBufSize = get_nSW_ToFpga_FTH_TxBufferLen(fh_config->frame_conf.nNumerology, fh_config->max_sections_per_slot);
-  oran_allocate_uplane_buffers(pi->instanceHandle, bl->src, bl->bufs.tx, xran_max_antenna_nr, txBufSize);
+  // DL/UL PRB mapping depending on the duplex mode
+  struct xran_prb_map dlPm = get_xran_prb_map(fh_config, XRAN_DIR_DL, 0, 14);
+  struct xran_prb_map ulPm = get_xran_prb_map(fh_config, XRAN_DIR_UL, 0, 14);
+  struct xran_prb_map dlPmMixed = {0};
+  struct xran_prb_map ulPmMixed = {0};
+  uint32_t idx = 0;
+  if (fh_config->frame_conf.nFrameDuplexType == XRAN_TDD) {
+    oran_mixed_slot_t info = get_mixed_slot_info(&fh_config->frame_conf);
+    dlPmMixed = get_xran_prb_map(fh_config, XRAN_DIR_DL, 0, info.num_dlsym);
+    ulPmMixed = get_xran_prb_map(fh_config, XRAN_DIR_UL, info.start_ulsym, info.num_ulsym);
+    idx = info.idx;
+  }
 
-  oran_mixed_slot_t info = get_mixed_slot_info(&fh_config->frame_conf);
-  struct xran_prb_map dlPm = get_xran_prb_map_dl(fh_config);
-  struct xran_prb_map dlPmMixed = dlPm;
-  dlPmMixed.prbMap[0].nStartSymb = 0;
-  dlPmMixed.prbMap[0].numSymb = info.num_dlsym;
   oran_cplane_prb_config dlConf = {
       .nTddPeriod = fh_config->frame_conf.nTddPeriod,
-      .mixed_slot_index = info.idx,
+      .mixed_slot_index = idx,
       .slotMap = dlPm,
       .mixedSlotMap = dlPmMixed,
   };
 
+  oran_cplane_prb_config ulConf = {
+      .nTddPeriod = fh_config->frame_conf.nTddPeriod,
+      .mixed_slot_index = idx,
+      .slotMap = ulPm,
+      .mixedSlotMap = ulPmMixed,
+  };
+
 #ifdef E_RELEASE
   uint32_t size_of_prb_map = sizeof(struct xran_prb_map) + sizeof(struct xran_prb_elm) * (xran_max_sections_per_slot - 1);
 #elif defined F_RELEASE
-  uint32_t numPrbElm = xran_get_num_prb_elm(&dlPmMixed, mtu);
+  uint32_t numPrbElm = xran_get_num_prb_elm(&dlPm, mtu);
   uint32_t size_of_prb_map  = sizeof(struct xran_prb_map) + sizeof(struct xran_prb_elm) * (numPrbElm);
 #endif
 
+  // PDSCH
+  const uint32_t txBufSize = get_nSW_ToFpga_FTH_TxBufferLen(fh_config->frame_conf.nNumerology, fh_config->max_sections_per_slot);
+  oran_allocate_uplane_buffers(pi->instanceHandle, bl->src, bl->bufs.tx, xran_max_antenna_nr, txBufSize);
   oran_allocate_cplane_buffers(pi->instanceHandle,
                                bl->srccp,
                                bl->bufs.tx_prbmap,
@@ -372,19 +365,9 @@ static void oran_allocate_buffers(void *handle,
                                size_of_prb_map,
                                &dlConf);
 
+  // PUSCH
   const uint32_t rxBufSize = get_nFpgaToSW_FTH_RxBufferLen(fh_config->frame_conf.nNumerology);
   oran_allocate_uplane_buffers(pi->instanceHandle, bl->dst, bl->bufs.rx, xran_max_antenna_nr, rxBufSize);
-
-  struct xran_prb_map ulPm = get_xran_prb_map_ul(fh_config);
-  struct xran_prb_map ulPmMixed = ulPm;
-  ulPmMixed.prbMap[0].nStartSymb = info.start_ulsym;
-  ulPmMixed.prbMap[0].numSymb = info.num_ulsym;
-  oran_cplane_prb_config ulConf = {
-      .nTddPeriod = fh_config->frame_conf.nTddPeriod,
-      .mixed_slot_index = info.idx,
-      .slotMap = ulPm,
-      .mixedSlotMap = ulPmMixed,
-  };
   oran_allocate_cplane_buffers(pi->instanceHandle,
                                bl->dstcp,
                                bl->bufs.rx_prbmap,
diff --git a/radio/fhi_72/oran_isolate.c b/radio/fhi_72/oran_isolate.c
index f922df40bb5600149c8fb8525196504a64e33e05..d3f4fa17961b4e4fe708be53cfc7a55f8d1c2822 100644
--- a/radio/fhi_72/oran_isolate.c
+++ b/radio/fhi_72/oran_isolate.c
@@ -203,7 +203,6 @@ void oran_fh_if4p5_south_in(RU_t *ru, int *frame, int *slot)
   ru_info.prach_buf = ru->prach_rxsigF[0]; // index: [prach_oca][ant_id]
 
   RU_proc_t *proc = &ru->proc;
-  extern int sl_ahead;
   int f, sl;
   LOG_D(PHY, "Read rxdataF %p,%p\n", ru_info.rxdataF[0], ru_info.rxdataF[1]);
   start_meas(&ru->rx_fhaul);
@@ -217,8 +216,8 @@ void oran_fh_if4p5_south_in(RU_t *ru, int *frame, int *slot)
   int slots_per_frame = 10 << (ru->openair0_cfg.nr_scs_for_raster);
   proc->tti_rx = sl;
   proc->frame_rx = f;
-  proc->tti_tx = (sl + sl_ahead) % slots_per_frame;
-  proc->frame_tx = (sl > (slots_per_frame - 1 - sl_ahead)) ? (f + 1) & 1023 : f;
+  proc->tti_tx = (sl + ru->sl_ahead) % slots_per_frame;
+  proc->frame_tx = (sl > (slots_per_frame - 1 - ru->sl_ahead)) ? (f + 1) & 1023 : f;
 
   if (proc->first_rx == 0) {
     if (proc->tti_rx != *slot) {
diff --git a/radio/rfsimulator/stored_node.c b/radio/rfsimulator/stored_node.c
index ef56ae999c56dae1965e2e288a3aa1cb1acc36ce..51db5bfea121cf36bd5aa2210df51868e3fc464d 100644
--- a/radio/rfsimulator/stored_node.c
+++ b/radio/rfsimulator/stored_node.c
@@ -44,42 +44,6 @@ int fullread(int fd, void *_buf, int count) {
 
   return ret;
 }
-#define shift 4
-int32_t signal_energy(int32_t *input,uint32_t length) {
-  int32_t i;
-  int32_t temp,temp2;
-  register simde__m64 mm0, mm1, mm2, mm3;
-  simde__m64 *in = (simde__m64 *)input;
-  mm0 = simde_mm_setzero_si64(); // pxor(mm0,mm0);
-  mm3 = simde_mm_setzero_si64(); // pxor(mm3,mm3);
-
-  for (i=0; i<length>>1; i++) {
-    mm1 = in[i];
-    mm2 = mm1;
-    mm1 = _m_pmaddwd(mm1,mm1);
-    mm1 = _m_psradi(mm1,shift);// shift any 32 bits blocs of the word by the value shift
-    mm0 = _m_paddd(mm0,mm1);// add the two 64 bits words 4 bytes by 4 bytes
-    //    mm2 = _m_psrawi(mm2,shift_DC);
-    mm3 = _m_paddw(mm3,mm2);// add the two 64 bits words 2 bytes by 2 bytes
-  }
-
-  mm1 = mm0;
-  mm0 = _m_psrlqi(mm0,32);
-  mm0 = _m_paddd(mm0,mm1);
-  temp = _m_to_int(mm0);
-  temp/=length;
-  temp<<=shift;   // this is the average of x^2
-  // now remove the DC component
-  mm2 = _m_psrlqi(mm3,32);
-  mm2 = _m_paddw(mm2,mm3);
-  mm2 = _m_pmaddwd(mm2,mm2);
-  temp2 = _m_to_int(mm2);
-  temp2/=(length*length);
-  //  temp2<<=(2*shift_DC);
-  temp -= temp2;
-  return((temp>0)?temp:1);
-}
-
 
 void fullwrite(int fd, void *_buf, int count) {
   char *buf = _buf;
@@ -238,8 +202,8 @@ int main(int argc, char *argv[]) {
         ((int16_t *)buff)[i]/=16;
 
     usleep(1000);
-    printf("sending at ts: %lu, number of samples: %d, energy: %d\n",
-           header.timestamp, header.size, signal_energy(buff, header.size));
+    printf("sending at ts: %lu, number of samples: %d\n",
+           header.timestamp, header.size);
     fullwrite(serviceSock, buff, dataSize);
     // Purge incoming samples
     setblocking(serviceSock, notBlocking);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf
deleted file mode 100644
index b83075840c39c5b62333ff38af0b261e3625d2d8..0000000000000000000000000000000000000000
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpb210.conf
+++ /dev/null
@@ -1,52 +0,0 @@
-log_config = {
-  global_log_level                      ="debug";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="debug";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="debug";
-};
-
-
-#L1s = (
-#    	{
-#	num_cc = 1;
-#	tr_n_preference = "nfapi";
-#      	remote_n_address = "192.168.1.28";
-#    	local_n_address  = "192.168.1.74";
-#    	local_n_portc    = 50000;
-#    	remote_n_portc   = 50001;
-#    	local_n_portd    = 50010;
-#    	remote_n_portd   = 50011;
-#        }  
-#);
-
-
-L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "nfapi";
-      	#remote_n_address = "10.0.0.2";
-    	#local_n_address  = "10.0.0.1";
-      	remote_n_address = "127.0.0.2";
-    	local_n_address  = "127.0.0.1";
-    	local_n_portc    = 50000;
-    	remote_n_portc   = 50001;
-    	local_n_portd    = 50010;
-    	remote_n_portd   = 50011;
-        }  
-);
-
-RUs = (
-    {		  
-       local_rf       = "yes"
-       nb_tx          = 1
-       nb_rx          = 1
-       att_tx         = 90
-       att_rx         = 0;
-       bands          = [7,38,42,43];
-       max_pdschReferenceSignalPower = -27;
-       max_rxgain                    = 125;
-    }		      
-);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.2x2.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.2x2.conf
new file mode 100644
index 0000000000000000000000000000000000000000..a25651e0dbf66014b19e1c573f86fa230cf587c4
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.2x2.conf
@@ -0,0 +1,28 @@
+log_config = {
+  global_log_level                      ="info";
+  hw_log_level                          ="info";
+  phy_log_level                         ="info";
+};
+
+L1s = ({
+  num_cc = 1;
+  tr_n_preference  = "nfapi";
+  remote_n_address = "127.0.0.1"; // vnf addr
+  local_n_address  = "127.0.0.1"; // pnf addr
+  local_n_portc    = 50000; // pnf p5 port [!]
+  remote_n_portc   = 50001; // vnf p5 port
+  local_n_portd    = 50010; // pnf p7 port
+  remote_n_portd   = 50011; // vnf p7 port
+});
+
+RUs = ({
+  local_rf   = "yes"
+  sl_ahead   = 5;
+  nb_tx      = 2
+  nb_rx      = 2
+  att_tx     = 0
+  att_rx     = 0;
+  bands      = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain = 125;
+});
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf
new file mode 100644
index 0000000000000000000000000000000000000000..887ff6eced9e9a59a3458d1e6a880b0ce459541c
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-pnf.band78.rfsim.conf
@@ -0,0 +1,34 @@
+log_config = {
+  global_log_level = "info";
+  hw_log_level     = "info";
+  phy_log_level    = "info";
+};
+
+L1s = ({
+	num_cc = 1;
+	tr_n_preference  = "nfapi";
+  remote_n_address = "127.0.0.1"; // vnf addr
+  local_n_address  = "127.0.0.1"; // pnf addr
+  local_n_portc    = 50000; // pnf p5 port [!]
+  remote_n_portc   = 50001; // vnf p5 port
+  local_n_portd    = 50010; // pnf p7 port
+  remote_n_portd   = 50011; // vnf p7 port
+});
+
+RUs = ({
+  local_rf   = "yes"
+  nb_tx      = 1
+  nb_rx      = 1
+  att_tx     = 0
+  att_rx     = 0;
+  bands      = [78];
+  max_pdschReferenceSignalPower = -27;
+  max_rxgain = 125;
+});
+
+rfsimulator: {
+  serveraddr = "server";
+  serverport = 4043;
+  options = (); #("saviq"); or/and "chanmod"
+  modelname = "AWGN";
+};
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf
similarity index 75%
rename from targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf
index 6e716359242359eb3f0b8b697a6d6bb9f9348483..bb4aed3dfe2a45982f990641bae83b47a08ae2da 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.106prb.nfapi.conf
@@ -7,21 +7,23 @@ gNBs =
  {
  ////////// Identification parameters:
     gNB_ID    =  0xe00;
-
-    cell_type =  "CELL_MACRO_GNB";
-
     gNB_name  =  "gNB-Eurecom-5GNRBox";
 
     // Tracking area code, 0x0000 and 0xfffe are reserved values
     tracking_area_code  =  1;
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1 }) });
 
-    plmn_list = ({mcc = 208; mnc = 93; mnc_length = 2;});	 
-
-    tr_s_preference     = "local_mac"
+    nr_cellid = 12345678L;
 
     ////////// Physical parameters:
 
-	
+    ssb_SubcarrierOffset                                      = 0;
+    pdsch_AntennaPorts_N1                                        = 1;
+    pusch_AntennaPorts                                        = 1;
+    min_rxtxtime                                              = 6;
+    enable_sdap                                               = 0;
+    #sib1_tda                                                  = 0;
+
     servingCellConfigCommon = (
     {
  #spCellConfigCommon
@@ -31,10 +33,10 @@ gNBs =
 #  downlinkConfigCommon
     #frequencyInfoDL
       # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
-      absoluteFrequencySSB                                          = 641032;
+      absoluteFrequencySSB                                             = 641280;
       dl_frequencyBand                                                 = 78;
       # this is 3600 MHz
-      dl_absoluteFrequencyPointA                                       = 640000;
+      dl_absoluteFrequencyPointA                                       = 640008;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                              = 0;
 # subcarrierSpacing
@@ -43,8 +45,8 @@ gNBs =
         dl_carrierBandwidth                                            = 106;
      #initialDownlinkBWP
       #genericParameters
-        # this is RBstart=41,L=24 (275*(L-1))+RBstart
-        initialDLBWPlocationAndBandwidth                                        = 6366;
+        # this is RBstart=27,L=48 (275*(L-1))+RBstart
+        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
         initialDLBWPsubcarrierSpacing                                           = 1;
@@ -64,7 +66,7 @@ gNBs =
       pMax                                                          = 20;
      #initialUplinkBWP
       #genericParameters
-        initialULBWPlocationAndBandwidth                                        = 6366;
+        initialULBWPlocationAndBandwidth                            = 28875;
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120  
         initialULBWPsubcarrierSpacing                                           = 1;
@@ -76,7 +78,7 @@ gNBs =
           prach_msg1_FDM                                            = 0;
           prach_msg1_FrequencyStart                                 = 0;
           zeroCorrelationZoneConfig                                 = 13;
-          preambleReceivedTargetPower                               = -118;
+          preambleReceivedTargetPower                               = -96;
 #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
           preambleTransMax                                          = 6;
 #powerRampingStep
@@ -84,12 +86,12 @@ gNBs =
         powerRampingStep                                            = 1;
 #ra_ReponseWindow
 #1,2,4,8,10,20,40,80
-        ra_ResponseWindow                                           = 4;
+        ra_ResponseWindow                                           = 5;
 #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
 #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
         ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
 #one (0..15) 4,8,12,16,...60,64
-        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
 #ra_ContentionResolutionTimer
 #(0..7) 8,16,24,32,40,48,56,64
         ra_ContentionResolutionTimer                                = 7;
@@ -143,35 +145,13 @@ gNBs =
       nrofUplinkSlots                                               = 2;
       nrofUplinkSymbols                                             = 4;
 
-  ssPBCH_BlockPower                                             = 10;
+      ssPBCH_BlockPower                                             = -25;
   }
 
 
   );
 
 
-
-   srb1_parameters :
-    {
-        # timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
-        timer_poll_retransmit    = 80;
-
-        # timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
-        timer_reordering         = 35;
-
-        # timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
-        timer_status_prohibit    = 0;
-
-        # poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
-        poll_pdu                 =  4;
-
-        # poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
-        poll_byte                =  99999;
-
-        # max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
-        max_retx_threshold       =  4;
-    }
-
     # ------- SCTP definitions
     SCTP :
     {
@@ -182,15 +162,15 @@ gNBs =
 
 
     ////////// MME parameters:
-    mme_ip_address = ({ ipv4 = "192.168.12.26"; });
+    amf_ip_address = ({ ipv4 = "192.168.70.132"; });
 
     NETWORK_INTERFACES :
     {
-
-        GNB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.111/24";
-        GNB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.111/24";
+        GNB_IPV4_ADDRESS_FOR_NG_AMF              = "192.168.70.129";
+        GNB_IPV4_ADDRESS_FOR_NGU                 = "192.168.70.129";
         GNB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
+
   }
 );
 
@@ -199,7 +179,7 @@ MACRLCs = (
         {
         num_cc = 1;
         remote_s_address = "127.0.0.1"; // pnf addr [!]
-        local_s_address  = "127.0.0.2"; // vnf addr
+        local_s_address  = "127.0.0.1"; // vnf addr
         local_s_portc    = 50001; // vnf p5 port
         remote_s_portc   = 50000; // pnf p5 port [!]
         local_s_portd    = 50011; // vnf p7 port [!]
@@ -209,24 +189,28 @@ MACRLCs = (
         }
 )
 
-
-THREAD_STRUCT = (
-  {
-    #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
-    parallel_config    = "PARALLEL_RU_L1_TRX_SPLIT";
-    #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
-    worker_config      = "WORKER_ENABLE";
-  }
-);
-
-log_config =
-    {
-      global_log_level                      ="info";
-      hw_log_level                          ="info";
-      phy_log_level                         ="info";
-      mac_log_level                         ="info";
-      rlc_log_level                         ="info";
-      pdcp_log_level                        ="info";
-      rrc_log_level                         ="info";
-   };
-                                    
+security = {
+  # preferred ciphering algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nea0, nea1, nea2, nea3
+  ciphering_algorithms = ( "nea0" );
+
+  # preferred integrity algorithms
+  # the first one of the list that an UE supports in chosen
+  # valid values: nia0, nia1, nia2, nia3
+  integrity_algorithms = ( "nia2", "nia0" );
+
+  # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+  # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+  drb_ciphering = "yes";
+  drb_integrity = "no";
+};
+
+log_config = {
+  global_log_level = "info";
+  mac_log_level    = "info";
+  rlc_log_level    = "info";
+  pdcp_log_level   = "info";
+  rrc_log_level    = "info";
+  sdap_log_level   = "info";
+}
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.273prb.nfapi.conf
similarity index 89%
rename from targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf
rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.273prb.nfapi.conf
index 72f6192f4a31c27440d2df9f7fed2df4dbfe6cb5..7cfc66748bf5514087346e1256e6f67d9679bdb2 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/vnf.sa.band78.106prb.rfsim.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb-vnf.sa.band78.273prb.nfapi.conf
@@ -11,32 +11,17 @@ gNBs =
 
     // Tracking area code, 0x0000 and 0xfffe are reserved values
     tracking_area_code  =  1;
-    plmn_list = ({
-                  mcc = 208;
-                  mnc = 99;
-                  mnc_length = 2;
-                  snssaiList = (
-                    {
-                      sst = 1;
-                      sd  = 0x1; // 0 false, else true
-                    },
-                    {
-                      sst = 1;
-                      sd  = 0x112233; // 0 false, else true
-                    }
-                  );
-
-                  });
+    plmn_list = ({ mcc = 001; mnc = 01; mnc_length = 2; snssaiList = ({ sst = 1 }) });
 
     nr_cellid = 12345678L;
 
     ////////// Physical parameters:
 
-    ssb_SubcarrierOffset                                      = 0;
-    pdsch_AntennaPorts                                        = 1;
-    pusch_AntennaPorts                                        = 1;
-    min_rxtxtime                                              = 6;
-    sib1_tda                                                  = 0;
+    pdsch_AntennaPorts_XP                                     = 2;
+    pusch_AntennaPorts                                        = 2;
+    do_CSIRS                                                  = 1;
+    do_SRS                                                    = 1;
+    min_rxtxtime = 5;
 
     servingCellConfigCommon = (
     {
@@ -47,20 +32,20 @@ gNBs =
 #  downlinkConfigCommon
     #frequencyInfoDL
       # this is 3600 MHz + 43 PRBs@30kHz SCS (same as initial BWP)
-      absoluteFrequencySSB                                             = 641280;
+      absoluteFrequencySSB                                             = 630048;
       dl_frequencyBand                                                 = 78;
       # this is 3600 MHz
-      dl_absoluteFrequencyPointA                                       = 640008;
+      dl_absoluteFrequencyPointA                                       = 626772;
       #scs-SpecificCarrierList
         dl_offstToCarrier                                              = 0;
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         dl_subcarrierSpacing                                           = 1;
-        dl_carrierBandwidth                                            = 106;
+        dl_carrierBandwidth                                            = 273;
      #initialDownlinkBWP
       #genericParameters
         # this is RBstart=27,L=48 (275*(L-1))+RBstart
-        initialDLBWPlocationAndBandwidth                               = 28875; # 6366 12925 12956 28875 12952
+        initialDLBWPlocationAndBandwidth                               = 1099; # 6366 12925 12956 28875 12952
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         initialDLBWPsubcarrierSpacing                                   = 1;
@@ -76,11 +61,11 @@ gNBs =
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
       ul_subcarrierSpacing                                          = 1;
-      ul_carrierBandwidth                                           = 106;
+      ul_carrierBandwidth                                           = 273;
       pMax                                                          = 20;
      #initialUplinkBWP
       #genericParameters
-        initialULBWPlocationAndBandwidth                            = 28875;
+        initialULBWPlocationAndBandwidth                            = 1099;
 # subcarrierSpacing
 # 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
         initialULBWPsubcarrierSpacing                               = 1;
@@ -91,7 +76,7 @@ gNBs =
 #0 = one, 1=two, 2=four, 3=eight
           prach_msg1_FDM                                            = 0;
           prach_msg1_FrequencyStart                                 = 0;
-          zeroCorrelationZoneConfig                                 = 13;
+          zeroCorrelationZoneConfig                                 = 12;
           preambleReceivedTargetPower                               = -96;
 #preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
           preambleTransMax                                          = 6;
@@ -100,12 +85,12 @@ gNBs =
         powerRampingStep                                            = 1;
 #ra_ReponseWindow
 #1,2,4,8,10,20,40,80
-        ra_ResponseWindow                                           = 4;
+        ra_ResponseWindow                                           = 5;
 #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
 #1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
-        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
-#one (0..15) 4,8,12,16,...60,64
-        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 14;
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#oneHalf (0..15) 4,8,12,16,...60,64
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
 #ra_ContentionResolutionTimer
 #(0..7) 8,16,24,32,40,48,56,64
         ra_ContentionResolutionTimer                                = 7;
@@ -129,7 +114,7 @@ gNBs =
 # 0 = neither, 1= group hopping, 2=sequence hopping
         pucchGroupHopping                                           = 0;
         hoppingId                                                   = 40;
-        p0_nominal                                                  = -90;
+        p0_nominal                                                  = -70;
 
       ssb_PositionsInBurst_Bitmap                                   = 1;
 
@@ -153,10 +138,10 @@ gNBs =
       # pattern1
       # dl_UL_TransmissionPeriodicity
       # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
-      dl_UL_TransmissionPeriodicity                                 = 6;
-      nrofDownlinkSlots                                             = 7;
+      dl_UL_TransmissionPeriodicity                                 = 5;
+      nrofDownlinkSlots                                             = 3;
       nrofDownlinkSymbols                                           = 6;
-      nrofUplinkSlots                                               = 2;
+      nrofUplinkSlots                                               = 1;
       nrofUplinkSymbols                                             = 4;
 
       ssPBCH_BlockPower                                             = -25;
diff --git a/ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.u0.25prb.rfsim.conf
similarity index 100%
rename from ci-scripts/conf_files/gnb.sa.band66.u0.25prb.rfsim.conf
rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band66.u0.25prb.rfsim.conf
diff --git a/ci-scripts/conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.162prb.usrpn310.4x4.conf
similarity index 100%
rename from ci-scripts/conf_files/gnb.sa.band77.162prb.usrpn310.4x4.conf
rename to targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band77.162prb.usrpn310.4x4.conf
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/pnf.sa.band78.rfsim.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/pnf.sa.band78.rfsim.conf
deleted file mode 100644
index 6c3626ac81bc8ac5c2ce9a06dd98059709e85372..0000000000000000000000000000000000000000
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/pnf.sa.band78.rfsim.conf
+++ /dev/null
@@ -1,53 +0,0 @@
-
-L1s = (
-{
-  num_cc = 1;
-  tr_n_preference = "nfapi";
-  remote_n_address = "127.0.0.2"; // vnf addr
-  local_n_address  = "127.0.0.1"; // pnf addr
-  local_n_portc    = 50000; // pnf p5 port [!]
-  remote_n_portc   = 50001; // vnf p5 port
-  local_n_portd    = 50010; // pnf p7 port
-  remote_n_portd   = 50011; // vnf p7 port
-  prach_dtx_threshold   = 120;
-  pucch0_dtx_threshold  = 150;
-  ofdm_offset_divisor   = 8; #set this to UINT_MAX for offset 0
-}
-);
-
-RUs = (
-{
-  local_rf       = "yes"
-  nb_tx          = 1
-  nb_rx          = 1
-  att_tx         = 0
-  att_rx         = 0;
-  bands          = [78];
-  max_pdschReferenceSignalPower = -27;
-  max_rxgain                    = 114;
-}
-);
-
-
-rfsimulator :
-{
-  serveraddr = "server";
-  serverport = 4043;
-  options = (); #("saviq"); or/and "chanmod"
-  modelname = "AWGN";
-  IQfile = "/tmp/rfsimulator.iqs";
-};
-
-log_config :
-{
-  global_log_level                      ="info";
-  hw_log_level                          ="info";
-  phy_log_level                         ="info";
-  mac_log_level                         ="info";
-  rlc_log_level                         ="info";
-  pdcp_log_level                        ="info";
-  rrc_log_level                         ="info";
-  ngap_log_level                        ="debug";
-  f1ap_log_level                        ="debug";
-};
-