diff --git a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
index a4d9985dcafa05dfa89b6b3f547b636cf3eeaff2..8d403cf4cea59bf0c7433bb6b16fd30ec1bc71d2 100644
--- a/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -236,9 +236,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-	pusch_proc_threads = 8;
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
index 1209a6f227f77167d113ae752e892bafbc3ae0f8..05c71c082e4a6d5e91e73e87eb0fa1f14f576110 100644
--- a/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/ci-scripts/conf_files/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -219,6 +219,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
   }
 );
 
diff --git a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
index 33855f2c0eb10c2d4301b57919ed9ea43e0c76d1..df2fd874cafb4fd1806aa2f76e78cf087be6a47b 100644
--- a/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf
@@ -231,10 +231,11 @@ MACRLCs = (
 
 L1s = (
   {
-    num_cc             = 1;
-    tr_n_preference    = "local_mac";
+    num_cc = 1;
+    tr_n_preference = "local_mac";
     pusch_proc_threads = 6;
-  }
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }  
 );
 
 RUs = (
diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml
index 7ec3a5f1402ceb1d6365c731b6d467235a01ceda..6c11a66d912bd29a94075f7db2819a4a5185ed4a 100644
--- a/ci-scripts/xml_files/fr1_nsa_quectel.xml
+++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml
@@ -97,7 +97,7 @@
 		<desc>Ping: 20pings in 20sec</desc>
 		<id>idefix</id>
 		<ping_args>-c 20</ping_args>
-		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+		<ping_packetloss_threshold>1</ping_packetloss_threshold>
 	</testCase>
 
 	<testCase id="050001">
@@ -105,7 +105,7 @@
 		<desc>Ping: 100pings in 20sec</desc>
 		<id>idefix</id>
 		<ping_args>-c 100 -i 0.2</ping_args>
-		<ping_packetloss_threshold>50</ping_packetloss_threshold>
+		<ping_packetloss_threshold>1</ping_packetloss_threshold>
 	</testCase>
 
 	<testCase id="070000">
@@ -114,7 +114,7 @@
 		<iperf_args>-u -b 20M -t 60</iperf_args>
 		<direction>DL</direction>
 		<id>idefix</id>
-		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_packetloss_threshold>3</iperf_packetloss_threshold>
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
@@ -124,7 +124,7 @@
 		<iperf_args>-u -b 3M -t 60</iperf_args>
 		<direction>UL</direction>
 		<id>idefix</id>
-		<iperf_packetloss_threshold>50</iperf_packetloss_threshold>
+		<iperf_packetloss_threshold>1</iperf_packetloss_threshold>
 		<iperf_profile>single-ue</iperf_profile>
 	</testCase>
 
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 44678b4c91855f3faa41354a1360cb09041c5405..9592334125b9ab691503f036754ddacd8427c40e 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -457,8 +457,8 @@ include_directories ("${RRC_FULL_DIR}")
 #NR RRC
 #######
 set (NR_RRC_ASN1_VERSION "NR_Rel16" )
-make_version(NR_RRC_VERSION 16 1 0)
-set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.1.0.asn1)
+make_version(NR_RRC_VERSION 16 4 1)
+set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1)
 add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
 set (NR_RRC_FULL_DIR ${asn1_generated_dir}/RRC_${NR_RRC_ASN1_VERSION})
 
diff --git a/doc/NR_NFAPI_archi.md b/doc/NR_NFAPI_archi.md
new file mode 100644
index 0000000000000000000000000000000000000000..59c511fb52c92a9887fd8b83ce77d4c539c21dbd
--- /dev/null
+++ b/doc/NR_NFAPI_archi.md
@@ -0,0 +1,141 @@
+# global
+
+xnf is pnf or vnf
+
+The xnf starting functions are configure_nfapi_xnf()
+
+The OAI code that read the configuration parameters call these functions that will create autonomous thread for xnf control part
+
+These control threads create a SCTP socket by Linux API call (no use of OpenAir internal architecture with SCTP itti thread).
+
+The main() function of softmodem has to create and start the other threads+loop on event for appropriate work: RF Rx in pnf, NGAP, GTP-U, X2, RLC, PDCP for vnf
+
+NFAPI has it's own code directly on Linux+Posix, it doesn't reuse any piece of the OpenAir framework: SCTP thread, thread creation and management, ... 
+
+## signaling (P5) xnf main loop
+
+nfapi_vnf_start() create the SCTP socket, then do event waiting in a infinite loop while(vnf->terminate == 0). It accepts the pnf connections, then process the messages on reception
+
+nfapi_pnf_start() initiate connection to vnf until it has a link. Then it enter a similar infinite loop in pnf_message_pump()
+
+After some checks, when a message is obtained, it calls pnf_handle_p5_message() or vnf_handle_p4_p5_message() that have a switch on each p5 message types: the enum nfapi_message_id_e
+
+Each message type has it's own processing function in the switch, like 
+```
+case NFAPI_START_RESPONSE:
+        vnf_handle_start_response(pRecvMsg, recvMsgLen, config, p5_idx);
+        break;
+```
+
+These loops are autonomous in their thread waiting incoming message.
+
+## P7 xnf main loop
+
+When the p5 interface receives appropriate message, it starts the p7 interface by launching a thread (see the calls to pthread_create() in nfapi/oai_integration/nfapi_xnf.c)
+
+The p7 main loops starting is a bit simpler, thanks to UDP non connected protocol. The xnf_dispatch_p7_message() do p7 fragments re-assembly, then 
+calls xnf_dispatch_p7_message() that have the big switch on message type (as in p5 above description)
+
+So, we have the logic for UL reception in vnf, and DL reception in pnf
+
+## P7 UL transmission by PNF
+
+RF samples are received, and decoding is done by the PNF using control data transmitted by the VNF to the PNF through downlink p7 messages (UL_TTI_req and UL_DCI_req). 
+
+After decoding, results are accumulated into the xNB->UL_INFO structure at the PNF. 
+
+The data in the UL_INFO struct is transmitted through a socket in the form of 'uplink indication functions' from the PNF to the VNF. Each uplink indication message is transmitted from their respective handle functions in NR_UL_indication(). For example,
+
+```
+
+void handle_nr_rach(NR_UL_IND_t *UL_info) {
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->rach_ind.number_of_pdus>0) {
+      oai_nfapi_nr_rach_indication(&UL_info->rach_ind); //This function calls the routines required for packing + transmission through socket
+      UL_info->rach_ind.number_of_pdus = 0;
+    }
+  }
+
+```
+
+## P7 UL reception at VNF
+
+Through the infinite loop [while(vnf_p7->terminate == 0)] running in nfapi_nr_vnf_p7_start(), the VNF receives and unpacks the uplink indication message received on its socket. Based on the unpacked messages, UL_INFO struct on the VNF side gets populated. 
+
+```
+
+// have a p7 message
+			if(FD_ISSET(vnf_p7->socket, &rfds))
+			{
+				vnf_nr_p7_read_dispatch_message(vnf_p7); 
+			}
+
+```
+
+vnf_nr_dispatch_p7_message() is the function that contains the switch on various message headers so that the appropriate unpack function is called. 
+
+## P7 DL Transmission by VNF 
+
+DL messages are scheduled at the VNF, through NR_UL_indication(). NR_UL_indication() is called when the SFN/slot in the UL_info structure changes (this acts as a trigger for next slot processing, instead of running a separate clock at the VNF). The SFN/slot at the VNF in UL_info is updated using the slot_indication uplink p7 message, which is sent at the beginning of every slot by the PNF. The slot_indication message contains SFN/slot of the TX_thread, so that the scheduler operates slot_ahead slots ahead of the RX thread. This ensures that UL_tti_req is received before RX slot processing at the PNF. 
+
+The function NR_schedule_response calls oai_nfapi_[DL P7 msg]_req(), which contains the routines for packing + transmission of scheduled messages through the socket to the PNF. For example, to send the 'TX_data_req' p7 message 
+
+```
+
+if (Sched_INFO->TX_req->Number_of_PDUs > 0)
+{
+  oai_nfapi_tx_data_req(Sched_INFO->TX_req);
+}
+
+```
+
+```mermaid
+
+graph TD
+    pselect[VNF socket pselect] -- timed out : end of slot --> call_sched[Call Scheduler NR_UL_indication] -- oai_nfapi_***_req sends the DL p7 msg--> slot_inc[Increment sfn/slot];
+    pselect[VNF socket pselect] -- UL p7 xyz msg recvd --> msg_recvd[Read message vnf_nr_p7_read_dispatch_message] --> header_unpack[Unpack Header] -- switch cases on header --> unpack_msg[Handle Message vnf_handle_nr_xyz] --> fill_ul_info[Fill UL info struct with fn pointer vnf_p7->_public.nr_rx_xyz];
+    fill_ul_info -- update pselect_timeout: next_slot_start - time_xyz_msg_recvd-->pselect;
+    slot_inc -- next slot --> pselect
+
+```
+Note that since DL P7 message reception and TX/RX processing are done on separate threads, there is the issue of the L1 processing threads trying to do their job before the required P7 message is received. In the case of RX processing, since the scheduler operates slot_ahead slots ahead of the RX thread, the required messages conveniently arrive earlier than they are required. However, in the case of TX processing, this cannot be ensured if the scheduler is exactly in sync with the TX thread.  
+
+Therefore, we operate the VNF vnf_slot_ahead (which is currently 2) slots ahead of the PNF. This is to ensure that the DL fapi structures for a particular TX slot are all received before TX processing for that slot.
+
+## P7 DL Reception at PNF 
+
+Through the infinite loop [while(pnf_p7->terminate == 0)] running in pnf_nr_p7_message_pump(), the PNF receives and unpacks the downlink P7 message received on its socket. Based on the unpacked message, the appropriate message structures are filled in the PNF, and these are used further down the pipeline for processing. 
+
+While receiving the DL P7 message, we check whether the message was received within a timing window from which it was sent. The duration of the window can be set by the user (set as a parameter for xnf in the p5 messages). Note that the DL information must be received by the PNF within a timing window at least lesser than the duration of slot_ahead variable (timing_window <= slot_ahead * slot_duration).
+
+```mermaid
+
+graph TB
+    pselect[PNF socket pselect] -- timed out : end of slot --> slot_inc[Increment sfn/slot];
+    pselect[PNF socket pselect] -- DL p7 xyz msg recvd --> msg_recvd[Read message pnf_nr_nfapi_p7_read_dispatch_message] --> header_unpack[Unpack Header] -- switch cases on header --> unpack_msg[Unpack Message pnf_handle_nr_xyz] --> fill_pnf_p7[Fill pnf_p7 global structure pnf_handle_nr_xyz] --Data from pnf_p7 struct copied to fapi structures using pnf_phy_***_req. Called every slot from handle_nr_slot_ind-->pselect;
+
+    slot_inc -- next slot --> pselect
+```
+Once the messages are received, they are filled into slot buffers, and are stored until the processing of the slot that they were meant for. 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/RUN_NR_NFAPI.md b/doc/RUN_NR_NFAPI.md
new file mode 100644
index 0000000000000000000000000000000000000000..ea7c2590c7378d5bf1f4a90680b57707b91f976e
--- /dev/null
+++ b/doc/RUN_NR_NFAPI.md
@@ -0,0 +1,54 @@
+# 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 2 --noS1 --phy-test
+
+```
+### PNF command
+```
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --rfsim --phy-test --rfsimulator.serveraddr server
+
+```
+### UE command
+```
+sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d
+
+```
+## 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 2 --noS1 --phy-test
+
+```
+### PNF command
+```
+sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --phy-test
+
+```
+### UE command
+```
+sudo ./nr-uesoftmodem --usrp-args "addr=*USRP_ADDRESS*,clock_source=external,time_source=external" --phy-test --rrc_config_path ../../../ci-scripts/rrc-files
+
+```
+
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index e9319f9d3c1070bc604662e481e352d26d4800f3..ce09531e78da301902eaf45669d44e55d9fc9821 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -85,6 +85,7 @@
 
 #include "T.h"
 #include "nfapi/oai_integration/vendor_ext.h"
+#include "executables/softmodem-common.h"
 #include <nfapi/oai_integration/nfapi_pnf.h>
 #include <openair1/PHY/NR_TRANSPORT/nr_ulsch.h>
 #include <PHY/NR_ESTIMATION/nr_ul_estimation.h>
@@ -146,15 +147,12 @@ void rx_func(void *param) {
   start_meas(&softmodem_stats_rxtx_sf);
 
   // *******************************************************************
-  // NFAPI not yet supported for NR - this code has to be revised
+
   if (NFAPI_MODE == NFAPI_MODE_PNF) {
     // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
-    //add_subframe(&frame, &subframe, 4);
-    //oai_subframe_ind(proc->frame_tx, proc->subframe_tx);
-    //LOG_D(PHY, "oai_subframe_ind(frame:%u, subframe:%d) - NOT CALLED ********\n", frame, subframe);
+    //LOG_D(PHY, "oai_nfapi_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx);
     start_meas(&nfapi_meas);
-    // oai_subframe_ind(frame_rx, slot_rx);
-    oai_slot_ind(frame_rx, slot_rx);
+    handle_nr_slot_ind(frame_rx, slot_rx);
     stop_meas(&nfapi_meas);
 
     /*if (gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus||
@@ -451,6 +449,8 @@ void init_eNB_afterRU(void) {
   PHY_VARS_gNB *gNB;
   LOG_I(PHY,"%s() RC.nb_nr_inst:%d\n", __FUNCTION__, RC.nb_nr_inst);
 
+  if(NFAPI_MODE == NFAPI_MODE_PNF)
+    RC.nb_nr_inst = 1;
   for (inst=0; inst<RC.nb_nr_inst; inst++) {
     LOG_I(PHY,"RC.nb_nr_CC[inst:%d]:%p\n", inst, RC.gNB[inst]);
     gNB                                  =  RC.gNB[inst];
@@ -535,6 +535,7 @@ void init_gNB(int single_thread_flag,int wait_for_sync) {
     gNB->UL_INFO.cqi_ind.cqi_raw_pdu_list = gNB->cqi_raw_pdu_list;*/
 
     gNB->prach_energy_counter = 0;
+    gNB->prb_interpolation = get_softmodem_params()->prb_interpolation;
   }
   
 
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 9475cc8657c879366ab1537aaa1fef09b9fe08ec..395801f488801e36698b7590128a28cc3ab96b1a 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -252,6 +252,7 @@ void init_tpools(uint8_t nun_dlsch_threads) {
 }
 static void get_options(void) {
 
+  nrUE_params.ofdm_offset_divisor = 8;
   paramdef_t cmdline_params[] =CMDLINE_NRUEPARAMS_DESC ;
   int numparams = sizeof(cmdline_params)/sizeof(paramdef_t);
   config_process_cmdline( cmdline_params,numparams,NULL);
@@ -318,8 +319,8 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
   UE->rf_map.chain         = CC_id + chain_offset;
 
 
-  LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n", 
-  	   UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction);
+  LOG_I(PHY,"Set UE mode %d, UE_fo_compensation %d, UE_scan_carrier %d, UE_no_timing_correction %d \n, do_prb_interpolation %d\n", 
+  	   UE->mode, UE->UE_fo_compensation, UE->UE_scan_carrier, UE->no_timing_correction, UE->prb_interpolation);
 
   // Set FP variables
 
@@ -335,6 +336,8 @@ void set_options(int CC_id, PHY_VARS_NR_UE *UE){
   LOG_I(PHY, "Set UE N_RB_DL %d\n", N_RB_DL);
   LOG_I(PHY, "Set UE nb_rx_antenna %d, nb_tx_antenna %d, threequarter_fs %d\n", fp->nb_antennas_rx, fp->nb_antennas_tx, fp->threequarter_fs);
 
+  fp->ofdm_offset_divisor = nrUE_params.ofdm_offset_divisor;
+
 }
 
 void init_openair0(void) {
@@ -496,6 +499,7 @@ int main( int argc, char **argv ) {
 			   mac->scc == NULL ? 78 : *mac->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]);
 
     init_symbol_rotation(&UE[CC_id]->frame_parms);
+    init_timeshift_rotation(&UE[CC_id]->frame_parms);
     init_nr_ue_vars(UE[CC_id], 0, abstraction_flag);
 
     #ifdef FR2_TEST
diff --git a/executables/nr-uesoftmodem.h b/executables/nr-uesoftmodem.h
index be3ca2d1a27ad4c7920d12d513814e38238ab2f9..3eba5731b07ed9cdfdfd194770d140d65abd98b5 100644
--- a/executables/nr-uesoftmodem.h
+++ b/executables/nr-uesoftmodem.h
@@ -8,7 +8,8 @@
 
 
 
-#define  CONFIG_HLP_DLSCH_PARA             "number of threads for dlsch processing 0 for no parallelization"
+#define  CONFIG_HLP_DLSCH_PARA             "number of threads for dlsch processing 0 for no parallelization\n"
+#define  CONFIG_HLP_OFFSET_DIV             "Divisor for computing OFDM symbol offset in Rx chain (num samples in CP/<the value>). Default value is 8. To set the sample offset to 0, set this value ~ 10e6\n"
 /***************************************************************************************************************************************/
 /* command line options definitions, CMDLINE_XXXX_DESC macros are used to initialize paramdef_t arrays which are then used as argument
    when calling config_get or config_getlist functions                                                                                 */
@@ -29,6 +30,7 @@
     {"usrp-args",                CONFIG_HLP_USRP_ARGS,   0,               strptr:(char **)&usrp_args,         defstrval:"type=b200", TYPE_STRING,   0},    \
     {"single-thread-disable",    CONFIG_HLP_NOSNGLT,     PARAMFLAG_BOOL,  iptr:&single_thread_flag,           defintval:1,           TYPE_INT,    0}, \
     {"dlsch-parallel",           CONFIG_HLP_DLSCH_PARA,  0,               iptr:(int32_t *)&nrUE_params.nr_dlsch_parallel,       defintval:0,           TYPE_UINT8,  0}, \
+    {"offset-divisor",           CONFIG_HLP_OFFSET_DIV,  0,               uptr:(uint32_t *)&nrUE_params.ofdm_offset_divisor,    defuintval:UINT_MAX,           TYPE_UINT32,  0}, \
     {"nr-dlsch-demod-shift",     CONFIG_HLP_DLSHIFT,     0,               iptr:(int32_t *)&nr_dlsch_demod_shift,    defintval:0,     TYPE_INT,    0}, \
     {"V" ,                       CONFIG_HLP_VCD,         PARAMFLAG_BOOL,  iptr:&vcdflag,                            defintval:0,     TYPE_INT,    0}, \
     {"rrc_config_path",          CONFIG_HLP_RRC_CFG_PATH,0,               strptr:(char **)&rrc_config_path,         defstrval:"./",  TYPE_STRING, 0} \
@@ -60,11 +62,13 @@
     {"E" ,                       CONFIG_HLP_TQFS,        PARAMFLAG_BOOL,  u8ptr:&(fp->threequarter_fs),       defintval:0,           TYPE_UINT8,    0}, \
     {"T" ,                       CONFIG_HLP_TDD,         PARAMFLAG_BOOL,  iptr:&tddflag,                      defintval:0,           TYPE_INT,      0}, \
     {"ue-timing-correction-disable", CONFIG_HLP_DISABLETIMECORR, PARAMFLAG_BOOL, iptr:&(UE->no_timing_correction), defintval:0,         TYPE_INT,    0}, \
+    {"do-prb-interpolation",      CONFIG_HLP_PRBINTER,   PARAMFLAG_BOOL,  iptr:&(UE->prb_interpolation),      defintval:0,           TYPE_INT,      0}, \
 }
 
 
 typedef struct {
   uint64_t       optmask;   //mask to store boolean config options
+  uint32_t       ofdm_offset_divisor; // Divisor for sample offset computation for each OFDM symbol
   uint8_t        nr_dlsch_parallel; // number of threads for dlsch decoding, 0 means no parallelization
   tpool_t        Tpool;             // thread pool 
 } nrUE_params_t;
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index b6a2b18215ab51b617b86a655f40e9ef6dc06f30..76904f2368995711fde6a661f5f4d3e080c8641e 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -72,6 +72,7 @@ extern "C"
 #define CONFIG_HLP_DLMCS         "Set the maximum downlink MCS\n"
 #define CONFIG_HLP_STMON         "Enable processing timing measurement of lte softmodem on per subframe basis \n"
 #define CONFIG_HLP_256QAM        "Use the 256 QAM mcs table for PDSCH\n"
+#define CONFIG_HLP_PRBINTER       "Do PRB based averaging of channel estimates. Frequency domain linear interpolation by default\n"
 
 #define CONFIG_HLP_NONSTOP       "Go back to frame sync mode after 100 consecutive PBCH failures\n"
 //#define CONFIG_HLP_NUMUES        "Set the number of UEs for the emulation"
@@ -119,6 +120,7 @@ extern "C"
 #define SEND_DMRSSYNC       softmodem_params.send_dmrs_sync
 #define USIM_TEST           softmodem_params.usim_test
 #define USE_256QAM_TABLE    softmodem_params.use_256qam_table
+#define PRB_INTERPOLATION   softmodem_params.prb_interpolation
 #define NFAPI               softmodem_params.nfapi
 #define NON_STOP            softmodem_params.non_stop
 
@@ -153,9 +155,10 @@ extern int usrp_tx_thread;
     {"nokrnmod",             CONFIG_HLP_NOKRNMOD,     PARAMFLAG_BOOL, uptr:&nokrnmod,                     defintval:0,           TYPE_INT,    0},                     \
     {"nbiot-disable",        CONFIG_HLP_DISABLNBIOT,  PARAMFLAG_BOOL, uptr:&nonbiot,                      defuintval:0,          TYPE_INT,    0},                     \
     {"use-256qam-table",     CONFIG_HLP_256QAM,       PARAMFLAG_BOOL, iptr:&USE_256QAM_TABLE,             defintval:0,           TYPE_INT,    0},                     \
-    {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0,              iptr:&usrp_tx_thread,               defstrval:0,           TYPE_INT,    0},                     \
-    {"nfapi",                CONFIG_HLP_NFAPI,        0,              u8ptr:&nfapi_mode,                  defintval:0,           TYPE_UINT8,  0},                     \
-    {"non-stop",            CONFIG_HLP_NONSTOP,      PARAMFLAG_BOOL, iptr:&NON_STOP,                      defintval:0,           TYPE_INT,    0},                     \
+    {"do-prb-interpolation",  CONFIG_HLP_PRBINTER,     PARAMFLAG_BOOL, iptr:&PRB_INTERPOLATION,            defintval:0,           TYPE_INT,    0},                     \
+    {"usrp-tx-thread-config", CONFIG_HLP_USRP_THREAD, 0,              iptr:&usrp_tx_thread,               defstrval:0,           TYPE_INT,    0},        \
+    {"nfapi",                CONFIG_HLP_NFAPI,        0,              u8ptr:&nfapi_mode,                       defintval:0,           TYPE_UINT8,  0},                     \
+    {"non-stop",            CONFIG_HLP_NONSTOP,      PARAMFLAG_BOOL, iptr:&NON_STOP,                       defintval:0,           TYPE_INT,  0},                     \
   }
 
   
@@ -246,6 +249,7 @@ typedef struct {
   int            hw_timing_advance;
   uint32_t       send_dmrs_sync;
   int            use_256qam_table;
+  int            prb_interpolation;
   uint8_t        nfapi;
   int            non_stop;
 } softmodem_params_t;
diff --git a/nfapi/nrNFAPI.md b/nfapi/nrNFAPI.md
deleted file mode 100644
index 299a43fd9320c807fcafe5cee6ea1989e75778f8..0000000000000000000000000000000000000000
--- a/nfapi/nrNFAPI.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Procedure to run nFAPI in 5G NR
-
-## Conributed by 5G Testbed IISC 
-### Developers: Sudhakar B,Mahesh K,Gokul S,Aniq U.R
-
-## Procedure to Build gNB and UE
-
-The regular commands to build gNB and UE can be used
-```
-sudo ./build_oai --gNB --UE
-
-```
-## Procedure to run NR nFAPI using RF-Simulator
-
-### VNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/rcc.band78.tm1.106PRB.nfapi.conf --nfapi 2 --noS1 --phy-test
-
-```
-### PNF command
-```
-sudo ./nr-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf --nfapi 1 --rfsim --phy-test --rfsimulator.serveraddr server
-
-```
-### UE command
-```
-sudo RFSIMULATOR=127.0.0.1 ./nr-uesoftmodem --rfsim --phy-test --rrc_config_path . -d
-
-```
-## Procedure to run NR nFAPI using Hardware
-Will be updated as we have not yet currently tested on hardware
-
-## Notes
-* In order to acheive the synchronization between VNF and PNF and receive the P7 messages within the timing window the order in which we should run the modules on different terminals is UE->VNF->PNF
-* Currently only downlink is functional and working as we are still working on uplink functionality
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index d9c5df199c09e70b9239923b03dc71ca9fc62697..2b1900200a1c24c46a6178f106b85d8d57fbef64 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -37,8 +37,6 @@
 #include "nfapi_pnf.h"
 #include "common/ran_context.h"
 #include "openair2/PHY_INTERFACE/phy_stub_UE.h"
-//#include "openair1/PHY/vars.h"
-extern RAN_CONTEXT_t RC;
 
 #include <sys/socket.h>
 #include <sys/time.h>
@@ -50,7 +48,7 @@ extern RAN_CONTEXT_t RC;
 
 #include <vendor_ext.h>
 #include "fapi_stub.h"
-//#include "fapi_l1.h"
+
 #include "common/utils/LOG/log.h"
 
 #include "PHY/INIT/phy_init.h"
@@ -62,7 +60,7 @@ extern RAN_CONTEXT_t RC;
 #include <openair1/SCHED/fapi_l1.h>
 #include <openair1/PHY/NR_TRANSPORT/nr_transport_proto.h>
 #include <targets/RT/USER/lte-softmodem.h>
-
+#include "nfapi/open-nFAPI/pnf/inc/pnf_p7.h"
 
 #define NUM_P5_PHY 2
 
@@ -70,6 +68,7 @@ extern RAN_CONTEXT_t RC;
 
 extern void phy_init_RU(RU_t *);
 extern int config_sync_var;
+extern RAN_CONTEXT_t RC;
 
 extern pthread_cond_t nfapi_sync_cond;
 extern pthread_mutex_t nfapi_sync_mutex;
@@ -1110,18 +1109,14 @@ int pnf_phy_ul_dci_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
   
   //   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);
 
-  //phy_info* phy = (phy_info*)(pnf_p7->user_data);
   struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
   if (proc ==NULL) 
     proc = &gNB->proc.L1_proc;
 
   for (int i=0; i<req->numPdus; i++) {
-    //LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d]\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
     if (req->ul_dci_pdu_list[i].PDUType == 0) {
-      //LOG_D(PHY,"[PNF] HI_DCI0_REQ sfn_sf:%d PDU[%d] - NFAPI_HI_DCI0_DCI_PDU_TYPE\n", NFAPI_SFNSF2DEC(req->sfn_sf), i);
-       nfapi_nr_ul_dci_request_pdus_t *ul_dci_req_pdu = &req->ul_dci_pdu_list[i]; 
-       int SFN=req->SFN+2;
-      handle_nfapi_nr_ul_dci_pdu(gNB, SFN, req->Slot, ul_dci_req_pdu); 
+      nfapi_nr_ul_dci_request_pdus_t *ul_dci_req_pdu = &req->ul_dci_pdu_list[i]; 
+      handle_nfapi_nr_ul_dci_pdu(gNB, req->SFN, req->Slot, ul_dci_req_pdu); 
     } 
     else {
       LOG_E(PHY,"[PNF] UL_DCI_REQ sfn_slot:%d PDU[%d] - unknown pdu type:%d\n", NFAPI_SFNSLOT2DEC(req->SFN, req->Slot), i, req->ul_dci_pdu_list[i].PDUType);
@@ -1181,45 +1176,37 @@ int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
 
   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: %u, PduIdx: %u,\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);
+    //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: %u, PduIdx: %u,\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++) {
-    // TODO: enable after adding gNB PDCCH:
     // 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);
 
     if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE) {
       nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdu=&dl_tti_pdu_list[i];
-      memcpy(dl_tti_pdu,&dl_tti_pdu_list[i],sizeof(nfapi_nr_dl_tti_request_pdu_t));
-      int SFN=sfn+2;
-      handle_nfapi_nr_pdcch_pdu(gNB, SFN, slot, &dl_tti_pdu->pdcch_pdu);
-      //dl_tti_pdu_list[i].pdcch_pdu.pdcch_pdu_rel15.numDlDci++; // ?
-      // NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() pdcch_vars->num_dci:%d\n", __FUNCTION__, pdcch_vars->num_dci);
-    } 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(gNB, sfn, slot, &dl_tti_pdu_list[i]);
-        gNB->pbch_configured=1;
-      //} else {
-        // NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() BCH NULL TX PDU SFN/SF:%d PDU_INDEX:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), pdu_index);
-      //}
-    } else if (dl_tti_pdu_list[i].PDUType == NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE) {
+      handle_nfapi_nr_pdcch_pdu(gNB, sfn, slot, &dl_tti_pdu->pdcch_pdu);
+    } 
+    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(gNB, sfn, slot, &dl_tti_pdu_list[i]);
+      gNB->pbch_configured=1;
+    } 
+    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_tx_data_request_t *tx_data = tx_data_request[sfn][slot][rel15_pdu->pduIndex];
-      nfapi_nr_pdu_t *tx_data = tx_data_request[sfn][slot][0];
+      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) {
         int UE_id = find_nr_dlsch(rel15_pdu->rnti,gNB,SEARCH_EXIST_OR_FREE);
@@ -1232,14 +1219,21 @@ int pnf_phy_dl_tti_req(gNB_L1_rxtx_proc_t *proc, nfapi_pnf_p7_config_t *pnf_p7,
           LOG_E(PHY,"pnf_phy_dl_config_req illegal harq_pid %d\n", harq_pid);
           return(-1);
         }
-        //uint8_t *dlsch_sdu = (uint8_t *)tx_data->TLVs[0].value.direct;
+
         uint8_t *dlsch_sdu = nr_tx_pdus[UE_id][harq_pid];
-       memcpy(dlsch_sdu, tx_data->TLVs[0].value.direct,tx_data->PDU_length);//TODO: Check if required
+        memcpy(dlsch_sdu, tx_data->TLVs[0].value.direct,tx_data->PDU_length);
         //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);
         handle_nr_nfapi_pdsch_pdu(gNB, sfn, slot,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 {
+      } 
+      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(gNB, sfn, slot, csi_rs_pdu);
+    }
+    else {
       NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s() UNKNOWN:%d\n", __FUNCTION__, dl_tti_pdu_list[i].PDUType);
     }
   }
@@ -1399,13 +1393,10 @@ int pnf_phy_tx_req(nfapi_pnf_p7_config_t *pnf_p7, nfapi_tx_request_t *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) {
-  // if (0)LOG_D(PHY,"[PNF] UL_CONFIG_REQ %s() sfn_sf:%d pdu:%d rach_prach_frequency_resources:%d srs_present:%u\n",
-  //               __FUNCTION__,
-  //               NFAPI_SFNSF2DEC(req->sfn_sf),
-  //               req->ul_config_request_body.number_of_pdus,
-  //               req->ul_config_request_body.rach_prach_frequency_resources,
-  //               req->ul_config_request_body.srs_present
-  //              );
+  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;
@@ -2162,7 +2153,7 @@ void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_add
   pnf.phys[0].udp.tx_port = vnf_p7_port;
   strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
   strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
-  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n",
+  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n",
          __FUNCTION__,config->vnf_ip_addr, config->vnf_p5_port,
          pnf.phys[0].local_addr,
          pnf.phys[0].udp.tx_addr, pnf.phys[0].udp.tx_port,
@@ -2213,7 +2204,7 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr,
   pnf.phys[0].udp.tx_port = vnf_p7_port;
   strcpy(pnf.phys[0].udp.tx_addr, vnf_ip_addr);
   strcpy(pnf.phys[0].local_addr, pnf_ip_addr);
-  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%u rx:%u]\n",
+  printf("%s() VNF:%s:%d PNF_PHY[addr:%s UDP:tx_addr:%s:%d rx:%d]\n",
          __FUNCTION__,
          config->vnf_ip_addr, config->vnf_p5_port,
          pnf.phys[0].local_addr,
@@ -2272,50 +2263,24 @@ void oai_subframe_ind(uint16_t sfn, uint16_t sf) {
   }
 }
 
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot) {
 
-long shift_ns,prev_ts_nsec,shift_us;
-void oai_slot_ind(uint16_t sfn, uint16_t slot) {
-  
-  //slow down PNF
-  
-  LOG_D(PHY,"%s(sfn:%d, slot:%d)\n", __FUNCTION__, sfn, slot);
-  struct timespec ts;
-      clock_gettime(CLOCK_MONOTONIC, &ts);
-  
-  // if (!(sfn == 0 && slot == 0) && ts.tv_nsec > prev_ts_nsec){
-  //   shift_ns = ts.tv_nsec - prev_ts_nsec;
-  //   shift_us = shift_ns/1000;
-  //   printf("previous: %d, current: %d, shift: %d", prev_ts_nsec, ts.tv_nsec, shift_us);
-  //   if(500-shift_us > 0)
-  //     usleep(500-shift_us);
-  //  // usleep(50);
-  // }
-  prev_ts_nsec = ts.tv_nsec;
-  
-  
-//NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (sfn:%u slot:%u) SFN/SLOT(TX):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, sfn, slot, NFAPI_SFNSLOT2DEC(sfn, slot));
-  //TODO FIXME - HACK - DJP - using a global to bodge it in
-  if (p7_config_g != NULL && sync_var==0) {
-    // DONE: changed for NR  x x   x x x x   x x x x  x x x x  - - - - - - : x (Frame), - (Slot) (max_numer =2)
-    uint16_t sfn_slot_tx = sfn<<6 | slot; 
-    // if ((sfn % 100 == 0) && slot==0) { // DOUBT: Why 100?
-    //   struct timespec ts;
-    //   clock_gettime(CLOCK_MONOTONIC, &ts);
-    //   NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s %d.%d (sfn:%u slot:%u) SFN/SLOT(TX):%u\n", __FUNCTION__, ts.tv_sec, ts.tv_nsec, sfn, slot, NFAPI_SFNSLOT2DEC(sfn, slot));
-    // }
-    
-    //TODO: send p7_config instead of p7_config_g
-    int slot_ret = nfapi_pnf_p7_slot_ind(p7_config_g, p7_config_g->phy_id, sfn, slot); 
+    //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));
+    uint8_t 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);
 
-    // if (subframe_ret) {
-    if (slot_ret) { 
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "[PNF] %s(frame:%u slot:%u) SFN/SLOT(TX):%u - PROBLEM with pnf_p7_slot_ind()\n", __FUNCTION__, sfn, slot, sfn_slot_tx, NFAPI_SFNSLOT2DEC(sfn, slot));
-      // printing anything causes error: probably because there isn't enough time to accomodate a print statement
-    } else {
-      //NFAPI_TRACE(NFAPI_TRACE_INFO, "***NFAPI subframe handler finished *** \n");
-    }
-  } else {
-  }
+    ind->sfn = sfn_tx;
+    ind->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); 
+
+    return;
 }
 
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) {
@@ -2366,3 +2331,42 @@ int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind) {
   //free(ind.rx_indication_body.rx_pdu_list);
   return retval;
 }
+
+//NR UPLINK INDICATION
+
+int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) {
+  ind->header.phy_id = 1;
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION;
+  return nfapi_pnf_p7_nr_slot_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION;
+  return nfapi_pnf_p7_nr_rx_data_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION;
+  return nfapi_pnf_p7_nr_crc_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION;
+  return nfapi_pnf_p7_nr_srs_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION;
+  return nfapi_pnf_p7_nr_uci_ind(p7_config_g, ind);
+}
+
+int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind) {
+  ind->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
+  ind->header.message_id = NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION;
+  return nfapi_pnf_p7_nr_rach_ind(p7_config_g, ind);
+}
+
diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h
index 61d4847ebab2a70196366753135a846d6efb96f5..b7ebdb36eae1d22befc314098078ab7618cc51db 100644
--- a/nfapi/oai_integration/nfapi_pnf.h
+++ b/nfapi/oai_integration/nfapi_pnf.h
@@ -19,13 +19,20 @@
  *      contact@openairinterface.org
  */
 
-#if !defined(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);
 void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 void configure_nr_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr, int pnf_p7_port, int vnf_p7_port);
 
 void oai_subframe_ind(uint16_t sfn, uint16_t sf);
-void oai_slot_ind(uint16_t sfn, uint16_t slot);
-#endif
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot);
+uint32_t sfnslot_add_slot(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);
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind);
+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);
+
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index f4448e71dff3862e7018014282b3b22b4c9a3d94..d96829e127756976157f746ea5176fd7b35378bf 100644
--- a/nfapi/oai_integration/nfapi_vnf.c
+++ b/nfapi/oai_integration/nfapi_vnf.c
@@ -33,10 +33,10 @@
 
 #include "nfapi_nr_interface_scf.h"
 #include "nfapi_vnf_interface.h"
+#include "nfapi_vnf.h"
 #include "nfapi.h"
 #include "vendor_ext.h"
 
-#include "nfapi_vnf.h"
 #include "PHY/defs_eNB.h"
 #include "PHY/LTE_TRANSPORT/transport_proto.h"
 #include "openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
@@ -239,6 +239,18 @@ void oai_enb_init(void) {
 
 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_I(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_I(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
   
@@ -584,7 +596,7 @@ extern pthread_mutex_t nfapi_sync_mutex;
 extern int nfapi_sync_var;
 
 int phy_sync_indication(struct nfapi_vnf_p7_config *config, uint8_t sync) {
-  printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
+  //printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
 
   if (sync==1 && nfapi_sync_var!=0) {
     
@@ -1002,6 +1014,124 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
   return 1;
 }
 
+//NR phy indication
+
+int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) {
+  
+  uint8_t vnf_slot_ahead = 2;
+  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); //offsetting the vnf from pnf by vnf_slot_head slots
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+  gNB->UL_INFO.frame     = vnf_sfn;
+	gNB->UL_INFO.slot      = vnf_slot;	
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+  LOG_D(MAC, "VNF SFN/Slot %d.%d \n", gNB->UL_INFO.frame, gNB->UL_INFO.slot);
+
+  return 1;
+}
+
+int phy_nr_crc_indication(nfapi_nr_crc_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.crc_ind = *ind;
+
+  if (ind->number_crcs > 0)
+    gNB->UL_INFO.crc_ind.crc_list = malloc(sizeof(nfapi_nr_crc_t)*ind->number_crcs);
+
+  for (int i=0; i<ind->number_crcs; i++)
+    memcpy(&gNB->UL_INFO.crc_ind.crc_list[i], &ind->crc_list[i], sizeof(ind->crc_list[0]));
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.rx_ind = *ind;
+
+  if (ind->number_of_pdus > 0)
+    gNB->UL_INFO.rx_ind.pdu_list = malloc(sizeof(nfapi_nr_rx_data_pdu_t)*ind->number_of_pdus);
+
+  for (int i=0; i<ind->number_of_pdus; i++) 
+    memcpy(&gNB->UL_INFO.rx_ind.pdu_list[i], &ind->pdu_list[i], sizeof(ind->pdu_list[0]));
+
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_uci_indication(nfapi_nr_uci_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.uci_ind = *ind;
+
+  if (ind->num_ucis > 0)
+    gNB->UL_INFO.uci_ind.uci_list = malloc(sizeof(nfapi_nr_uci_t)*ind->num_ucis);
+
+  for (int i=0; i<ind->num_ucis; i++)
+    memcpy(&gNB->UL_INFO.uci_ind.uci_list[i], &ind->uci_list[i], sizeof(ind->uci_list[0]));
+  //printf("UCI ind written to UL_info: num_ucis: %d, PDU_type : %d. \n", ind->num_ucis, ind->uci_list[0].pdu_type);
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_srs_indication(nfapi_nr_srs_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.srs_ind = *ind;
+
+  if (ind->number_of_pdus > 0)
+    gNB->UL_INFO.srs_ind.pdu_list = malloc(sizeof(nfapi_nr_srs_indication_pdu_t)*ind->number_of_pdus);
+
+  for (int i=0; i<ind->number_of_pdus; i++) {
+    memcpy(&gNB->UL_INFO.srs_ind.pdu_list[i], &ind->pdu_list[i], sizeof(ind->pdu_list[0]));
+
+    LOG_D(MAC, "%s() NFAPI SFN/Slot:%d.%d SRS_IND:number_of_pdus:%d UL_INFO:pdus:%d\n",
+        __FUNCTION__,
+        ind->sfn,ind->slot, ind->number_of_pdus, gNB->UL_INFO.srs_ind.number_of_pdus
+        );
+  }
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+int phy_nr_rach_indication(nfapi_nr_rach_indication_t *ind) {
+  struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+
+  gNB->UL_INFO.rach_ind = *ind;
+
+  if (ind->number_of_pdus > 0)
+    gNB->UL_INFO.rach_ind.pdu_list = malloc(sizeof(nfapi_nr_prach_indication_pdu_t)*ind->number_of_pdus);
+
+  for (int i=0; i<ind->number_of_pdus; i++) {
+    memcpy(&gNB->UL_INFO.rach_ind.pdu_list[i], &ind->pdu_list[i], sizeof(ind->pdu_list[0]));
+
+    LOG_D(MAC, "%s() NFAPI SFN/Slot:%d.%d RACH_IND:number_of_pdus:%d UL_INFO:pdus:%d\n",
+        __FUNCTION__,
+        ind->sfn,ind->slot, ind->number_of_pdus, gNB->UL_INFO.rach_ind.number_of_pdus
+        );
+  }
+
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+
+  return 1;
+}
+
+//end NR phy indication
+
 int phy_lbt_dl_indication(struct nfapi_vnf_p7_config *config, nfapi_lbt_dl_indication_t *ind) {
   // vnf_p7_info* p7_vnf = (vnf_p7_info*)(config->user_data);
   //mac_lbt_dl_ind(p7_vnf->mac, ind);
@@ -1167,6 +1297,12 @@ void *vnf_nr_p7_thread_start(void *ptr) {
   p7_vnf->config->lbt_dl_indication = &phy_lbt_dl_indication;
   p7_vnf->config->nb_harq_indication = &phy_nb_harq_indication;
   p7_vnf->config->nrach_indication = &phy_nrach_indication;
+  p7_vnf->config->nr_crc_indication = &phy_nr_crc_indication;
+  p7_vnf->config->nr_slot_indication = &phy_nr_slot_indication;  
+  p7_vnf->config->nr_rx_data_indication = &phy_nr_rx_data_indication;
+  p7_vnf->config->nr_uci_indication = &phy_nr_uci_indication;
+  p7_vnf->config->nr_rach_indication = &phy_nr_rach_indication;
+  p7_vnf->config->nr_srs_indication = &phy_nr_srs_indication;
   p7_vnf->config->malloc = &vnf_allocate;
   p7_vnf->config->free = &vnf_deallocate;
   p7_vnf->config->trace = &vnf_trace;
@@ -1501,8 +1637,8 @@ void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port) {
   nfapi_setmode(NFAPI_MODE_VNF);
   memset(&vnf, 0, sizeof(vnf));
   memset(vnf.p7_vnfs, 0, sizeof(vnf.p7_vnfs));
-  vnf.p7_vnfs[0].timing_window = 32;
-  vnf.p7_vnfs[0].periodic_timing_enabled = 1;
+  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].config = nfapi_vnf_p7_config_create();
@@ -1620,7 +1756,7 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req)
   //LOG_I(PHY, "sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
   //printf("\nEntering oai_nfapi_nr_dl_config_req sfn:%d,slot:%d\n",dl_config_req->SFN,dl_config_req->Slot);
   nfapi_vnf_p7_config_t *p7_config = vnf.p7_vnfs[0].config;
-   dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
+  dl_config_req->header.message_id= NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST;
   dl_config_req->header.phy_id = 1; // DJP HACK TODO FIXME - need to pass this around!!!!
 
   int retval = nfapi_vnf_p7_nr_dl_config_req(p7_config, dl_config_req);
diff --git a/nfapi/oai_integration/nfapi_vnf.h b/nfapi/oai_integration/nfapi_vnf.h
index f4fd6a2bf9a221460cab3b2992bda0856a268fe0..478956f75cd8476a97028a409c839b6af3c4afa8 100644
--- a/nfapi/oai_integration/nfapi_vnf.h
+++ b/nfapi/oai_integration/nfapi_vnf.h
@@ -19,9 +19,9 @@
  *      contact@openairinterface.org
  */
 
-#if !defined(NFAPI_VNF_H__)
-#define NFAPI_VNF_H__
 
 void configure_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
 void configure_nr_nfapi_vnf(char *vnf_addr, int vnf_p5_port);
-#endif
+
+uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset);
+
diff --git a/nfapi/open-nFAPI/common/src/debug.c b/nfapi/open-nFAPI/common/src/debug.c
index f53be43223f132a2f43bc3c3d69e2f0760f730e5..a45d41d7d7218f806869f6fda7dd9c628b893d9a 100644
--- a/nfapi/open-nFAPI/common/src/debug.c
+++ b/nfapi/open-nFAPI/common/src/debug.c
@@ -1,76 +1,76 @@
-/*
- * 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
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <pthread.h>
-#include <syslog.h>
-
-#include <debug.h>
-
-#define MAX_MSG_LENGTH 			2096
-#define TRACE_HEADER_LENGTH		44
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
-
-// initialize the trace function to 0
-void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
-
-nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
-//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
-
-void nfapi_set_trace_level(nfapi_trace_level_t new_level)
-{
-	nfapi_trace_level_g = new_level;
-}
-
-void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
-{
-	char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
-	uint32_t num_chars;
-	va_list p_args;
-	struct timeval tv;
-	pthread_t tid = pthread_self();
-
-	(void)gettimeofday(&tv, NULL);
-
-	num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
-
-	if (num_chars > TRACE_HEADER_LENGTH)
-	{
-		printf("trace_dbg: Error, num_chars is too large: %u", num_chars);
-		return;
-	}
-
-	va_start(p_args, format);
-	if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
-	{
-		if (level <= NFAPI_TRACE_WARN)
-		{
-			printf("%s", trace_buff);
-		}
-		printf("%s", trace_buff);
-	}
-	va_end(p_args);
-}
+/*
+ * 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
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <syslog.h>
+
+#include <debug.h>
+
+#define MAX_MSG_LENGTH 			2096
+#define TRACE_HEADER_LENGTH		44
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...);
+
+// initialize the trace function to 0
+void (*nfapi_trace_g)(nfapi_trace_level_t level, const char* format, ...) = &nfapi_trace_dbg;
+
+nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_INFO;
+//nfapi_trace_level_t nfapi_trace_level_g = NFAPI_TRACE_WARN;
+
+void nfapi_set_trace_level(nfapi_trace_level_t new_level)
+{
+	nfapi_trace_level_g = new_level;
+}
+
+void nfapi_trace_dbg(nfapi_trace_level_t level, const char *format, ...)
+{
+	char trace_buff[MAX_MSG_LENGTH + TRACE_HEADER_LENGTH];
+	uint32_t num_chars;
+	va_list p_args;
+	struct timeval tv;
+	pthread_t tid = pthread_self();
+
+	(void)gettimeofday(&tv, NULL);
+
+	num_chars = (uint32_t)snprintf(trace_buff, TRACE_HEADER_LENGTH, "%04u.%06u: 0x%02x: %10u: ", ((uint32_t)tv.tv_sec) & 0x1FFF, (uint32_t)tv.tv_usec, (uint32_t)level, (uint32_t)tid);
+
+	if (num_chars > TRACE_HEADER_LENGTH)
+	{
+		printf("trace_dbg: Error, num_chars is too large: %d", num_chars);
+		return;
+	}
+
+	va_start(p_args, format);
+	if ((num_chars = (uint32_t)vsnprintf(&trace_buff[num_chars], MAX_MSG_LENGTH, format, p_args)))
+	{
+		if (level <= NFAPI_TRACE_WARN)
+		{
+			printf("%s", trace_buff);
+		}
+		printf("%s", trace_buff);
+	}
+	va_end(p_args);
+}
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf
deleted file mode 100644
index 6ee4ec840431454c5429456810abaa7a2f29fb59..0000000000000000000000000000000000000000
Binary files a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf and /dev/null differ
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index be6f92b2b992038a35a0534784ef005b1a8a60ea..9d245446c86d00283f5ce6f678aeac630ce1e8bd 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
@@ -673,6 +673,7 @@ typedef struct {
 #define NFAPI_NR_SLOT_INDICATION_PERIOD_NUMEROLOGY_3 125 //us
 
 typedef struct {
+  nfapi_p7_message_header_t header;
 	uint16_t sfn; //0->1023   
   uint16_t slot;//0->319
   
@@ -1492,10 +1493,11 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint16_t number_of_pdus;
-  nfapi_nr_rx_data_pdu_t* pdu_list;
+  nfapi_nr_rx_data_pdu_t *pdu_list; 
 
 } nfapi_nr_rx_data_indication_t;
 
@@ -1518,6 +1520,7 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint16_t number_crcs;
@@ -1653,6 +1656,7 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint16_t num_ucis;
@@ -1689,6 +1693,7 @@ typedef struct
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint8_t number_of_pdus;
@@ -1721,6 +1726,7 @@ typedef struct{
 
 typedef struct
 {
+  nfapi_p7_message_header_t header;
   uint16_t sfn;
   uint16_t slot;
   uint8_t number_of_pdus;
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
index 0c0a8750bc2d5e5d8a302f41dcd5327cc47da318..23d19482ea6bd45a8048a684b24c310e031a22ff 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p5.c
@@ -1,2368 +1,2389 @@
-/*
- * 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include "nfapi_nr_interface.h"
-#include "nfapi_nr_interface_scf.h"
-#include <debug.h>
-
-
-// Pack routines
-//TODO: Add pacl/unpack fns for uint32 and uint64
-static uint8_t pack_nr_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_request_t *request = (nfapi_nr_pnf_param_request_t *)msg;
-  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_request_t *request = (nfapi_pnf_param_request_t *)msg;
-  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_pnf_param_general_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
-  return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) &&
-           push8(value->location_mode, ppWritePackedMsg, end) &&
-           push16(value->location_coordinates_length, ppWritePackedMsg, end) &&
-           pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) &&
-           push32(value->dl_config_timing, ppWritePackedMsg, end) &&
-           push32(value->tx_timing, ppWritePackedMsg, end) &&
-           push32(value->ul_config_timing, ppWritePackedMsg, end) &&
-           push32(value->hi_dci0_timing, ppWritePackedMsg, end) &&
-           push16(value->maximum_number_phys, ppWritePackedMsg, end) &&
-           push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) &&
-           push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) &&
-           push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) &&
-           push8(value->shared_bands, ppWritePackedMsg, end) &&
-           push8(value->shared_pa, ppWritePackedMsg, end) &&
-           pushs16(value->maximum_total_power, ppWritePackedMsg, end) &&
-           pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rf_config_info_t *rf = (nfapi_rf_config_info_t *)elem;
-  return (push16(rf->rf_config_index, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_pnf_phy_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
-  return (  push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-            push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
-            packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
-            push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
-            packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
-            push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
-            push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
-            push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
-            push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
-            push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
-            push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
-  return ( push16(value->number_of_phys, ppWritePackedMsg, end) &&
-           packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info));
-}
-
-static uint8_t pack_pnf_rf_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
-  uint16_t rf_index = 0;
-
-  if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  for(; rf_index < value->number_of_rfs; ++rf_index) {
-    if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) &&
-          push16(value->rf[rf_index].band, ppWritePackedMsg, end) &&
-          pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) &&
-          pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) &&
-          push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) &&
-          push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t pack_pnf_phy_rel10_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
-  return(push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-         push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) &&
-         push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) &&
-         push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) &&
-         push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) &&
-         push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) &&
-         push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info));
-}
-
-static uint8_t pack_pnf_phy_rel11_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
-  return (push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->edpcch_supported, ppWritePackedMsg, end) &&
-          push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) &&
-          push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) &&
-          push16(phy->ul_comp_supported, ppWritePackedMsg, end) &&
-          push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end ));
-}
-static uint8_t pack_pnf_phy_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info));
-}
-static uint8_t pack_pnf_phy_rel12_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
-  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->csi_subframe_set, ppWritePackedMsg, end) &&
-          push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) &&
-          push16(phy->drs_supported, ppWritePackedMsg, end) &&
-          push16(phy->ul_64qam_supported, ppWritePackedMsg, end) &&
-          push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) &&
-          push16(phy->alternative_bts_indices, ppWritePackedMsg, end));
-}
-static uint8_t pack_pnf_phy_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info));
-}
-
-static uint8_t pack_pnf_phy_rel13_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
-  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->pucch_format4_supported, ppWritePackedMsg, end) &&
-          push16(phy->pucch_format5_supported, ppWritePackedMsg, end) &&
-          push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) &&
-          push16(phy->laa_supported, ppWritePackedMsg, end) &&
-          push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) &&
-          push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) &&
-          push16(phy->beamforming_supported, ppWritePackedMsg, end) &&
-          push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) &&
-          push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) &&
-          push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_pnf_phy_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info));
-}
-
-static uint8_t pack_pnf_phy_rel13_nb_iot_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
-  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
-          push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
-          packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
-          push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
-          packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
-          push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
-          push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
-          push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
-          push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
-  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
-          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info));
-}
-/*
-static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
-{
-  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
-
-  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-      pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-      pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-      pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-*/
-static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
-  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
-  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
-          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
-          pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) &&
-          pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_phy_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
-  return (push16(rf->phy_id, ppWritePackedMsg, end) &&
-          push16(rf->phy_config_index, ppWritePackedMsg, end) &&
-          push16(rf->rf_config_index, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
-  return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) &&
-         packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info));
-}
-
-static uint8_t pack_nr_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
-  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
-          //push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
-  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
-          push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_nr_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_nr_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
-  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
-  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_nr_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_stop_request_t *pNfapiMsg = (nfapi_nr_pnf_stop_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-
-static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
-  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-static uint8_t pack_nr_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_stop_response_t *pNfapiMsg = (nfapi_nr_pnf_stop_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
-  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
-  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_uint32_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
-  return push32(value->value, ppWritePackedMsg, end);
-}
-
-static uint8_t unpack_uint32_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
-  return pull32(ppReadPackedMsg, &value->value, end);
-}
-
-
-static uint8_t pack_uint16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
-  return push16(value->value, ppWritePackedMsg, end);
-}
-
-static uint8_t unpack_uint16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
-  return pull16(ppReadPackedMsg, &value->value, end);
-}
-
-static uint8_t pack_int16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
-  return pushs16(value->value, ppWritePackedMsg, end);
-}
-
-static uint8_t unpack_int16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
-  return pulls16(ppReadPackedMsg, &value->value, end);
-}
-
-static uint8_t pack_uint8_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
-  return push8(value->value, ppWritePackedMsg, end);
-}
-static uint8_t unpack_uint8_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
-  return pull8(ppReadPackedMsg, &value->value, end);
-}
-
-static uint8_t pack_ipv4_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
-  return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end);
-}
-static uint8_t unpack_ipv4_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
-  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end);
-}
-static uint8_t pack_ipv6_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ipv6_address_t *value = (nfapi_ipv6_address_t *)tlv;
-  return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end);
-}
-static uint8_t unpack_ipv6_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
-  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end);
-}
-
-static uint8_t pack_rf_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
-  return ( push16(value->number_rf_bands, ppWritePackedMsg, end) &&
-           pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end));
-}
-static uint8_t unpack_rf_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) &&
-           pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end));
-}
-
-static uint8_t pack_nmm_frequency_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
-  return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) &&
-          pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end));
-}
-static uint8_t unpack_nmm_frequency_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) &&
-           pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end));
-}
-static uint8_t pack_embms_mbsfn_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_embms_mbsfn_config_t *value = (nfapi_embms_mbsfn_config_t *)tlv;
-  return ( push16(value->num_mbsfn_config, ppWritePackedMsg, end) &&
-           pusharray16(value->radioframe_allocation_period, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-           pusharray16(value->radioframe_allocation_offset, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-           pusharray8(value->fourframes_flag, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
-           pusharrays32(value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, ppWritePackedMsg, end));
-}
-// static uint8_t unpack_embms_mbsfn_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end)
-// {
-//     nfapi_embms_mbsfn_config_t* value = (nfapi_embms_mbsfn_config_t*)tlv;
-
-//     return ( pull16(ppReadPackedMsg, &value->num_mbsfn_config, end) &&
-//              pull16(ppReadPackedMsg, &value->radioframe_allocation_period, end) &&
-//              pull16(ppReadPackedMsg, &value->radioframe_allocation_offset, end) &&
-//              pull8(ppReadPackedMsg, &value->fourframes_flag, end) &&
-//                      pullarrays32(ppReadPackedMsg, value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, end));
-// }
-
-static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
-  return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG,  &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          // Do we check the phy state and then just fill those sepecified, however
-          // we do not know the duplex mode, so just attempt to pack all and assumme
-          // that the callee has set the right tlvs
-          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          // laa capability
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end,&pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDX_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_idx), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDR9_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_id_r9), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_TAG, &(pNfapiMsg->embms_mbsfn_config), ppWritePackedMsg, end, &pack_embms_mbsfn_config_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_PERIOD_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_OFFSET_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_FLAG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_config_flag), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_SUBFRAMECONFIG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_subframeconfig), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-          pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_nr_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  printf("\nRUNNING pack_param_response\n");
-  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
-  return (push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_only_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG, &(pNfapiMsg->pusch_param.pusch_frequency_hopping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_max_len), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG, &(pNfapiMsg->pusch_param.pusch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pusch_param.pusch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG, &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG, &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG, &(pNfapiMsg->pusch_param.supported_modulation_order_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG, &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG, &(pNfapiMsg->pusch_param.dfts_ofdm_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG, &(pNfapiMsg->pusch_param.pusch_aggregation_factor), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_long_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_short_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG, &(pNfapiMsg->prach_param.prach_restricted_sets), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG, &(pNfapiMsg->measurement_param.rssi_measurement_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          // config:
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
-  return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-           // Do we check the phy state and then just fill those sepecified, however
-           // we do not know the duplex mode, so just attempt to pack all and assumme
-           // that the callee has set the right tlvs
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end,
-                    &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-           pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
-           pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  printf("\n\nEntering pack_config_request\n");
-  nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t *)msg;
-  return (push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.dl_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_DL_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.dl_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.dl_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_DL_K0_TAG, &(pNfapiMsg->carrier_config.dl_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_NUM_RX_ANT_TAG, &(pNfapiMsg->carrier_config.num_rx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_NUM_TX_ANT_TAG, &(pNfapiMsg->carrier_config.num_tx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.ul_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_UL_K0_TAG, &(pNfapiMsg->carrier_config.ul_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.uplink_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.uplink_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, &(pNfapiMsg->cell_config.frame_duplex_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, &(pNfapiMsg->cell_config.phy_cell_id), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG, &(pNfapiMsg->prach_config.prach_sequence_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, &(pNfapiMsg->prach_config.restricted_set_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, &(pNfapiMsg->prach_config.ssb_per_rach), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, &(pNfapiMsg->prach_config.prach_sub_c_spacing), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SCS_COMMON_TAG, &(pNfapiMsg->ssb_config.scs_common), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, &(pNfapiMsg->ssb_config.ss_pbch_power), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_BETA_PSS_TAG, &(pNfapiMsg->ssb_table.beta_pss), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_MIB_TAG, &(pNfapiMsg->ssb_table.MIB), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG, &(pNfapiMsg->ssb_table.ssb_offset_point_a), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SSB_PERIOD_TAG, &(pNfapiMsg->ssb_table.ssb_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, &(pNfapiMsg->ssb_table.ssb_subcarrier_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_CONFIG_SLOT_CONFIG_TAG, &(pNfapiMsg->tdd_table.max_tdd_periodicity_list[0].max_num_of_symbol_per_slot_list[0].slot_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          //pack_tlv(NFAPI_NR_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          //pack_tlv(NFAPI_NR_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          //pack_tlv(NFAPI_NR_NFAPI_NRARFCN_TAG, &(pNfapiMsg->nfapi_config.nrarfcn), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          //pack_tlv(NFAPI_NR_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          //pack_tlv(NFAPI_NR_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_nr_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
-  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
-  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_nr_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_request_scf_t *pNfapiMsg = (nfapi_nr_start_request_scf_t *)msg;
-  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t *)msg;
-  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_nr_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-
-static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
-  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-}
-
-static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
-  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
-}
-
-static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
-  return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_recevied_interference_power_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
-  return  ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) &&
-            pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
-  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end,
-                   &pack_recevied_interference_power_measurement_value) &&
-          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
-          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  uint8_t result = 0;
-
-  // look for the specific message
-  switch (header->message_id) {
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-      result = pack_nr_pnf_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      result = pack_nr_pnf_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-      result = pack_nr_pnf_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-      result = pack_nr_pnf_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-      result = pack_nr_pnf_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-      result = pack_nr_pnf_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-      result = pack_nr_pnf_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      result = pack_nr_pnf_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-      result = pack_nr_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-      result = pack_nr_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-      result = pack_nr_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-      result = pack_nr_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-      result = pack_nr_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-      result = pack_nr_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-      result = pack_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-      result = pack_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    default: {
-      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p4_p5_vendor_extension) {
-          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
-      }
-    }
-    break;
-  }
-
-  return result;
-}
-
-
-static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
-  uint8_t result = 0;
-
-  // look for the specific message
-  switch (header->message_id) {
-    case NFAPI_PNF_PARAM_REQUEST:
-      result = pack_pnf_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      result = pack_pnf_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_REQUEST:
-      result = pack_pnf_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_RESPONSE:
-      result = pack_pnf_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_START_REQUEST:
-      result = pack_pnf_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_START_RESPONSE:
-      result = pack_pnf_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_STOP_REQUEST:
-      result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PARAM_REQUEST:
-      result = pack_param_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_PARAM_RESPONSE:
-      result = pack_param_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_CONFIG_REQUEST:
-      result = pack_config_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_CONFIG_RESPONSE:
-      result = pack_config_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_START_REQUEST:
-      result = pack_start_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_START_RESPONSE:
-      result = pack_start_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_STOP_REQUEST:
-      result = pack_stop_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_STOP_RESPONSE:
-      result = pack_stop_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      result = pack_measurement_request(header, ppWritePackedMsg, end, config);
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      result = pack_measurement_response(header, ppWritePackedMsg, end, config);
-      break;
-
-    default: {
-      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p4_p5_vendor_extension) {
-          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
-      }
-    }
-    break;
-  }
-
-  return result;
-}
-
-
-// helper function for message length calculation -
-// takes the pointers to the start of message to end of message
-
-static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) {
-  if (msgEnd < msgHead) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
-    return 0;
-  }
-
-  return (msgEnd - msgHead);
-}
-
-// Main pack function - public
-int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint32_t packedMsgLen;
-  uint16_t packedMsgLen16;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  // pack the message
-  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(0, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
-      pack_nr_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
-    // check for a valid message length
-    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-
-    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-      return -1;
-    } else {
-      packedMsgLen16 = (uint16_t)packedMsgLen;
-    }
-
-    // Update the message length in the header
-    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
-      return -1;
-
-    // return the packed length
-    return (packedMsgLen);
-  } else {
-    // Failed to pack the meassage
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
-    return -1;
-  }
-}
-
-int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint32_t packedMsgLen;
-  uint16_t packedMsgLen16;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  // pack the message
-  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) &&
-      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
-      pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
-    // check for a valid message length
-    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
-
-    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-      return -1;
-    } else {
-      packedMsgLen16 = (uint16_t)packedMsgLen;
-    }
-
-    // Update the message length in the header
-    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
-      return -1;
-
-    // return the packed length
-    return (packedMsgLen);
-  } else {
-    // Failed to pack the meassage
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
-    return -1;
-  }
-}
-
-
-
-// Unpack routines
-
-
-static uint8_t  unpack_nr_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_request_t *pNfapiMsg = (nfapi_nr_pnf_param_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t  unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_pnf_param_general_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
-  return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) &&
-          pull8(ppReadPackedMsg, &value->location_mode, end) &&
-          pull16(ppReadPackedMsg, &value->location_coordinates_length, end) &&
-          pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) &&
-          pull32(ppReadPackedMsg, &value->dl_config_timing, end) &&
-          pull32(ppReadPackedMsg, &value->tx_timing, end) &&
-          pull32(ppReadPackedMsg, &value->ul_config_timing, end) &&
-          pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) &&
-          pull16(ppReadPackedMsg, &value->maximum_number_phys, end) &&
-          pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) &&
-          pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) &&
-          pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) &&
-          pull8(ppReadPackedMsg, &value->shared_bands, end) &&
-          pull8(ppReadPackedMsg, &value->shared_pa, end) &&
-          pulls16(ppReadPackedMsg, &value->maximum_total_power, end) &&
-          pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end));
-}
-
-static uint8_t unpack_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rf_config_info_t *info = (nfapi_rf_config_info_t *)elem;
-  return pull16(ppReadPackedMsg, &info->rf_config_index, end);
-}
-
-static uint8_t unpack_pnf_phy_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
-  return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-           pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
-           unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
-           pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
-           unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
-           pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) &&
-           pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) &&
-           pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
-           pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
-           pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
-           pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
-}
-
-
-static uint8_t unpack_pnf_phy_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info));
-}
-
-static uint8_t unpack_pnf_rf_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_rf_info_t *rf = (nfapi_pnf_rf_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) &&
-          pull16(ppReadPackedMsg, &rf->band, end) &&
-          pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) &&
-          pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) &&
-          pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) &&
-          pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) &&
-          pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) &&
-          pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) &&
-          pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end));
-}
-static uint8_t unpack_pnf_rf_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) &&
-           unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info));
-}
-
-static uint8_t unpack_pnf_phy_rel10_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) &&
-          pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end));
-}
-static uint8_t unpack_pnf_phy_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info));
-}
-
-
-static uint8_t unpack_pnf_phy_rel11_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->edpcch_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) &&
-          pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) &&
-          pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info));
-}
-
-static uint8_t unpack_phy_phy_rel12_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) &&
-          pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) &&
-          pull16(ppReadPackedMsg, &phy->drs_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end));
-}
-
-static uint8_t unpack_pnf_phy_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-          unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info));
-}
-
-static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) &&
-          pull16(ppReadPackedMsg, &phy->laa_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->beamforming_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info));
-}
-
-static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
-          unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
-          pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
-          unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
-          pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
-          pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
-          pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
-          pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
-}
-
-static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
-           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info));
-}
-
-static uint8_t unpack_nr_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
-    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
-  };
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-
-static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
-    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
-    { NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value},
-    { NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value},
-    { NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value},
-    { NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value},
-    { NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value},
-    { NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value},
-
-  };
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_phy_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
-  return( pull16(ppReadPackedMsg, &rf->phy_id, end) &&
-          pull16(ppReadPackedMsg, &rf->phy_config_index, end) &&
-          pull16(ppReadPackedMsg, &rf->rf_config_index, end));
-}
-
-static uint8_t unpack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) &&
-           unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info));
-}
-
-static uint8_t unpack_nr_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
-}
-
-
-
-static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
-}
-
-
-static uint8_t unpack_nr_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-
-static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value},
-
-    { NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value},
-    { NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value},
-
-    { NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value},
-
-    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
-
-    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
-
-    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
-
-    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
-
-    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
-
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
-
-    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
-
-    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
-    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
-
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
-    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
-
-  };
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), &unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state),&unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), &unpack_uint16_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), &unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), &unpack_uint16_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), &unpack_uint16_tlv_value},
-
-
-    { NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_only_pusch),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_frequency_hopping),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_config_types),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_max_len),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG,  &(pNfapiMsg->pusch_param.pusch_cbg),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG,  &(pNfapiMsg->pusch_param.pusch_mapping_type),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_allocation_types),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG,  &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG,  &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,  &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG,  &(pNfapiMsg->pusch_param.supported_modulation_order_ul),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG,  &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG,  &(pNfapiMsg->pusch_param.dfts_ofdm_support),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG,  &(pNfapiMsg->pusch_param.pusch_aggregation_factor),  &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_long_formats),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_short_formats),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG,  &(pNfapiMsg->prach_param.prach_restricted_sets),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,  &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot),  &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG,  &(pNfapiMsg->measurement_param.rssi_measurement_support),  &unpack_uint8_tlv_value},
-    //config
-    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-    { 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(" %d ", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
-    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
-
-    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
-    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
-
-    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
-    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
-    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
-
-    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
-    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
-
-    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
-    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
-
-    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
-
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
-
-
-    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value},
-    { NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value},
-
-    { NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value},
-    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value},
-
-    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
-    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
-
-    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
-    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
-
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
-    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
-    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
-    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
-    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
-    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
-    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
-
-  };
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t *)msg;
-  pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t *) malloc(20*sizeof(nfapi_nr_max_tdd_periodicity_t));
-
-  for(int i=0; i<40; 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(14*sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
-
-  pNfapiMsg->prach_config.num_prach_fd_occasions_list=(nfapi_nr_num_prach_fd_occasions_t *) malloc(sizeof(nfapi_nr_num_prach_fd_occasions_t));
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.dl_bandwidth),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_DL_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.dl_frequency),  &unpack_uint32_tlv_value},
-    { NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.dl_grid_size[1]),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_DL_K0_TAG,  &(pNfapiMsg->carrier_config.dl_k0[1]),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_NUM_RX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_rx_ant),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_NUM_TX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_tx_ant),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.ul_grid_size[1]),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_UL_K0_TAG,  &(pNfapiMsg->carrier_config.ul_k0[1]),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.uplink_bandwidth),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.uplink_frequency),  &unpack_uint32_tlv_value},
-    { NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG,  &(pNfapiMsg->cell_config.frame_duplex_type),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_PHY_CELL_ID_TAG,  &(pNfapiMsg->cell_config.phy_cell_id),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG,  &(pNfapiMsg->prach_config.prach_sequence_length),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG,  &(pNfapiMsg->prach_config.restricted_set_config),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_SSB_PER_RACH_TAG,  &(pNfapiMsg->prach_config.ssb_per_rach),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG,  &(pNfapiMsg->prach_config.prach_sub_c_spacing),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_K1_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences),  &unpack_uint8_tlv_value},
-
-    { NFAPI_NR_CONFIG_SCS_COMMON_TAG,  &(pNfapiMsg->ssb_config.scs_common),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG,  &(pNfapiMsg->ssb_config.ss_pbch_power),  &unpack_uint32_tlv_value},
-    { NFAPI_NR_CONFIG_BETA_PSS_TAG,  &(pNfapiMsg->ssb_table.beta_pss),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_MIB_TAG,  &(pNfapiMsg->ssb_table.MIB),  &unpack_uint32_tlv_value},
-    { NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask),  &unpack_uint32_tlv_value},
-    { NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask),  &unpack_uint32_tlv_value},
-
-    { NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG,  &(pNfapiMsg->ssb_table.ssb_offset_point_a),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_CONFIG_SSB_PERIOD_TAG,  &(pNfapiMsg->ssb_table.ssb_period),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG,  &(pNfapiMsg->ssb_table.ssb_subcarrier_offset),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_TDD_PERIOD_TAG,  &(pNfapiMsg->tdd_table.tdd_period),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_CONFIG_SLOT_CONFIG_TAG,  &(pNfapiMsg->tdd_table.max_tdd_periodicity_list[0].max_num_of_symbol_per_slot_list[0].slot_config),  &unpack_uint8_tlv_value},
-    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4),  &unpack_ipv4_address_value},
-    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6),  &unpack_ipv6_address_value},
-    { NFAPI_NR_NFAPI_P7_PNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_port),  &unpack_uint16_tlv_value},
-    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),  &unpack_ipv4_address_value},
-    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6),  &unpack_ipv6_address_value},
-    { NFAPI_NR_NFAPI_P7_VNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_port),  &unpack_uint16_tlv_value},
-    { 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},
-    { NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,  &(pNfapiMsg->nfapi_config.timing_window),  &unpack_uint8_tlv_value},
-  };
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
-  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_request_scf_t *pNfapiMsg = ( nfapi_nr_start_request_scf_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_request_t *pNfapiMsg = ( nfapi_start_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_nr_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-
-static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
-  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
-}
-static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value},
-    { NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value},
-    { NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
-           pullarrays16(ppReadPackedMsg, value->received_interference_power,  NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end));
-}
-
-
-static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value},
-    { NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value},
-    { NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value},
-  };
-  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
-           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-// unpack length check
-
-static int check_nr_unpack_length(nfapi_nr_phy_msg_type_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
-        retLen = sizeof(nfapi_pnf_param_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_param_response_t))
-        retLen = sizeof(nfapi_nr_pnf_param_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_request_t))
-        retLen = sizeof(nfapi_nr_pnf_config_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_response_t))
-        retLen = sizeof(nfapi_nr_pnf_config_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_request_t))
-        retLen = sizeof(nfapi_nr_pnf_start_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_response_t))
-        retLen = sizeof(nfapi_nr_pnf_start_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_request_t))
-        retLen = sizeof(nfapi_nr_pnf_stop_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_response_t))
-        retLen = sizeof(nfapi_nr_pnf_stop_response_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_param_request_scf_t))
-        retLen = sizeof(nfapi_nr_param_request_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_param_response_scf_t))
-        retLen = sizeof(nfapi_nr_param_response_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_config_request_scf_t))
-        retLen = sizeof(nfapi_nr_config_request_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_config_response_scf_t))
-        retLen = sizeof(nfapi_nr_config_response_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-      if (unpackedBufLen >= sizeof( nfapi_nr_start_request_scf_t))
-        retLen = sizeof( nfapi_nr_start_request_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_nr_start_response_scf_t))
-        retLen = sizeof(nfapi_nr_start_response_scf_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
-        retLen = sizeof(nfapi_stop_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
-        retLen = sizeof(nfapi_stop_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_PNF_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
-        retLen = sizeof(nfapi_pnf_param_request_t);
-
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t))
-        retLen = sizeof(nfapi_pnf_param_response_t);
-
-      break;
-
-    case NFAPI_PNF_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t))
-        retLen = sizeof(nfapi_pnf_config_request_t);
-
-      break;
-
-    case NFAPI_PNF_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t))
-        retLen = sizeof(nfapi_pnf_config_response_t);
-
-      break;
-
-    case NFAPI_PNF_START_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t))
-        retLen = sizeof(nfapi_pnf_start_request_t);
-
-      break;
-
-    case NFAPI_PNF_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t))
-        retLen = sizeof(nfapi_pnf_start_response_t);
-
-      break;
-
-    case NFAPI_PNF_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t))
-        retLen = sizeof(nfapi_pnf_stop_request_t);
-
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t))
-        retLen = sizeof(nfapi_pnf_stop_response_t);
-
-      break;
-
-    case NFAPI_PARAM_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_param_request_t))
-        retLen = sizeof(nfapi_param_request_t);
-
-      break;
-
-    case NFAPI_PARAM_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_param_response_t))
-        retLen = sizeof(nfapi_param_response_t);
-
-      break;
-
-    case NFAPI_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_config_request_t))
-        retLen = sizeof(nfapi_config_request_t);
-
-      break;
-
-    case NFAPI_CONFIG_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_config_response_t))
-        retLen = sizeof(nfapi_config_response_t);
-
-      break;
-
-    case NFAPI_START_REQUEST:
-      if (unpackedBufLen >= sizeof( nfapi_start_request_t))
-        retLen = sizeof( nfapi_start_request_t);
-
-      break;
-
-    case NFAPI_START_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_start_response_t))
-        retLen = sizeof(nfapi_start_response_t);
-
-      break;
-
-    case NFAPI_STOP_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
-        retLen = sizeof(nfapi_stop_request_t);
-
-      break;
-
-    case NFAPI_STOP_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
-        retLen = sizeof(nfapi_stop_response_t);
-
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_measurement_request_t))
-        retLen = sizeof(nfapi_measurement_request_t);
-
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_measurement_response_t))
-        retLen = sizeof(nfapi_measurement_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-
-// Main unpack functions - public
-
-int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  // process the header
-  return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-           pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-           pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-           pull16(&pReadPackedMessage, &pMessageHeader->spare, end) );
-}
-
-int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  uint8_t *ptr = pReadPackedMessage;
-  printf("\n Read message unpack: ");
-
-  while(ptr < end) {
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
-    // failed to read the header
-    return -1;
-  }
-
-  int result = -1;
-
-  if(check_nr_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
-    // the unpack buffer is not big enough for the struct
-    return -1;
-  }
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
-      result = unpack_nr_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
-      result = unpack_nr_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
-      result = unpack_nr_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
-      result = unpack_nr_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
-      result = unpack_nr_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
-      result = unpack_nr_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
-      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
-      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
-      result = unpack_nr_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
-      result = unpack_nr_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
-      result = unpack_nr_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
-      result = unpack_nr_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
-      result = unpack_nr_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
-      result = unpack_nr_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
-      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
-      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p4_p5_vendor_extension) {
-          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  return result;
-}
-
-int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
-  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  uint8_t *ptr = pReadPackedMessage;
-  printf("\n Read message unpack: ");
-
-  while(ptr < end) {
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-
-  printf("\n");
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
-    // failed to read the header
-    return -1;
-  }
-
-  int result = -1;
-
-  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
-    // the unpack buffer is not big enough for the struct
-    return -1;
-  }
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_PNF_PARAM_REQUEST:
-      result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_PARAM_RESPONSE:
-      result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_REQUEST:
-      result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_CONFIG_RESPONSE:
-      result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_START_REQUEST:
-      result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_START_RESPONSE:
-      result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_STOP_REQUEST:
-      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PNF_STOP_RESPONSE:
-      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PARAM_REQUEST:
-      result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_PARAM_RESPONSE:
-      result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_CONFIG_REQUEST:
-      result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_CONFIG_RESPONSE:
-      result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_START_REQUEST:
-      result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_START_RESPONSE:
-      result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_STOP_REQUEST:
-      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_STOP_RESPONSE:
-      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_REQUEST:
-      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    case NFAPI_MEASUREMENT_RESPONSE:
-      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p4_p5_vendor_extension) {
-          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  return result;
-}
-
+/*
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdint.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include "nfapi_nr_interface.h"
+#include "nfapi_nr_interface_scf.h"
+#include <debug.h>
+
+
+// Pack routines
+//TODO: Add pacl/unpack fns for uint32 and uint64
+static uint8_t pack_nr_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_request_t *request = (nfapi_nr_pnf_param_request_t *)msg;
+  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_pnf_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_request_t *request = (nfapi_pnf_param_request_t *)msg;
+  return pack_vendor_extension_tlv(request->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_pnf_param_general_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
+  return ( push8(value->nfapi_sync_mode, ppWritePackedMsg, end) &&
+           push8(value->location_mode, ppWritePackedMsg, end) &&
+           push16(value->location_coordinates_length, ppWritePackedMsg, end) &&
+           pusharray8(value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, ppWritePackedMsg, end) &&
+           push32(value->dl_config_timing, ppWritePackedMsg, end) &&
+           push32(value->tx_timing, ppWritePackedMsg, end) &&
+           push32(value->ul_config_timing, ppWritePackedMsg, end) &&
+           push32(value->hi_dci0_timing, ppWritePackedMsg, end) &&
+           push16(value->maximum_number_phys, ppWritePackedMsg, end) &&
+           push16(value->maximum_total_bandwidth, ppWritePackedMsg, end) &&
+           push8(value->maximum_total_number_dl_layers, ppWritePackedMsg, end) &&
+           push8(value->maximum_total_number_ul_layers, ppWritePackedMsg, end) &&
+           push8(value->shared_bands, ppWritePackedMsg, end) &&
+           push8(value->shared_pa, ppWritePackedMsg, end) &&
+           pushs16(value->maximum_total_power, ppWritePackedMsg, end) &&
+           pusharray8(value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rf_config_info_t *rf = (nfapi_rf_config_info_t *)elem;
+  return (push16(rf->rf_config_index, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_pnf_phy_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
+  return (  push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+            push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
+            packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
+            push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
+            packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
+            push16(phy->downlink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
+            push16(phy->uplink_channel_bandwidth_supported, ppWritePackedMsg, end) &&
+            push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
+            push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
+            push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
+            push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
+  return ( push16(value->number_of_phys, ppWritePackedMsg, end) &&
+           packarray(value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_info));
+}
+
+static uint8_t pack_pnf_rf_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
+  uint16_t rf_index = 0;
+
+  if(push16(value->number_of_rfs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  for(; rf_index < value->number_of_rfs; ++rf_index) {
+    if( !(push16(value->rf[rf_index].rf_config_index, ppWritePackedMsg, end) &&
+          push16(value->rf[rf_index].band, ppWritePackedMsg, end) &&
+          pushs16(value->rf[rf_index].maximum_transmit_power, ppWritePackedMsg, end) &&
+          pushs16(value->rf[rf_index].minimum_transmit_power, ppWritePackedMsg, end) &&
+          push8(value->rf[rf_index].number_of_antennas_suppported, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].minimum_downlink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].maximum_downlink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].minimum_uplink_frequency, ppWritePackedMsg, end) &&
+          push32(value->rf[rf_index].maximum_uplink_frequency, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t pack_pnf_phy_rel10_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
+  return(push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_7_supported, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_8_supported, ppWritePackedMsg, end) &&
+         push16(phy->two_antenna_ports_for_pucch, ppWritePackedMsg, end) &&
+         push16(phy->transmission_mode_9_supported, ppWritePackedMsg, end) &&
+         push16(phy->simultaneous_pucch_pusch, ppWritePackedMsg, end) &&
+         push16(phy->four_layer_tx_with_tm3_and_tm4, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel10_info));
+}
+
+static uint8_t pack_pnf_phy_rel11_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
+  return (push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->edpcch_supported, ppWritePackedMsg, end) &&
+          push16(phy->multi_ack_csi_reporting, ppWritePackedMsg, end) &&
+          push16(phy->pucch_tx_diversity, ppWritePackedMsg, end) &&
+          push16(phy->ul_comp_supported, ppWritePackedMsg, end) &&
+          push16(phy->transmission_mode_5_supported, ppWritePackedMsg, end ));
+}
+static uint8_t pack_pnf_phy_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel11_info));
+}
+static uint8_t pack_pnf_phy_rel12_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->csi_subframe_set, ppWritePackedMsg, end) &&
+          push16(phy->enhanced_4tx_codebook, ppWritePackedMsg, end) &&
+          push16(phy->drs_supported, ppWritePackedMsg, end) &&
+          push16(phy->ul_64qam_supported, ppWritePackedMsg, end) &&
+          push16(phy->transmission_mode_10_supported, ppWritePackedMsg, end) &&
+          push16(phy->alternative_bts_indices, ppWritePackedMsg, end));
+}
+static uint8_t pack_pnf_phy_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel12_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel12_info));
+}
+
+static uint8_t pack_pnf_phy_rel13_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->pucch_format4_supported, ppWritePackedMsg, end) &&
+          push16(phy->pucch_format5_supported, ppWritePackedMsg, end) &&
+          push16(phy->more_than_5_ca_support, ppWritePackedMsg, end) &&
+          push16(phy->laa_supported, ppWritePackedMsg, end) &&
+          push16(phy->laa_ending_in_dwpts_supported, ppWritePackedMsg, end) &&
+          push16(phy->laa_starting_in_second_slot_supported, ppWritePackedMsg, end) &&
+          push16(phy->beamforming_supported, ppWritePackedMsg, end) &&
+          push16(phy->csi_rs_enhancement_supported, ppWritePackedMsg, end) &&
+          push16(phy->drms_enhancement_supported, ppWritePackedMsg, end) &&
+          push16(phy->srs_enhancement_supported, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_pnf_phy_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_info));
+}
+
+static uint8_t pack_pnf_phy_rel13_nb_iot_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
+  return( push16(phy->phy_config_index, ppWritePackedMsg, end) &&
+          push16(phy->number_of_rfs, ppWritePackedMsg, end) &&
+          packarray(phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, ppWritePackedMsg, end, &pack_rf_config_info) &&
+          push16(phy->number_of_rf_exclusions, ppWritePackedMsg, end) &&
+          packarray(phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, ppWritePackedMsg, end, &pack_rf_config_info) &&
+          push8(phy->number_of_dl_layers_supported, ppWritePackedMsg, end) &&
+          push8(phy->number_of_ul_layers_supported, ppWritePackedMsg, end) &&
+          push16(phy->maximum_3gpp_release_supported, ppWritePackedMsg, end) &&
+          push8(phy->nmm_modes_supported, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
+  return (push16(value->number_of_phys, ppWritePackedMsg, end) &&
+          packarray(value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_info));
+}
+/*
+static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
+{
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t*)msg;
+
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+      pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+      pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+      pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+*/
+static uint8_t pack_nr_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
+  return (push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, ppWritePackedMsg, end, &pack_pnf_param_general_value) &&
+          pack_tlv(NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, ppWritePackedMsg, end, &pack_pnf_phy_value) &&
+          pack_tlv(NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, ppWritePackedMsg, end, &pack_pnf_rf_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, ppWritePackedMsg, end, &pack_pnf_phy_rel10_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, ppWritePackedMsg, end, &pack_pnf_phy_rel11_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, ppWritePackedMsg, end, &pack_pnf_phy_rel12_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, ppWritePackedMsg, end, &pack_pnf_phy_rel13_value) &&
+          pack_tlv(NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, ppWritePackedMsg, end, &pack_pnf_phy_rel13_nb_iot_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_phy_rf_config_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
+  return (push16(rf->phy_id, ppWritePackedMsg, end) &&
+          push16(rf->phy_config_index, ppWritePackedMsg, end) &&
+          push16(rf->rf_config_index, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
+  return(push16(value->number_phy_rf_config_info, ppWritePackedMsg, end) &&
+         packarray(value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, ppWritePackedMsg, end, &pack_phy_rf_config_info));
+}
+
+static uint8_t pack_nr_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
+  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
+          //push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_pnf_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
+  return (pack_tlv(NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, ppWritePackedMsg, end, &pack_pnf_phy_rf_config_value) &&
+          push8(pNfapiMsg->num_tlvs,ppWritePackedMsg,end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_nr_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_pnf_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_nr_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_nr_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_stop_request_t *pNfapiMsg = (nfapi_nr_pnf_stop_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+
+static uint8_t pack_pnf_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
+  return ( pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+static uint8_t pack_nr_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_stop_response_t *pNfapiMsg = (nfapi_nr_pnf_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+
+static uint8_t pack_pnf_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_param_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
+  return (pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_uint32_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
+  return push32(value->value, ppWritePackedMsg, end);
+}
+
+static uint8_t unpack_uint32_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint32_tlv_t *value = (nfapi_uint32_tlv_t *)tlv;
+  return pull32(ppReadPackedMsg, &value->value, end);
+}
+
+
+static uint8_t pack_uint16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
+  return push16(value->value, ppWritePackedMsg, end);
+}
+
+static uint8_t unpack_uint16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint16_tlv_t *value = (nfapi_uint16_tlv_t *)tlv;
+  return pull16(ppReadPackedMsg, &value->value, end);
+}
+
+static uint8_t pack_int16_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
+  return pushs16(value->value, ppWritePackedMsg, end);
+}
+
+static uint8_t unpack_int16_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_int16_tlv_t *value = (nfapi_int16_tlv_t *)tlv;
+  return pulls16(ppReadPackedMsg, &value->value, end);
+}
+
+static uint8_t pack_uint8_tlv_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
+  return push8(value->value, ppWritePackedMsg, end);
+}
+static uint8_t unpack_uint8_tlv_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_uint8_tlv_t *value = (nfapi_uint8_tlv_t *)tlv;
+  return pull8(ppReadPackedMsg, &value->value, end);
+}
+
+static uint8_t pack_ipv4_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pusharray8(value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, ppWritePackedMsg, end);
+}
+static uint8_t unpack_ipv4_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV4_ADDRESS_LENGTH, NFAPI_IPV4_ADDRESS_LENGTH, end);
+}
+static uint8_t pack_ipv6_address_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ipv6_address_t *value = (nfapi_ipv6_address_t *)tlv;
+  return pusharray8(value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, ppWritePackedMsg, end);
+}
+static uint8_t unpack_ipv6_address_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ipv4_address_t *value = (nfapi_ipv4_address_t *)tlv;
+  return pullarray8(ppReadPackedMsg, value->address, NFAPI_IPV6_ADDRESS_LENGTH, NFAPI_IPV6_ADDRESS_LENGTH, end);
+}
+
+static uint8_t pack_rf_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
+  return ( push16(value->number_rf_bands, ppWritePackedMsg, end) &&
+           pusharray16(value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, ppWritePackedMsg, end));
+}
+static uint8_t unpack_rf_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rf_bands_t *value = (nfapi_rf_bands_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_rf_bands, end) &&
+           pullarray16(ppReadPackedMsg, value->rf_band, NFAPI_MAX_NUM_RF_BANDS, value->number_rf_bands, end));
+}
+
+static uint8_t pack_nmm_frequency_bands_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
+  return( push16(value->number_of_rf_bands, ppWritePackedMsg, end) &&
+          pusharray16(value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, ppWritePackedMsg, end));
+}
+static uint8_t unpack_nmm_frequency_bands_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nmm_frequency_bands_t *value = (nfapi_nmm_frequency_bands_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_rf_bands, end) &&
+           pullarray16(ppReadPackedMsg, value->bands, NFAPI_MAX_NMM_FREQUENCY_BANDS, value->number_of_rf_bands, end));
+}
+static uint8_t pack_embms_mbsfn_config_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_embms_mbsfn_config_t *value = (nfapi_embms_mbsfn_config_t *)tlv;
+  return ( push16(value->num_mbsfn_config, ppWritePackedMsg, end) &&
+           pusharray16(value->radioframe_allocation_period, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharray16(value->radioframe_allocation_offset, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharray8(value->fourframes_flag, 8,value->num_mbsfn_config,ppWritePackedMsg, end) &&
+           pusharrays32(value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, ppWritePackedMsg, end));
+}
+// static uint8_t unpack_embms_mbsfn_config_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t* end)
+// {
+//     nfapi_embms_mbsfn_config_t* value = (nfapi_embms_mbsfn_config_t*)tlv;
+
+//     return ( pull16(ppReadPackedMsg, &value->num_mbsfn_config, end) &&
+//              pull16(ppReadPackedMsg, &value->radioframe_allocation_period, end) &&
+//              pull16(ppReadPackedMsg, &value->radioframe_allocation_offset, end) &&
+//              pull8(ppReadPackedMsg, &value->fourframes_flag, end) &&
+//                      pullarrays32(ppReadPackedMsg, value->mbsfn_subframeconfig, 8, value->num_mbsfn_config, end));
+// }
+
+static uint8_t pack_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
+  return( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_L1_STATUS_PHY_STATE_TAG,  &pNfapiMsg->l1_status.phy_state, ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          // Do we check the phy state and then just fill those sepecified, however
+          // we do not know the duplex mode, so just attempt to pack all and assumme
+          // that the callee has set the right tlvs
+          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_bandwidth_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.dl_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &(pNfapiMsg->phy_capabilities.ul_modulation_support), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.phy_antenna_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &(pNfapiMsg->phy_capabilities.mbsfn_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          // laa capability
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value)&&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end,&pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDX_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_idx), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_AREA_IDR9_TAG, &(pNfapiMsg->embms_sib13_config.mbsfn_area_id_r9), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_EMBMS_MBSFN_CONFIG_TAG, &(pNfapiMsg->embms_mbsfn_config), ppWritePackedMsg, end, &pack_embms_mbsfn_config_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_PERIOD_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_RADIOFRAME_ALLOCATION_OFFSET_TAG, &(pNfapiMsg->fembms_config.radioframe_allocation_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_FLAG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_config_flag), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_FEMBMS_CONFIG_NON_MBSFN_SUBFRAMECONFIG_TAG, &(pNfapiMsg->fembms_config.non_mbsfn_subframeconfig), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+          pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_param_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  printf("\nRUNNING pack_param_response\n");
+  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
+  return (push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG, &(pNfapiMsg->pusch_param.uci_only_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG, &(pNfapiMsg->pusch_param.pusch_frequency_hopping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_config_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_max_len), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG, &(pNfapiMsg->pusch_param.pusch_cbg), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pusch_param.pusch_mapping_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pusch_param.pusch_allocation_types), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG, &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG, &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG, &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG, &(pNfapiMsg->pusch_param.supported_modulation_order_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG, &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG, &(pNfapiMsg->pusch_param.dfts_ofdm_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG, &(pNfapiMsg->pusch_param.pusch_aggregation_factor), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_long_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG, &(pNfapiMsg->prach_param.prach_short_formats), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG, &(pNfapiMsg->prach_param.prach_restricted_sets), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG, &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG, &(pNfapiMsg->measurement_param.rssi_measurement_support), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          // config:
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
+  return ( push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+           // Do we check the phy state and then just fill those sepecified, however
+           // we do not know the duplex mode, so just attempt to pack all and assumme
+           // that the callee has set the right tlvs
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &(pNfapiMsg->subframe_config.duplex_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &(pNfapiMsg->subframe_config.pcfich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_PB_TAG, &(pNfapiMsg->subframe_config.pb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.dl_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &(pNfapiMsg->subframe_config.ul_cyclic_prefix_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.dl_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &(pNfapiMsg->rf_config.ul_channel_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &(pNfapiMsg->rf_config.reference_signal_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.tx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &(pNfapiMsg->rf_config.rx_antenna_ports), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &(pNfapiMsg->phich_config.phich_resource), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &(pNfapiMsg->phich_config.phich_duration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &(pNfapiMsg->phich_config.phich_power_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &(pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &(pNfapiMsg->sch_config.physical_cell_id), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->prach_config.configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->prach_config.zero_correlation_zone_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &(pNfapiMsg->prach_config.high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->prach_config.frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &(pNfapiMsg->pusch_config.hopping_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &(pNfapiMsg->pusch_config.hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &(pNfapiMsg->pusch_config.number_of_subbands), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &(pNfapiMsg->pucch_config.delta_pucch_shift), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &(pNfapiMsg->pucch_config.n_cqi_rb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &(pNfapiMsg->pucch_config.n_an_cs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &(pNfapiMsg->pucch_config.n1_pucch_an), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.bandwidth_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &(pNfapiMsg->srs_config.max_up_pts), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &(pNfapiMsg->srs_config.srs_subframe_configuration), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &(pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &(pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &(pNfapiMsg->uplink_reference_signal_config.group_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &(pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_pdsch), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &(pNfapiMsg->laa_config.ed_threshold_lbt_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &(pNfapiMsg->laa_config.pd_threshold), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &(pNfapiMsg->laa_config.multi_carrier_type), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &(pNfapiMsg->laa_config.multi_carrier_tx), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &(pNfapiMsg->laa_config.multi_carrier_freeze), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_antenna_ports_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &(pNfapiMsg->laa_config.tx_power_drs), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &(pNfapiMsg->emtc_config.pbch_repetitions_enable_r13), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_catm_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &(pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &(pNfapiMsg->emtc_config.prach_catm_high_speed_flag), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity), ppWritePackedMsg, end,
+                    &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &(pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &(pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &(pNfapiMsg->tdd_frame_structure_config.subframe_assignment), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &(pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &(pNfapiMsg->l23_config.data_report_mode), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_L23_CONFIG_SFNSF_TAG, &(pNfapiMsg->l23_config.sfnsf), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+           pack_tlv(NFAPI_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.dl_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_PHY_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &(pNfapiMsg->nfapi_config.max_transmit_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_EARFCN_TAG, &(pNfapiMsg->nfapi_config.earfcn), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_umts_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &(pNfapiMsg->nfapi_config.nmm_lte_frequency_bands), ppWritePackedMsg, end, &pack_nmm_frequency_bands_value) &&
+           pack_tlv(NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &(pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+static uint8_t pack_nr_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config)
+{
+
+	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
+
+	for(int i = 0; i<40; i++){ //packing tdd slot config
+		for(int symbol = 0; symbol<14;symbol++){
+			push8(pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, ppWritePackedMsg,end);
+		}
+	}
+
+	return (push8(pNfapiMsg->num_tlv, ppWritePackedMsg, end) &&
+		    pack_tlv(NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.dl_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_DL_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.dl_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.dl_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_DL_K0_TAG, &(pNfapiMsg->carrier_config.dl_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_RX_ANT_TAG, &(pNfapiMsg->carrier_config.num_rx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_TX_ANT_TAG, &(pNfapiMsg->carrier_config.num_tx_ant), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG, &(pNfapiMsg->carrier_config.ul_grid_size[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UL_K0_TAG, &(pNfapiMsg->carrier_config.ul_k0[1]), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG, &(pNfapiMsg->carrier_config.uplink_bandwidth), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG, &(pNfapiMsg->carrier_config.uplink_frequency), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			
+			pack_tlv(NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG, &(pNfapiMsg->cell_config.frame_duplex_type), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_PHY_CELL_ID_TAG, &(pNfapiMsg->cell_config.phy_cell_id), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			
+			pack_tlv(NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG, &(pNfapiMsg->prach_config.prach_sequence_length), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG, &(pNfapiMsg->prach_config.restricted_set_config), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_PER_RACH_TAG, &(pNfapiMsg->prach_config.ssb_per_rach), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG, &(pNfapiMsg->prach_config.prach_sub_c_spacing), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_K1_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+            pack_tlv(NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG, &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+
+			pack_tlv(NFAPI_NR_CONFIG_SCS_COMMON_TAG, &(pNfapiMsg->ssb_config.scs_common), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG, &(pNfapiMsg->ssb_config.ss_pbch_power), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_BETA_PSS_TAG, &(pNfapiMsg->ssb_table.beta_pss), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_MIB_TAG, &(pNfapiMsg->ssb_table.MIB), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_MASK_TAG, &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask), ppWritePackedMsg, end, &pack_uint32_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG, &(pNfapiMsg->ssb_table.ssb_offset_point_a), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_PERIOD_TAG, &(pNfapiMsg->ssb_table.ssb_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG, &(pNfapiMsg->ssb_table.ssb_subcarrier_offset), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+			pack_tlv(NFAPI_NR_CONFIG_TDD_PERIOD_TAG, &(pNfapiMsg->tdd_table.tdd_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_pnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4), ppWritePackedMsg, end, &pack_ipv4_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6), ppWritePackedMsg, end, &pack_ipv6_address_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &(pNfapiMsg->nfapi_config.p7_vnf_port), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+			//pack_tlv(NFAPI_NR_NFAPI_RF_BANDS_TAG, &(pNfapiMsg->nfapi_config.rf_bands), ppWritePackedMsg, end, &pack_rf_bands_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_MODE_TAG, &(pNfapiMsg->nfapi_config.timing_info_mode), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_TIMING_INFO_PERIOD_TAG, &(pNfapiMsg->nfapi_config.timing_info_period), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			pack_tlv(NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &(pNfapiMsg->nfapi_config.timing_window), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+			//pack_tlv(NFAPI_NR_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &(pNfapiMsg->nfapi_config.ul_ue_per_sf), ppWritePackedMsg, end, &pack_uint8_tlv_value) &&
+
+			pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
+  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_config_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
+  return ( push8(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_nr_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_request_scf_t *pNfapiMsg = (nfapi_nr_start_request_scf_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_start_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_request_t *pNfapiMsg = (nfapi_start_request_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_nr_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_start_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end ) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+
+static uint8_t pack_stop_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
+  return pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+}
+
+static uint8_t pack_stop_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
+  return ( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+           pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config) );
+}
+
+static uint8_t pack_measurement_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
+  return( pack_tlv(NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &(pNfapiMsg->dl_rs_tx_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &(pNfapiMsg->received_interference_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &(pNfapiMsg->thermal_noise_power), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_recevied_interference_power_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
+  return  ( push16(value->number_of_resource_blocks, ppWritePackedMsg, end) &&
+            pusharrays16(value->received_interference_power, NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_measurement_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
+  return( push32(pNfapiMsg->error_code, ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &(pNfapiMsg->dl_rs_tx_power_measurement), ppWritePackedMsg, end, &pack_int16_tlv_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &(pNfapiMsg->received_interference_power_measurement), ppWritePackedMsg, end,
+                   &pack_recevied_interference_power_measurement_value) &&
+          pack_tlv(NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &(pNfapiMsg->thermal_noise_power_measurement), ppWritePackedMsg, end, &pack_uint16_tlv_value) &&
+          pack_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  uint8_t result = 0;
+
+  // look for the specific message
+  switch (header->message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      result = pack_nr_pnf_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = pack_nr_pnf_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      result = pack_nr_pnf_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      result = pack_nr_pnf_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      result = pack_nr_pnf_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      result = pack_nr_pnf_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      result = pack_nr_pnf_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = pack_nr_pnf_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      result = pack_nr_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      result = pack_nr_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      result = pack_nr_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      result = pack_nr_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      result = pack_nr_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      result = pack_nr_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      result = pack_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      result = pack_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    default: {
+      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
+      }
+    }
+    break;
+  }
+
+  return result;
+}
+
+
+static uint8_t pack_p5_message_body(nfapi_p4_p5_message_header_t *header, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
+  uint8_t result = 0;
+
+  // look for the specific message
+  switch (header->message_id) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      result = pack_pnf_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = pack_pnf_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      result = pack_pnf_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      result = pack_pnf_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      result = pack_pnf_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      result = pack_pnf_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      result = pack_pnf_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = pack_pnf_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      result = pack_param_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      result = pack_param_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      result = pack_config_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      result = pack_config_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_START_REQUEST:
+      result = pack_start_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_START_RESPONSE:
+      result = pack_start_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      result = pack_stop_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      result = pack_stop_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = pack_measurement_request(header, ppWritePackedMsg, end, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = pack_measurement_response(header, ppWritePackedMsg, end, config);
+      break;
+
+    default: {
+      if(header->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          header->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p4_p5_vendor_extension) {
+          result = (config->pack_p4_p5_vendor_extension)(header, ppWritePackedMsg, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, header->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, header->message_id);
+      }
+    }
+    break;
+  }
+
+  return result;
+}
+
+
+// helper function for message length calculation -
+// takes the pointers to the start of message to end of message
+
+static uint32_t get_packed_msg_len(uintptr_t msgHead, uintptr_t msgEnd) {
+  if (msgEnd < msgHead) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "get_packed_msg_len: Error in pointers supplied %d, %d\n", msgHead, msgEnd);
+    return 0;
+  }
+
+  return (msgEnd - msgHead);
+}
+
+// Main pack function - public
+int nfapi_nr_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // pack the message
+  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(0, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
+      pack_nr_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
+    // check for a valid message length
+    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+      return -1;
+    } else {
+      packedMsgLen16 = (uint16_t)packedMsgLen;
+    }
+
+    // Update the message length in the header
+    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
+      return -1;
+
+    // return the packed length
+    return (packedMsgLen);
+  } else {
+    // Failed to pack the meassage
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
+    return -1;
+  }
+}
+
+int nfapi_p5_message_pack(void *pMessageBuf, uint32_t messageBufLen, void *pPackedBuf, uint32_t packedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackMessageEnd = pPackedBuf + packedBufLen;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint32_t packedMsgLen;
+  uint16_t packedMsgLen16;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  // pack the message
+  if(push16(pMessageHeader->phy_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->message_id, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, pPackMessageEnd) &&
+      push16(pMessageHeader->spare, &pWritePackedMessage, pPackMessageEnd) &&
+      pack_p5_message_body(pMessageHeader, &pWritePackedMessage, pPackMessageEnd, config)) {
+    // check for a valid message length
+    packedMsgLen = get_packed_msg_len((uintptr_t)pPackedBuf, (uintptr_t)pWritePackedMessage);
+
+    if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+      return -1;
+    } else {
+      packedMsgLen16 = (uint16_t)packedMsgLen;
+    }
+
+    // Update the message length in the header
+    if(!push16(packedMsgLen16, &pPackedLengthField, pPackMessageEnd))
+      return -1;
+
+    // return the packed length
+    return (packedMsgLen);
+  } else {
+    // Failed to pack the meassage
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 Failed to pack message\n");
+    return -1;
+  }
+}
+
+
+
+// Unpack routines
+
+
+static uint8_t  unpack_nr_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_request_t *pNfapiMsg = (nfapi_nr_pnf_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t  unpack_pnf_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_request_t *pNfapiMsg = (nfapi_pnf_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_pnf_param_general_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_param_general_t *value = (nfapi_pnf_param_general_t *)tlv;
+  return( pull8(ppReadPackedMsg, &value->nfapi_sync_mode, end) &&
+          pull8(ppReadPackedMsg, &value->location_mode, end) &&
+          pull16(ppReadPackedMsg, &value->location_coordinates_length, end) &&
+          pullarray8(ppReadPackedMsg, value->location_coordinates, NFAPI_PNF_PARAM_GENERAL_LOCATION_LENGTH, value->location_coordinates_length, end) &&
+          pull32(ppReadPackedMsg, &value->dl_config_timing, end) &&
+          pull32(ppReadPackedMsg, &value->tx_timing, end) &&
+          pull32(ppReadPackedMsg, &value->ul_config_timing, end) &&
+          pull32(ppReadPackedMsg, &value->hi_dci0_timing, end) &&
+          pull16(ppReadPackedMsg, &value->maximum_number_phys, end) &&
+          pull16(ppReadPackedMsg, &value->maximum_total_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &value->maximum_total_number_dl_layers, end) &&
+          pull8(ppReadPackedMsg, &value->maximum_total_number_ul_layers, end) &&
+          pull8(ppReadPackedMsg, &value->shared_bands, end) &&
+          pull8(ppReadPackedMsg, &value->shared_pa, end) &&
+          pulls16(ppReadPackedMsg, &value->maximum_total_power, end) &&
+          pullarray8(ppReadPackedMsg, value->oui, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, NFAPI_PNF_PARAM_GENERAL_OUI_LENGTH, end));
+}
+
+static uint8_t unpack_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rf_config_info_t *info = (nfapi_rf_config_info_t *)elem;
+  return pull16(ppReadPackedMsg, &info->rf_config_index, end);
+}
+
+static uint8_t unpack_pnf_phy_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_info_t *phy = (nfapi_pnf_phy_info_t *)elem;
+  return ( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+           pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
+           unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
+           pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
+           unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
+           pull16(ppReadPackedMsg, &phy->downlink_channel_bandwidth_supported, end) &&
+           pull16(ppReadPackedMsg, &phy->uplink_channel_bandwidth_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
+           pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
+           pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
+}
+
+
+static uint8_t unpack_pnf_phy_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_t *value = (nfapi_pnf_phy_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_info));
+}
+
+static uint8_t unpack_pnf_rf_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_info_t *rf = (nfapi_pnf_rf_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &rf->rf_config_index, end) &&
+          pull16(ppReadPackedMsg, &rf->band, end) &&
+          pulls16(ppReadPackedMsg, &rf->maximum_transmit_power, end) &&
+          pulls16(ppReadPackedMsg, &rf->minimum_transmit_power, end) &&
+          pull8(ppReadPackedMsg, &rf->number_of_antennas_suppported, end) &&
+          pull32(ppReadPackedMsg, &rf->minimum_downlink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->maximum_downlink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->minimum_uplink_frequency, end) &&
+          pull32(ppReadPackedMsg, &rf->maximum_uplink_frequency, end));
+}
+static uint8_t unpack_pnf_rf_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_rf_t *value = (nfapi_pnf_rf_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_rfs, end) &&
+           unpackarray(ppReadPackedMsg, value->rf, sizeof(nfapi_pnf_rf_info_t), NFAPI_MAX_PNF_RF, value->number_of_rfs, end, &unpack_pnf_rf_info));
+}
+
+static uint8_t unpack_pnf_phy_rel10_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_info_t *phy = (nfapi_pnf_phy_rel10_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_7_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_8_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->two_antenna_ports_for_pucch, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_9_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->simultaneous_pucch_pusch, end) &&
+          pull16(ppReadPackedMsg, &phy->four_layer_tx_with_tm3_and_tm4, end));
+}
+static uint8_t unpack_pnf_phy_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel10_t *value = (nfapi_pnf_phy_rel10_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel10_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel10_info));
+}
+
+
+static uint8_t unpack_pnf_phy_rel11_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_info_t *phy = (nfapi_pnf_phy_rel11_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->edpcch_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->multi_ack_csi_reporting, end ) &&
+          pull16(ppReadPackedMsg, &phy->pucch_tx_diversity, end) &&
+          pull16(ppReadPackedMsg, &phy->ul_comp_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_5_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel11_t *value = (nfapi_pnf_phy_rel11_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel11_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel11_info));
+}
+
+static uint8_t unpack_phy_phy_rel12_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_info_t *phy = (nfapi_pnf_phy_rel12_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->csi_subframe_set, end) &&
+          pull16(ppReadPackedMsg, &phy->enhanced_4tx_codebook, end) &&
+          pull16(ppReadPackedMsg, &phy->drs_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->ul_64qam_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->transmission_mode_10_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->alternative_bts_indices, end));
+}
+
+static uint8_t unpack_pnf_phy_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel12_t *value = (nfapi_pnf_phy_rel12_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+          unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel12_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_phy_phy_rel12_info));
+}
+
+static uint8_t unpack_pnf_phy_rel13_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_info_t *phy = (nfapi_pnf_phy_rel13_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->pucch_format4_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->pucch_format5_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->more_than_5_ca_support, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_ending_in_dwpts_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->laa_starting_in_second_slot_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->beamforming_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->csi_rs_enhancement_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->drms_enhancement_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->srs_enhancement_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_t *value = (nfapi_pnf_phy_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_info));
+}
+
+static uint8_t unpack_pnf_phy_rel13_nb_info_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_info_t *phy = (nfapi_pnf_phy_rel13_nb_iot_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &phy->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &phy->number_of_rfs, end) &&
+          unpackarray(ppReadPackedMsg, phy->rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rfs, end, &unpack_rf_config_info) &&
+          pull16(ppReadPackedMsg, &phy->number_of_rf_exclusions, end) &&
+          unpackarray(ppReadPackedMsg, phy->excluded_rf_config, sizeof(nfapi_rf_config_info_t), NFAPI_MAX_PNF_PHY_RF_CONFIG, phy->number_of_rf_exclusions, end, &unpack_rf_config_info) &&
+          pull8(ppReadPackedMsg, &phy->number_of_dl_layers_supported, end) &&
+          pull8(ppReadPackedMsg, &phy->number_of_ul_layers_supported, end) &&
+          pull16(ppReadPackedMsg, &phy->maximum_3gpp_release_supported, end) &&
+          pull8(ppReadPackedMsg, &phy->nmm_modes_supported, end));
+}
+
+static uint8_t unpack_pnf_phy_rel13_nb_iot_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rel13_nb_iot_t *value = (nfapi_pnf_phy_rel13_nb_iot_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_phys, end) &&
+           unpackarray(ppReadPackedMsg, value->phy, sizeof(nfapi_pnf_phy_rel13_nb_iot_info_t), NFAPI_MAX_PNF_PHY, value->number_of_phys, end, &unpack_pnf_phy_rel13_nb_info_info));
+}
+
+static uint8_t unpack_nr_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_param_response_t *pNfapiMsg = (nfapi_nr_pnf_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
+    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+
+static uint8_t unpack_pnf_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_param_response_t *pNfapiMsg = (nfapi_pnf_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PARAM_GENERAL_TAG, &pNfapiMsg->pnf_param_general, &unpack_pnf_param_general_value},
+    { NFAPI_PNF_PHY_TAG, &pNfapiMsg->pnf_phy, &unpack_pnf_phy_value},
+    { NFAPI_PNF_RF_TAG, &pNfapiMsg->pnf_rf, &unpack_pnf_rf_value},
+    { NFAPI_PNF_PHY_REL10_TAG, &pNfapiMsg->pnf_phy_rel10, &unpack_pnf_phy_rel10_value},
+    { NFAPI_PNF_PHY_REL11_TAG, &pNfapiMsg->pnf_phy_rel11, &unpack_pnf_phy_rel11_value},
+    { NFAPI_PNF_PHY_REL12_TAG, &pNfapiMsg->pnf_phy_rel12, &unpack_pnf_phy_rel12_value},
+    { NFAPI_PNF_PHY_REL13_TAG, &pNfapiMsg->pnf_phy_rel13, &unpack_pnf_phy_rel13_value},
+    { NFAPI_PNF_PHY_REL13_NB_IOT_TAG, &pNfapiMsg->pnf_phy_rel13_nb_iot, &unpack_pnf_phy_rel13_nb_iot_value},
+
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_phy_rf_config_info(void *elem, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_phy_rf_config_info_t *rf = (nfapi_phy_rf_config_info_t *)elem;
+  return( pull16(ppReadPackedMsg, &rf->phy_id, end) &&
+          pull16(ppReadPackedMsg, &rf->phy_config_index, end) &&
+          pull16(ppReadPackedMsg, &rf->rf_config_index, end));
+}
+
+static uint8_t unpack_pnf_phy_rf_config_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_pnf_phy_rf_config_t *value = (nfapi_pnf_phy_rf_config_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_phy_rf_config_info, end) &&
+           unpackarray(ppReadPackedMsg, value->phy_rf_config, sizeof(nfapi_phy_rf_config_info_t), NFAPI_MAX_PHY_RF_INSTANCES, value->number_phy_rf_config_info, end, &unpack_phy_rf_config_info));
+}
+
+static uint8_t unpack_nr_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_request_t *pNfapiMsg = (nfapi_nr_pnf_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+}
+
+
+
+static uint8_t unpack_pnf_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_request_t *pNfapiMsg = (nfapi_pnf_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_PNF_PHY_RF_TAG, &pNfapiMsg->pnf_phy_rf_config, &unpack_pnf_phy_rf_config_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension);
+}
+
+
+static uint8_t unpack_nr_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_config_response_t *pNfapiMsg = (nfapi_nr_pnf_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_pnf_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_config_response_t *pNfapiMsg = (nfapi_pnf_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_request_t *pNfapiMsg = (nfapi_nr_pnf_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_pnf_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_request_t *pNfapiMsg = (nfapi_pnf_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_start_response_t *pNfapiMsg = (nfapi_pnf_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_pnf_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_pnf_start_response_t *pNfapiMsg = (nfapi_nr_pnf_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end ) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+
+static uint8_t unpack_pnf_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_request_t *pNfapiMsg = (nfapi_pnf_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_pnf_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_pnf_stop_response_t *pNfapiMsg = (nfapi_pnf_stop_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_request_t *pNfapiMsg = (nfapi_param_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_param_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_request_scf_t *pNfapiMsg = (nfapi_nr_param_request_scf_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_param_response_t *pNfapiMsg = (nfapi_param_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_L1_STATUS_PHY_STATE_TAG, &pNfapiMsg->l1_status.phy_state, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHY_CAPABILITIES_DL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_bandwidth_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_UL_BANDWIDTH_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_bandwidth_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_DL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.dl_modulation_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_UL_MODULATION_SUPPORT_TAG, &pNfapiMsg->phy_capabilities.ul_modulation_support, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_PHY_ANTENNA_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.phy_antenna_capability, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_RELEASE_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.release_capability, &unpack_uint16_tlv_value},
+    { NFAPI_PHY_CAPABILITIES_MBSFN_CAPABILITY_TAG, &pNfapiMsg->phy_capabilities.mbsfn_capability, &unpack_uint16_tlv_value},
+
+    { NFAPI_LAA_CAPABILITY_LAA_SUPPORT_TAG, &pNfapiMsg->laa_capability.laa_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_PD_SENSING_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.pd_sensing_lbt_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_MULTI_CARRIER_LBT_SUPPORT_TAG, &pNfapiMsg->laa_capability.multi_carrier_lbt_support, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CAPABILITY_PARTIAL_SF_SUPPORT_TAG, &pNfapiMsg->laa_capability.partial_sf_support, &unpack_uint16_tlv_value},
+
+    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
+
+    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
+
+    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
+
+    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
+
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
+
+    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
+
+    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
+    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
+
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
+    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+
+  };
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_param_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_param_response_scf_t *pNfapiMsg = (nfapi_nr_param_response_scf_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_NR_PARAM_TLV_RELEASE_CAPABILITY_TAG, &(pNfapiMsg->cell_param.release_capability), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PHY_STATE_TAG, &(pNfapiMsg->cell_param.phy_state),&unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_DL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_dl_config), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SKIP_BLANK_UL_CONFIG_TAG, &(pNfapiMsg->cell_param.skip_blank_ul_config), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_NUM_CONFIG_TLVS_TO_REPORT_TAG, &(pNfapiMsg->cell_param.num_config_tlvs_to_report ), &unpack_uint16_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_CYCLIC_PREFIX_TAG, &(pNfapiMsg->carrier_param.cyclic_prefix), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_DL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_dl), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_DL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_dl), &unpack_uint16_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_SUBCARRIER_SPACINGS_UL_TAG, &(pNfapiMsg->carrier_param.supported_subcarrier_spacings_ul), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_BANDWIDTH_UL_TAG, &(pNfapiMsg->carrier_param.supported_bandwidth_ul), &unpack_uint16_tlv_value},
+
+
+    { NFAPI_NR_PARAM_TLV_CCE_MAPPING_TYPE_TAG, &(pNfapiMsg->pdcch_param.cce_mapping_type), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_CORESET_OUTSIDE_FIRST_3_OFDM_SYMS_OF_SLOT_TAG, &(pNfapiMsg->pdcch_param.coreset_outside_first_3_of_ofdm_syms_of_slot), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRECODER_GRANULARITY_CORESET_TAG, &(pNfapiMsg->pdcch_param.coreset_precoder_granularity_coreset), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDCCH_MU_MIMO_TAG, &(pNfapiMsg->pdcch_param.pdcch_mu_mimo), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDCCH_PRECODER_CYCLING_TAG, &(pNfapiMsg->pdcch_param.pdcch_precoder_cycling), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDCCHS_PER_SLOT_TAG, &(pNfapiMsg->pdcch_param.max_pdcch_per_slot), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PUCCH_FORMATS_TAG, &(pNfapiMsg->pucch_param.pucch_formats), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PUCCHS_PER_SLOT_TAG, &(pNfapiMsg->pucch_param.max_pucchs_per_slot), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PDSCH_MAPPING_TYPE_TAG, &(pNfapiMsg->pdsch_param.pdsch_mapping_type), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_ALLOCATION_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_allocation_types), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_VRB_TO_PRB_MAPPING_TAG, &(pNfapiMsg->pdsch_param.pdsch_vrb_to_prb_mapping), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_CBG_TAG, &(pNfapiMsg->pdsch_param.pdsch_cbg), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_CONFIG_TYPES_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_config_types), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_MAX_LENGTH_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_max_length), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DMRS_ADDITIONAL_POS_TAG, &(pNfapiMsg->pdsch_param.pdsch_dmrs_additional_pos), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDSCH_S_YBS_PER_SLOT_TAG, &(pNfapiMsg->pdsch_param.max_pdsch_tbs_per_slot), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_PDSCH_TAG, &(pNfapiMsg->pdsch_param.max_number_mimo_layers_pdsch), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_DL_TAG, &(pNfapiMsg->pdsch_param.max_mu_mimo_users_dl), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_DATA_IN_DMRS_SYMBOLS_TAG, &(pNfapiMsg->pdsch_param.pdsch_data_in_dmrs_symbols), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PREMPTION_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.premption_support), &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PDSCH_NON_SLOT_SUPPORT_TAG, &(pNfapiMsg->pdsch_param.pdsch_non_slot_support), &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_UCI_MUX_ULSCH_IN_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_mux_ulsch_in_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_UCI_ONLY_PUSCH_TAG,  &(pNfapiMsg->pusch_param.uci_only_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_FREQUENCY_HOPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_frequency_hopping),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_CONFIG_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_config_types),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_MAX_LEN_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_max_len),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_DMRS_ADDITIONAL_POS_TAG,  &(pNfapiMsg->pusch_param.pusch_dmrs_additional_pos),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_CBG_TAG,  &(pNfapiMsg->pusch_param.pusch_cbg),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_MAPPING_TYPE_TAG,  &(pNfapiMsg->pusch_param.pusch_mapping_type),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_ALLOCATION_TYPES_TAG,  &(pNfapiMsg->pusch_param.pusch_allocation_types),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_VRB_TO_PRB_MAPPING_TAG,  &(pNfapiMsg->pusch_param.pusch_vrb_to_prb_mapping),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_MAX_PTRS_PORTS_TAG,  &(pNfapiMsg->pusch_param.pusch_max_ptrs_ports),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PDUSCHS_TBS_PER_SLOT_TAG,  &(pNfapiMsg->pusch_param.max_pduschs_tbs_per_slot),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_NUMBER_MIMO_LAYERS_NON_CB_PUSCH_TAG,  &(pNfapiMsg->pusch_param.max_number_mimo_layers_non_cb_pusch),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_SUPPORTED_MODULATION_ORDER_UL_TAG,  &(pNfapiMsg->pusch_param.supported_modulation_order_ul),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_MU_MIMO_USERS_UL_TAG,  &(pNfapiMsg->pusch_param.max_mu_mimo_users_ul),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_DFTS_OFDM_SUPPORT_TAG,  &(pNfapiMsg->pusch_param.dfts_ofdm_support),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PUSCH_AGGREGATION_FACTOR_TAG,  &(pNfapiMsg->pusch_param.pusch_aggregation_factor),  &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_PRACH_LONG_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_long_formats),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRACH_SHORT_FORMATS_TAG,  &(pNfapiMsg->prach_param.prach_short_formats),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_PRACH_RESTRICTED_SETS_TAG,  &(pNfapiMsg->prach_param.prach_restricted_sets),  &unpack_uint8_tlv_value},
+    { NFAPI_NR_PARAM_TLV_MAX_PRACH_FD_OCCASIONS_IN_A_SLOT_TAG,  &(pNfapiMsg->prach_param.max_prach_fd_occasions_in_a_slot),  &unpack_uint8_tlv_value},
+
+    { NFAPI_NR_PARAM_TLV_RSSI_MEASUREMENT_SUPPORT_TAG,  &(pNfapiMsg->measurement_param.rssi_measurement_support),  &unpack_uint8_tlv_value},
+    //config
+    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NR_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NR_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { 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(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_request_t *pNfapiMsg = (nfapi_config_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_SUBFRAME_CONFIG_DUPLEX_MODE_TAG, &pNfapiMsg->subframe_config.duplex_mode, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PCFICH_POWER_OFFSET_TAG, &pNfapiMsg->subframe_config.pcfich_power_offset, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_PB_TAG, &pNfapiMsg->subframe_config.pb, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_DL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.dl_cyclic_prefix_type, &unpack_uint16_tlv_value},
+    { NFAPI_SUBFRAME_CONFIG_UL_CYCLIC_PREFIX_TYPE_TAG, &pNfapiMsg->subframe_config.ul_cyclic_prefix_type, &unpack_uint16_tlv_value},
+
+    { NFAPI_RF_CONFIG_DL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.dl_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_UL_CHANNEL_BANDWIDTH_TAG, &pNfapiMsg->rf_config.ul_channel_bandwidth, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_REFERENCE_SIGNAL_POWER_TAG, &pNfapiMsg->rf_config.reference_signal_power, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_TX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.tx_antenna_ports, &unpack_uint16_tlv_value},
+    { NFAPI_RF_CONFIG_RX_ANTENNA_PORTS_TAG, &pNfapiMsg->rf_config.rx_antenna_ports, &unpack_uint16_tlv_value},
+
+    { NFAPI_PHICH_CONFIG_PHICH_RESOURCE_TAG, &pNfapiMsg->phich_config.phich_resource, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_DURATION_TAG, &pNfapiMsg->phich_config.phich_duration, &unpack_uint16_tlv_value},
+    { NFAPI_PHICH_CONFIG_PHICH_POWER_OFFSET_TAG, &pNfapiMsg->phich_config.phich_power_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_SCH_CONFIG_PRIMARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.primary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_SECONDARY_SYNCHRONIZATION_SIGNAL_EPRE_EPRERS_TAG, &pNfapiMsg->sch_config.secondary_synchronization_signal_epre_eprers, &unpack_uint16_tlv_value},
+    { NFAPI_SCH_CONFIG_PHYSICAL_CELL_ID_TAG, &pNfapiMsg->sch_config.physical_cell_id, &unpack_uint16_tlv_value},
+
+    { NFAPI_PRACH_CONFIG_CONFIGURATION_INDEX_TAG, &pNfapiMsg->prach_config.configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->prach_config.root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->prach_config.zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_HIGH_SPEED_FLAG_TAG, &pNfapiMsg->prach_config.high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_PRACH_CONFIG_FREQUENCY_OFFSET_TAG, &pNfapiMsg->prach_config.frequency_offset, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUSCH_CONFIG_HOPPING_MODE_TAG, &pNfapiMsg->pusch_config.hopping_mode, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_HOPPING_OFFSET_TAG, &pNfapiMsg->pusch_config.hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_PUSCH_CONFIG_NUMBER_OF_SUBBANDS_TAG, &pNfapiMsg->pusch_config.number_of_subbands, &unpack_uint16_tlv_value},
+
+    { NFAPI_PUCCH_CONFIG_DELTA_PUCCH_SHIFT_TAG, &pNfapiMsg->pucch_config.delta_pucch_shift, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_CQI_RB_TAG, &pNfapiMsg->pucch_config.n_cqi_rb, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N_AN_CS_TAG, &pNfapiMsg->pucch_config.n_an_cs, &unpack_uint16_tlv_value},
+    { NFAPI_PUCCH_CONFIG_N1_PUCCH_AN_TAG, &pNfapiMsg->pucch_config.n1_pucch_an, &unpack_uint16_tlv_value},
+
+    { NFAPI_SRS_CONFIG_BANDWIDTH_CONFIGURATION_TAG, &pNfapiMsg->srs_config.bandwidth_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_MAX_UP_PTS_TAG, &pNfapiMsg->srs_config.max_up_pts, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_SUBFRAME_CONFIGURATION_TAG, &pNfapiMsg->srs_config.srs_subframe_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_SRS_CONFIG_SRS_ACKNACK_SRS_SIMULTANEOUS_TRANSMISSION_TAG, &pNfapiMsg->srs_config.srs_acknack_srs_simultaneous_transmission, &unpack_uint16_tlv_value},
+
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_UPLINK_RS_HOPPING_TAG, &pNfapiMsg->uplink_reference_signal_config.uplink_rs_hopping, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_GROUP_ASSIGNMENT_TAG, &pNfapiMsg->uplink_reference_signal_config.group_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_UPLINK_REFERENCE_SIGNAL_CONFIG_CYCLIC_SHIFT_1_FOR_DRMS_TAG, &pNfapiMsg->uplink_reference_signal_config.cyclic_shift_1_for_drms, &unpack_uint16_tlv_value},
+
+
+    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_PDSCH_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_pdsch, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_ED_THRESHOLD_FOR_LBT_FOR_DRS_TAG, &pNfapiMsg->laa_config.ed_threshold_lbt_drs, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_PD_THRESHOLD_TAG, &pNfapiMsg->laa_config.pd_threshold, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TYPE_TAG, &pNfapiMsg->laa_config.multi_carrier_type, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_TX_TAG, &pNfapiMsg->laa_config.multi_carrier_tx, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_MULTI_CARRIER_FREEZE_TAG, &pNfapiMsg->laa_config.multi_carrier_freeze, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_TX_ANTENNA_PORTS_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_antenna_ports_drs, &unpack_uint16_tlv_value},
+    { NFAPI_LAA_CONFIG_TRANSMISSION_POWER_FOR_DRS_TAG, &pNfapiMsg->laa_config.tx_power_drs, &unpack_uint16_tlv_value},
+
+    { NFAPI_EMTC_CONFIG_PBCH_REPETITIONS_ENABLE_R13_TAG, &pNfapiMsg->emtc_config.pbch_repetitions_enable_r13, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_ROOT_SEQUENCE_INDEX_TAG, &pNfapiMsg->emtc_config.prach_catm_root_sequence_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_ZERO_CORRELATION_ZONE_CONFIGURATION_TAG, &pNfapiMsg->emtc_config.prach_catm_zero_correlation_zone_configuration, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CATM_HIGH_SPEED_FLAG, &pNfapiMsg->emtc_config.prach_catm_high_speed_flag, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_0_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_0_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_1_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_1_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_2_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_2_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_CONFIGURATION_INDEX_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_configuration_index, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_FREQUENCY_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_frequency_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_NUMBER_OF_REPETITIONS_PER_ATTEMPT_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_number_of_repetitions_per_attempt, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_STARTING_SUBFRAME_PERIODICITY_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_starting_subframe_periodicity, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_ENABLE_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_enable, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PRACH_CE_LEVEL_3_HOPPING_OFFSET_TAG, &pNfapiMsg->emtc_config.prach_ce_level_3_hopping_offset, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEA_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodea, &unpack_uint16_tlv_value},
+    { NFAPI_EMTC_CONFIG_PUCCH_INTERVAL_ULHOPPINGCONFIGCOMMONMODEB_TAG, &pNfapiMsg->emtc_config.pucch_interval_ulhoppingconfigcommonmodeb, &unpack_uint16_tlv_value},
+
+    { NFAPI_TDD_FRAME_STRUCTURE_SUBFRAME_ASSIGNMENT_TAG, &pNfapiMsg->tdd_frame_structure_config.subframe_assignment, &unpack_uint16_tlv_value},
+    { NFAPI_TDD_FRAME_STRUCTURE_SPECIAL_SUBFRAME_PATTERNS_TAG, &pNfapiMsg->tdd_frame_structure_config.special_subframe_patterns, &unpack_uint16_tlv_value},
+
+    { NFAPI_L23_CONFIG_DATA_REPORT_MODE_TAG, &pNfapiMsg->l23_config.data_report_mode, &unpack_uint16_tlv_value},
+    { NFAPI_L23_CONFIG_SFNSF_TAG, &pNfapiMsg->l23_config.sfnsf, &unpack_uint16_tlv_value},
+
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_VNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_vnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_VNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_vnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV4_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv4, &unpack_ipv4_address_value},
+    { NFAPI_NFAPI_P7_PNF_ADDRESS_IPV6_TAG, &pNfapiMsg->nfapi_config.p7_pnf_address_ipv6, &unpack_ipv6_address_value},
+    { NFAPI_NFAPI_P7_PNF_PORT_TAG, &pNfapiMsg->nfapi_config.p7_pnf_port, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_DOWNLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.dl_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_UPLINK_UES_PER_SUBFRAME_TAG, &pNfapiMsg->nfapi_config.ul_ue_per_sf, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_RF_BANDS_TAG, &pNfapiMsg->nfapi_config.rf_bands, &unpack_rf_bands_value},
+    { NFAPI_NFAPI_TIMING_WINDOW_TAG, &pNfapiMsg->nfapi_config.timing_window, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_MODE_TAG, &pNfapiMsg->nfapi_config.timing_info_mode, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_TIMING_INFO_PERIOD_TAG, &pNfapiMsg->nfapi_config.timing_info_period, &unpack_uint8_tlv_value},
+    { NFAPI_NFAPI_MAXIMUM_TRANSMIT_POWER_TAG, &pNfapiMsg->nfapi_config.max_transmit_power, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_EARFCN_TAG, &pNfapiMsg->nfapi_config.earfcn, &unpack_uint16_tlv_value},
+    { NFAPI_NFAPI_NMM_GSM_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_gsm_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UMTS_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_umts_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_LTE_FREQUENCY_BANDS_TAG, &pNfapiMsg->nfapi_config.nmm_lte_frequency_bands, &unpack_nmm_frequency_bands_value},
+    { NFAPI_NFAPI_NMM_UPLINK_RSSI_SUPPORTED_TAG, &pNfapiMsg->nfapi_config.nmm_uplink_rssi_supported, &unpack_uint8_tlv_value},
+
+  };
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_nr_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t* config)
+{
+	nfapi_nr_config_request_scf_t *pNfapiMsg = (nfapi_nr_config_request_scf_t*)msg;
+
+	pNfapiMsg->tdd_table.max_tdd_periodicity_list = (nfapi_nr_max_tdd_periodicity_t*) malloc(40*sizeof(nfapi_nr_max_tdd_periodicity_t));
+
+	for(int i=0;i<40;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(14*sizeof(nfapi_nr_max_num_of_symbol_per_slot_t));
+
+    pNfapiMsg->prach_config.num_prach_fd_occasions_list=(nfapi_nr_num_prach_fd_occasions_t *) malloc(sizeof(nfapi_nr_num_prach_fd_occasions_t));
+
+	for(int i = 0; i < 40; i++){ //unpacking tdd slot config
+		for(int symbol = 0; symbol<14;symbol++){
+			pull8(ppReadPackedMsg,&pNfapiMsg->tdd_table.max_tdd_periodicity_list[i].max_num_of_symbol_per_slot_list[symbol].slot_config.value, end);
+		}
+	}
+	unpack_tlv_t unpack_fns[] =
+	{
+		{ NFAPI_NR_CONFIG_DL_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.dl_bandwidth),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_DL_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.dl_frequency),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_DL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.dl_grid_size[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_DL_K0_TAG,  &(pNfapiMsg->carrier_config.dl_k0[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_RX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_rx_ant),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_TX_ANT_TAG,  &(pNfapiMsg->carrier_config.num_tx_ant),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UL_GRID_SIZE_TAG,  &(pNfapiMsg->carrier_config.ul_grid_size[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UL_K0_TAG,  &(pNfapiMsg->carrier_config.ul_k0[1]),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UPLINK_BANDWIDTH_TAG,  &(pNfapiMsg->carrier_config.uplink_bandwidth),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_UPLINK_FREQUENCY_TAG,  &(pNfapiMsg->carrier_config.uplink_frequency),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_FRAME_DUPLEX_TYPE_TAG,  &(pNfapiMsg->cell_config.frame_duplex_type),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PHY_CELL_ID_TAG,  &(pNfapiMsg->cell_config.phy_cell_id),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_PRACH_FD_OCCASIONS_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG,  &(pNfapiMsg->prach_config.prach_sequence_length),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG,  &(pNfapiMsg->prach_config.restricted_set_config),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_PER_RACH_TAG,  &(pNfapiMsg->prach_config.ssb_per_rach),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG,  &(pNfapiMsg->prach_config.prach_sub_c_spacing),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_ROOT_SEQUENCE_INDEX_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_root_sequence_index),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_K1_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].k1),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].prach_zero_corr_conf),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG,  &(pNfapiMsg->prach_config.num_prach_fd_occasions_list[0].num_root_sequences),  &unpack_uint8_tlv_value},
+
+		{ NFAPI_NR_CONFIG_SCS_COMMON_TAG,  &(pNfapiMsg->ssb_config.scs_common),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_SS_PBCH_POWER_TAG,  &(pNfapiMsg->ssb_config.ss_pbch_power),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_BETA_PSS_TAG,  &(pNfapiMsg->ssb_table.beta_pss),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_MIB_TAG,  &(pNfapiMsg->ssb_table.MIB),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[0].ssb_mask),  &unpack_uint32_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_MASK_TAG,  &(pNfapiMsg->ssb_table.ssb_mask_list[1].ssb_mask),  &unpack_uint32_tlv_value},
+
+		{ NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG,  &(pNfapiMsg->ssb_table.ssb_offset_point_a),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_PERIOD_TAG,  &(pNfapiMsg->ssb_table.ssb_period),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG,  &(pNfapiMsg->ssb_table.ssb_subcarrier_offset),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_CONFIG_TDD_PERIOD_TAG,  &(pNfapiMsg->tdd_table.tdd_period),  &unpack_uint8_tlv_value},
+		{ NFAPI_NR_NFAPI_P7_PNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_address_ipv6),  &unpack_ipv6_address_value},
+		{ NFAPI_NR_NFAPI_P7_PNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_pnf_port),  &unpack_uint16_tlv_value},
+		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv4),  &unpack_ipv4_address_value},
+		{ NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV6_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_address_ipv6),  &unpack_ipv6_address_value},
+		{ NFAPI_NR_NFAPI_P7_VNF_PORT_TAG,  &(pNfapiMsg->nfapi_config.p7_vnf_port),  &unpack_uint16_tlv_value},
+		{ 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},
+		{ NFAPI_NR_NFAPI_TIMING_WINDOW_TAG,  &(pNfapiMsg->nfapi_config.timing_window),  &unpack_uint8_tlv_value},
+	};
+
+	return ( pull8(ppReadPackedMsg, &pNfapiMsg->num_tlv, end) &&
+			 unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+		
+}
+
+static uint8_t unpack_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_config_response_t *pNfapiMsg = (nfapi_config_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_config_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_config_response_scf_t *pNfapiMsg = (nfapi_nr_config_response_scf_t *)msg;
+  return ( pull8(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_request_scf_t *pNfapiMsg = ( nfapi_nr_start_request_scf_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_start_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_request_t *pNfapiMsg = ( nfapi_start_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_start_response_t *pNfapiMsg = (nfapi_start_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_nr_start_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_nr_start_response_scf_t *pNfapiMsg = (nfapi_nr_start_response_scf_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+
+static uint8_t unpack_stop_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_request_t *pNfapiMsg = (nfapi_stop_request_t *)msg;
+  return unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_stop_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_stop_response_t *pNfapiMsg = (nfapi_stop_response_t *)msg;
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension)));
+}
+static uint8_t unpack_measurement_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_request_t *pNfapiMsg = (nfapi_measurement_request_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_MEASUREMENT_REQUEST_DL_RS_XTX_POWER_TAG, &pNfapiMsg->dl_rs_tx_power, &unpack_uint16_tlv_value},
+    { NFAPI_MEASUREMENT_REQUEST_RECEIVED_INTERFERENCE_POWER_TAG, &pNfapiMsg->received_interference_power, &unpack_uint16_tlv_value},
+    { NFAPI_MEASUREMENT_REQUEST_THERMAL_NOISE_POWER_TAG, &pNfapiMsg->thermal_noise_power, &unpack_uint16_tlv_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &(pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_received_interference_power_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_received_interference_power_measurement_t *value = (nfapi_received_interference_power_measurement_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+           pullarrays16(ppReadPackedMsg, value->received_interference_power,  NFAPI_MAX_RECEIVED_INTERFERENCE_POWER_RESULTS, value->number_of_resource_blocks, end));
+}
+
+
+static uint8_t unpack_measurement_response(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_measurement_response_t *pNfapiMsg = (nfapi_measurement_response_t *)msg;
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_MEASUREMENT_RESPONSE_DL_RS_POWER_MEASUREMENT_TAG, &pNfapiMsg->dl_rs_tx_power_measurement, &unpack_int16_tlv_value},
+    { NFAPI_MEASUREMENT_RESPONSE_RECEIVED_INTERFERENCE_POWER_MEASUREMENT_TAG, &pNfapiMsg->received_interference_power_measurement, &unpack_received_interference_power_measurement_value},
+    { NFAPI_MEASUREMENT_RESPONSE_THERMAL_NOISE_MEASUREMENT_TAG, &pNfapiMsg->thermal_noise_power_measurement, &unpack_int16_tlv_value},
+  };
+  return ( pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) &&
+           unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+// unpack length check
+
+static int check_nr_unpack_length(nfapi_nr_phy_msg_type_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
+        retLen = sizeof(nfapi_pnf_param_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_param_response_t))
+        retLen = sizeof(nfapi_nr_pnf_param_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_request_t))
+        retLen = sizeof(nfapi_nr_pnf_config_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_config_response_t))
+        retLen = sizeof(nfapi_nr_pnf_config_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_request_t))
+        retLen = sizeof(nfapi_nr_pnf_start_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_start_response_t))
+        retLen = sizeof(nfapi_nr_pnf_start_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_request_t))
+        retLen = sizeof(nfapi_nr_pnf_stop_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_pnf_stop_response_t))
+        retLen = sizeof(nfapi_nr_pnf_stop_response_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_param_request_scf_t))
+        retLen = sizeof(nfapi_nr_param_request_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_param_response_scf_t))
+        retLen = sizeof(nfapi_nr_param_response_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_nr_config_request_scf_t))
+        retLen = sizeof(nfapi_nr_config_request_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_config_response_scf_t))
+        retLen = sizeof(nfapi_nr_config_response_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      if (unpackedBufLen >= sizeof( nfapi_nr_start_request_scf_t))
+        retLen = sizeof( nfapi_nr_start_request_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_nr_start_response_scf_t))
+        retLen = sizeof(nfapi_nr_start_response_scf_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
+        retLen = sizeof(nfapi_stop_request_t);
+
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
+        retLen = sizeof(nfapi_stop_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_request_t))
+        retLen = sizeof(nfapi_pnf_param_request_t);
+
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_param_response_t))
+        retLen = sizeof(nfapi_pnf_param_response_t);
+
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_config_request_t))
+        retLen = sizeof(nfapi_pnf_config_request_t);
+
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_config_response_t))
+        retLen = sizeof(nfapi_pnf_config_response_t);
+
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_start_request_t))
+        retLen = sizeof(nfapi_pnf_start_request_t);
+
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_start_response_t))
+        retLen = sizeof(nfapi_pnf_start_response_t);
+
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_request_t))
+        retLen = sizeof(nfapi_pnf_stop_request_t);
+
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_pnf_stop_response_t))
+        retLen = sizeof(nfapi_pnf_stop_response_t);
+
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_param_request_t))
+        retLen = sizeof(nfapi_param_request_t);
+
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_param_response_t))
+        retLen = sizeof(nfapi_param_response_t);
+
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_config_request_t))
+        retLen = sizeof(nfapi_config_request_t);
+
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_config_response_t))
+        retLen = sizeof(nfapi_config_response_t);
+
+      break;
+
+    case NFAPI_START_REQUEST:
+      if (unpackedBufLen >= sizeof( nfapi_start_request_t))
+        retLen = sizeof( nfapi_start_request_t);
+
+      break;
+
+    case NFAPI_START_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_start_response_t))
+        retLen = sizeof(nfapi_start_response_t);
+
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_stop_request_t))
+        retLen = sizeof(nfapi_stop_request_t);
+
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_stop_response_t))
+        retLen = sizeof(nfapi_stop_response_t);
+
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_measurement_request_t))
+        retLen = sizeof(nfapi_measurement_request_t);
+
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_measurement_response_t))
+        retLen = sizeof(nfapi_measurement_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s Unknown message ID %d\n", __FUNCTION__, msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+
+// Main unpack functions - public
+
+int nfapi_p5_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the header
+  return ( pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+           pull16(&pReadPackedMessage, &pMessageHeader->spare, end) );
+}
+
+int nfapi_nr_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  uint8_t *ptr = pReadPackedMessage;
+  printf("\n Read message unpack: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
+    // failed to read the header
+    return -1;
+  }
+
+  int result = -1;
+
+  if(check_nr_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
+    // the unpack buffer is not big enough for the struct
+    return -1;
+  }
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_REQUEST:
+      result = unpack_nr_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_PARAM_RESPONSE:
+      result = unpack_nr_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_REQUEST:
+      result = unpack_nr_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_CONFIG_RESPONSE:
+      result = unpack_nr_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_REQUEST:
+      result = unpack_nr_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_START_RESPONSE:
+      result = unpack_nr_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_REQUEST:
+      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PNF_STOP_RESPONSE:
+      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST:
+      result = unpack_nr_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_PARAM_RESPONSE:
+      result = unpack_nr_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST:
+      result = unpack_nr_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_CONFIG_RESPONSE:
+      result = unpack_nr_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_REQUEST:
+      result = unpack_nr_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_START_RESPONSE:
+      result = unpack_nr_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_REQUEST:
+      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_NR_PHY_MSG_TYPE_STOP_RESPONSE:
+      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  return result;
+}
+
+int nfapi_p5_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p4_p5_codec_config_t *config) {
+  nfapi_p4_p5_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p4_p5_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P5 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  uint8_t *ptr = pReadPackedMessage;
+  printf("\n Read message unpack: ");
+
+  while(ptr < end) {
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+
+  printf("\n");
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if( !(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end ) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+        pull16(&pReadPackedMessage, &pMessageHeader->spare, end))) {
+    // failed to read the header
+    return -1;
+  }
+
+  int result = -1;
+
+  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0) {
+    // the unpack buffer is not big enough for the struct
+    return -1;
+  }
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_PNF_PARAM_REQUEST:
+      result = unpack_pnf_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_PARAM_RESPONSE:
+      result = unpack_pnf_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_REQUEST:
+      result = unpack_pnf_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_CONFIG_RESPONSE:
+      result = unpack_pnf_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_START_REQUEST:
+      result = unpack_pnf_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_START_RESPONSE:
+      result = unpack_pnf_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_STOP_REQUEST:
+      result = unpack_pnf_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PNF_STOP_RESPONSE:
+      result = unpack_pnf_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PARAM_REQUEST:
+      result = unpack_param_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_PARAM_RESPONSE:
+      result = unpack_param_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_CONFIG_REQUEST:
+      result = unpack_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_CONFIG_RESPONSE:
+      result = unpack_config_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_START_REQUEST:
+      result = unpack_start_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_START_RESPONSE:
+      result = unpack_start_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_STOP_REQUEST:
+      result = unpack_stop_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_STOP_RESPONSE:
+      result = unpack_stop_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_REQUEST:
+      result = unpack_measurement_request(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    case NFAPI_MEASUREMENT_RESPONSE:
+      result = unpack_measurement_response(&pReadPackedMessage, end, pMessageHeader, config);
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p4_p5_vendor_extension) {
+          result = (config->unpack_p4_p5_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown P5 message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  return result;
+}
+
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index 9e9c9d5496673f4911fb1c08be3ce5ca8bf9e5f1..ecd8e3dbfe6b7fee43ee0b64ccf2dae949ee2678 100644
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1,7362 +1,7948 @@
-/*
- * 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
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <assert.h>
-#include <signal.h>
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <zlib.h>
-#include <sched.h>
-#include <time.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-
-#include <nfapi_interface.h>
-#include <nfapi.h>
-#include <debug.h>
-#include "nfapi_nr_interface_scf.h"
-
-extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppReadPackedMsg, void *user_data);
-extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppWritePackedMsg, void *user_data);
-
-uint32_t nfapi_calculate_checksum(uint8_t *buffer, uint16_t len) {
-  uint32_t chksum = 0;
-  // calcaulte upto the checksum
-  chksum = crc32(chksum, buffer, 8);
-  // skip the checksum
-  uint8_t zeros[4] = {0, 0, 0, 0};
-  chksum = crc32(chksum, zeros, 4);
-  // continu with the rest of the mesage
-  chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
-  // return the inverse
-  return ~(chksum);
-}
-
-int nfapi_p7_update_checksum(uint8_t *buffer, uint32_t len) {
-  uint32_t checksum = nfapi_calculate_checksum(buffer, len);
-  uint8_t *p_write = &buffer[8];
-  return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
-}
-
-int nfapi_p7_update_transmit_timestamp(uint8_t *buffer, uint32_t timestamp) {
-  uint8_t *p_write = &buffer[12];
-  return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
-}
-
-uint32_t nfapi_p7_calculate_checksum(uint8_t *buffer, uint32_t len) {
-  return nfapi_calculate_checksum(buffer, len);
-}
-
-void *nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t *config) {
-  if(size == 0)
-    return 0;
-
-  void *buffer_p = NULL;
-
-  if(config && config->allocate) {
-    buffer_p = (config->allocate)(size);
-
-    if(buffer_p != NULL) {
-      memset(buffer_p,0,size);
-    }
-
-    return buffer_p;
-  } else {
-    buffer_p = calloc(1, size);
-    return buffer_p;
-  }
-}
-
-void nfapi_p7_deallocate(void *ptr, nfapi_p7_codec_config_t *config) {
-  if(ptr == NULL)
-    return;
-
-  if(config && config->deallocate) {
-    return (config->deallocate)(ptr);
-  } else {
-    return free(ptr);
-  }
-}
-// Pack routines
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  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) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->mcs_1, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
-           push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
-           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-           push8(value->mcs_2, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
-           push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
-           push8(value->harq_process, ppWritePackedMsg, end) &&
-           push8(value->tpmi, ppWritePackedMsg, end) &&
-           push8(value->pmi, ppWritePackedMsg, end) &&
-           push8(value->precoding_information, ppWritePackedMsg, end) &&
-           push8(value->tpc, ppWritePackedMsg, end) &&
-           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
-           push8(value->ngap, ppWritePackedMsg, end) &&
-           push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
-           push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
-           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
-           push8(value->preamble_index, ppWritePackedMsg, end) &&
-           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
-           push8(value->rnti_type, ppWritePackedMsg, end) &&
-           push16(value->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel9_t *value = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
-  return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
-          push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
-          push8(value->scrambling_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel10_t *value = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
-  return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
-           push8(value->carrier_indicator, ppWritePackedMsg, end) &&
-           push8(value->srs_flag, ppWritePackedMsg, end) &&
-           push8(value->srs_request, ppWritePackedMsg, end) &&
-           push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
-           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-           push8(value->n_dl_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel11_t *value = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
-  return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
-           push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel12_t *value = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
-  return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
-           push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
-           push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
-           pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
-         push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-         push8(value->num_antennas, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
-
-    if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
-         push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
-      return 0;
-
-    uint8_t antenna_idx = 0;
-    uint8_t scheduled_ue_idx = 0;
-
-    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
-      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
-        if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
-          return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
-  return(
-          push16(value->bwp_size, ppWritePackedMsg, end) &&
-          push16(value->bwp_start, ppWritePackedMsg, end) &&
-          push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
-          push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
-          push16(value->start_rb, ppWritePackedMsg, end) &&
-          push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
-          push8(value->csi_type, ppWritePackedMsg, end) &&
-          push8(value->row, ppWritePackedMsg, end) &&
-          push16(value->freq_domain, ppWritePackedMsg, end) &&
-          push8(value->symb_l0, ppWritePackedMsg, end) &&
-          push8(value->symb_l1, ppWritePackedMsg, end) &&
-          push8(value->cdm_type, ppWritePackedMsg, end) &&
-          push8(value->freq_density, ppWritePackedMsg, end) &&
-          push16(value->scramb_id, ppWritePackedMsg, end) &&
-          push8(value->power_control_offset, ppWritePackedMsg, end) &&
-          push8(value->power_control_offset_ss, ppWritePackedMsg, end)
-        );
-}
-
-
-static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_pdcch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t *)tlv;
-
-  for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i) {
-    if(!push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
-        push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-        push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
-        push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
-        push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
-        push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-        push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
-        push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-        pusharray8(value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
-
-    return 0;
-  }
-
-  // TODO: resolve the packaging of array (currently sending a single element)
-  return(
-          push16(value->BWPSize, ppWritePackedMsg, end) &&
-          push16(value->BWPStart, ppWritePackedMsg, end) &&
-          push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
-          push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-          push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
-          push8(value->DurationSymbols, ppWritePackedMsg, end) &&
-          pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
-          push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
-          push8(value->RegBundleSize, ppWritePackedMsg, end) &&
-          push8(value->InterleaverSize, ppWritePackedMsg, end) &&
-          push8(value->CoreSetType, ppWritePackedMsg, end) &&
-          push16(value->ShiftIndex, ppWritePackedMsg, end) &&
-          push8(value->precoderGranularity, ppWritePackedMsg, end) &&
-          push16(value->numDlDci, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
-  // TODO: resolve the packaging of array (currently sending a single element)
-  return(
-          push16(value->pduBitmap, ppWritePackedMsg, end) &&
-          push16(value->rnti, ppWritePackedMsg, end) &&
-          push16(value->pduIndex, ppWritePackedMsg, end) &&
-          push16(value->BWPSize, ppWritePackedMsg, end) &&
-          push16(value->BWPStart, ppWritePackedMsg, end) &&
-          push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
-          push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
-          push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
-          pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
-          pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
-          pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
-          push16(value->dataScramblingId, ppWritePackedMsg, end) &&
-          push8(value->nrOfLayers, ppWritePackedMsg, end) &&
-          push8(value->transmissionScheme, ppWritePackedMsg, end) &&
-          push8(value->refPoint, ppWritePackedMsg, end) &&
-          push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
-          push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
-          push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
-          push8(value->SCID, ppWritePackedMsg, end) &&
-          push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
-          push16(value->dmrsPorts, ppWritePackedMsg, end) &&
-          push8(value->resourceAlloc, ppWritePackedMsg, end) &&
-          push16(value->rbStart, ppWritePackedMsg, end) &&
-          push16(value->rbSize, ppWritePackedMsg, end) &&
-          push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
-          push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
-          push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
-          push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
-          push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
-          push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
-          push8(value->PTRSReOffset, ppWritePackedMsg, end)
-        );
-}
-
-
-static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
-  return(
-          push16(value->PhysCellId, ppWritePackedMsg, end) &&
-          push8(value->BetaPss, ppWritePackedMsg, end) &&
-          push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
-          push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
-          push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
-          push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
-          push32(value->bchPayload, ppWritePackedMsg, end)
-          // TODO: pack precoding_and_beamforming too
-        );
-}
-
-
-static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel13_t *value = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
-  return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
-          push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
-          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
-          push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
-          push8(value->drms_table_flag, ppWritePackedMsg, end) &&
-          push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
-          (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
-}
-
-static uint8_t pack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  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));
-}
-static uint8_t pack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_mch_pdu_rel8_t *value = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
-  return ( push16(value->length, ppWritePackedMsg, end) &&
-           push16(value->pdu_index, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->modulation, ppWritePackedMsg, end) &&
-           push16(value->transmission_power, ppWritePackedMsg, end) &&
-           push16(value->mbsfn_area_id, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_bf_vector_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_bf_vector_t *bf = (nfapi_bf_vector_t *)elem;
-  return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
-           push8(bf->num_antennas, ppWritePackedMsg, end) &&
-           pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel8_t *value = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
-  return ( push16(value->length, ppWritePackedMsg, end) &&
-           push16(value->pdu_index, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->modulation, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version, ppWritePackedMsg, end) &&
-           push8(value->transport_blocks, ppWritePackedMsg, end) &&
-           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-           push8(value->transmission_scheme, ppWritePackedMsg, end) &&
-           push8(value->number_of_layers, ppWritePackedMsg, end) &&
-           push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-           pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
-           push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
-           push8(value->pa, ppWritePackedMsg, end) &&
-           push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
-           push8(value->ngap, ppWritePackedMsg, end) &&
-           push8(value->nprb, ppWritePackedMsg, end) &&
-           push8(value->transmission_mode, ppWritePackedMsg, end) &&
-           push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
-           push8(value->num_bf_vector, ppWritePackedMsg, end) &&
-           packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel9_t *value = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
-  return ( push8(value->nscid, ppWritePackedMsg, end) );
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel10_t *value = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
-  return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
-           push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
-           push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
-           push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
-           pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
-           push8(value->pdsch_start, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel11_t *value = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
-  return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
-          push16(value->drms_scrambling, ppWritePackedMsg, end) &&
-          push8(value->csi_config_flag, ppWritePackedMsg, end) &&
-          push16(value->csi_scrambling, ppWritePackedMsg, end) &&
-          push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
-          push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
-          push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel12_t *value = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
-  return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
-          push8(value->maxlayers, ppWritePackedMsg, end) &&
-          push8(value->n_dl_harq, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel13_t *value = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
-  return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
-          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
-          push8(value->ue_type, ppWritePackedMsg, end) &&
-          push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
-          push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-          push8(value->drms_table_flag, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel8_t *value = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
-  return( push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push16(value->p_rnti, ppWritePackedMsg, end) &&
-          push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
-          push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
-          push32(value->resource_block_coding, ppWritePackedMsg, end) &&
-          push8(value->mcs, ppWritePackedMsg, end) &&
-          push8(value->redundancy_version, ppWritePackedMsg, end) &&
-          push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
-          push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
-          push8(value->transmission_scheme, ppWritePackedMsg, end) &&
-          push8(value->number_of_layers, ppWritePackedMsg, end) &&
-          push8(value->codebook_index, ppWritePackedMsg, end) &&
-          push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
-          push8(value->pa, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push8(value->nprb, ppWritePackedMsg, end) &&
-          push8(value->ngap, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel13_t *value = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
-  return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
-           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_prs_pdu_rel9_t *value = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
-  return( push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
-          push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
-          push8(value->prs_muting, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel10_t *value = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
-  return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
-          push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
-          push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
-          pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel13_t *value = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
-
-  if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
-       push8(value->cdm_type, ppWritePackedMsg, end) &&
-       push8(value->num_bf_vector, ppWritePackedMsg, end))) {
-    return 0;
-  }
-
-  uint16_t i;
-
-  for(i = 0; i < value->num_bf_vector; ++i) {
-    if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
-         pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t pack_bf_vector(nfapi_bf_vector_t *vector, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
-           push8(vector->num_antennas, ppWritePackedMsg, end) &&
-           pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel11_t *value = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
-  return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
-           push16(value->epdcch_id, ppWritePackedMsg, end) &&
-           push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
-           push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
-           pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
-           pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel13_t *value = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
-  return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
-          push8(value->initial_lbt_sf, ppWritePackedMsg, end));
-}
-static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_mpdcch_pdu_rel13_t *value = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
-  return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
-           push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
-           push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
-           push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
-           push8(value->start_symbol, ppWritePackedMsg, end) &&
-           push8(value->ecce_index, ppWritePackedMsg, end) &&
-           push8(value->aggregation_level, ppWritePackedMsg, end) &&
-           push8(value->rnti_type, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) &&
-           push8(value->ce_mode, ppWritePackedMsg, end) &&
-           push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
-           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-           push16(value->transmission_power, ppWritePackedMsg, end) &&
-           push8(value->dci_format, ppWritePackedMsg, end) &&
-           push16(value->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(value->mcs, ppWritePackedMsg, end) &&
-           push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
-           push8(value->redundancy_version, ppWritePackedMsg, end) &&
-           push8(value->new_data_indicator, ppWritePackedMsg, end) &&
-           push8(value->harq_process, ppWritePackedMsg, end) &&
-           push8(value->tpmi_length, ppWritePackedMsg, end) &&
-           push8(value->tpmi, ppWritePackedMsg, end) &&
-           push8(value->pmi_flag, ppWritePackedMsg, end) &&
-           push8(value->pmi, ppWritePackedMsg, end) &&
-           push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
-           push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-           push8(value->tpc, ppWritePackedMsg, end) &&
-           push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
-           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
-           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
-           push8(value->preamble_index, ppWritePackedMsg, end) &&
-           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
-           push8(value->starting_ce_level, ppWritePackedMsg, end) &&
-           push8(value->srs_request, ppWritePackedMsg, end) &&
-           push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
-           push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
-           push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-           push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
-           push8(value->direct_indication, ppWritePackedMsg, end) &&
-           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-           push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
-           pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_nbch_pdu_rel13_t *value = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
-  return (push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push16(value->transmission_power, ppWritePackedMsg, end) &&
-          push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_npdcch_pdu_rel13_t *value = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
-  return (push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push8(value->ncce_index, ppWritePackedMsg, end) &&
-          push8(value->aggregation_level, ppWritePackedMsg, end) &&
-          push8(value->start_symbol, ppWritePackedMsg, end) &&
-          push8(value->rnti_type, ppWritePackedMsg, end) &&
-          push16(value->rnti, ppWritePackedMsg, end) &&
-          push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
-          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
-          push8(value->dci_format, ppWritePackedMsg, end) &&
-          push8(value->scheduling_delay, ppWritePackedMsg, end) &&
-          push8(value->resource_assignment, ppWritePackedMsg, end) &&
-          push8(value->repetition_number, ppWritePackedMsg, end) &&
-          push8(value->mcs, ppWritePackedMsg, end) &&
-          push8(value->new_data_indicator, ppWritePackedMsg, end) &&
-          push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
-          push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
-          push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
-          push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
-          push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
-          push8(value->direct_indication, ppWritePackedMsg, end) &&
-          push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-          push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_dl_config_ndlsch_pdu_rel13_t *value = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
-  return (push16(value->length, ppWritePackedMsg, end) &&
-          push16(value->pdu_index, ppWritePackedMsg, end) &&
-          push8(value->start_symbol, ppWritePackedMsg, end) &&
-          push8(value->rnti_type, ppWritePackedMsg, end) &&
-          push16(value->rnti, ppWritePackedMsg, end) &&
-          push16(value->resource_assignment, ppWritePackedMsg, end) &&
-          push16(value->repetition_number, ppWritePackedMsg, end) &&
-          push8(value->modulation, ppWritePackedMsg, end) &&
-          push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
-          push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
-          push16(value->sf_idx, ppWritePackedMsg, end) &&
-          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_dl_tti_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)tlv;
-
-  if(!(push16(value->PDUSize, ppWritePackedMsg, end) &&
-       push16(value->PDUType, ppWritePackedMsg, end) ))
-    return 0;
-
-  // first match the pdu type, then call the respective function
-  switch(value->PDUType) {
-    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
-      if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
-      if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
-      if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
-      if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  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) &&
-       push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
-       push16(value->transmission_power_pcfich, ppWritePackedMsg, end))) {
-    return 0;
-  }
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_pdu;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
-
-    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      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) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value))) {
-          return 0;
-        }
-      }
-      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;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
-             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
-
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->dl_tti_request_body.nPDUs, ppWritePackedMsg, end) &&
-        pusharray8(pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
-        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
-       ))
-    return 0;
-
-  int arr[12];
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
-    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
-      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
-    }
-
-    if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
-    if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  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));
-  {
-    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) {
-  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
-  return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
-  return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
-          push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
-  return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
-  return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-          push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-          push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
-}
-
-//Pack fns for ul_tti PDUS
-
-
-static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return(
-          push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
-          push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
-          push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
-          push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
-          push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
-          push16(prach_pdu->num_cs, ppWritePackedMsg, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return(
-          push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
-          push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
-          push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
-          push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  if (!(
-        push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
-        push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
-        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
-        push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
-        push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
-        // TODO: ignoring beamforming tlv for now
-      ))
-    return 0;
-
-  //Pack Optional Data only included if indicated in pduBitmap
-  switch(pusch_pdu->pdu_bit_map) {
-    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
-      // pack optional TLVs
-      return(
-              push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
-              push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
-              pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
-      return(
-              push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
-      return(
-              push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
-      return(
-              push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
-              push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
-              push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
-            );
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return(
-          push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
-          push32(srs_pdu->handle, ppWritePackedMsg, end) &&
-          push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
-          push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
-          push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
-          push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
-          push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
-          push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
-          push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
-          push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
-          push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
-          push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
-          push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
-          push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
-          push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
-          push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
-          push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
-          push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
-          push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
-          push16(srs_pdu->t_offset, ppWritePackedMsg, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu *ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
-  return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
-
-  if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
-       push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
-       push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end))) {
-    return 0;
-  }
-
-  switch(cqi_ri_info_rel9->report_type) {
-    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
-      if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
-           push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end))) {
-        return 0;
-      }
-    }
-    break;
-
-    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
-      if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
-        return 0;
-
-      uint8_t i;
-
-      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
-        if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
-          return 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[j], ppWritePackedMsg, end) == 0)
-            return 0;
-        }
-      }
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
-    }
-    break;
-  };
-
-  return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
-
-  switch(cqi_ri_info_rel13->report_type) {
-    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
-      if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
-        return 0;
-    }
-    break;
-
-    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
-      // No parameters
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
-    }
-    break;
-  };
-
-  return 1;
-}
-
-static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information *cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
-          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
-          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
-  return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
-          push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters *init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end,
-                  &pack_ul_config_request_init_tx_params_rel8_value);
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
-  return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
-          push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
-          push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
-  return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
-          push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
-  return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
-           push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
-  return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
-           push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
-  return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
-           push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
-           push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
-           push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information *ue_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
-  return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
-           push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
-           push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
-           push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
-  return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-           push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
-  return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
-           push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
-           push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
-           push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
-  return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
-           push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
-  return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
-           push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
-  return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
-  return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
-           push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
-  return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
-           push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
-           push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information *cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
-}
-
-static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
-  return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
-}
-static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
-  return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
-           push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information *sr_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
-  return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
-          push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
-          push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
-          push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
-          push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
-  return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
-}
-
-static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
-  return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
-  return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
-  return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
-          push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
-          push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
-          push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
-          pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
-          pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end,
-                   &pack_ul_config_request_nb_harq_rel13_value));
-}
-static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
-  return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
-           push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
-           push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
-}
-
-
-
-static uint8_t pack_ul_tti_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_ul_tti_request_number_of_pdus_t *value = (nfapi_nr_ul_tti_request_number_of_pdus_t *)tlv;
-
-  if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
-       push16(value->pdu_type, ppWritePackedMsg, end) ))
-    return 0;
-
-  // first match the pdu type, then call the respective function
-  switch(value->pdu_type) {
-    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
-      if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
-      if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
-      if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
-      if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_tti_groups_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_ul_tti_request_number_of_groups_t *value = (nfapi_nr_ul_tti_request_number_of_groups_t *)tlv;
-
-  if(!push8(value->n_ue, ppWritePackedMsg, end))
-    return 0;
-
-  for(int i=0; i<value->n_ue; i++) {
-    if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
-
-  if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
-       push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
-       push8(value->srs_present, ppWritePackedMsg, end)))
-    return 0;
-
-  uint16_t i = 0;
-
-  for(i = 0; i < value->number_of_pdus; ++i) {
-    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
-
-    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
-        if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
-             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
-             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
-        if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
-        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
-             pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
-             pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
-
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
-    return 0;
-
-  for(int i=0; i<pNfapiMsg->n_pdus; i++) {
-    if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  for(int i=0; i<pNfapiMsg->n_group; i++) {
-    if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
-}
-
-static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
-  return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
-           push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
-  return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
-           push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
-  return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
-           push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
-           push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
-           push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
-  return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
-           push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
-  return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
-           push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
-  return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
-           push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
-           push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
-           push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
-           pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
-  return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
-           push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
-           push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
-
-  if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
-       push8(value->number_of_dci, ppWritePackedMsg, end) &&
-       push8(value->number_of_hi, ppWritePackedMsg, end)))
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
-
-    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
-             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
-          return 0;
-      }
-      break;
-
-      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
-        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ul_dci_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_ul_dci_request_pdus_t *value = (nfapi_nr_ul_dci_request_pdus_t *)tlv;
-
-  for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i) {
-    if(!push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
-        push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
-        push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
-        push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
-        push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
-        push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
-        push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
-        push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
-        pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end));
-
-    return 0;
-  }
-
-  return (push16(value->PDUType, ppWritePackedMsg, end) &&
-          push16(value->PDUSize, ppWritePackedMsg, end) &&
-          push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
-          push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
-          pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
-          push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
-          push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
-
-  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
-       ))
-    return 0;
-
-  for(int i=0; i<pNfapiMsg->numPdus; i++) {
-    if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-
-static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-//pack_tx_data_pdu_list_value
-static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nr_pdu_t *value = (nfapi_nr_pdu_t *)tlv;
-
-  if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
-       push16(value->PDU_index, ppWritePackedMsg, end) &&
-       push16(value->PDU_length, ppWritePackedMsg, end)
-      ))
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_tlvs = value->num_TLV;
-
-  for(; i < total_number_of_tlvs; ++i) {
-    if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
-          push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
-      return 0;
-
-    switch(value->TLVs[i].tag) {
-      case 0: {
-        if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
-          return 0;
-
-        break;
-      }
-
-      case 1: {
-        if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end))
-          return 0;
-
-        break;
-      }
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
-        break;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_tx_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_tx_request_body_t *value = (nfapi_tx_request_body_t *)tlv;
-
-  if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_tx_request_pdu_t *pdu = &(value->tx_pdu_list[i]);
-
-    if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
-         push16(pdu->pdu_index, ppWritePackedMsg, end)))
-      return 0;
-
-    uint8_t j;
-
-    for(j = 0; j < pdu->num_segments; ++j) {
-      // Use -1 as it is unbounded
-      // 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 (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;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
-
-  if (!(
-        push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
-        push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
-      ))
-    return 0;
-
-  for(int i=0; i<pNfapiMsg->Number_of_PDUs; i++) {
-    if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
-  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_release_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ue_release_request_body_t *value = (nfapi_ue_release_request_body_t *)tlv;
-
-  if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0) {
-    return 0;
-  }
-
-  uint8_t j;
-  uint16_t num = value->number_of_TLVs;
-
-  for(j = 0; j < num; ++j) {
-    if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0) {
-      return 0;
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
-  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
-  int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
-  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-  return x && y && z;
-}
-
-static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
-  int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
-  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
-  return x && z;
-}
-
-static uint8_t pack_rx_ue_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push16(value->rnti, ppWritePackedMsg, end) );
-}
-
-static uint8_t unpack_rx_ue_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
-  return ( pull32(ppReadPackedMsg, &value->handle, end) &&
-           pull16(ppReadPackedMsg, &value->rnti, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) &&
-           push8(data->value_1, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) &&
-           push8(data->value_1, ppWritePackedMsg, end) &&
-           push8(data->value_2, ppWritePackedMsg, end) &&
-           push8(data->value_3, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  return ( push8(data->value_0, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel8_t *harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t *)tlv;
-
-  if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
-       push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t result = 0;
-
-  switch(harq_indication_tdd_rel8->mode) {
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-      result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-      result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-      result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-      result = 1;
-      break;
-
-    default:
-      // err....
-      break;
-  }
-
-  return result;
-}
-
-static uint8_t pack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel9_t *harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t *)tlv;
-
-  if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
-       push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx;
-
-  for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(harq_indication_tdd_rel9->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
-        break;
-
-      default:
-        // err....
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t *)tlv;
-
-  if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
-       push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx;
-
-  for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(harq_indication_tdd_rel13->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
-        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
-        break;
-
-      default:
-        // err....
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel8_t *harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t *)tlv;
-  return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
-           push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel9_t *harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t *)tlv;
-  return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
-           push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
-           pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t *)tlv;
-  return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
-           push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
-           pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_ul_cqi_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
-  return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
-           push8(value->channel, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
-
-  if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_harqs;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
-         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_crc_indication_rel8_t *crc_indication_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
-  return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_crc_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
-
-  if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_crcs;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
-  return ( push16(value->length, ppWritePackedMsg, end) &&
-           push16(value->offset, ppWritePackedMsg, end) &&
-           push8(value->ul_cqi, ppWritePackedMsg, end) &&
-           push16(value->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
-  return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  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;
-
-  // need to calculate the data offset's.
-  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;
-    }
-  }
-
-  // Now update the structure to include the offset
-  for(i =0; i < total_number_of_pdus; ++i) {
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      if(pdu->rx_indication_rel8.offset == 1) {
-        pdu->rx_indication_rel8.offset = offset;
-        offset += pdu->rx_indication_rel8.length;
-      }
-    }
-  }
-
-  // Write out the pdu
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
-         pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
-      return 0;
-  }
-
-  // Write out the pdu data
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    uint16_t length = 0;
-    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
-
-    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      length = pdu->rx_indication_rel8.length;
-    }
-
-    if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel8_t *preamble_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
-  return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
-           push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
-           push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
-}
-static uint8_t pack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel9_t *preamble_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
-  return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-static uint8_t pack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel13_t *preamble_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
-  return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_rach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
-
-  if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_preambles;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
-         pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
-         pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel8_t *srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
-  return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
-           push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
-           push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
-           push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
-           pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel9_t *srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
-  return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_ttd_rel10_t *srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
-  return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel11_t *srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
-  return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
-}
-
-static uint8_t pack_tdd_channel_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
-
-  if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
-       push8(value->number_of_subbands, ppWritePackedMsg, end) &&
-       push8(value->num_atennas, ppWritePackedMsg, end)))
-    return 0;
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
-         pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg,  uint8_t *end) {
-  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
-
-  if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_ues;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
-         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
-         pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
-
-  if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_srs;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
-  return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
-           push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
-           push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
-           push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
-           push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
-  return  ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
-            push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
-            push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
-            push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
-            pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
-            push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
-            push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
-
-  if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  // need to calculate the data offset's. This very bittle due the hardcoding
-  // of the sizes. can not use the sizeof as we have an array for the Rel9
-  // info
-  uint16_t i = 0;
-  uint16_t offset = 2; // taking into account the number_of_cqis
-  uint16_t total_number_of_pdus = value->number_of_cqis;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-    offset += 2; // for the instance length
-
-    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
-      offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
-    }
-
-    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      offset += 4 + 8;
-    }
-
-    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
-    }
-
-    if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG) {
-      offset += 4 + 2;
-    }
-  }
-
-  // Now update the structure to include the offset
-  for(i =0; i < total_number_of_pdus; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-
-    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      if(pdu->cqi_indication_rel8.data_offset == 1) {
-        pdu->cqi_indication_rel8.data_offset = offset;
-        offset += pdu->cqi_indication_rel8.length;
-      }
-    }
-
-    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      if(pdu->cqi_indication_rel9.data_offset == 1) {
-        pdu->cqi_indication_rel9.data_offset = offset;
-        offset += pdu->cqi_indication_rel9.length;
-      }
-    }
-  }
-
-  // Write out the cqi information
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end,pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
-         pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  // Write out the cqi raw data
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    uint16_t length = 0;
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-
-    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      length = pdu->cqi_indication_rel8.length;
-    }
-
-    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      length = pdu->cqi_indication_rel9.length;
-    }
-
-    if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
-  //Fixme: allocate some mem to fix pure bug, need to find out proper size
-  pNfapiMsg->vendor_extension=NULL;//(nfapi_vendor_extension_tlv_t)malloc( sizeof(* pNfapiMsg->vendor_extension));
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->mp_cca, ppWritePackedMsg, end) &&
-           push32(value->n_cca, ppWritePackedMsg, end) &&
-           push32(value->offset, ppWritePackedMsg, end) &&
-           push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
-           push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
-           push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->offset, ppWritePackedMsg, end) &&
-           push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
-           push32(value->lbt_mode, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
-
-  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
-    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
-        if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
-        if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->result, ppWritePackedMsg, end) &&
-           push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
-           push32(value->initial_partial_sf, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
-  return ( push32(value->handle, ppWritePackedMsg, end) &&
-           push32(value->result, ppWritePackedMsg, end));
-}
-
-static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_lbt_dl_config_indication_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
-
-  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
-
-    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    // Put a 0 size in and then determine the size after the pdu
-    // has been writen and write the calculated size
-    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
-    pdu->pdu_size = 0;
-
-    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
-        if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
-        if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
-          return 0;
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-
-    // add 1 for the pdu_type. The delta will include the pdu_size
-    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
-
-    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nb_harq_indication_fdd_rel13_t *nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
-  return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
-}
-
-static uint8_t pack_nb_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
-
-  if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_harqs = value->number_of_harqs;
-
-  for(; i < total_number_of_harqs; ++i) {
-    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
-    uint8_t *instance_length_p = *ppWritePackedMsg;
-
-    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-      return 0;
-
-    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
-         pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
-         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-
-static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nrach_indication_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nrach_indication_pdu_rel13_t *nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
-  return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
-           push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
-           push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
-           push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
-}
-
-
-static uint8_t pack_nrach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
-  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
-
-  if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
-
-  for(; i < total_number_of_initial_scs_detected; ++i) {
-    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
-
-    //uint8_t* instance_length_p = *ppWritePackedMsg;
-    //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
-    //  return 0;
-
-    if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
-      return 0;
-
-    // calculate the instance length subtracting the size of the instance
-    // length feild
-    //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
-    //push16(instance_length, &instance_length_p, end);
-  }
-
-  return 1;
-}
-
-static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
-  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
-           pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
-  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-           pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
-  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-           pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
-           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
-  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
-  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
-  return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
-  return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
-          push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
-          pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
-          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
-}
-
-
-
-// Main pack function - public
-
-int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
-  nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint8_t *end = pPackedBuf + packedBufLen;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  /*
-  printf("\n P7 MESSAGE SENT: \n");
-  for(int i=0; i< packedBufLen; i++){
-    printf("%d", *(uint8_t *)(pMessageBuf + i));
-  }
-  printf("\n");
-  */
-  // process the header
-  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-       push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
-       push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
-       push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
-    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_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-      result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-      result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-      result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-      result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      //printf("RX ULSCH\n");
-      result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-      result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-      result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_TIMING_INFO:
-      result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    default: {
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p7_vendor_extension) {
-          result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-    }
-    break;
-  }
-
-  if(result == 0) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
-    return -1;
-  }
-
-  // check for a valid message length
-  uintptr_t msgHead = (uintptr_t)pPackedBuf;
-  uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
-  uint32_t packedMsgLen = msgEnd - msgHead;
-  uint16_t packedMsgLen16;
-
-  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-    return -1;
-  } else {
-    packedMsgLen16 = (uint16_t)packedMsgLen;
-  }
-
-  // Update the message length in the header
-  pMessageHeader->message_length = packedMsgLen16;
-
-  if(!push16(packedMsgLen16, &pPackedLengthField, end))
-    return -1;
-
-  if(1) {
-    //quick test
-    if(pMessageHeader->message_length != packedMsgLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
-    }
-  }
-
-  return (packedMsgLen);
-}
-
-int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
-  nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
-  uint8_t *pWritePackedMessage = pPackedBuf;
-  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
-  uint8_t *end = pPackedBuf + packedBufLen;
-
-  if (pMessageBuf == NULL || pPackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
-    return -1;
-  }
-
-  /*
-  printf("\n P7 MESSAGE SENT: \n");
-  for(int i=0; i< packedBufLen; i++){
-    printf("%d", *(uint8_t *)(pMessageBuf + i));
-  }
-  printf("\n");
-  */
-  // process the header
-  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
-       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
-       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
-       push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
-       push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
-       push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
-    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;
-
-    case NFAPI_UL_CONFIG_REQUEST:
-      result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-      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;
-
-    case NFAPI_HI_DCI0_REQUEST:
-      result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      //printf("RX ULSCH\n");
-      result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_DL_NODE_SYNC:
-      result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_UL_NODE_SYNC:
-      result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    case NFAPI_TIMING_INFO:
-      result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
-      break;
-
-    default: {
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->pack_p7_vendor_extension) {
-          result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-    }
-    break;
-  }
-
-  if(result == 0) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
-    return -1;
-  }
-
-  // check for a valid message length
-  uintptr_t msgHead = (uintptr_t)pPackedBuf;
-  uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
-  uint32_t packedMsgLen = msgEnd - msgHead;
-  uint16_t packedMsgLen16;
-
-  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
-    return -1;
-  } else {
-    packedMsgLen16 = (uint16_t)packedMsgLen;
-  }
-
-  // Update the message length in the header
-  pMessageHeader->message_length = packedMsgLen16;
-
-  if(!push16(packedMsgLen16, &pPackedLengthField, end))
-    return -1;
-
-  if(1) {
-    //quick test
-    if(pMessageHeader->message_length != packedMsgLen) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
-    }
-  }
-
-  return (packedMsgLen);
-}
-
-// Unpack routines
-// NR:
-static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &value->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &value->bwp_start, end) &&
-          pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
-          pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
-          pull16(ppReadPackedMsg, &value->start_rb, end) &&
-          pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
-          pull8(ppReadPackedMsg, &value->csi_type, end) &&
-          pull8(ppReadPackedMsg, &value->row, end) &&
-          pull16(ppReadPackedMsg, &value->freq_domain, end) &&
-          pull8(ppReadPackedMsg, &value->symb_l0, end) &&
-          pull8(ppReadPackedMsg, &value->symb_l1, end) &&
-          pull8(ppReadPackedMsg, &value->cdm_type, end) &&
-          pull8(ppReadPackedMsg, &value->freq_density, end) &&
-          pull16(ppReadPackedMsg, &value->scramb_id, end) &&
-          pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
-          pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
-        );
-}
-
-
-static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_pdcch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t *)tlv;
-
-  for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i) {
-    if(!pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
-        pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
-        pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
-        pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
-        pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
-        pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
-        pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
-        pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
-        pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->dci_pdu[i].PayloadSizeBits, end));
-
-    return 0;
-  }
-
-  // TODO: resolve the packaging of array (currently sending a single element)
-  return(
-          pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-          pull16(ppReadPackedMsg, &value->BWPStart, end) &&
-          pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
-          pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-          pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
-          pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
-          pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
-          pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
-          pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
-          pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
-          pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
-          pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
-          pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
-          pull16(ppReadPackedMsg, &value->numDlDci, end));
-}
-
-
-static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
-  // TODO: resolve the packaging of array (currently sending a single element)
-  return(
-          pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
-          pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull16(ppReadPackedMsg, &value->pduIndex, end) &&
-          pull16(ppReadPackedMsg, &value->BWPSize, end) &&
-          pull16(ppReadPackedMsg, &value->BWPStart, end) &&
-          pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
-          pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
-          pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
-          pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
-          pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
-          pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
-          pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
-          pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
-          pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
-          pull8(ppReadPackedMsg, &value->refPoint, end) &&
-          pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
-          pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
-          pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
-          pull8(ppReadPackedMsg, &value->SCID, end) &&
-          pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
-          pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
-          pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
-          pull16(ppReadPackedMsg, &value->rbStart, end) &&
-          pull16(ppReadPackedMsg, &value->rbSize, end) &&
-          pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
-          pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
-          pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
-          pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
-        );
-}
-
-
-static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
-          pull8(ppReadPackedMsg, &value->BetaPss, end) &&
-          pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
-          pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
-          pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
-          pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
-          pull32(ppReadPackedMsg, &value->bchPayload, end)
-          // TODO: pack precoding_and_beamforming too
-        );
-}
-
-
-// LTE:
-static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel8_t *dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
-          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-          pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
-          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel9_t *dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
-           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
-           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel10_t *dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel11_t *dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
-}
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel12_t *dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
-          pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
-}
-
-static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end) {
-  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
-       pull8(ppReadPackedMsg, &value->num_antennas, end)))
-    return 0;
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
-
-    if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
-         pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
-      return 0;
-
-    uint8_t antenna_idx = 0;
-    uint8_t scheduled_ue_idx = 0;
-
-    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
-      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
-        if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
-          return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dci_dl_pdu_rel13_t *dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
-  // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
-  // added
-  uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
-  dci_dl_pdu_rel13->tpm_struct_flag = 0;
-  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
-          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
-          ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
-          ( (tpm_struct_flag_present == 1 &&  dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
-}
-
-static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_bch_pdu_rel8_t *bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
-           pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_mch_pdu_rel8_t *mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
-          pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
-          pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
-          pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
-          pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
-          pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
-}
-
-static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
-
-  if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
-        pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
-        pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-        pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
-        pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
-        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
-    return 0;
-
-  uint16_t j = 0;
-
-  for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j) {
-    if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
-         pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
-         pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel9_t *dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel10_t *dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
-           pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel11_t *dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel12_t *dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
-}
-static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_dlsch_pdu_rel13_t *dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
-           pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
-           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
-}
-
-static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel8_t *pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
-           pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
-           pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
-           pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
-           pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
-}
-static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_pch_pdu_rel13_t *pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
-           pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
-}
-
-static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_prs_pdu_rel9_t *prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
-           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
-           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
-           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel10_t *csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
-           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
-           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
-           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
-           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
-           pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
-}
-
-static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_csi_rs_pdu_rel13_t *csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
-
-  if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
-        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
-        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
-    return 0;
-
-  uint16_t idx =0;
-
-  for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx) {
-    if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
-      return 0;
-
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
-    //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel11_t *epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
-          pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
-          pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
-          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
-          pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
-}
-
-static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_epdcch_parameters_rel13_t *epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
-           pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
-}
-
-static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_mpdcch_pdu_rel13_t *mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
-           pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
-           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
-           pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
-}
-
-
-static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_nbch_pdu_rel13_t *nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
-           pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
-           pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
-}
-
-static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_npdcch_pdu_rel13_t *npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
-           pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
-           pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
-}
-
-static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_dl_config_ndlsch_pdu_rel13_t *ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
-           pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
-           pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
-           pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
-}
-
-
-static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)msg;
-
-  if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
-       pull16(ppReadPackedMsg, &value->PDUType, end) ))
-    return 0;
-
-  // first match the pdu type, then call the respective function
-  switch(value->PDUType) {
-    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
-      if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
-      if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
-      if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
-      if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-
-
-
-static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
-       pull8(ppReadPackedMsg, &value->number_dci, end) &&
-       pull16(ppReadPackedMsg, &value->number_pdu, end) &&
-       pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
-       pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
-    return 0;
-
-  if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_pdu) {
-    value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
-
-    if(value->dl_config_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
-      return 0;
-    }
-  } else {
-    value->dl_config_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_pdu;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end) {
-      // pdu end of beyond buffer end
-      return 0;
-    }
-
-    switch(pdu->pdu_type) {
-      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
-          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
-          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
-          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default:
-        // Need to log an error
-        break;
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
-
-  if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
-        pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
-        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
-       ))
-    return 0;
-
-  int arr[12];
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
-    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
-      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
-    }
-
-    if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
-      return 0;
-  }
-
-  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
-    if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_prach_pdu_t *prach_pdu = (nfapi_nr_prach_pdu_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
-          pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
-          pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_pucch_pdu_t *pucch_pdu = (nfapi_nr_pucch_pdu_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
-          pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
-          pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
-          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_pusch_pdu_t *pusch_pdu = (nfapi_nr_pusch_pdu_t *)tlv;
-
-  if (!(
-        pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
-        pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate,  end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order,  end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->mcs_index,  end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
-        pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
-        pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
-        // TODO: ignoring beamforming tlv for now
-      ))
-    return 0;
-
-  //Pack Optional Data only included if indicated in pduBitmap
-  switch(pusch_pdu->pdu_bit_map) {
-    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
-      // pack optional TLVs
-      return(
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
-              pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
-              pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
-      return(
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
-      return(
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
-              +               pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
-              +               pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
-            );
-    }
-    break;
-
-    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
-      return(
-              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
-              pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
-              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
-            );
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nr_srs_pdu_t *srs_pdu = (nfapi_nr_srs_pdu_t *)tlv;
-  return(
-          pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
-          pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->num_symbols,  end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
-          // TODO: ignoring beamforming tlv for now
-        );
-}
-
-
-static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_ul_tti_request_number_of_pdus_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t *)msg;
-
-  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
-    return 0;
-
-  // first natch the pdu type, then call the respective function
-  switch(pNfapiMsg->pdu_type) {
-    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
-      if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
-      if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
-      if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
-      if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
-        return 0;
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
-    }
-    break;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_ul_tti_request_number_of_groups_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t *)msg;
-
-  if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
-    return 0;
-
-  for (int i = 0; i < pNfapiMsg->n_ue; i++) {
-    if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx,end) )
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
-
-  if (!(
-        pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
-    return 0;
-
-  for(int i=0; i< pNfapiMsg->n_pdus; i++) {
-    if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
-      return 0;
-  }
-
-  for(int i=0; i< pNfapiMsg->n_group; i++) {
-    if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-
-static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
-  };
-  return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-           unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
-  return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
-}
-
-static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
-          pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
-          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
-           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
-           pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
-           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
-}
-static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->ue_type, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
-          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
-          pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
-}
-static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
-          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
-}
-
-static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
-       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
-       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
-    return 0;
-
-  switch(cqi_ri_info_rel9->report_type) {
-    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
-      if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
-           pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
-        return 0;
-    }
-    break;
-
-    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
-      if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
-        return 0;
-
-      uint8_t i;
-
-      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
-        if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
-          return 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[j], end) == 0)
-            return 0;
-        }
-      }
-    }
-    break;
-
-    default: {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
-      return 0;
-    }
-    break;
-  };
-
-  return 1;
-}
-
-// NOTE : This function is a little unconventional as we uese the side to
-// determine the report type
-static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
-
-  if(cqi_ri_info_rel13->tl.length == 0) {
-    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
-  } else {
-    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
-
-    if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
-          pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
-}
-static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
-}
-
-static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
-  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
-}
-
-static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
-  return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
-          pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
-          pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
-}
-static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
-          pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
-          pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
-          pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
-}
-
-static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
-           pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
-          pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
-}
-static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
-          pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
-          pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
-}
-
-static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
-          pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
-          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
-          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
-          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
-  return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
-          pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
-          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
-          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
-          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
-  return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
-          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
-}
-
-static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
-  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
-          pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
-}
-
-
-static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
-  return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
-          pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
-          pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
-  return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
-}
-
-static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
-}
-
-static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
-  return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
-}
-
-static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
-       pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
-       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
-       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
-    return 0;
-
-  unpack_tlv_t unpack_fns[] = {
-    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
-    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
-    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-    { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
-  };
-  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
-}
-
-static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
-          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
-          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
-}
-
-
-static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-#define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
-#define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
-#define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
-  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
-#define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
-#define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
-#define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
-#define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
-#define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
-#define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
-  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
-#define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
-#define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
-  { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
-  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
-       pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
-       pull8(ppReadPackedMsg, &value->srs_present, end)))
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus > 0) {
-    value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
-
-    if(value->ul_config_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->ul_config_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end) {
-      // pdu end is past buffer end
-      return 0;
-    }
-
-    switch(pdu->pdu_type) {
-      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
-          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
-          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
-          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
-          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
-          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
-          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
-          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
-          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
-          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
-          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-    }
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
-  return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
-          pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
-          pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
-          pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
-          pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
-          pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
-          pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
-          pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
-}
-
-static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
-           pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
-}
-
-static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
-          pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
-          pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
-          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
-          pull8(ppReadPackedMsg, &value->ecce_index, end) &&
-          pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
-          pull8(ppReadPackedMsg, &value->rnti_type, end) &&
-          pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull8(ppReadPackedMsg, &value->ce_mode, end) &&
-          pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
-          pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
-          pull16(ppReadPackedMsg, &value->transmission_power, end) &&
-          pull8(ppReadPackedMsg, &value->dci_format, end) &&
-          pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
-          pull8(ppReadPackedMsg, &value->mcs, end) &&
-          pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
-          pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
-          pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
-          pull8(ppReadPackedMsg, &value->harq_process, end) &&
-          pull8(ppReadPackedMsg, &value->redudency_version, end) &&
-          pull8(ppReadPackedMsg, &value->tpc, end) &&
-          pull8(ppReadPackedMsg, &value->csi_request, end) &&
-          pull8(ppReadPackedMsg, &value->ul_inex, end) &&
-          pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
-          pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
-          pull8(ppReadPackedMsg, &value->srs_request, end) &&
-          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
-          pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
-          pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
-          pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
-}
-
-static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
-          pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
-          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
-          pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
-          pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
-          pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
-          pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
-          pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
-          pull8(ppReadPackedMsg, &value->mcs, end) &&
-          pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
-          pull8(ppReadPackedMsg, &value->repetition_number, end) &&
-          pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
-          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
-}
-
-static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
-
-  if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_hi, end)))
-    return 0;
-
-  uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
-
-  if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
-    return 0;
-  }
-
-  if(totalNumPdus > 0) {
-    value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
-
-    if(value->hi_dci0_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
-      return 0;
-    }
-  } else {
-    value->hi_dci0_pdu_list = 0;
-  }
-
-  uint8_t i;
-
-  for(i = 0; i < totalNumPdus; ++i) {
-    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end) {
-      // pdu end if past buffer end
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
-      return 0;
-    }
-
-    switch(pdu->pdu_type) {
-      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
-          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
-          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
-          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
-          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
-          { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
-      }
-      break;
-    };
-  }
-
-  return 1;
-}
-//unpack_ul_dci_pdu_list_value
-
-static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_ul_dci_request_pdus_t *value = (nfapi_nr_ul_dci_request_pdus_t *)msg;
-
-  for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i) {
-    if(!pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI,  end) &&
-        pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
-        pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
-        pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
-        pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
-        pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
-        pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
-        pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
-        pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, DCI_PAYLOAD_BYTE_LEN, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end));
-
-    return 0;
-  }
-
-  return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
-          pull16(ppReadPackedMsg, &value->PDUSize, end) &&
-          pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
-          pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
-          pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
-          pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
-          pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
-          pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
-}
-
-static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
-
-  if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-        pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
-       ))
-    return 0;
-
-  for(int i=0; i< pNfapiMsg->numPdus; i++) {
-    if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
-  nfapi_nr_pdu_t *pNfapiMsg = (nfapi_nr_pdu_t *)msg;
-
-  if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
-      ))
-    return 0;
-
-  uint16_t i = 0;
-  uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
-
-  for(; i < total_number_of_tlvs; ++i) {
-    if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
-          pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
-      return 0;
-
-    switch(pNfapiMsg->TLVs[i].tag) {
-      case 0: {
-        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
-          return 0;
-
-        break;
-      }
-
-      case 1: {
-        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end))
-          return 0;
-
-        break;
-      }
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
-        break;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
-
-  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
-       pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
-    return 0;
-
-  for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++) {
-    if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  uint8_t proceed = 1;
-  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
-
-  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
-    return 0;
-
-  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
-    nfapi_tl_t generic_tl;
-
-    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    switch(generic_tl.tag) {
-      case NFAPI_TX_REQUEST_BODY_TAG: {
-        pNfapiMsg->tx_request_body.tl = generic_tl;
-
-        if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
-          return 0;
-
-        if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
-          return 0;
-        }
-
-        if(pNfapiMsg->tx_request_body.number_of_pdus > 0) {
-          pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
-
-          if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL) {
-            NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx  pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
-            return 0;
-          }
-        } else {
-          pNfapiMsg->tx_request_body.tx_pdu_list = 0;
-        }
-
-        uint16_t i;
-        uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
-
-        for(i = 0; i < totalNumPdus; ++i) {
-          nfapi_tx_request_pdu_t *pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
-
-          if (pdu) {
-            uint16_t length = 0;
-            uint16_t index = 0;
-
-            if(!(pull16(ppReadPackedMsg, &length, end) &&
-                 pull16(ppReadPackedMsg, &index, end)))
-              return 0;
-
-            pdu->pdu_length = length;
-            pdu->pdu_index = index;
-            // TODO : May need to rethink this bit
-            pdu->num_segments = 1;
-            pdu->segments[0].segment_length = pdu->pdu_length;
-            pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
-
-            if(pdu->segments[0].segment_data) {
-              if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
-                return 0;
-
-              if (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 {
-              NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
-            }
-          } else {
-            NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
-          }
-        }
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
-      }
-      break;
-    };
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  uint8_t proceed = 1;
-  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
-
-  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
-    return 0;
-
-  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
-    nfapi_tl_t generic_tl;
-
-    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    switch(generic_tl.tag) {
-      case NFAPI_UE_RELEASE_BODY_TAG: {
-        pNfapiMsg->ue_release_request_body.tl = generic_tl;
-
-        if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
-          return 0;
-
-        if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI) {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
-          return 0;
-        } else {
-          uint8_t j;
-          uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
-
-          for(j = 0; j < num; ++j) {
-            if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0) {
-              return 0;
-            }
-          }
-        }
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
-      }
-      break;
-    };
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_bundling_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
-          pull8(ppReadPackedMsg, &value->value_1, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_multiplexing_t *value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
-          pull8(ppReadPackedMsg, &value->value_1, end) &&
-          pull8(ppReadPackedMsg, &value->value_2, end) &&
-          pull8(ppReadPackedMsg, &value->value_3, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_special_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &value->value_0, end));
-}
-static uint8_t unpack_harq_indication_tdd_harq_data(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_harq_data_t *value = (nfapi_harq_indication_tdd_harq_data_t *)tlv;
-  return  (pull8(ppReadPackedMsg, &value->value_0, end));
-}
-
-static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel8_t *value = (nfapi_harq_indication_tdd_rel8_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-    return 0;
-
-  uint8_t result = 0;
-
-  switch(value->mode) {
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-      result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-      result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-      result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
-      break;
-
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-      result = 1;
-      break;
-
-    default:
-      // TODO add error message
-      return 0;
-      break;
-  }
-
-  return result;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel9_t *value = (nfapi_harq_indication_tdd_rel9_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-    return 0;
-
-  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
-    // TODO : add error message
-    return 0;
-  }
-
-  uint16_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(value->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
-        break;
-
-      default:
-        // TODO add error message
-        return 0;
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_tdd_rel13_t *value = (nfapi_harq_indication_tdd_rel13_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
-       pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
-    return 0;
-
-  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
-    // TODO : add error message
-    return 0;
-  }
-
-  uint16_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
-    uint8_t result = 0;
-
-    switch(value->mode) {
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
-        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
-        break;
-
-      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
-        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
-        break;
-
-      default:
-        // TODO add error message
-        return 0;
-        break;
-    }
-
-    if(result == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel8_t *value = (nfapi_harq_indication_fdd_rel8_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
-          pull8(ppReadPackedMsg, &value->harq_tb2, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel9_t *value = (nfapi_harq_indication_fdd_rel9_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->mode, end) &&
-          pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
-          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_harq_indication_fdd_rel13_t *value = (nfapi_harq_indication_fdd_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->mode, end) &&
-          pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
-          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
-}
-
-static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-          pull8(ppReadPackedMsg, &value->channel, end));
-}
-
-
-
-static uint8_t unpack_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
-  uint8_t *harqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(harqBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
-    return 0;
-
-  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
-    return 0;
-  }
-
-  value->harq_pdu_list = (nfapi_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
-
-  if(value->harq_pdu_list == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
-    return 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_harqs; ++i) {
-    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
-      { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
-      { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
-      { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
-      { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
-      { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
-      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_crc_indication_rel8_t *crc_pdu_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
-  return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
-}
-
-static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
-  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
-  uint8_t *crcBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(crcBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
-    return 0;
-
-  if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_crcs > 0) {
-    value->crc_pdu_list = (nfapi_crc_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
-
-    if(value->crc_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
-      return 0;
-    }
-  } else {
-    value->crc_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_crcs; ++i) {
-    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->length, end) &&
-          pull16(ppReadPackedMsg, &value->offset, end) &&
-          pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
-          pull16(ppReadPackedMsg, &value->timing_advance, end));
-}
-static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
-}
-
-static uint8_t unpack_rx_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
-  // the rxBodyEnd points to the end of the cqi PDU's
-  uint8_t *rxBodyEnd = *ppReadPackedMsg + value->tl.length;
-  uint8_t *rxPduEnd = rxBodyEnd;
-  uint8_t *numberOfPdusAddress = *ppReadPackedMsg;
-
-  if(rxBodyEnd > end) {
-    // pdu end is past buffer end
-    return 0;
-  }
-
-  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus > 0) {
-    value->rx_pdu_list = (nfapi_rx_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
-
-    if(value->rx_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->rx_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-  nfapi_rx_indication_pdu_t *pdu = 0;
-
-  while((uint8_t *)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t *)(*ppReadPackedMsg) < rxPduEnd) {
-    nfapi_tl_t generic_tl;
-
-    if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-      return 0;
-
-    switch(generic_tl.tag) {
-      case NFAPI_RX_UE_INFORMATION_TAG: {
-        pdu = &(value->rx_pdu_list[i++]);
-        pdu->rx_ue_information.tl = generic_tl;
-
-        if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
-          return 0;
-      }
-      break;
-
-      case NFAPI_RX_INDICATION_REL8_TAG: {
-        if(pdu != 0) {
-          pdu->rx_indication_rel8.tl = generic_tl;
-
-          if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          if(pdu->rx_indication_rel8.offset > 0) {
-            // Need to check that the data is within the tlv
-            if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd) {
-              // If this the first pdu set the rxPduEnd
-              if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd) {
-                rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
-
-                if(rxPduEnd > end) {
-                  // pdu end is past buffer end
-                  return 0;
-                }
-              }
-            } else {
-              NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
-            }
-          }
-        }
-      }
-      break;
-
-      case NFAPI_RX_INDICATION_REL9_TAG: {
-        if(pdu != 0) {
-          pdu->rx_indication_rel9.tl = generic_tl;
-
-          if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
-            return 0;
-        }
-      }
-      break;
-
-      default: {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
-      }
-      break;
-    }
-  }
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_pdus; ++idx) {
-    if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
-      uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
-      value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
-
-      if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0) {
-        return 0;
-      }
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel8_t *preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
-          pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
-          pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
-}
-
-static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel9_t *preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
-  return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
-}
-
-static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_preamble_pdu_rel13_t *preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
-  return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
-}
-
-static uint8_t unpack_rach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
-  uint8_t *rachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(rachBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
-    return 0;
-
-  if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_preambles > 0) {
-    value->preamble_list = (nfapi_preamble_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
-
-    if(value->preamble_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
-      return 0;
-    }
-  } else {
-    value->preamble_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_preambles; ++i) {
-    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
-      { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
-      { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel8_t *srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
-
-  if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
-       pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
-       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
-       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
-       pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
-    return 0;
-
-  return 1;
-}
-
-static uint8_t unpack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel9_t *srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
-  return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
-}
-
-static uint8_t unpack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_ttd_rel10_t *srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
-  return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
-}
-
-static uint8_t unpack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_srs_indication_fdd_rel11_t *srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
-  return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
-}
-
-static uint8_t unpack_tdd_channel_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
-
-  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
-       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
-       pull8(ppReadPackedMsg, &value->num_atennas, end)))
-    return 0;
-
-  if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS) {
-    // todo : add error
-    return 0;
-  }
-
-  if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS) {
-    // todo : add error
-    return 0;
-  }
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_subbands; ++idx) {
-    if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
-         pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
-      return 0;
-  }
-
-  return 1;
-}
-
-
-static uint8_t unpack_srs_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
-  uint8_t *srsBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(srsBodyEnd > end)
-    return 0;
-
-  if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
-    return 0;
-
-  if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_ues > 0) {
-    value->srs_pdu_list = (nfapi_srs_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
-
-    if(value->srs_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
-      return 0;
-    }
-  } else {
-    value->srs_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_ues; ++i) {
-    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
-      { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
-      { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
-      { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
-      { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
-  uint8_t *srBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(srBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
-    return 0;
-
-  if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_srs > 0) {
-    value->sr_pdu_list = (nfapi_sr_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
-
-    if(value->sr_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
-      return 0;
-    }
-  } else {
-    value->sr_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_srs; ++i) {
-    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
-  return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
-          pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
-          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
-          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
-          pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
-}
-
-static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
-
-  if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
-       pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
-       pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
-       pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
-    return 0;
-
-  if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
-    return 0;
-  }
-
-  if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
-       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
-       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
-    return 0;
-
-  return 1;
-}
-
-static uint8_t  unpack_cqi_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
-  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
-  // the cqiBodyEnd points to the end of the cqi PDU's
-  uint8_t *cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  //uint8_t* cqiPduEnd = cqiBodyEnd;
-  //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
-
-  if(cqiBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
-    return 0;
-
-  if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
-    return -1;
-  }
-
-  if(value->number_of_cqis > 0) {
-    value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
-
-    if(value->cqi_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
-      return 0;
-    }
-  } else {
-    value->cqi_pdu_list = 0;
-  }
-
-  if(value->number_of_cqis > 0) {
-    value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
-
-    if(value->cqi_raw_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
-      return 0;
-    }
-  } else {
-    value->cqi_raw_pdu_list = 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_cqis; ++i) {
-    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
-    memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-
-    while((uint8_t *)(*ppReadPackedMsg) < cqiPduInstanceEnd) {
-      nfapi_tl_t generic_tl;
-
-      if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
-        return 0;
-
-      switch(generic_tl.tag) {
-        case NFAPI_RX_UE_INFORMATION_TAG:
-          pdu->rx_ue_information.tl = generic_tl;
-
-          if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        case NFAPI_CQI_INDICATION_REL8_TAG:
-          pdu->cqi_indication_rel8.tl = generic_tl;
-
-          if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        case NFAPI_CQI_INDICATION_REL9_TAG:
-          pdu->cqi_indication_rel9.tl = generic_tl;
-
-          if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        case NFAPI_UL_CQI_INFORMATION_TAG:
-          pdu->ul_cqi_information.tl = generic_tl;
-
-          if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
-            return 0;
-
-          break;
-
-        default: {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
-        }
-        break;
-      };
-    }
-  }
-
-  uint8_t idx = 0;
-
-  for(idx = 0; idx < value->number_of_cqis; ++idx) {
-    if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
-      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
-        return 0;
-    } else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
-      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
-        return 0;
-    }
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->mp_cca, end) &&
-          pull32(ppReadPackedMsg, &value->n_cca, end) &&
-          pull32(ppReadPackedMsg, &value->offset, end) &&
-          pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
-          pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
-          pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->offset, end) &&
-          pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
-          pull32(ppReadPackedMsg, &value->lbt_mode, end));
-}
-
-
-static uint8_t unpack_lbt_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus) {
-    value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
-
-    if(value->lbt_dl_config_req_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->lbt_dl_config_req_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default:
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
-        return 0;
-    }
-  }
-
-  return 1;
-}
-static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->result, end) &&
-          pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
-          pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
-}
-static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
-  return (pull32(ppReadPackedMsg, &value->handle, end) &&
-          pull32(ppReadPackedMsg, &value->result, end));
-}
-
-static uint8_t unpack_lbt_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
-    return 0;
-
-  if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
-    return 0;
-  }
-
-  if(value->number_of_pdus > 0) {
-    value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
-
-    if(value->lbt_indication_pdu_list == NULL) {
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
-      return 0;
-    }
-  } else {
-    value->lbt_indication_pdu_list = 0;
-  }
-
-  uint16_t i;
-  uint16_t total_number_of_pdus = value->number_of_pdus;
-
-  for(i = 0; i < total_number_of_pdus; ++i) {
-    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
-
-    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
-         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
-      return 0;
-
-    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
-
-    if(packedPduEnd > end)
-      return 0;
-
-    switch(pdu->pdu_type) {
-      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
-        unpack_tlv_t unpack_fns[] = {
-          { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
-        };
-        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
-      }
-      break;
-
-      default:
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
-        return 0;
-    }
-  }
-
-  return 1;
-}
-static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nb_harq_indication_fdd_rel13_t *value = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
-  return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
-}
-
-
-static uint8_t unpack_nb_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
-  uint8_t *nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(nbharqBodyEnd > end)
-    return 0;
-
-  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
-    return 0;
-
-  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
-    return 0;
-  }
-
-  value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
-
-  if(value->nb_harq_pdu_list == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
-    return 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_harqs; ++i) {
-    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
-
-    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
-      return 0;
-
-    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
-      { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
-      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
-  nfapi_nrach_indication_pdu_rel13_t *value = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
-  return (pull16(ppReadPackedMsg, &value->rnti, end) &&
-          pull8(ppReadPackedMsg, &value->initial_sc, end) &&
-          pull16(ppReadPackedMsg, &value->timing_advance, end) &&
-          pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
-}
-
-static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
-
-  if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0) {
-    return 0;
-  } else {
-    NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_nrach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
-  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
-  uint8_t *nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
-
-  if(nrachBodyEnd > end)
-    return 0;
-
-  if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
-    return 0;
-
-  if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
-    return 0;
-  }
-
-  value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
-
-  if(value->nrach_pdu_list == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
-    return 0;
-  }
-
-  uint8_t i = 0;
-
-  for(i = 0; i < value->number_of_initial_scs_detected; ++i) {
-    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
-    uint8_t *nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
-    unpack_tlv_t unpack_fns[] = {
-      { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
-    };
-
-    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
-      return 0;
-  }
-
-  return 1;
-}
-
-static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
-  unpack_p7_tlv_t unpack_fns[] = {
-    { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
-  };
-  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
-          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
-  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
-  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
-          pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
-          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
-          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
-}
-
-
-
-// unpack length check
-
-static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_DL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
-        retLen = sizeof(nfapi_dl_config_request_t);
-
-      break;
-
-    case NFAPI_UL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
-        retLen = sizeof(nfapi_ul_config_request_t);
-
-      break;
-
-    case NFAPI_SUBFRAME_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
-        retLen = sizeof(nfapi_subframe_indication_t);
-
-      break;
-
-    case NFAPI_HI_DCI0_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
-        retLen = sizeof(nfapi_hi_dci0_request_t);
-
-      break;
-
-    case NFAPI_TX_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
-        retLen = sizeof(nfapi_tx_request_t);
-
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
-        retLen = sizeof(nfapi_harq_indication_t);
-
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
-        retLen = sizeof(nfapi_crc_indication_t);
-
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
-        retLen = sizeof(nfapi_rx_indication_t);
-
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
-        retLen = sizeof(nfapi_rach_indication_t);
-
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
-        retLen = sizeof(nfapi_srs_indication_t);
-
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
-        retLen = sizeof(nfapi_sr_indication_t);
-
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
-        retLen = sizeof(nfapi_cqi_indication_t);
-
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
-        retLen = sizeof(nfapi_lbt_dl_config_request_t);
-
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
-        retLen = sizeof(nfapi_lbt_dl_indication_t);
-
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
-        retLen = sizeof(nfapi_nb_harq_indication_t);
-
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
-        retLen = sizeof(nfapi_nrach_indication_t);
-
-      break;
-
-    case NFAPI_DL_NODE_SYNC:
-      if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
-        retLen = sizeof(nfapi_dl_node_sync_t);
-
-      break;
-
-    case NFAPI_UL_NODE_SYNC:
-      if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
-        retLen = sizeof(nfapi_ul_node_sync_t);
-
-      break;
-
-    case NFAPI_TIMING_INFO:
-      if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
-        retLen = sizeof(nfapi_timing_info_t);
-
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
-        retLen = sizeof(nfapi_ue_release_request_t);
-
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
-        retLen = sizeof(nfapi_ue_release_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
-  int retLen = 0;
-
-  switch (msgId) {
-    case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
-        retLen = sizeof(nfapi_nr_dl_tti_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
-        retLen = sizeof(nfapi_nr_ul_tti_request_t);
-
-      break;
-
-    case NFAPI_SUBFRAME_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
-        retLen = sizeof(nfapi_subframe_indication_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
-        retLen = sizeof(nfapi_nr_ul_dci_request_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
-        retLen = sizeof(nfapi_nr_tx_data_request_t);
-
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
-        retLen = sizeof(nfapi_harq_indication_t);
-
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
-        retLen = sizeof(nfapi_crc_indication_t);
-
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
-        retLen = sizeof(nfapi_rx_indication_t);
-
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
-        retLen = sizeof(nfapi_rach_indication_t);
-
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
-        retLen = sizeof(nfapi_srs_indication_t);
-
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
-        retLen = sizeof(nfapi_sr_indication_t);
-
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
-        retLen = sizeof(nfapi_cqi_indication_t);
-
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
-        retLen = sizeof(nfapi_lbt_dl_config_request_t);
-
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
-        retLen = sizeof(nfapi_lbt_dl_indication_t);
-
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
-        retLen = sizeof(nfapi_nb_harq_indication_t);
-
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
-        retLen = sizeof(nfapi_nrach_indication_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-      if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
-        retLen = sizeof(nfapi_nr_dl_node_sync_t);
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-      if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
-        retLen = sizeof(nfapi_nr_ul_node_sync_t);
-
-      break;
-
-    case NFAPI_TIMING_INFO:
-      if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
-        retLen = sizeof(nfapi_timing_info_t);
-
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
-        retLen = sizeof(nfapi_ue_release_request_t);
-
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
-        retLen = sizeof(nfapi_ue_release_response_t);
-
-      break;
-
-    default:
-      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
-      break;
-  }
-
-  return retLen;
-}
-
-
-
-// Main unpack functions - public
-
-int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
-  nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  // process the header
-  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
-    return -1;
-
-  return 0;
-}
-
-int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
-  int result = 0;
-  nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t *)pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  /*
-    uint8_t *ptr = pMessageBuf;
-  printf("\n Read P7 message unpack: ");
-  while(ptr < end){
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-  printf("\n");
-  */
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
-    return -1;
-  }
-
-  if((uint8_t *)(pMessageBuf + pMessageHeader->message_length) > end) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
-    return -1;
-  }
-
-  /*
-  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-  {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
-    return -1;
-  }
-  */
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_DL_CONFIG_REQUEST:
-      if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UL_CONFIG_REQUEST:
-      if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_TX_REQUEST:
-      if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
-        result = unpack_tx_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_HI_DCI0_REQUEST:
-      if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
-        result = unpack_hi_dci0_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
-        result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
-        result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
-        result = unpack_crc_indication(&pReadPackedMessage,end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
-        result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
-        result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
-        result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
-        result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
-        result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
-        result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
-        result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
-        result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_DL_NODE_SYNC:
-      if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
-        result = unpack_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UL_NODE_SYNC:
-      if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
-        result = unpack_ul_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_TIMING_INFO:
-      if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
-        result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
-        result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p7_vendor_extension) {
-          result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  if(result == 0)
-    return -1;
-  else
-    return 0;
-}
-
-int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
-  int result = 0;
-  nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t *)pUnpackedBuf;
-  uint8_t *pReadPackedMessage = pMessageBuf;
-  uint8_t *end = pMessageBuf + messageBufLen;
-
-  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
-    return -1;
-  }
-
-  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
-    return -1;
-  }
-
-  /*
-    uint8_t *ptr = pMessageBuf;
-  printf("\n Read P7 message unpack: ");
-  while(ptr < end){
-    printf(" %d ", *ptr);
-    ptr++;
-  }
-  printf("\n");
-  */
-  // clean the supplied buffer for - tag value blanking
-  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
-
-  // process the header
-  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
-       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
-       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
-    return -1;
-  }
-
-  if((uint8_t *)(pMessageBuf + pMessageHeader->message_length) > end) {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
-    return -1;
-  }
-
-  /*
-  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
-  {
-    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
-    return -1;
-  }
-  */
-
-  // look for the specific message
-  switch (pMessageHeader->message_id) {
-    case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-      if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
-        result = unpack_dl_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
-      if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
-        result = unpack_ul_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
-      if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
-        result = unpack_tx_data_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
-      if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
-        result = unpack_ul_dci_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UE_RELEASE_REQUEST:
-      if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
-        result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_HARQ_INDICATION:
-      if (check_nr_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
-        result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_CRC_INDICATION:
-      if (check_nr_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
-        result = unpack_crc_indication(&pReadPackedMessage,end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_ULSCH_INDICATION:
-      if (check_nr_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
-        result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RACH_INDICATION:
-      if (check_nr_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
-        result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_SRS_INDICATION:
-      if (check_nr_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
-        result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_SR_INDICATION:
-      if (check_nr_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
-        result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_RX_CQI_INDICATION:
-      if (check_nr_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
-        result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_LBT_DL_CONFIG_REQUEST:
-      if (check_nr_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
-        result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_LBT_DL_INDICATION:
-      if (check_nr_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
-        result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NB_HARQ_INDICATION:
-      if (check_nr_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
-        result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NRACH_INDICATION:
-      if (check_nr_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
-        result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
-      if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
-        result = unpack_nr_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
-      if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
-        result = unpack_nr_ul_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_TIMING_INFO:
-      if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
-        result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    case NFAPI_UE_RELEASE_RESPONSE:
-      if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
-        result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
-      else
-        return -1;
-
-      break;
-
-    default:
-      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
-          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
-        if(config && config->unpack_p7_vendor_extension) {
-          result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
-        } else {
-          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
-        }
-      } else {
-        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
-      }
-
-      break;
-  }
-
-  if(result == 0)
-    return -1;
-  else
-    return 0;
-}
-
-
+/*
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <assert.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <zlib.h>
+#include <sched.h>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <pthread.h>
+#include <stdint.h>
+
+#include <nfapi_interface.h>
+#include <nfapi.h>
+#include <debug.h>
+#include "nfapi_nr_interface_scf.h"
+
+extern int nfapi_unpack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppReadPackedMsg, void *user_data);
+extern int nfapi_pack_p7_vendor_extension(nfapi_p7_message_header_t *header, uint8_t **ppWritePackedMsg, void *user_data);
+
+uint32_t nfapi_calculate_checksum(uint8_t *buffer, uint16_t len) {
+  uint32_t chksum = 0;
+  // calcaulte upto the checksum
+  chksum = crc32(chksum, buffer, 8);
+  // skip the checksum
+  uint8_t zeros[4] = {0, 0, 0, 0};
+  chksum = crc32(chksum, zeros, 4);
+  // continu with the rest of the mesage
+  chksum = crc32(chksum, &buffer[NFAPI_P7_HEADER_LENGTH], len - NFAPI_P7_HEADER_LENGTH);
+  // return the inverse
+  return ~(chksum);
+}
+
+int nfapi_p7_update_checksum(uint8_t *buffer, uint32_t len) {
+  uint32_t checksum = nfapi_calculate_checksum(buffer, len);
+  uint8_t *p_write = &buffer[8];
+  return (push32(checksum, &p_write, buffer + len) > 0 ? 0 : -1);
+}
+
+int nfapi_p7_update_transmit_timestamp(uint8_t *buffer, uint32_t timestamp) {
+  uint8_t *p_write = &buffer[12];
+  return (push32(timestamp, &p_write, buffer + 16) > 0 ? 0 : -1);
+}
+
+uint32_t nfapi_p7_calculate_checksum(uint8_t *buffer, uint32_t len) {
+  return nfapi_calculate_checksum(buffer, len);
+}
+
+void *nfapi_p7_allocate(size_t size, nfapi_p7_codec_config_t *config) {
+  if(size == 0)
+    return 0;
+
+  void *buffer_p = NULL;
+
+  if(config && config->allocate) {
+    buffer_p = (config->allocate)(size);
+
+    if(buffer_p != NULL) {
+      memset(buffer_p,0,size);
+    }
+
+    return buffer_p;
+  } else {
+    buffer_p = calloc(1, size);
+    return buffer_p;
+  }
+}
+
+void nfapi_p7_deallocate(void *ptr, nfapi_p7_codec_config_t *config) {
+  if(ptr == NULL)
+    return;
+
+  if(config && config->deallocate) {
+    return (config->deallocate)(ptr);
+  } else {
+    return free(ptr);
+  }
+}
+// Pack routines
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  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) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->mcs_1, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version_1, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator_1, ppWritePackedMsg, end) &&
+           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+           push8(value->mcs_2, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version_2, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator_2, ppWritePackedMsg, end) &&
+           push8(value->harq_process, ppWritePackedMsg, end) &&
+           push8(value->tpmi, ppWritePackedMsg, end) &&
+           push8(value->pmi, ppWritePackedMsg, end) &&
+           push8(value->precoding_information, ppWritePackedMsg, end) &&
+           push8(value->tpc, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+           push8(value->ngap, ppWritePackedMsg, end) &&
+           push8(value->transport_block_size_index, ppWritePackedMsg, end) &&
+           push8(value->downlink_power_offset, ppWritePackedMsg, end) &&
+           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+           push8(value->preamble_index, ppWritePackedMsg, end) &&
+           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+           push8(value->rnti_type, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel9_t *value = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
+  return( push8(value->mcch_flag, ppWritePackedMsg, end) &&
+          push8(value->mcch_change_notification, ppWritePackedMsg, end) &&
+          push8(value->scrambling_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel10_t *value = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
+  return ( push8(value->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+           push8(value->carrier_indicator, ppWritePackedMsg, end) &&
+           push8(value->srs_flag, ppWritePackedMsg, end) &&
+           push8(value->srs_request, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_scrambling_and_layers, ppWritePackedMsg, end) &&
+           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(value->n_dl_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel11_t *value = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
+  return ( push8(value->harq_ack_resource_offset, ppWritePackedMsg, end) &&
+           push8(value->pdsch_re_mapping_quasi_co_location_indicator, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel12_t *value = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
+  return ( push8(value->primary_cell_type, ppWritePackedMsg, end) &&
+           push8(value->ul_dl_configuration_flag, ppWritePackedMsg, end) &&
+           push8(value->number_ul_dl_configurations, ppWritePackedMsg, end) &&
+           pusharray8(value->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, value->number_ul_dl_configurations, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_tpm_value(nfapi_dl_config_dci_dl_tpm_t *value, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  if (!( push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+         push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+         push8(value->num_antennas, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
+
+    if(!(push8(subband_info->subband_index, ppWritePackedMsg, end) &&
+         push8(subband_info->scheduled_ues, ppWritePackedMsg, end)))
+      return 0;
+
+    uint8_t antenna_idx = 0;
+    uint8_t scheduled_ue_idx = 0;
+
+    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
+      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
+        if(!push16(subband_info->precoding_value[antenna_idx][scheduled_ue_idx], ppWritePackedMsg, end))
+          return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
+  return(
+          push16(value->bwp_size, ppWritePackedMsg, end) &&
+          push16(value->bwp_start, ppWritePackedMsg, end) &&
+          push8(value->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(value->cyclic_prefix, ppWritePackedMsg, end) &&
+          push16(value->start_rb, ppWritePackedMsg, end) &&
+          push16(value->nr_of_rbs, ppWritePackedMsg, end) &&
+          push8(value->csi_type, ppWritePackedMsg, end) &&
+          push8(value->row, ppWritePackedMsg, end) &&
+          push16(value->freq_domain, ppWritePackedMsg, end) &&
+          push8(value->symb_l0, ppWritePackedMsg, end) &&
+          push8(value->symb_l1, ppWritePackedMsg, end) &&
+          push8(value->cdm_type, ppWritePackedMsg, end) &&
+          push8(value->freq_density, ppWritePackedMsg, end) &&
+          push16(value->scramb_id, ppWritePackedMsg, end) &&
+          push8(value->power_control_offset, ppWritePackedMsg, end) &&
+          push8(value->power_control_offset_ss, ppWritePackedMsg, end)
+        );
+}
+
+
+static uint8_t pack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+
+	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+	
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(push16(value->dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+		push8(value->dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+		push16(value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+		pusharray8(value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
+		return 0;
+		
+	}
+	// TODO: resolve the packaging of array (currently sending a single element)
+	return(
+		push16(value->BWPSize, ppWritePackedMsg, end) &&
+		push16(value->BWPStart, ppWritePackedMsg, end) &&
+		push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+		push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+		push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+		push8(value->DurationSymbols, ppWritePackedMsg, end) &&
+		pusharray8(value->FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+		push8(value->CceRegMappingType, ppWritePackedMsg, end) &&
+		push8(value->RegBundleSize, ppWritePackedMsg, end) &&
+		push8(value->InterleaverSize, ppWritePackedMsg, end) &&
+		push8(value->CoreSetType, ppWritePackedMsg, end) &&
+		push16(value->ShiftIndex, ppWritePackedMsg, end) &&
+		push8(value->precoderGranularity, ppWritePackedMsg, end) &&
+		push16(value->numDlDci, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
+  // TODO: resolve the packaging of array (currently sending a single element)
+  return(
+          push16(value->pduBitmap, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push16(value->pduIndex, ppWritePackedMsg, end) &&
+          push16(value->BWPSize, ppWritePackedMsg, end) &&
+          push16(value->BWPStart, ppWritePackedMsg, end) &&
+          push8(value->SubcarrierSpacing, ppWritePackedMsg, end) &&
+          push8(value->CyclicPrefix, ppWritePackedMsg, end) &&
+          push8(value->NrOfCodewords, ppWritePackedMsg, end) &&
+          pusharray16(value->targetCodeRate, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->qamModOrder, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->mcsIndex, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->mcsTable, 2, 1, ppWritePackedMsg, end) &&
+          pusharray8(value->rvIndex, 2, 1, ppWritePackedMsg, end) &&
+          pusharray32(value->TBSize, 2, 1, ppWritePackedMsg, end) &&
+          push16(value->dataScramblingId, ppWritePackedMsg, end) &&
+          push8(value->nrOfLayers, ppWritePackedMsg, end) &&
+          push8(value->transmissionScheme, ppWritePackedMsg, end) &&
+          push8(value->refPoint, ppWritePackedMsg, end) &&
+          push16(value->dlDmrsSymbPos, ppWritePackedMsg, end) &&
+          push8(value->dmrsConfigType, ppWritePackedMsg, end) &&
+          push16(value->dlDmrsScramblingId, ppWritePackedMsg, end) &&
+          push8(value->SCID, ppWritePackedMsg, end) &&
+          push8(value->numDmrsCdmGrpsNoData, ppWritePackedMsg, end) &&
+          push16(value->dmrsPorts, ppWritePackedMsg, end) &&
+          push8(value->resourceAlloc, ppWritePackedMsg, end) &&
+          push16(value->rbStart, ppWritePackedMsg, end) &&
+          push16(value->rbSize, ppWritePackedMsg, end) &&
+          push8(value->VRBtoPRBMapping, ppWritePackedMsg, end) &&
+          push8(value->StartSymbolIndex, ppWritePackedMsg, end) &&
+          push8(value->NrOfSymbols, ppWritePackedMsg, end) &&
+          push8(value->PTRSPortIndex, ppWritePackedMsg, end) &&
+          push8(value->PTRSTimeDensity, ppWritePackedMsg, end) &&
+          push8(value->PTRSFreqDensity, ppWritePackedMsg, end) &&
+          push8(value->PTRSReOffset, ppWritePackedMsg, end)
+        );
+}
+
+
+static uint8_t pack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
+  return(
+          push16(value->PhysCellId, ppWritePackedMsg, end) &&
+          push8(value->BetaPss, ppWritePackedMsg, end) &&
+          push8(value->SsbBlockIndex, ppWritePackedMsg, end) &&
+          push8(value->SsbSubcarrierOffset, ppWritePackedMsg, end) &&
+          push16(value->ssbOffsetPointA, ppWritePackedMsg, end) &&
+          push8(value->bchPayloadFlag, ppWritePackedMsg, end) &&
+          push32(value->bchPayload, ppWritePackedMsg, end)
+          // TODO: pack precoding_and_beamforming too
+        );
+}
+
+
+static uint8_t pack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel13_t *value = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
+  return( push8(value->laa_end_partial_sf_flag, ppWritePackedMsg, end) &&
+          push8(value->laa_end_partial_sf_configuration, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+          push8(value->codebook_size_determination, ppWritePackedMsg, end) &&
+          push8(value->drms_table_flag, ppWritePackedMsg, end) &&
+          push8(value->tpm_struct_flag, ppWritePackedMsg, end) &&
+          (value->tpm_struct_flag == 1 ? pack_tpm_value(&(value->tpm), ppWritePackedMsg, end) : 1));
+}
+
+static uint8_t pack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  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));
+}
+static uint8_t pack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_mch_pdu_rel8_t *value = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->pdu_index, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->modulation, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end) &&
+           push16(value->mbsfn_area_id, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_bf_vector_info(void *elem, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_bf_vector_t *bf = (nfapi_bf_vector_t *)elem;
+  return ( push8(bf->subband_index, ppWritePackedMsg, end) &&
+           push8(bf->num_antennas, ppWritePackedMsg, end) &&
+           pusharray16(bf->bf_value, NFAPI_MAX_NUM_ANTENNAS, bf->num_antennas, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel8_t *value = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->pdu_index, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+           push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+           push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->modulation, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version, ppWritePackedMsg, end) &&
+           push8(value->transport_blocks, ppWritePackedMsg, end) &&
+           push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+           push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+           push8(value->number_of_layers, ppWritePackedMsg, end) &&
+           push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+           pusharray8(value->codebook_index, NFAPI_MAX_NUM_SUBBANDS, value->number_of_subbands, ppWritePackedMsg, end) &&
+           push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+           push8(value->pa, ppWritePackedMsg, end) &&
+           push8(value->delta_power_offset_index, ppWritePackedMsg, end) &&
+           push8(value->ngap, ppWritePackedMsg, end) &&
+           push8(value->nprb, ppWritePackedMsg, end) &&
+           push8(value->transmission_mode, ppWritePackedMsg, end) &&
+           push8(value->num_bf_prb_per_subband, ppWritePackedMsg, end) &&
+           push8(value->num_bf_vector, ppWritePackedMsg, end) &&
+           packarray(value->bf_vector, sizeof(nfapi_bf_vector_t), NFAPI_MAX_BF_VECTORS, value->num_bf_vector, ppWritePackedMsg, end, &pack_bf_vector_info));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel9_t *value = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
+  return ( push8(value->nscid, ppWritePackedMsg, end) );
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel10_t *value = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
+  return ( push8(value->csi_rs_flag, ppWritePackedMsg, end) &&
+           push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+           push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+           push8(value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+           pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_nzp_configuration, ppWritePackedMsg, end) &&
+           push8(value->pdsch_start, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel11_t *value = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
+  return( push8(value->drms_config_flag, ppWritePackedMsg, end) &&
+          push16(value->drms_scrambling, ppWritePackedMsg, end) &&
+          push8(value->csi_config_flag, ppWritePackedMsg, end) &&
+          push16(value->csi_scrambling, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_flag, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_atenna_ports, ppWritePackedMsg, end) &&
+          push8(value->pdsch_re_mapping_freq_shift, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel12_t *value = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
+  return( push8(value->altcqi_table_r12, ppWritePackedMsg, end) &&
+          push8(value->maxlayers, ppWritePackedMsg, end) &&
+          push8(value->n_dl_harq, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel13_t *value = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
+  return( push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end) &&
+          push8(value->ue_type, ppWritePackedMsg, end) &&
+          push8(value->pdsch_payload_type, ppWritePackedMsg, end) &&
+          push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+          push8(value->drms_table_flag, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel8_t *value = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
+  return( push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->p_rnti, ppWritePackedMsg, end) &&
+          push8(value->resource_allocation_type, ppWritePackedMsg, end) &&
+          push8(value->virtual_resource_block_assignment_flag, ppWritePackedMsg, end) &&
+          push32(value->resource_block_coding, ppWritePackedMsg, end) &&
+          push8(value->mcs, ppWritePackedMsg, end) &&
+          push8(value->redundancy_version, ppWritePackedMsg, end) &&
+          push8(value->number_of_transport_blocks, ppWritePackedMsg, end) &&
+          push8(value->transport_block_to_codeword_swap_flag, ppWritePackedMsg, end) &&
+          push8(value->transmission_scheme, ppWritePackedMsg, end) &&
+          push8(value->number_of_layers, ppWritePackedMsg, end) &&
+          push8(value->codebook_index, ppWritePackedMsg, end) &&
+          push8(value->ue_category_capacity, ppWritePackedMsg, end) &&
+          push8(value->pa, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push8(value->nprb, ppWritePackedMsg, end) &&
+          push8(value->ngap, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel13_t *value = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
+  return ( push8(value->ue_mode, ppWritePackedMsg, end) &&
+           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_prs_pdu_rel9_t *value = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
+  return( push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push8(value->prs_bandwidth, ppWritePackedMsg, end) &&
+          push8(value->prs_cyclic_prefix_type, ppWritePackedMsg, end) &&
+          push8(value->prs_muting, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel10_t *value = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
+  return( push8(value->csi_rs_antenna_port_count_r10, ppWritePackedMsg, end) &&
+          push8(value->csi_rs_resource_config_r10, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push16(value->csi_rs_zero_tx_power_resource_config_bitmap_r10, ppWritePackedMsg, end) &&
+          push8(value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end) &&
+          pusharray8(value->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, value->csi_rs_number_of_nzp_configuration, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel13_t *value = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
+
+  if(!(push8(value->csi_rs_class, ppWritePackedMsg, end) &&
+       push8(value->cdm_type, ppWritePackedMsg, end) &&
+       push8(value->num_bf_vector, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  uint16_t i;
+
+  for(i = 0; i < value->num_bf_vector; ++i) {
+    if(!(push8(value->bf_vector[i].csi_rs_resource_index, ppWritePackedMsg, end) &&
+         pusharray16(value->bf_vector[i].bf_value, NFAPI_MAX_ANTENNA_PORT_COUNT, NFAPI_MAX_ANTENNA_PORT_COUNT, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t pack_bf_vector(nfapi_bf_vector_t *vector, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(vector->subband_index, ppWritePackedMsg, end) &&
+           push8(vector->num_antennas, ppWritePackedMsg, end) &&
+           pusharray16(vector->bf_value, NFAPI_MAX_NUM_ANTENNAS, vector->num_antennas, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_epdcch_parameters_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel11_t *value = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
+  return ( push8(value->epdcch_resource_assignment_flag, ppWritePackedMsg, end) &&
+           push16(value->epdcch_id, ppWritePackedMsg, end) &&
+           push8(value->epdcch_start_symbol, ppWritePackedMsg, end) &&
+           push8(value->epdcch_num_prb, ppWritePackedMsg, end) &&
+           pusharray8(value->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, value->epdcch_num_prb, ppWritePackedMsg, end) &&
+           pack_bf_vector(&value->bf_vector, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_epdcch_parameters_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel13_t *value = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
+  return (push8(value->dwpts_symbols, ppWritePackedMsg, end) &&
+          push8(value->initial_lbt_sf, ppWritePackedMsg, end));
+}
+static uint8_t pack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_mpdcch_pdu_rel13_t *value = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
+  return ( push8(value->mpdcch_narrow_band, ppWritePackedMsg, end) &&
+           push8(value->number_of_prb_pairs, ppWritePackedMsg, end) &&
+           push8(value->resource_block_assignment, ppWritePackedMsg, end) &&
+           push8(value->mpdcch_tansmission_type, ppWritePackedMsg, end) &&
+           push8(value->start_symbol, ppWritePackedMsg, end) &&
+           push8(value->ecce_index, ppWritePackedMsg, end) &&
+           push8(value->aggregation_level, ppWritePackedMsg, end) &&
+           push8(value->rnti_type, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) &&
+           push8(value->ce_mode, ppWritePackedMsg, end) &&
+           push16(value->drms_scrambling_init, ppWritePackedMsg, end) &&
+           push16(value->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+           push16(value->transmission_power, ppWritePackedMsg, end) &&
+           push8(value->dci_format, ppWritePackedMsg, end) &&
+           push16(value->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(value->mcs, ppWritePackedMsg, end) &&
+           push8(value->pdsch_reptition_levels, ppWritePackedMsg, end) &&
+           push8(value->redundancy_version, ppWritePackedMsg, end) &&
+           push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+           push8(value->harq_process, ppWritePackedMsg, end) &&
+           push8(value->tpmi_length, ppWritePackedMsg, end) &&
+           push8(value->tpmi, ppWritePackedMsg, end) &&
+           push8(value->pmi_flag, ppWritePackedMsg, end) &&
+           push8(value->pmi, ppWritePackedMsg, end) &&
+           push8(value->harq_resource_offset, ppWritePackedMsg, end) &&
+           push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+           push8(value->tpc, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index_length, ppWritePackedMsg, end) &&
+           push8(value->downlink_assignment_index, ppWritePackedMsg, end) &&
+           push8(value->allocate_prach_flag, ppWritePackedMsg, end) &&
+           push8(value->preamble_index, ppWritePackedMsg, end) &&
+           push8(value->prach_mask_index, ppWritePackedMsg, end) &&
+           push8(value->starting_ce_level, ppWritePackedMsg, end) &&
+           push8(value->srs_request, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_and_scrambling_identity_flag, ppWritePackedMsg, end) &&
+           push8(value->antenna_ports_and_scrambling_identity, ppWritePackedMsg, end) &&
+           push8(value->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+           push8(value->paging_direct_indication_differentiation_flag, ppWritePackedMsg, end) &&
+           push8(value->direct_indication, ppWritePackedMsg, end) &&
+           push8(value->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(value->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+           pusharray16(value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_nbch_pdu_rel13_t *value = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push16(value->transmission_power, ppWritePackedMsg, end) &&
+          push16(value->hyper_sfn_2_lsbs, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_npdcch_pdu_rel13_t *value = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push8(value->ncce_index, ppWritePackedMsg, end) &&
+          push8(value->aggregation_level, ppWritePackedMsg, end) &&
+          push8(value->start_symbol, ppWritePackedMsg, end) &&
+          push8(value->rnti_type, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push8(value->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+          push8(value->dci_format, ppWritePackedMsg, end) &&
+          push8(value->scheduling_delay, ppWritePackedMsg, end) &&
+          push8(value->resource_assignment, ppWritePackedMsg, end) &&
+          push8(value->repetition_number, ppWritePackedMsg, end) &&
+          push8(value->mcs, ppWritePackedMsg, end) &&
+          push8(value->new_data_indicator, ppWritePackedMsg, end) &&
+          push8(value->harq_ack_resource, ppWritePackedMsg, end) &&
+          push8(value->npdcch_order_indication, ppWritePackedMsg, end) &&
+          push8(value->starting_number_of_nprach_repetitions, ppWritePackedMsg, end) &&
+          push8(value->subcarrier_indication_of_nprach, ppWritePackedMsg, end) &&
+          push8(value->paging_direct_indication_differentation_flag, ppWritePackedMsg, end) &&
+          push8(value->direct_indication, ppWritePackedMsg, end) &&
+          push8(value->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+          push8(value->total_dci_length_including_padding, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_dl_config_ndlsch_pdu_rel13_t *value = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
+  return (push16(value->length, ppWritePackedMsg, end) &&
+          push16(value->pdu_index, ppWritePackedMsg, end) &&
+          push8(value->start_symbol, ppWritePackedMsg, end) &&
+          push8(value->rnti_type, ppWritePackedMsg, end) &&
+          push16(value->rnti, ppWritePackedMsg, end) &&
+          push16(value->resource_assignment, ppWritePackedMsg, end) &&
+          push16(value->repetition_number, ppWritePackedMsg, end) &&
+          push8(value->modulation, ppWritePackedMsg, end) &&
+          push8(value->number_of_subframes_for_resource_assignment, ppWritePackedMsg, end) &&
+          push8(value->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+          push16(value->sf_idx, ppWritePackedMsg, end) &&
+          push8(value->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_dl_tti_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)tlv;
+
+  if(!(push32(value->PDUSize, ppWritePackedMsg, end) &&
+       push16(value->PDUType, ppWritePackedMsg, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->PDUType) {
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
+      if(!(pack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
+      if(!(pack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
+      if(!(pack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
+      if(!(pack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppWritePackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  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) &&
+       push8(value->number_pdsch_rnti, ppWritePackedMsg, end) &&
+       push16(value->transmission_power_pcfich, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_pdu;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      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) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value))) {
+          return 0;
+        }
+      }
+      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;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_mch_pdu_rel8_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dlsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_pch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_prs_pdu_rel9_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, ppWritePackedMsg, end,  &pack_dl_config_csi_rs_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel8_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel9_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel10_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel11_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel12_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_dci_dl_pdu_rel13_value) &&
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel11_value) &
+             pack_tlv(NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, ppWritePackedMsg, end, &pack_dl_config_epdcch_parameters_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_mpdcch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_nbch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_npdcch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, ppWritePackedMsg, end, &pack_dl_config_ndlsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->dl_tti_request_body.nPDUs, ppWritePackedMsg, end) &&
+        pusharray8(pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, ppWritePackedMsg, end)
+        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  int arr[12];
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+    }
+
+    if(!(pusharrays32(arr,12,pNfapiMsg->dl_tti_request_body.nUe[i],ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
+    if(!pack_dl_tti_request_body_value(&pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i],ppWritePackedMsg,end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  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));
+  {
+    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) {
+  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
+  return( push32(ulsch_pdu_rel8->handle, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel8->size, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->modulation_type, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->new_data_indication, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->redundancy_version, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->harq_process_number, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->ul_tx_mode, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->current_tx_nb, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel8->n_srs, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
+  return (push8(ulsch_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+          push32(ulsch_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->transport_blocks, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->transmission_scheme, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->number_of_layers, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->codebook_index, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel10->disable_sequence_hopping_flag, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
+  return (push8(ulsch_pdu_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel11->npusch_identity, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel11->dmrs_config_flag, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel11->ndmrs_csh_identity, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
+  return (push8(ulsch_pdu_rel13->ue_type, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+          push16(ulsch_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+          push8(ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, ppWritePackedMsg, end));
+}
+
+//Pack fns for ul_tti PDUS
+
+
+static uint8_t pack_ul_tti_request_prach_pdu(nfapi_nr_prach_pdu_t *prach_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(prach_pdu->phys_cell_id, ppWritePackedMsg, end) &&
+          push8(prach_pdu->num_prach_ocas, ppWritePackedMsg, end) &&
+          push8(prach_pdu->prach_format, ppWritePackedMsg, end) &&
+          push8(prach_pdu->num_ra, ppWritePackedMsg, end) &&
+          push8(prach_pdu->prach_start_symbol, ppWritePackedMsg, end) &&
+          push16(prach_pdu->num_cs, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t *pucch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(pucch_pdu->rnti, ppWritePackedMsg, end) &&
+          push32(pucch_pdu->handle, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bwp_size, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bwp_start, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->format_type, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->multi_slot_tx_indicator, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->prb_start, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->prb_size, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->nr_of_symbols, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->freq_hop_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->second_hop_prb, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->group_hop_flag, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->sequence_hop_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->hopping_id, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->initial_cyclic_shift, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->time_domain_occ_idx, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->pre_dft_occ_idx, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->pre_dft_occ_len, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->add_dmrs_flag, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->dmrs_scrambling_id, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->dmrs_cyclic_shift, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->sr_flag, ppWritePackedMsg, end) &&
+          push8(pucch_pdu->bit_len_harq, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bit_len_csi_part1, ppWritePackedMsg, end) &&
+          push16(pucch_pdu->bit_len_csi_part2, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  if (!(
+        push16(pusch_pdu->pdu_bit_map, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rnti, ppWritePackedMsg, end) &&
+        push32(pusch_pdu->handle, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->bwp_size, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->bwp_start, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->target_code_rate, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->qam_mod_order, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->mcs_index, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->mcs_table, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->transform_precoding, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->data_scrambling_id, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->nrOfLayers, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->ul_dmrs_symb_pos, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->dmrs_config_type, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->ul_dmrs_scrambling_id, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->scid, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->num_dmrs_cdm_grps_no_data, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->resource_alloc, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->resource_alloc,ppWritePackedMsg, end) &&
+        push16(pusch_pdu->dmrs_ports, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rb_start, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->rb_size, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->vrb_to_prb_mapping, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+        push16(pusch_pdu->tx_direct_current_location, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->uplink_frequency_shift_7p5khz, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->start_symbol_index, ppWritePackedMsg, end) &&
+        push8(pusch_pdu->nr_of_symbols, ppWritePackedMsg, end)
+        // TODO: ignoring beamforming tlv for now
+      ))
+    return 0;
+
+  //Pack Optional Data only included if indicated in pduBitmap
+  switch(pusch_pdu->pdu_bit_map) {
+    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
+      // pack optional TLVs
+      return(
+              push8(pusch_pdu->pusch_data.rv_index, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_data.harq_process_id, ppWritePackedMsg, end) &&
+              push32(pusch_pdu->pusch_data.tb_size, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_data.num_cb, ppWritePackedMsg, end) &&
+              pusharray8(pusch_pdu->pusch_data.cb_present_and_position,1,1,ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+      return(
+              push16(pusch_pdu->pusch_uci.harq_ack_bit_length, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_uci.csi_part1_bit_length, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_uci.csi_part2_bit_length, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.alpha_scaling, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_harq_ack, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_csi1, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_uci.beta_offset_csi2, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+      return(
+              push8(pusch_pdu->pusch_ptrs.num_ptrs_ports, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_time_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ptrs_freq_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->pusch_ptrs.ul_ptrs_power, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+      return(
+              push8(pusch_pdu->dfts_ofdm.low_papr_group_number, ppWritePackedMsg, end) &&
+              push16(pusch_pdu->dfts_ofdm.low_papr_sequence_number, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, ppWritePackedMsg, end) &&
+              push8(pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, ppWritePackedMsg, end)
+            );
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_tti_request_srs_pdu(nfapi_nr_srs_pdu_t *srs_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return(
+          push16(srs_pdu->rnti, ppWritePackedMsg, end) &&
+          push32(srs_pdu->handle, ppWritePackedMsg, end) &&
+          push16(srs_pdu->bwp_size, ppWritePackedMsg, end) &&
+          push16(srs_pdu->bwp_start, ppWritePackedMsg, end) &&
+          push8(srs_pdu->subcarrier_spacing, ppWritePackedMsg, end) &&
+          push8(srs_pdu->cyclic_prefix, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_ant_ports, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_symbols, ppWritePackedMsg, end) &&
+          push8(srs_pdu->num_repetitions, ppWritePackedMsg, end) &&
+          push8(srs_pdu->time_start_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu->config_index, ppWritePackedMsg, end) &&
+          push16(srs_pdu->sequence_id, ppWritePackedMsg, end) &&
+          push8(srs_pdu->bandwidth_index, ppWritePackedMsg, end) &&
+          push8(srs_pdu->comb_size, ppWritePackedMsg, end) &&
+          push8(srs_pdu->comb_offset, ppWritePackedMsg, end) &&
+          push8(srs_pdu->cyclic_shift, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_shift, ppWritePackedMsg, end) &&
+          push8(srs_pdu->frequency_hopping, ppWritePackedMsg, end) &&
+          push8(srs_pdu->group_or_sequence_hopping, ppWritePackedMsg, end) &&
+          push8(srs_pdu->resource_type, ppWritePackedMsg, end) &&
+          push16(srs_pdu->t_srs, ppWritePackedMsg, end) &&
+          push16(srs_pdu->t_offset, ppWritePackedMsg, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+static uint8_t pack_ul_config_request_ulsch_pdu(nfapi_ul_config_ulsch_pdu *ulsch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &ulsch_pdu->ulsch_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &ulsch_pdu->ulsch_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &ulsch_pdu->ulsch_pdu_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &ulsch_pdu->ulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
+  return ( push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->ri_size, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->delta_offset_cqi, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel8->delta_offset_ri, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
+
+  if(!(push8(cqi_ri_info_rel9->report_type, ppWritePackedMsg, end) &&
+       push8(cqi_ri_info_rel9->delta_offset_cqi, ppWritePackedMsg, end) &&
+       push8(cqi_ri_info_rel9->delta_offset_ri, ppWritePackedMsg, end))) {
+    return 0;
+  }
+
+  switch(cqi_ri_info_rel9->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(!(push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, ppWritePackedMsg, end) &&
+           push8(cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, ppWritePackedMsg, end))) {
+        return 0;
+      }
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, ppWritePackedMsg, end) == 0)
+        return 0;
+
+      uint8_t i;
+
+      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
+        if(push8(cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, ppWritePackedMsg, end) == 0)
+          return 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[j], ppWritePackedMsg, end) == 0)
+            return 0;
+        }
+      }
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+    }
+    break;
+  };
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
+
+  switch(cqi_ri_info_rel13->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(push16(cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, ppWritePackedMsg, end) == 0)
+        return 0;
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      // No parameters
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel13->report_type );
+    }
+    break;
+  };
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_cqi_ri_information(nfapi_ul_config_cqi_ri_information *cqi_ri_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return (pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &cqi_ri_info->cqi_ri_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel8_value) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &cqi_ri_info->cqi_ri_information_rel9, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel9_value) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &cqi_ri_info->cqi_ri_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_ri_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_init_tx_params_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
+  return (push8(init_tx_params_rel8->n_srs_initial, ppWritePackedMsg, end) &&
+          push8(init_tx_params_rel8->initial_number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_initial_transmission_parameters(nfapi_ul_config_initial_transmission_parameters *init_tx_params, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return pack_tlv(NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &init_tx_params->initial_transmission_parameters_rel8, ppWritePackedMsg, end,
+                  &pack_ul_config_request_init_tx_params_rel8_value);
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
+  return (push8(harq_info_rel10->harq_size, ppWritePackedMsg, end) &&
+          push8(harq_info_rel10->delta_offset_harq, ppWritePackedMsg, end) &&
+          push8(harq_info_rel10->ack_nack_mode, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
+  return (push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+          push8(harq_info_rel13->delta_offset_harq_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ulsch_harq_information(nfapi_ul_config_ulsch_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &harq_info->harq_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ulsch_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_ue_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
+  return ( push32(ue_info_rel8->handle, ppWritePackedMsg, end) &&
+           push16(ue_info_rel8->rnti, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
+  return ( push8(ue_info_rel11->virtual_cell_id_enabled_flag, ppWritePackedMsg, end) &&
+           push16(ue_info_rel11->npusch_identity, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_ue_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
+  return ( push8(ue_info_rel13->ue_type, ppWritePackedMsg, end) &&
+           push8(ue_info_rel13->empty_symbols, ppWritePackedMsg, end) &&
+           push16(ue_info_rel13->total_number_of_repetitions, ppWritePackedMsg, end) &&
+           push16(ue_info_rel13->repetition_number, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_ue_information(nfapi_ul_config_ue_information *ue_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &ue_info->ue_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &ue_info->ue_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &ue_info->ue_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_ue_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_rel10_tdd = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
+  return ( push8(harq_info_rel10_tdd->harq_size, ppWritePackedMsg, end) &&
+           push8(harq_info_rel10_tdd->ack_nack_mode, ppWritePackedMsg, end) &&
+           push8(harq_info_rel10_tdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel10_tdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_rel8_fdd = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
+  return ( push16(harq_info_rel8_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push8(harq_info_rel8_fdd->harq_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_rel9_fdd = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
+  return ( push8(harq_info_rel9_fdd->harq_size, ppWritePackedMsg, end) &&
+           push8(harq_info_rel9_fdd->ack_nack_mode, ppWritePackedMsg, end) &&
+           push8(harq_info_rel9_fdd->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel9_fdd->n_pucch_1_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
+  return ( push8(harq_info_rel11->num_ant_ports, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_0, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_1, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_2, ppWritePackedMsg, end) &&
+           push16(harq_info_rel11->n_pucch_2_3, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_harq_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
+  return ( push16(harq_info_rel13->harq_size_2, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->n_prb, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+           push8(harq_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_harq_information(nfapi_ul_config_harq_information *harq_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &harq_info->harq_information_rel10_tdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel10_tdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &harq_info->harq_information_rel8_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel8_fdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &harq_info->harq_information_rel9_fdd, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel9_fdd_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &harq_info->harq_information_rel11, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel11_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &harq_info->harq_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_harq_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_cqi_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
+  return ( push16(cqi_info_rel8->pucch_index, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel8->dl_cqi_pmi_size, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
+  return ( push8(cqi_info_rel10->number_of_pucch_resource, ppWritePackedMsg, end) &&
+           push16(cqi_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+static uint8_t pack_ul_config_request_cqi_info_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
+  return ( push8(cqi_info_rel13->csi_mode, ppWritePackedMsg, end) &&
+           push16(cqi_info_rel13->dl_cqi_pmi_size_2, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->starting_prb, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->n_prb, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->cdm_index, ppWritePackedMsg, end) &&
+           push8(cqi_info_rel13->n_srs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_cqi_information(nfapi_ul_config_cqi_information *cqi_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &cqi_info->cqi_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &cqi_info->cqi_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel10_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &cqi_info->cqi_information_rel13, ppWritePackedMsg, end, &pack_ul_config_request_cqi_info_rel13_value));
+}
+
+static uint8_t pack_ul_config_request_sr_info_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
+  return push16(sr_info_rel8->pucch_index, ppWritePackedMsg, end);
+}
+static uint8_t pack_ul_config_request_sr_info_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
+  return ( push8(sr_info_rel10->number_of_pucch_resources, ppWritePackedMsg, end) &&
+           push16(sr_info_rel10->pucch_index_p1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_sr_information(nfapi_ul_config_sr_information *sr_info, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &sr_info->sr_information_rel8, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel8_value) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &sr_info->sr_information_rel10, ppWritePackedMsg, end, &pack_ul_config_request_sr_info_rel10_value));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
+  return (push32(srs_pdu_rel8->handle, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->size, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->srs_bandwidth, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->frequency_domain_position, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->srs_hopping_bandwidth, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->transmission_comb, ppWritePackedMsg, end) &&
+          push16(srs_pdu_rel8->i_srs, ppWritePackedMsg, end) &&
+          push8(srs_pdu_rel8->sounding_reference_cyclic_shift, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
+  return push8(srs_pdu_rel10->antenna_port, ppWritePackedMsg, end);
+}
+
+static uint8_t pack_ul_config_request_srs_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
+  return ( push8(srs_pdu_rel13->number_of_combs, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nb_harq_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_pdu_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
+  return ( push8(nb_harq_pdu_rel13->harq_ack_resource, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_config_request_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
+  return (push8(nulsch_pdu_rel13->nulsch_format, ppWritePackedMsg, end) &&
+          push32(nulsch_pdu_rel13->handle, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->size, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+          push8(nulsch_pdu_rel13->n_srs, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, ppWritePackedMsg, end) &&
+          push16(nulsch_pdu_rel13->sf_idx, ppWritePackedMsg, end) &&
+          pack_ul_config_request_ue_information(&(nulsch_pdu_rel13->ue_information), ppWritePackedMsg, end) &&
+          pack_tlv(NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, ppWritePackedMsg, end,
+                   &pack_ul_config_request_nb_harq_rel13_value));
+}
+static uint8_t pack_ul_config_request_nrach_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
+  return ( push8(nrach_pdu_rel13->nprach_config_0, ppWritePackedMsg, end) &&
+           push8(nrach_pdu_rel13->nprach_config_1, ppWritePackedMsg, end) &&
+           push8(nrach_pdu_rel13->nprach_config_2, ppWritePackedMsg, end));
+}
+
+
+
+static uint8_t pack_ul_tti_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_ul_tti_request_number_of_pdus_t *value = (nfapi_nr_ul_tti_request_number_of_pdus_t *)tlv;
+
+  if(!(push16(value->pdu_size, ppWritePackedMsg, end) &&
+       push16(value->pdu_type, ppWritePackedMsg, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
+      if(!pack_ul_tti_request_prach_pdu(&value->prach_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+      if(!pack_ul_tti_request_pucch_pdu(&value->pucch_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+      if(!pack_ul_tti_request_pusch_pdu(&value->pusch_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
+      if(!pack_ul_tti_request_srs_pdu(&value->srs_pdu, ppWritePackedMsg, end))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_tti_groups_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_ul_tti_request_number_of_groups_t *value = (nfapi_nr_ul_tti_request_number_of_groups_t *)tlv;
+
+  if(!push8(value->n_ue, ppWritePackedMsg, end))
+    return 0;
+
+  for(int i=0; i<value->n_ue; i++) {
+    if(!push8(value->ue_list[i].pdu_idx, ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
+
+  if(!(push8(value->number_of_pdus, ppWritePackedMsg, end) &&
+       push8(value->rach_prach_frequency_resources, ppWritePackedMsg, end) &&
+       push8(value->srs_present, ppWritePackedMsg, end)))
+    return 0;
+
+  uint16_t i = 0;
+
+  for(i = 0; i < value->number_of_pdus; ++i) {
+    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
+        if(!pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_pdu), ppWritePackedMsg, end))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_harq_pdu.harq_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_harq_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_ri_information(&(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_ulsch_harq_information(&(pdu->ulsch_cqi_harq_ri_pdu.harq_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_initial_transmission_parameters(&(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_pdu.cqi_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_sr_pdu.sr_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_cqi_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_pdu.sr_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->uci_cqi_sr_harq_pdu.ue_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->uci_cqi_sr_harq_pdu.cqi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_sr_information(&(pdu->uci_cqi_sr_harq_pdu.sr_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->uci_cqi_sr_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &pdu->srs_pdu.srs_pdu_rel8, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel8_value) &&
+             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &pdu->srs_pdu.srs_pdu_rel10, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel10_value) &&
+             pack_tlv(NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &pdu->srs_pdu.srs_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_srs_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
+        if(!(pack_ul_config_request_ue_information(&(pdu->harq_buffer_pdu.ue_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_csi_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->ulsch_uci_csi_pdu.csi_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->ulsch_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
+        if(!(pack_ul_config_request_ulsch_pdu(&(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu), ppWritePackedMsg, end) &&
+             pack_ul_config_request_cqi_information(&(pdu->ulsch_csi_uci_harq_pdu.csi_information), ppWritePackedMsg, end) &&
+             pack_ul_config_request_harq_information(&(pdu->ulsch_csi_uci_harq_pdu.harq_information), ppWritePackedMsg, end)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &pdu->nulsch_pdu.nulsch_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nulsch_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &pdu->nrach_pdu.nrach_pdu_rel13, ppWritePackedMsg, end, &pack_ul_config_request_nrach_pdu_rel13_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_pdus, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->rach_present, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_ulsch, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_ulcch, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->n_group, ppWritePackedMsg, end) ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->n_pdus; i++) {
+    if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->n_group; i++) {
+    if(!pack_ul_tti_groups_list_value(&pNfapiMsg->groups_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_ul_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, ppWritePackedMsg, end, &pack_ul_config_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config)) ;
+}
+
+static uint8_t pack_hi_dci0_hi_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
+  return ( push8(hi_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->hi_value, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel8->i_phich, ppWritePackedMsg, end) &&
+           push16(hi_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_hi_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
+  return ( push8(hi_pdu_rel10->flag_tb2, ppWritePackedMsg, end) &&
+           push8(hi_pdu_rel10->hi_value_2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel8_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
+  return ( push8(dci_pdu_rel8->dci_format, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cce_index, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->aggregation_level, ppWritePackedMsg, end) &&
+           push16(dci_pdu_rel8->rnti, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->resource_block_start, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->number_of_resource_block, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->mcs_1, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cyclic_shift_2_for_drms, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->frequency_hopping_enabled_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->frequency_hopping_bits, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->new_data_indication_1, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->ue_tx_antenna_seleciton, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->tpc, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->cqi_csi_request, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->ul_index, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel8->dl_assignment_index, ppWritePackedMsg, end) &&
+           push32(dci_pdu_rel8->tpc_bitmap, ppWritePackedMsg, end) &&
+           push16(dci_pdu_rel8->transmission_power, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel10_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
+  return ( push8(dci_pdu_rel10->cross_carrier_scheduling_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->carrier_indicator, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->size_of_cqi_csi_feild, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->srs_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->srs_request, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->resource_allocation_flag, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->resource_allocation_type, ppWritePackedMsg, end) &&
+           push32(dci_pdu_rel10->resource_block_coding, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->mcs_2, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->new_data_indication_2, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->number_of_antenna_ports, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->tpmi, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->total_dci_length_including_padding, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel10->n_ul_rb, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_dci_rel12_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
+  return ( push8(dci_pdu_rel12->pscch_resource, ppWritePackedMsg, end) &&
+           push8(dci_pdu_rel12->time_resource_pattern, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_mpdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *mpdcch_dci_pdu_rel13 = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
+  return ( push8(mpdcch_dci_pdu_rel13->mpdcch_narrowband, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_prb_pairs, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->resource_block_assignment, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->mpdcch_transmission_type, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ecce_index, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->aggreagation_level, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->rnti_type, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ce_mode, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->drms_scrambling_init, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->initial_transmission_sf_io, ppWritePackedMsg, end) &&
+           push16(mpdcch_dci_pdu_rel13->transmission_power, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dci_format, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->resource_block_start, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_resource_blocks, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->pusch_repetition_levels, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->frequency_hopping_flag, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->new_data_indication, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->harq_process, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->redudency_version, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->tpc, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->csi_request, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->ul_inex, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dai_presence_flag, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dl_assignment_index, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->srs_request, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end) &&
+           push32(mpdcch_dci_pdu_rel13->tcp_bitmap, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->total_dci_length_include_padding, ppWritePackedMsg, end) &&
+           push8(mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end) &&
+           pusharray16(mpdcch_dci_pdu_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_dci_pdu_rel13->number_of_tx_antenna_ports, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_hi_dci0_npdcch_dci_rel13_pdu_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *npdcch_dci_pdu_rel13 = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
+  return ( push8(npdcch_dci_pdu_rel13->ncce_index, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->aggregation_level, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->start_symbol, ppWritePackedMsg, end) &&
+           push16(npdcch_dci_pdu_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->scrambling_reinitialization_batch_index, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->nrs_antenna_ports_assumed_by_the_ue, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->subcarrier_indication, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->resource_assignment, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->scheduling_delay, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->mcs, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->redudancy_version, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->repetition_number, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->new_data_indicator, ppWritePackedMsg, end) &&
+           push8(npdcch_dci_pdu_rel13->dci_subframe_repetition_number, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_hi_dci0_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
+
+  if(!(push16(value->sfnsf, ppWritePackedMsg, end) &&
+       push8(value->number_of_dci, ppWritePackedMsg, end) &&
+       push8(value->number_of_hi, ppWritePackedMsg, end)))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_dci + value->number_of_hi;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
+
+    if(push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_hi_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_hi_rel10_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, ppWritePackedMsg, end, pack_hi_dci0_dci_rel12_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, ppWritePackedMsg, end, pack_hi_dci0_dci_rel8_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, ppWritePackedMsg, end, pack_hi_dci0_dci_rel10_pdu_value) &&
+             pack_tlv(NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, ppWritePackedMsg, end, pack_dl_config_epdcch_parameters_rel11_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_mpdcch_dci_rel13_pdu_value)))
+          return 0;
+      }
+      break;
+
+      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
+        if(!(pack_tlv(NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, ppWritePackedMsg, end, pack_hi_dci0_npdcch_dci_rel13_pdu_value)))
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ul_dci_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)tlv;
+	
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI, ppWritePackedMsg, end) &&
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, ppWritePackedMsg, end) &&
+
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, ppWritePackedMsg, end) &&
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, ppWritePackedMsg, end) &&
+
+		push8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, ppWritePackedMsg, end) &&
+		push16(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end) &&
+		
+		pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, ppWritePackedMsg, end)))
+
+		return 0;
+	}
+
+	return (push16(value->PDUType, ppWritePackedMsg, end) &&
+	   	    push16(value->PDUSize, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, ppWritePackedMsg, end) &&
+
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, ppWritePackedMsg, end) &&
+			    pusharray8(value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, ppWritePackedMsg, end) &&
+
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, ppWritePackedMsg, end) &&
+			    push8(value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, ppWritePackedMsg, end) &&
+			    push16(value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, ppWritePackedMsg, end));
+
+}
+
+static uint8_t pack_ul_dci_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
+
+  if (!(push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push8(pNfapiMsg->numPdus, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->numPdus; i++) {
+    if(!pack_ul_dci_pdu_list_value(&pNfapiMsg->ul_dci_pdu_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+static uint8_t pack_hi_dci0_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, ppWritePackedMsg, end, &pack_hi_dci0_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//pack_tx_data_pdu_list_value
+static uint8_t pack_tx_data_pdu_list_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nr_pdu_t *value = (nfapi_nr_pdu_t *)tlv;
+
+  if(!(push32(value->num_TLV, ppWritePackedMsg, end) &&
+       push16(value->PDU_index, ppWritePackedMsg, end) &&
+       push16(value->PDU_length, ppWritePackedMsg, end)
+      ))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_tlvs = value->num_TLV;
+
+  for(; i < total_number_of_tlvs; ++i) {
+    if (!(push16(value->TLVs[i].length, ppWritePackedMsg, end) &&
+          push16(value->TLVs[i].tag, ppWritePackedMsg, end)))
+      return 0;
+
+    switch(value->TLVs[i].tag) {
+      case 0: {
+        if(!pusharray32(value->TLVs[i].value.direct, 16384, value->TLVs[i].length, ppWritePackedMsg, end))
+          return 0;
+
+        break;
+      }
+
+      case 1: {
+        if(!pusharray32(value->TLVs[i].value.ptr, value->TLVs[i].length, value->TLVs[i].length, ppWritePackedMsg, end))
+          return 0;
+
+        break;
+      }
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", value->TLVs[i].tag );
+        break;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_tx_request_body_t *value = (nfapi_tx_request_body_t *)tlv;
+
+  if(push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_tx_request_pdu_t *pdu = &(value->tx_pdu_list[i]);
+
+    if(!(push16(pdu->pdu_length, ppWritePackedMsg, end) &&
+         push16(pdu->pdu_index, ppWritePackedMsg, end)))
+      return 0;
+
+    uint8_t j;
+
+    for(j = 0; j < pdu->num_segments; ++j) {
+      // Use -1 as it is unbounded
+      // 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 (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;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_data_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
+
+  if (!(
+        push16(pNfapiMsg->SFN, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Slot, ppWritePackedMsg, end) &&
+        push16(pNfapiMsg->Number_of_PDUs, ppWritePackedMsg, end)
+      ))
+    return 0;
+
+  for(int i=0; i<pNfapiMsg->Number_of_PDUs; i++) {
+    if(!pack_tx_data_pdu_list_value(&pNfapiMsg->pdu_list[i], ppWritePackedMsg, end))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_tx_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
+  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_release_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ue_release_request_body_t *value = (nfapi_ue_release_request_body_t *)tlv;
+
+  if(push16(value->number_of_TLVs, ppWritePackedMsg, end) == 0) {
+    return 0;
+  }
+
+  uint8_t j;
+  uint16_t num = value->number_of_TLVs;
+
+  for(j = 0; j < num; ++j) {
+    if(push16(value->ue_release_request_TLVs_list[j].rnti, ppWritePackedMsg, end) == 0) {
+      return 0;
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t pack_ue_release_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
+  int x = push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end);
+  int y = pack_tlv(NFAPI_UE_RELEASE_BODY_TAG, &pNfapiMsg->ue_release_request_body, ppWritePackedMsg, end, &pack_release_request_body_value);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  return x && y && z;
+}
+
+static uint8_t pack_ue_release_response(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
+  int x = push32(pNfapiMsg->error_code, ppWritePackedMsg, end);
+  int z = pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config);
+  return x && z;
+}
+
+static uint8_t pack_rx_ue_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push16(value->rnti, ppWritePackedMsg, end) );
+}
+
+static uint8_t unpack_rx_ue_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_ue_information *value = (nfapi_rx_ue_information *)tlv;
+  return ( pull32(ppReadPackedMsg, &value->handle, end) &&
+           pull16(ppReadPackedMsg, &value->rnti, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_bundling(nfapi_harq_indication_tdd_harq_data_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) &&
+           push8(data->value_1, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_multiplexing(nfapi_harq_indication_tdd_harq_data_multiplexing_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) &&
+           push8(data->value_1, ppWritePackedMsg, end) &&
+           push8(data->value_2, ppWritePackedMsg, end) &&
+           push8(data->value_3, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data_special_bundling(nfapi_harq_indication_tdd_harq_data_special_bundling_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_harq_data(nfapi_harq_indication_tdd_harq_data_t *data, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  return ( push8(data->value_0, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel8_t *harq_indication_tdd_rel8 = (nfapi_harq_indication_tdd_rel8_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel8->mode, ppWritePackedMsg, end) &&
+       push8(harq_indication_tdd_rel8->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t result = 0;
+
+  switch(harq_indication_tdd_rel8->mode) {
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+      result = pack_harq_indication_tdd_harq_data_bundling(&harq_indication_tdd_rel8->harq_data.bundling, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+      result = pack_harq_indication_tdd_harq_data_multiplexing(&harq_indication_tdd_rel8->harq_data.multiplex, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+      result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel8->harq_data.special_bundling, ppWritePackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+      result = 1;
+      break;
+
+    default:
+      // err....
+      break;
+  }
+
+  return result;
+}
+
+static uint8_t pack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel9_t *harq_indication_tdd_rel9 = (nfapi_harq_indication_tdd_rel9_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel9->mode, ppWritePackedMsg, end) &&
+       push8(harq_indication_tdd_rel9->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx;
+
+  for(idx = 0; idx < harq_indication_tdd_rel9->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(harq_indication_tdd_rel9->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data(&(harq_indication_tdd_rel9->harq_data[idx].bundling), ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].multiplex, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel9->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel9->harq_data[idx].format_3, ppWritePackedMsg, end);
+        break;
+
+      default:
+        // err....
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel13_t *harq_indication_tdd_rel13 = (nfapi_harq_indication_tdd_rel13_t *)tlv;
+
+  if(!(push8(harq_indication_tdd_rel13->mode, ppWritePackedMsg, end) &&
+       push16(harq_indication_tdd_rel13->number_of_ack_nack, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx;
+
+  for(idx = 0; idx < harq_indication_tdd_rel13->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(harq_indication_tdd_rel13->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].multiplex, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = pack_harq_indication_tdd_harq_data_special_bundling(&harq_indication_tdd_rel13->harq_data[idx].special_bundling, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].channel_selection, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_3, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_4, ppWritePackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+        result = pack_harq_indication_tdd_harq_data(&harq_indication_tdd_rel13->harq_data[idx].format_5, ppWritePackedMsg, end);
+        break;
+
+      default:
+        // err....
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel8_t *harq_indication_fdd_rel8 = (nfapi_harq_indication_fdd_rel8_t *)tlv;
+  return ( push8(harq_indication_fdd_rel8->harq_tb1, ppWritePackedMsg, end) &&
+           push8(harq_indication_fdd_rel8->harq_tb2, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel9_t *harq_indication_fdd_rel9 = (nfapi_harq_indication_fdd_rel9_t *)tlv;
+  return ( push8(harq_indication_fdd_rel9->mode, ppWritePackedMsg, end) &&
+           push8(harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end) &&
+           pusharray8(harq_indication_fdd_rel9->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, harq_indication_fdd_rel9->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel13_t *harq_indication_fdd_rel13 = (nfapi_harq_indication_fdd_rel13_t *)tlv;
+  return ( push8(harq_indication_fdd_rel13->mode, ppWritePackedMsg, end) &&
+           push16(harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end) &&
+           pusharray8(harq_indication_fdd_rel13->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, harq_indication_fdd_rel13->number_of_ack_nack, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_ul_cqi_information_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
+  return ( push8(value->ul_cqi, ppWritePackedMsg, end) &&
+           push8(value->channel, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
+
+  if(push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_harqs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, ppWritePackedMsg, end, pack_harq_indication_tdd_rel8_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, ppWritePackedMsg, end, pack_harq_indication_tdd_rel9_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, ppWritePackedMsg, end, pack_harq_indication_tdd_rel13_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, ppWritePackedMsg, end, pack_harq_indication_fdd_rel8_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, ppWritePackedMsg, end, pack_harq_indication_fdd_rel9_value) &&
+         pack_tlv(NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_harq_indication_fdd_rel13_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, ppWritePackedMsg, end, pack_harq_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_crc_indication_rel8_body(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_crc_indication_rel8_t *crc_indication_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
+  return ( push8(crc_indication_rel8->crc_flag, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_crc_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
+
+  if(push16(value->number_of_crcs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_crcs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, ppWritePackedMsg, end, pack_crc_indication_rel8_body)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, ppWritePackedMsg, end, &pack_crc_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+static uint8_t pack_rx_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
+  return ( push16(value->length, ppWritePackedMsg, end) &&
+           push16(value->offset, ppWritePackedMsg, end) &&
+           push8(value->ul_cqi, ppWritePackedMsg, end) &&
+           push16(value->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_rx_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
+  return ( push16(value->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_rx_ulsch_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  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;
+
+  // need to calculate the data offset's.
+  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;
+    }
+  }
+
+  // Now update the structure to include the offset
+  for(i =0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      if(pdu->rx_indication_rel8.offset == 1) {
+        pdu->rx_indication_rel8.offset = offset;
+        offset += pdu->rx_indication_rel8.length;
+      }
+    }
+  }
+
+  // Write out the pdu
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_RX_INDICATION_REL8_TAG, &pdu->rx_indication_rel8, ppWritePackedMsg, end, pack_rx_indication_rel8_value) &&
+         pack_tlv(NFAPI_RX_INDICATION_REL9_TAG, &pdu->rx_indication_rel9, ppWritePackedMsg, end, pack_rx_indication_rel9_value)))
+      return 0;
+  }
+
+  // Write out the pdu data
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    uint16_t length = 0;
+    nfapi_rx_indication_pdu_t *pdu = &(value->rx_pdu_list[i]);
+
+    if(pdu->rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      length = pdu->rx_indication_rel8.length;
+    }
+
+    if( pusharray8(value->rx_pdu_list[i].data, length, length, ppWritePackedMsg, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_rx_ulsch_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, ppWritePackedMsg, end, pack_rx_ulsch_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel8_t *preamble_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
+  return ( push16(preamble_rel8->rnti, ppWritePackedMsg, end) &&
+           push8(preamble_rel8->preamble, ppWritePackedMsg, end) &&
+           push16(preamble_rel8->timing_advance, ppWritePackedMsg, end));
+}
+static uint8_t pack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel9_t *preamble_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
+  return ( push16(preamble_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+static uint8_t pack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel13_t *preamble_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
+  return ( push8(preamble_rel13->rach_resource_type, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_rach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
+
+  if( push16(value->number_of_preambles, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_preambles;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, ppWritePackedMsg, end, pack_preamble_pdu_rel8_value) &&
+         pack_tlv(NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, ppWritePackedMsg, end, pack_preamble_pdu_rel9_value) &&
+         pack_tlv(NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, ppWritePackedMsg, end, pack_preamble_pdu_rel13_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, ppWritePackedMsg, end, pack_rach_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel8_t *srs_pdu_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
+  return ( push16(srs_pdu_rel8->doppler_estimation, ppWritePackedMsg, end) &&
+           push16(srs_pdu_rel8->timing_advance, ppWritePackedMsg, end) &&
+           push8(srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end) &&
+           push8(srs_pdu_rel8->rb_start, ppWritePackedMsg, end) &&
+           pusharray8(srs_pdu_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_rel8->number_of_resource_blocks, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel9_t *srs_pdu_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
+  return ( push16(srs_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_ttd_rel10_t *srs_pdu_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
+  return ( push8(srs_pdu_rel10->uppts_symbol, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel11_t *srs_pdu_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
+  return ( push16(srs_pdu_rel11->ul_rtoa, ppWritePackedMsg, end) ) ;
+}
+
+static uint8_t pack_tdd_channel_measurement_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
+
+  if(!(push8(value->num_prb_per_subband, ppWritePackedMsg, end) &&
+       push8(value->number_of_subbands, ppWritePackedMsg, end) &&
+       push8(value->num_atennas, ppWritePackedMsg, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    if(!(push8(value->subands[idx].subband_index, ppWritePackedMsg, end) &&
+         pusharray16(value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, ppWritePackedMsg, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_srs_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg,  uint8_t *end) {
+  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
+
+  if( push8(value->number_of_ues, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_ues;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, &pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel8_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel9_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, ppWritePackedMsg, end, &pack_srs_indication_tdd_rel10_value) &&
+         pack_tlv(NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, ppWritePackedMsg, end, &pack_srs_indication_fdd_rel11_value) &&
+         pack_tlv(NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, ppWritePackedMsg, end, &pack_tdd_channel_measurement_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, ppWritePackedMsg, end, &pack_srs_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_sr_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
+
+  if(push16(value->number_of_srs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_srs;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_sr_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, ppWritePackedMsg, end, &pack_sr_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_cqi_indication_rel8_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
+  return ( push16(cqi_pdu_rel8->length, ppWritePackedMsg, end) &&
+           push16(cqi_pdu_rel8->data_offset, ppWritePackedMsg, end) &&
+           push8(cqi_pdu_rel8->ul_cqi, ppWritePackedMsg, end) &&
+           push8(cqi_pdu_rel8->ri, ppWritePackedMsg, end) &&
+           push16(cqi_pdu_rel8->timing_advance, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_rel9_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
+  return  ( push16(cqi_pdu_rel9->length, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->data_offset, ppWritePackedMsg, end) &&
+            push8(cqi_pdu_rel9->ul_cqi, ppWritePackedMsg, end) &&
+            push8(cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+            pusharray8(cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->timing_advance, ppWritePackedMsg, end) &&
+            push16(cqi_pdu_rel9->timing_advance_r9, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_cqi_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
+
+  if( push16(value->number_of_cqis, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  // need to calculate the data offset's. This very bittle due the hardcoding
+  // of the sizes. can not use the sizeof as we have an array for the Rel9
+  // info
+  uint16_t i = 0;
+  uint16_t offset = 2; // taking into account the number_of_cqis
+  uint16_t total_number_of_pdus = value->number_of_cqis;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    offset += 2; // for the instance length
+
+    if(pdu->rx_ue_information.tl.tag == NFAPI_RX_UE_INFORMATION_TAG) {
+      offset += 4 + 6; // sizeof(nfapi_rx_ue_information) - sizeof(nfapi_tl_t)
+    }
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      offset += 4 + 8;
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      offset += 4 + 10 + pdu->cqi_indication_rel9.number_of_cc_reported;
+    }
+
+    if(pdu->ul_cqi_information.tl.tag == NFAPI_UL_CQI_INFORMATION_TAG) {
+      offset += 4 + 2;
+    }
+  }
+
+  // Now update the structure to include the offset
+  for(i =0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      if(pdu->cqi_indication_rel8.data_offset == 1) {
+        pdu->cqi_indication_rel8.data_offset = offset;
+        offset += pdu->cqi_indication_rel8.length;
+      }
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      if(pdu->cqi_indication_rel9.data_offset == 1) {
+        pdu->cqi_indication_rel9.data_offset = offset;
+        offset += pdu->cqi_indication_rel9.length;
+      }
+    }
+  }
+
+  // Write out the cqi information
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end,pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_CQI_INDICATION_REL8_TAG, &pdu->cqi_indication_rel8, ppWritePackedMsg, end, pack_cqi_indication_rel8_value) &&
+         pack_tlv(NFAPI_CQI_INDICATION_REL9_TAG, &pdu->cqi_indication_rel9, ppWritePackedMsg, end, pack_cqi_indication_rel9_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  // Write out the cqi raw data
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    uint16_t length = 0;
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+
+    if(pdu->cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      length = pdu->cqi_indication_rel8.length;
+    }
+
+    if(pdu->cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      length = pdu->cqi_indication_rel9.length;
+    }
+
+    if( pusharray8(value->cqi_raw_pdu_list[i].pdu, NFAPI_CQI_RAW_MAX_LEN, length, ppWritePackedMsg, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t pack_cqi_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
+  //Fixme: allocate some mem to fix pure bug, need to find out proper size
+  pNfapiMsg->vendor_extension=NULL;//(nfapi_vendor_extension_tlv_t)malloc( sizeof(* pNfapiMsg->vendor_extension));
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, ppWritePackedMsg, end, pack_cqi_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->mp_cca, ppWritePackedMsg, end) &&
+           push32(value->n_cca, ppWritePackedMsg, end) &&
+           push32(value->offset, ppWritePackedMsg, end) &&
+           push32(value->lte_txop_sf, ppWritePackedMsg, end) &&
+           push16(value->txop_sfn_sf_end, ppWritePackedMsg, end) &&
+           push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->offset, ppWritePackedMsg, end) &&
+           push16(value->sfn_sf_end, ppWritePackedMsg, end) &&
+           push32(value->lbt_mode, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if( push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_req_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
+        if(pack_tlv(NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_req_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->result, ppWritePackedMsg, end) &&
+           push32(value->lte_txop_symbols, ppWritePackedMsg, end) &&
+           push32(value->initial_partial_sf, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
+  return ( push32(value->handle, ppWritePackedMsg, end) &&
+           push32(value->result, ppWritePackedMsg, end));
+}
+
+static uint8_t pack_lbt_dl_config_request(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, ppWritePackedMsg, end, &pack_lbt_dl_config_request_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_lbt_dl_config_indication_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
+
+  if( push16(value->number_of_pdus, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
+
+    if( push8(pdu->pdu_type, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    // Put a 0 size in and then determine the size after the pdu
+    // has been writen and write the calculated size
+    uint8_t *pWritePackedMsgPduSize = *ppWritePackedMsg;
+    pdu->pdu_size = 0;
+
+    if(push8(pdu->pdu_size, ppWritePackedMsg, end) == 0)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_pdsch_rsp_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
+        if( pack_tlv(NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, ppWritePackedMsg, end, pack_lbt_drs_rsp_pdu_rel13_value) == 0)
+          return 0;
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+
+    // add 1 for the pdu_type. The delta will include the pdu_size
+    pdu->pdu_size = 1 + (*ppWritePackedMsg - pWritePackedMsgPduSize);
+
+    push8(pdu->pdu_size, &pWritePackedMsgPduSize, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_lbt_dl_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, ppWritePackedMsg, end, &pack_lbt_dl_config_indication_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_fdd_rel13_t *nb_harq_indication_fdd_rel13 = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
+  return ( push8(nb_harq_indication_fdd_rel13->harq_tb1, ppWritePackedMsg, end) );
+}
+
+static uint8_t pack_nb_harq_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
+
+  if( push16(value->number_of_harqs, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_harqs = value->number_of_harqs;
+
+  for(; i < total_number_of_harqs; ++i) {
+    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
+    uint8_t *instance_length_p = *ppWritePackedMsg;
+
+    if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+      return 0;
+
+    if(!(pack_tlv(NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, ppWritePackedMsg, end, pack_rx_ue_information_value) &&
+         pack_tlv(NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, ppWritePackedMsg, end, pack_nb_harq_indication_fdd_rel13_value) &&
+         pack_tlv(NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, ppWritePackedMsg, end, pack_ul_cqi_information_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+
+static uint8_t pack_nb_harq_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, ppWritePackedMsg, end, &pack_nb_harq_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nrach_indication_rel13_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_pdu_rel13_t *nrach_indication_fdd_rel13 = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
+  return ( push16(nrach_indication_fdd_rel13->rnti, ppWritePackedMsg, end) &&
+           push8(nrach_indication_fdd_rel13->initial_sc, ppWritePackedMsg, end) &&
+           push16(nrach_indication_fdd_rel13->timing_advance, ppWritePackedMsg, end) &&
+           push8(nrach_indication_fdd_rel13->nrach_ce_level, ppWritePackedMsg, end));
+}
+
+
+static uint8_t pack_nrach_indication_body_value(void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
+
+  if( push8(value->number_of_initial_scs_detected, ppWritePackedMsg, end) == 0)
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_initial_scs_detected = value->number_of_initial_scs_detected;
+
+  for(; i < total_number_of_initial_scs_detected; ++i) {
+    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
+
+    //uint8_t* instance_length_p = *ppWritePackedMsg;
+    //if(!push16(pdu->instance_length, ppWritePackedMsg, end))
+    //  return 0;
+
+    if(!(pack_tlv(NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, ppWritePackedMsg, end, pack_nrach_indication_rel13_value)))
+      return 0;
+
+    // calculate the instance length subtracting the size of the instance
+    // length feild
+    //uint16_t instance_length = *ppWritePackedMsg - instance_length_p - 2;
+    //push16(instance_length, &instance_length_p, end);
+  }
+
+  return 1;
+}
+
+static uint8_t pack_nrach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
+  return ( push16(pNfapiMsg->sfn_sf, ppWritePackedMsg, end) &&
+           pack_tlv(NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, ppWritePackedMsg, end, &pack_nrach_indication_body_value) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
+  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+           pushs32(pNfapiMsg->delta_sfn_slot, ppWritePackedMsg, end) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_dl_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
+  return ( push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+           pushs32(pNfapiMsg->delta_sfn_sf, ppWritePackedMsg, end) &&
+           pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
+  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_ul_node_sync(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
+  return (push32(pNfapiMsg->t1, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t2, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->t3, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
+  return (push32(pNfapiMsg->last_sfn_sf, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->dl_config_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->tx_request_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_config_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->hi_dci0_jitter, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_config_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_request_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_config_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->hi_dci0_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_config_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_request_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_config_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->hi_dci0_earliest_arrival, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
+  return (push32(pNfapiMsg->last_sfn, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->last_slot, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->time_since_last_timing_info, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->dl_tti_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->tx_data_request_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_tti_jitter, ppWritePackedMsg, end) &&
+          push32(pNfapiMsg->ul_dci_jitter, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_tti_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_data_request_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_tti_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_dci_latest_delay, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->dl_tti_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->tx_data_request_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_tti_earliest_arrival, ppWritePackedMsg, end) &&
+          pushs32(pNfapiMsg->ul_dci_earliest_arrival, ppWritePackedMsg, end) &&
+          pack_p7_vendor_extension_tlv(pNfapiMsg->vendor_extension, ppWritePackedMsg, end, config));
+}
+
+//NR UPLINK indication function packing
+
+//SLOT INDICATION
+
+static uint8_t pack_nr_slot_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+
+	if (!(push16((uint16_t)pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16((uint16_t)pNfapiMsg->slot , ppWritePackedMsg, end)
+		))
+			return 0;
+
+return 1;
+}
+
+//RX DATA INDICATION 
+
+static uint8_t pack_nr_rx_data_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->harq_id, ppWritePackedMsg, end) &&
+		 push16(value->pdu_length, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) && 
+		 push16(value->rssi, ppWritePackedMsg, end) 
+		 ))
+		  return 0;
+
+	return 1;
+}
+
+
+static uint8_t pack_nr_rx_data_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!pack_nr_rx_data_indication_body(pNfapiMsg->pdu_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR CRC INDICATION
+
+static uint8_t pack_nr_crc_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_crc_t* value = (nfapi_nr_crc_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->harq_id, ppWritePackedMsg, end) &&
+		 push8(value->tb_crc_status, ppWritePackedMsg, end) &&
+		 push16(value->num_cb, ppWritePackedMsg, end) &&
+		 //pusharray8(value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, ppWritePackedMsg, end) && //length is ceil(NumCb/8)
+		 push8(value->ul_cqi, ppWritePackedMsg, end) && 
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	return 1;
+}
+
+static uint8_t pack_nr_crc_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_crcs, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_crcs;i++)	
+	{
+		if(!pack_nr_crc_indication_body(pNfapiMsg->crc_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//SRS INDICATION
+
+static uint8_t pack_nr_srs_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
+
+	if(!(push32(value->handle, ppWritePackedMsg, end) &&
+	 	 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) &&
+		 push8(value->num_symbols, ppWritePackedMsg, end) &&
+		 push8(value->wide_band_snr, ppWritePackedMsg, end) &&
+		 push8(value->num_reported_symbols, ppWritePackedMsg, end) && 
+		 push8(value->reported_symbol_list->num_rbs, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
+	{
+		if(!(push8(value->reported_symbol_list->rb_list->rb_snr, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t pack_nr_srs_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!pack_nr_srs_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//RACH INDICATION
+
+static uint8_t pack_nr_rach_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
+
+	if(!(push16(value->phy_cell_id, ppWritePackedMsg, end) &&
+	 	 push8(value->symbol_index, ppWritePackedMsg, end) &&
+		 push8(value->slot_index, ppWritePackedMsg, end) &&
+		 push8(value->freq_index, ppWritePackedMsg, end) &&
+		 push8(value->avg_rssi, ppWritePackedMsg, end) &&
+		 push8(value->avg_snr, ppWritePackedMsg, end) && 
+		 push8(value->num_preamble, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->num_preamble; i++)
+	{
+		if(!(push8(value->preamble_list->preamble_index, ppWritePackedMsg, end) &&
+			push16(value->preamble_list->timing_advance, ppWritePackedMsg, end) &&
+			push32(value->preamble_list->preamble_pwr, ppWritePackedMsg, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t pack_nr_rach_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push8(pNfapiMsg->number_of_pdus, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!pack_nr_rach_indication_body(&(pNfapiMsg->pdu_list[i]),ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+
+//UCI INDICATION
+
+static uint8_t pack_nr_uci_pucch_0_1(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+
+	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
+	 	 push32(value->handle, ppWritePackedMsg, end) &&
+		 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->pucch_format, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) && 
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(push8(value->sr->sr_indication, ppWritePackedMsg, end) &&
+	 	 push8(value->sr->sr_confidence_level, ppWritePackedMsg, end) 
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(push8(value->harq->num_harq, ppWritePackedMsg, end) &&
+	 	 push8(value->harq->harq_confidence_level, ppWritePackedMsg, end) 
+		 ))
+			return 0;
+
+		for(int i=0; i<value->harq->num_harq;i++)	
+		{
+			if(!(push8(value->harq->harq_list[i].harq_value, ppWritePackedMsg, end)
+			))
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_pucch_2_3_4(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+
+	if(!(push8(value->pduBitmap, ppWritePackedMsg, end) &&
+	 	 push32(value->handle, ppWritePackedMsg, end) &&
+		 push16(value->rnti, ppWritePackedMsg, end) &&
+		 push8(value->pucch_format, ppWritePackedMsg, end) &&
+		 push8(value->ul_cqi, ppWritePackedMsg, end) &&
+		 push16(value->timing_advance, ppWritePackedMsg, end) && 
+		 push16(value->rssi, ppWritePackedMsg, end)
+		 ))
+		  return 0;
+
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(push8(value->sr.sr_bit_len, ppWritePackedMsg, end) &&
+	 	 pusharray8(value->sr.sr_payload, (int)(value->sr.sr_bit_len / 8) + 1, (int)(value->sr.sr_bit_len / 8) + 1, ppWritePackedMsg, end) 
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(push8(value->harq.harq_crc, ppWritePackedMsg, end) &&
+			push8(value->harq.harq_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8) + 1, (int)(value->harq.harq_bit_len / 8) + 1, ppWritePackedMsg, end) 
+			))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
+		if(!(push8(value->csi_part1.csi_part1_crc, ppWritePackedMsg, end) &&
+			push8(value->csi_part1.csi_part1_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, (int)(value->csi_part1.csi_part1_bit_len / 8) + 1, ppWritePackedMsg, end) 
+			))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
+		if(!(push8(value->csi_part2.csi_part2_crc, ppWritePackedMsg, end) &&
+			push8(value->csi_part2.csi_part2_bit_len, ppWritePackedMsg, end) &&
+	 	 	pusharray8(value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, (int)(value->csi_part2.csi_part2_bit_len / 8) + 1, ppWritePackedMsg, end) 
+			))
+			return 0;
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_indication_body(void* tlv, uint8_t **ppWritePackedMsg, uint8_t *end)
+{
+	nfapi_nr_uci_t* value = (nfapi_nr_uci_t*)tlv;
+
+	if(!(push16(value->pdu_type, ppWritePackedMsg, end) &&
+		push16(value->pdu_size, ppWritePackedMsg, end)
+		))
+		return 0;
+	
+	switch (value->pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: 
+        pack_nr_uci_pucch_0_1(&value->pucch_pdu_format_0_1, ppWritePackedMsg, end);
+        break;
+      
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: 
+        pack_nr_uci_pucch_2_3_4(&value->pucch_pdu_format_2_3_4, ppWritePackedMsg, end);
+        break;
+	}
+
+	return 1;
+}
+
+static uint8_t pack_nr_uci_indication(void *msg, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+
+	if (!(push16(pNfapiMsg->sfn , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->slot , ppWritePackedMsg, end) &&
+		push16(pNfapiMsg->num_ucis, ppWritePackedMsg, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->num_ucis;i++)	
+	{
+		if(!pack_nr_uci_indication_body(pNfapiMsg->uci_list,ppWritePackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+
+// Main pack function - public
+
+int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t* config)
+{
+	nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+	uint8_t *pWritePackedMessage = pPackedBuf;
+	uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+	uint8_t *end = pPackedBuf + packedBufLen;
+
+	if (pMessageBuf == NULL || pPackedBuf == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+		return -1;
+	}
+	/*
+	printf("\n P7 MESSAGE SENT: \n");
+	for(int i=0; i< packedBufLen; i++){
+		printf("%d", *(uint8_t *)(pMessageBuf + i));
+	}
+	printf("\n");
+	*/
+	// process the header
+	if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+		 push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+		 push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+		 push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+		 push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+		 push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end)))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+		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_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			result = pack_dl_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			result = pack_ul_tti_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			result = pack_tx_data_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			result = pack_ul_dci_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+		
+		case NFAPI_UE_RELEASE_REQUEST:
+			result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			result = pack_nr_slot_indication(pMessageHeader, &pWritePackedMessage, end, config);
+
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			result = pack_nr_rx_data_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			result = pack_nr_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			result = pack_nr_uci_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			result = pack_nr_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			result = pack_nr_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			result = pack_nr_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			result = pack_nr_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		case NFAPI_TIMING_INFO:
+			result = pack_nr_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+			break;
+
+		default:
+			{
+				if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+				   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+				{
+					if(config && config->pack_p7_vendor_extension)
+					{
+						result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+					}
+					else
+					{
+						NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+					}
+				}
+				else
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+				}
+			}
+			break;
+	}
+
+	if(result == 0)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+		return -1;
+	}
+
+	// check for a valid message length
+	uintptr_t msgHead = (uintptr_t)pPackedBuf;
+	uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+	uint32_t packedMsgLen = msgEnd - msgHead;
+	uint16_t packedMsgLen16;
+	if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+		return -1;
+	}
+	else
+	{
+		packedMsgLen16 = (uint16_t)packedMsgLen;
+	}
+
+	// Update the message length in the header
+	pMessageHeader->message_length = packedMsgLen16;
+
+	if(!push16(packedMsgLen16, &pPackedLengthField, end))
+		return -1;
+
+	if(1)
+	{
+		//quick test
+		if(pMessageHeader->message_length != packedMsgLen)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+		}
+	}
+
+	return (packedMsgLen);
+}
+
+int nfapi_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packedBufLen, nfapi_p7_codec_config_t *config) {
+  nfapi_p7_message_header_t *pMessageHeader = pMessageBuf;
+  uint8_t *pWritePackedMessage = pPackedBuf;
+  uint8_t *pPackedLengthField = &pWritePackedMessage[4];
+  uint8_t *end = pPackedBuf + packedBufLen;
+
+  if (pMessageBuf == NULL || pPackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack supplied pointers are null\n");
+    return -1;
+  }
+
+  /*
+  printf("\n P7 MESSAGE SENT: \n");
+  for(int i=0; i< packedBufLen; i++){
+    printf("%d", *(uint8_t *)(pMessageBuf + i));
+  }
+  printf("\n");
+  */
+  // process the header
+  if(!(push16(pMessageHeader->phy_id, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->message_id, &pWritePackedMessage, end) &&
+       push16(0/*pMessageHeader->message_length*/, &pWritePackedMessage, end) &&
+       push16(pMessageHeader->m_segment_sequence, &pWritePackedMessage, end) &&
+       push32(0/*pMessageHeader->checksum*/, &pWritePackedMessage, end) &&
+       push32(pMessageHeader->transmit_timestamp, &pWritePackedMessage, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack header failed\n");
+    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;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      result = pack_ul_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      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;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      result = pack_hi_dci0_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      result =pack_ue_release_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      result =pack_ue_release_response(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      result = pack_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      result = pack_crc_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      //printf("RX ULSCH\n");
+      result = pack_rx_ulsch_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      result = pack_rach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      result = pack_srs_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      result = pack_sr_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      result = pack_cqi_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      result = pack_lbt_dl_config_request(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      result = pack_lbt_dl_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      result = pack_nb_harq_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      result = pack_nrach_indication(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      result = pack_dl_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      result = pack_ul_node_sync(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    case NFAPI_TIMING_INFO:
+      result = pack_timing_info(pMessageHeader, &pWritePackedMessage, end, config);
+      break;
+
+    default: {
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->pack_p7_vendor_extension) {
+          result = (config->pack_p7_vendor_extension)(pMessageHeader, &pWritePackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve ecoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+    }
+    break;
+  }
+
+  if(result == 0) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 Pack failed to pack message\n");
+    return -1;
+  }
+
+  // check for a valid message length
+  uintptr_t msgHead = (uintptr_t)pPackedBuf;
+  uintptr_t msgEnd = (uintptr_t)pWritePackedMessage;
+  uint32_t packedMsgLen = msgEnd - msgHead;
+  uint16_t packedMsgLen16;
+
+  if (packedMsgLen > 0xFFFF || packedMsgLen > packedBufLen) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "Packed message length error %d, buffer supplied %d\n", packedMsgLen, packedBufLen);
+    return -1;
+  } else {
+    packedMsgLen16 = (uint16_t)packedMsgLen;
+  }
+
+  // Update the message length in the header
+  pMessageHeader->message_length = packedMsgLen16;
+
+  if(!push16(packedMsgLen16, &pPackedLengthField, end))
+    return -1;
+
+  if(1) {
+    //quick test
+    if(pMessageHeader->message_length != packedMsgLen) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "nfapi packedMsgLen(%d) != message_length(%d) id %d\n", packedMsgLen, pMessageHeader->message_length, pMessageHeader->message_id);
+    }
+  }
+
+  return (packedMsgLen);
+}
+
+// Unpack routines
+// NR:
+static uint8_t unpack_dl_tti_csi_rs_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *value = (nfapi_nr_dl_tti_csi_rs_pdu_rel15_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &value->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &value->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &value->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &value->cyclic_prefix, end) &&
+          pull16(ppReadPackedMsg, &value->start_rb, end) &&
+          pull16(ppReadPackedMsg, &value->nr_of_rbs, end) &&
+          pull8(ppReadPackedMsg, &value->csi_type, end) &&
+          pull8(ppReadPackedMsg, &value->row, end) &&
+          pull16(ppReadPackedMsg, &value->freq_domain, end) &&
+          pull8(ppReadPackedMsg, &value->symb_l0, end) &&
+          pull8(ppReadPackedMsg, &value->symb_l1, end) &&
+          pull8(ppReadPackedMsg, &value->cdm_type, end) &&
+          pull8(ppReadPackedMsg, &value->freq_density, end) &&
+          pull16(ppReadPackedMsg, &value->scramb_id, end) &&
+          pull8(ppReadPackedMsg, &value->power_control_offset, end) &&
+          pull8(ppReadPackedMsg, &value->power_control_offset_ss, end)
+        );
+}
+
+
+static uint8_t unpack_dl_tti_pdcch_pdu_rel15_value(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+
+	nfapi_nr_dl_tti_pdcch_pdu_rel15_t* value = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t*)tlv;
+	
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(pull16(ppReadPackedMsg, &value->dci_pdu[i].RNTI, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingId, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].ScramblingRNTI, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].CceIndex, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].AggregationLevel, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].beta_PDCCH_1_0, end) &&
+		pull8(ppReadPackedMsg, &value->dci_pdu[i].powerControlOffsetSS, end) &&
+		pull16(ppReadPackedMsg, &value->dci_pdu[i].PayloadSizeBits, end) &&
+		
+		pullarray8(ppReadPackedMsg, value->dci_pdu[i].Payload, value->dci_pdu[i].PayloadSizeBits, value->dci_pdu[i].PayloadSizeBits, end)))
+			
+		return 0;
+	}
+	// TODO: resolve the packaging of array (currently sending a single element)
+	return(
+		pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+		pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+		pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+		pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+		pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+		pull8(ppReadPackedMsg, &value->DurationSymbols, end) &&
+		pullarray8(ppReadPackedMsg, value->FreqDomainResource, 6, 6, end) &&
+		pull8(ppReadPackedMsg, &value->CceRegMappingType, end) &&
+		pull8(ppReadPackedMsg, &value->RegBundleSize, end) &&
+		pull8(ppReadPackedMsg, &value->InterleaverSize, end) &&
+		pull8(ppReadPackedMsg, &value->CoreSetType, end) &&
+		pull16(ppReadPackedMsg, &value->ShiftIndex, end) &&
+		pull8(ppReadPackedMsg, &value->precoderGranularity, end) &&
+		pull16(ppReadPackedMsg, &value->numDlDci, end));
+}
+
+
+
+static uint8_t unpack_dl_tti_pdsch_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_pdsch_pdu_rel15_t *value = (nfapi_nr_dl_tti_pdsch_pdu_rel15_t *)tlv;
+  // TODO: resolve the packaging of array (currently sending a single element)
+  return(
+          pull16(ppReadPackedMsg, &value->pduBitmap, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull16(ppReadPackedMsg, &value->pduIndex, end) &&
+          pull16(ppReadPackedMsg, &value->BWPSize, end) &&
+          pull16(ppReadPackedMsg, &value->BWPStart, end) &&
+          pull8(ppReadPackedMsg, &value->SubcarrierSpacing, end) &&
+          pull8(ppReadPackedMsg, &value->CyclicPrefix, end) &&
+          pull8(ppReadPackedMsg, &value->NrOfCodewords, end) &&
+          pullarray16(ppReadPackedMsg, value->targetCodeRate, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->qamModOrder, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->mcsIndex, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->mcsTable, 2, 1, end) &&
+          pullarray8(ppReadPackedMsg, value->rvIndex, 2, 1, end) &&
+          pullarray32(ppReadPackedMsg, value->TBSize, 2, 1, end) &&
+          pull16(ppReadPackedMsg, &value->dataScramblingId, end) &&
+          pull8(ppReadPackedMsg, &value->nrOfLayers, end) &&
+          pull8(ppReadPackedMsg, &value->transmissionScheme, end) &&
+          pull8(ppReadPackedMsg, &value->refPoint, end) &&
+          pull16(ppReadPackedMsg, &value->dlDmrsSymbPos, end) &&
+          pull8(ppReadPackedMsg, &value->dmrsConfigType, end) &&
+          pull16(ppReadPackedMsg, &value->dlDmrsScramblingId, end) &&
+          pull8(ppReadPackedMsg, &value->SCID, end) &&
+          pull8(ppReadPackedMsg, &value->numDmrsCdmGrpsNoData, end) &&
+          pull16(ppReadPackedMsg, &value->dmrsPorts, end) &&
+          pull8(ppReadPackedMsg, &value->resourceAlloc, end) &&
+          pull16(ppReadPackedMsg, &value->rbStart, end) &&
+          pull16(ppReadPackedMsg, &value->rbSize, end) &&
+          pull8(ppReadPackedMsg, &value->VRBtoPRBMapping, end) &&
+          pull8(ppReadPackedMsg, &value->StartSymbolIndex, end) &&
+          pull8(ppReadPackedMsg, &value->NrOfSymbols, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSPortIndex, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSTimeDensity, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSFreqDensity, end) &&
+          pull8(ppReadPackedMsg, &value->PTRSReOffset, end)
+        );
+}
+
+
+static uint8_t unpack_dl_tti_ssb_pdu_rel15_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_dl_tti_ssb_pdu_rel15_t *value = (nfapi_nr_dl_tti_ssb_pdu_rel15_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &value->PhysCellId, end) &&
+          pull8(ppReadPackedMsg, &value->BetaPss, end) &&
+          pull8(ppReadPackedMsg, &value->SsbBlockIndex, end) &&
+          pull8(ppReadPackedMsg, &value->SsbSubcarrierOffset, end) &&
+          pull16(ppReadPackedMsg, &value->ssbOffsetPointA, end) &&
+          pull8(ppReadPackedMsg, &value->bchPayloadFlag, end) &&
+          pull32(ppReadPackedMsg, &value->bchPayload, end)
+          // TODO: pack precoding_and_beamforming too
+        );
+}
+
+
+// LTE:
+static uint8_t unpack_dl_config_dci_dl_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel8_t *dci_dl_pdu_rel8 = (nfapi_dl_config_dci_dl_pdu_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->dci_format, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->cce_idx, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->aggregation_level, end) &&
+          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_allocation_type, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+          pull32(ppReadPackedMsg, &dci_dl_pdu_rel8->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_1, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->mcs_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->redundancy_version_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->new_data_indicator_2, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->harq_process, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpmi, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->pmi, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->precoding_information, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->tpc, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_assignment_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->ngap, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->transport_block_size_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->downlink_power_offset, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->allocate_prach_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->preamble_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->prach_mask_index, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel8->rnti_type, end) &&
+          pull16(ppReadPackedMsg, &dci_dl_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel9_t *dci_dl_pdu_rel9 = (nfapi_dl_config_dci_dl_pdu_rel9_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_flag, end) &&
+           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->mcch_change_notification, end) &&
+           pull8(ppReadPackedMsg, &dci_dl_pdu_rel9->scrambling_identity, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel10_t *dci_dl_pdu_rel10 = (nfapi_dl_config_dci_dl_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->carrier_indicator, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->srs_request, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->antenna_ports_scrambling_and_layers, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->total_dci_length_including_padding, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel10->n_dl_rb, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel11_t *dci_dl_pdu_rel11 = (nfapi_dl_config_dci_dl_pdu_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->harq_ack_resource_offset, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel11->pdsch_re_mapping_quasi_co_location_indicator, end));
+}
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel12_t *dci_dl_pdu_rel12 = (nfapi_dl_config_dci_dl_pdu_rel12_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->primary_cell_type, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->ul_dl_configuration_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel12->number_ul_dl_configurations, end) &&
+          pullarray8(ppReadPackedMsg, dci_dl_pdu_rel12->ul_dl_configuration_indication, NFAPI_MAX_UL_DL_CONFIGURATIONS, dci_dl_pdu_rel12->number_ul_dl_configurations, end));
+}
+
+static uint8_t unpack_tpm_value(uint8_t **ppReadPackedMsg, nfapi_dl_config_dci_dl_tpm_t *value, uint8_t *end) {
+  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+       pull8(ppReadPackedMsg, &value->num_antennas, end)))
+    return 0;
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    nfapi_dl_config_dci_dl_tpm_subband_info_t *subband_info = &(value->subband_info[idx]);
+
+    if(!(pull8(ppReadPackedMsg, &subband_info->subband_index, end) &&
+         pull8(ppReadPackedMsg, &subband_info->scheduled_ues, end)))
+      return 0;
+
+    uint8_t antenna_idx = 0;
+    uint8_t scheduled_ue_idx = 0;
+
+    for(antenna_idx = 0; antenna_idx < value->num_antennas; ++antenna_idx) {
+      for(scheduled_ue_idx = 0; scheduled_ue_idx < subband_info->scheduled_ues; ++scheduled_ue_idx) {
+        if(!pull16(ppReadPackedMsg, &(subband_info->precoding_value[antenna_idx][scheduled_ue_idx]), end))
+          return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_dl_config_dci_dl_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dci_dl_pdu_rel13_t *dci_dl_pdu_rel13 = (nfapi_dl_config_dci_dl_pdu_rel13_t *)tlv;
+  // If the length is greater than 5 then the TPM struct flag and possiably the TPM structure have been
+  // added
+  uint8_t tpm_struct_flag_present = dci_dl_pdu_rel13->tl.length > 5;
+  dci_dl_pdu_rel13->tpm_struct_flag = 0;
+  return (pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->laa_end_partial_sf_configuration, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->initial_lbt_sf, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->codebook_size_determination, end) &&
+          pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->drms_table_flag, end) &&
+          ( (tpm_struct_flag_present == 1) ? pull8(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm_struct_flag, end) : 1) &&
+          ( (tpm_struct_flag_present == 1 &&  dci_dl_pdu_rel13->tpm_struct_flag == 1) ? unpack_tpm_value(ppReadPackedMsg, &dci_dl_pdu_rel13->tpm, end) : 1));
+}
+
+static uint8_t unpack_dl_config_bch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_bch_pdu_rel8_t *bch_pdu_rel8 = (nfapi_dl_config_bch_pdu_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &bch_pdu_rel8->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&bch_pdu_rel8->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &bch_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_dl_config_mch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_mch_pdu_rel8_t *mch_pdu_rel8 = (nfapi_dl_config_mch_pdu_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &mch_pdu_rel8->length, end) &&
+          pull16(ppReadPackedMsg, (uint16_t *)&mch_pdu_rel8->pdu_index, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &mch_pdu_rel8->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &mch_pdu_rel8->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &mch_pdu_rel8->modulation, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->transmission_power, end) &&
+          pull16(ppReadPackedMsg, &mch_pdu_rel8->mbsfn_area_id, end));
+}
+
+static uint8_t unpack_dl_config_dlsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel8_t *dlsch_pdu_rel8 = (nfapi_dl_config_dlsch_pdu_rel8_t *)tlv;
+
+  if (!(pull16(ppReadPackedMsg, &dlsch_pdu_rel8->length, end) &&
+        pull16(ppReadPackedMsg, (uint16_t *)&dlsch_pdu_rel8->pdu_index, end) &&
+        pull16(ppReadPackedMsg, &dlsch_pdu_rel8->rnti, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->resource_allocation_type, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+        pull32(ppReadPackedMsg, &dlsch_pdu_rel8->resource_block_coding, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->modulation, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->redundancy_version, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_blocks, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_scheme, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_layers, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->number_of_subbands, end) &&
+        pullarray8(ppReadPackedMsg, dlsch_pdu_rel8->codebook_index, NFAPI_MAX_NUM_SUBBANDS, dlsch_pdu_rel8->number_of_subbands, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ue_category_capacity, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->pa, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->delta_power_offset_index, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->ngap, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->nprb, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->transmission_mode, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_prb_per_subband, end) &&
+        pull8(ppReadPackedMsg, &dlsch_pdu_rel8->num_bf_vector, end)))
+    return 0;
+
+  uint16_t j = 0;
+
+  for(j = 0; j < dlsch_pdu_rel8->num_bf_vector; ++j) {
+    if(!(pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].subband_index, end) &&
+         pull8(ppReadPackedMsg, &dlsch_pdu_rel8->bf_vector[j].num_antennas, end) &&
+         pullarray16(ppReadPackedMsg, dlsch_pdu_rel8->bf_vector[j].bf_value, NFAPI_MAX_NUM_ANTENNAS, dlsch_pdu_rel8->bf_vector[j].num_antennas, end)))
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel9_t *dlsch_pdu_rel9 = (nfapi_dl_config_dlsch_pdu_rel9_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel9->nscid, end) );
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel10_t *dlsch_pdu_rel10 = (nfapi_dl_config_dlsch_pdu_rel10_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_flag, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_resource_config_r10, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+           pullarray8(ppReadPackedMsg, dlsch_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, dlsch_pdu_rel10->csi_rs_number_nzp_configuration, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel10->pdsch_start, end)) ;
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel11_t *dlsch_pdu_rel11 = (nfapi_dl_config_dlsch_pdu_rel11_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel11->drms_config_flag, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->drms_scrambling, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->csi_config_flag, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel11->csi_scrambling, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_flag, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_atenna_ports, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel11->pdsch_re_mapping_freq_shift, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel12_t *dlsch_pdu_rel12 = (nfapi_dl_config_dlsch_pdu_rel12_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel12->altcqi_table_r12, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->maxlayers, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel12->n_dl_harq, end));
+}
+static uint8_t unpack_dl_config_dlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_dlsch_pdu_rel13_t *dlsch_pdu_rel13 = (nfapi_dl_config_dlsch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dlsch_pdu_rel13->dwpts_symbols, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->initial_lbt_sf, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->ue_type, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->pdsch_payload_type, end) &&
+           pull16(ppReadPackedMsg, &dlsch_pdu_rel13->initial_transmission_sf_io, end) &&
+           pull8(ppReadPackedMsg, &dlsch_pdu_rel13->drms_table_flag, end));
+}
+
+static uint8_t unpack_dl_config_pch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel8_t *pch_pdu_rel8 = (nfapi_dl_config_pch_pdu_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &pch_pdu_rel8->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&pch_pdu_rel8->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel8->p_rnti, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->resource_allocation_type, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->virtual_resource_block_assignment_flag, end) &&
+           pull32(ppReadPackedMsg, &pch_pdu_rel8->resource_block_coding, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->mcs, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->redundancy_version, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_transport_blocks, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->transport_block_to_codeword_swap_flag, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->transmission_scheme, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->number_of_layers, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->codebook_index, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->ue_category_capacity, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->pa, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel8->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->nprb, end) &&
+           pull8(ppReadPackedMsg, &pch_pdu_rel8->ngap, end));
+}
+static uint8_t unpack_dl_config_pch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_pch_pdu_rel13_t *pch_pdu_rel13 = (nfapi_dl_config_pch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &pch_pdu_rel13->ue_mode, end) &&
+           pull16(ppReadPackedMsg, &pch_pdu_rel13->initial_transmission_sf_io, end));
+}
+
+static uint8_t unpack_dl_config_prs_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_prs_pdu_rel9_t *prs_pdu_rel9 = (nfapi_dl_config_prs_pdu_rel9_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &prs_pdu_rel9->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_bandwidth, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_cyclic_prefix_type, end) &&
+           pull8(ppReadPackedMsg, &prs_pdu_rel9->prs_muting, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel10_t *csi_rs_pdu_rel10 = (nfapi_dl_config_csi_rs_pdu_rel10_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_antenna_port_count_r10, end) &&
+           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_resource_config_r10, end) &&
+           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->transmission_power, end) &&
+           pull16(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_zero_tx_power_resource_config_bitmap_r10, end) &&
+           pull8(ppReadPackedMsg, &csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end) &&
+           pullarray8(ppReadPackedMsg, csi_rs_pdu_rel10->csi_rs_resource_config, NFAPI_MAX_CSI_RS_RESOURCE_CONFIG, csi_rs_pdu_rel10->csi_rs_number_of_nzp_configuration, end));
+}
+
+static uint8_t unpack_dl_config_csi_rs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_csi_rs_pdu_rel13_t *csi_rs_pdu_rel13 = (nfapi_dl_config_csi_rs_pdu_rel13_t *)tlv;
+
+  if (!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->csi_rs_class, end) &&
+        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->cdm_type, end) &&
+        pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->num_bf_vector, end)))
+    return 0;
+
+  uint16_t idx =0;
+
+  for(idx = 0; idx < csi_rs_pdu_rel13->num_bf_vector; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].csi_rs_resource_index, end)))
+      return 0;
+
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : HOW TO DECODE BF VALUE \n");
+    //pullarray16(ppReadPackedMsg, &csi_rs_pdu_rel13->bf_vector[idx].bf_vector, ??);
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel11_t *epdcch_params_rel11 = (nfapi_dl_config_epdcch_parameters_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_resource_assignment_flag, end) &&
+          pull16(ppReadPackedMsg, &epdcch_params_rel11->epdcch_id, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_start_symbol, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->epdcch_num_prb, end) &&
+          pullarray8(ppReadPackedMsg, epdcch_params_rel11->epdcch_prb_index, NFAPI_MAX_EPDCCH_PRB, epdcch_params_rel11->epdcch_num_prb, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.subband_index, end) &&
+          pull8(ppReadPackedMsg, &epdcch_params_rel11->bf_vector.num_antennas, end) &&
+          pullarray16(ppReadPackedMsg, epdcch_params_rel11->bf_vector.bf_value, NFAPI_MAX_NUM_ANTENNAS, epdcch_params_rel11->bf_vector.num_antennas, end));
+}
+
+static uint8_t unpack_dl_config_epdcch_params_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_epdcch_parameters_rel13_t *epdcch_params_rel13 = (nfapi_dl_config_epdcch_parameters_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &epdcch_params_rel13->dwpts_symbols, end) &&
+           pull8(ppReadPackedMsg, &epdcch_params_rel13->initial_lbt_sf, end));
+}
+
+static uint8_t unpack_dl_config_mpdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_mpdcch_pdu_rel13_t *mpdcch_params_rel13 = (nfapi_dl_config_mpdcch_pdu_rel13_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_narrow_band, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_prb_pairs, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_assignment, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mpdcch_tansmission_type, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ecce_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->aggregation_level, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->rnti, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->ce_mode, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->drms_scrambling_init, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->initial_transmission_sf_io, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->transmission_power, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_format, end) &&
+           pull16(ppReadPackedMsg, &mpdcch_params_rel13->resource_block_coding, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->mcs, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pdsch_reptition_levels, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->redundancy_version, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->new_data_indicator, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_process, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi_length, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpmi, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->pmi, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->harq_resource_offset, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->dci_subframe_repetition_number, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->tpc, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index_length, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->downlink_assignment_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->allocate_prach_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->preamble_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->prach_mask_index, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->starting_ce_level, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->srs_request, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->antenna_ports_and_scrambling_identity, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->frequency_hopping_enabled_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->paging_direct_indication_differentiation_flag, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->direct_indication, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->total_dci_length_including_padding, end) &&
+           pull8(ppReadPackedMsg, &mpdcch_params_rel13->number_of_tx_antenna_ports, end) &&
+           pullarray16(ppReadPackedMsg, mpdcch_params_rel13->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, mpdcch_params_rel13->number_of_tx_antenna_ports, end));
+}
+
+
+static uint8_t unpack_dl_config_nbch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_nbch_pdu_rel13_t *nbch_params_rel13 = (nfapi_dl_config_nbch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &nbch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&nbch_params_rel13->pdu_index, end) &&
+           pull16(ppReadPackedMsg, &nbch_params_rel13->transmission_power, end) &&
+           pull16(ppReadPackedMsg, &nbch_params_rel13->hyper_sfn_2_lsbs, end));
+}
+
+static uint8_t unpack_dl_config_npdcch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_npdcch_pdu_rel13_t *npdcch_params_rel13 = (nfapi_dl_config_npdcch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &npdcch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&npdcch_params_rel13->pdu_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->ncce_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->aggregation_level, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &npdcch_params_rel13->rnti, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->scrambling_reinitialization_batch_index, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_format, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->scheduling_delay, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->resource_assignment, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->repetition_number, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->mcs, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->new_data_indicator, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->harq_ack_resource, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->npdcch_order_indication, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->starting_number_of_nprach_repetitions, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->subcarrier_indication_of_nprach, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->paging_direct_indication_differentation_flag, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->direct_indication, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->dci_subframe_repetition_number, end) &&
+           pull8(ppReadPackedMsg, &npdcch_params_rel13->total_dci_length_including_padding, end));
+}
+
+static uint8_t unpack_dl_config_ndlsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_dl_config_ndlsch_pdu_rel13_t *ndlsch_params_rel13 = (nfapi_dl_config_ndlsch_pdu_rel13_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &ndlsch_params_rel13->length, end) &&
+           pull16(ppReadPackedMsg, (uint16_t *)&ndlsch_params_rel13->pdu_index, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->start_symbol, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->rnti_type, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->rnti, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->resource_assignment, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->repetition_number, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->modulation, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->number_of_subframes_for_resource_assignment, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->scrambling_sequence_initialization_cinit, end) &&
+           pull16(ppReadPackedMsg, &ndlsch_params_rel13->sf_idx, end) &&
+           pull8(ppReadPackedMsg, &ndlsch_params_rel13->nrs_antenna_ports_assumed_by_the_ue, end));
+}
+
+
+static uint8_t unpack_dl_tti_request_body_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_dl_tti_request_pdu_t *value = (nfapi_nr_dl_tti_request_pdu_t *)msg;
+
+  if(!(pull32(ppReadPackedMsg, &value->PDUSize, end) &&
+       pull16(ppReadPackedMsg, &value->PDUType, end) ))
+    return 0;
+
+  // first match the pdu type, then call the respective function
+  switch(value->PDUType) {
+    case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE: {
+      if(!(unpack_dl_tti_csi_rs_pdu_rel15_value(&value->csi_rs_pdu.csi_rs_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE: {
+      if(!(unpack_dl_tti_pdcch_pdu_rel15_value(&value->pdcch_pdu.pdcch_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE: {
+      if(!(unpack_dl_tti_pdsch_pdu_rel15_value(&value->pdsch_pdu.pdsch_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_DL_TTI_SSB_PDU_TYPE: {
+      if(!(unpack_dl_tti_ssb_pdu_rel15_value(&value->ssb_pdu.ssb_pdu_rel15,ppReadPackedMsg,end)))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid DL_TTI pdu type %d \n", value->PDUType );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+
+
+
+static uint8_t unpack_dl_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_body_t *value = (nfapi_dl_config_request_body_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_pdcch_ofdm_symbols, end) &&
+       pull8(ppReadPackedMsg, &value->number_dci, end) &&
+       pull16(ppReadPackedMsg, &value->number_pdu, end) &&
+       pull8(ppReadPackedMsg, &value->number_pdsch_rnti, end) &&
+       pull16(ppReadPackedMsg, &value->transmission_power_pcfich, end)))
+    return 0;
+
+  if(value->number_pdu > NFAPI_DL_CONFIG_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_pdu, NFAPI_DL_CONFIG_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_pdu) {
+    value->dl_config_pdu_list = (nfapi_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_dl_config_request_pdu_t) * value->number_pdu, config);
+
+    if(value->dl_config_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate dl config pdu list (count:%d)\n", __FUNCTION__, value->number_pdu);
+      return 0;
+    }
+  } else {
+    value->dl_config_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_pdu;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_dl_config_request_pdu_t *pdu = &(value->dl_config_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end of beyond buffer end
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_DL_CONFIG_DCI_DL_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL8_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL9_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL10_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL11_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL12_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_DCI_DL_PDU_REL13_TAG, &pdu->dci_dl_pdu.dci_dl_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_BCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_BCH_PDU_REL8_TAG, &pdu->bch_pdu.bch_pdu_rel8, &unpack_dl_config_bch_pdu_rel8_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_MCH_PDU_REL8_TAG, &pdu->mch_pdu.mch_pdu_rel8, &unpack_dl_config_mch_pdu_rel8_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_DLSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL8_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel8, &unpack_dl_config_dlsch_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL9_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel9, &unpack_dl_config_dlsch_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL10_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel10, &unpack_dl_config_dlsch_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL11_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel11, &unpack_dl_config_dlsch_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL12_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel12, &unpack_dl_config_dlsch_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_DLSCH_PDU_REL13_TAG, &pdu->dlsch_pdu.dlsch_pdu_rel13, &unpack_dl_config_dlsch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL8_TAG, &pdu->pch_pdu.pch_pdu_rel8, &unpack_dl_config_pch_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_PCH_PDU_REL13_TAG, &pdu->pch_pdu.pch_pdu_rel13, &unpack_dl_config_pch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_PRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_PRS_PDU_REL9_TAG, &pdu->prs_pdu.prs_pdu_rel9, &unpack_dl_config_prs_pdu_rel9_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_CSI_RS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL10_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel10, &unpack_dl_config_csi_rs_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_CSI_RS_PDU_REL13_TAG, &pdu->csi_rs_pdu.csi_rs_pdu_rel13, &unpack_dl_config_csi_rs_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_EPDCCH_DL_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL8_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel8, &unpack_dl_config_dci_dl_pdu_rel8_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL9_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel9, &unpack_dl_config_dci_dl_pdu_rel9_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL10_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel10, &unpack_dl_config_dci_dl_pdu_rel10_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL11_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel11, &unpack_dl_config_dci_dl_pdu_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL12_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel12, &unpack_dl_config_dci_dl_pdu_rel12_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PDU_REL13_TAG, &pdu->epdcch_pdu.epdcch_pdu_rel13, &unpack_dl_config_dci_dl_pdu_rel13_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL11_TAG, &pdu->epdcch_pdu.epdcch_params_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+          { NFAPI_DL_CONFIG_REQUEST_EPDCCH_PARAM_REL13_TAG, &pdu->epdcch_pdu.epdcch_params_rel13, &unpack_dl_config_epdcch_params_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_MPDCCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_MPDCCH_PDU_REL13_TAG, &pdu->mpdcch_pdu.mpdcch_pdu_rel13, &unpack_dl_config_mpdcch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NBCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NBCH_PDU_REL13_TAG, &pdu->nbch_pdu.nbch_pdu_rel13, &unpack_dl_config_nbch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NPDCCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NPDCCH_PDU_REL13_TAG, &pdu->npdcch_pdu.npdcch_pdu_rel13, &unpack_dl_config_npdcch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_DL_CONFIG_NDLSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_DL_CONFIG_REQUEST_NDLSCH_PDU_REL13_TAG, &pdu->ndlsch_pdu.ndlsch_pdu_rel13, &unpack_dl_config_ndlsch_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        // Need to log an error
+        break;
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_tti_request_t *pNfapiMsg = (nfapi_nr_dl_tti_request_t *)msg;
+
+  if (!(pull16(ppReadPackedMsg,&pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nGroup, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->dl_tti_request_body.nPDUs, end) &&
+        pullarray8(ppReadPackedMsg,pNfapiMsg->dl_tti_request_body.nUe,256,pNfapiMsg->dl_tti_request_body.nGroup, end)
+        //pusharray8(pNfapiMsg->PduIdx[0] ,256,256, ppWritePackedMsg, end)
+       ))
+    return 0;
+
+  int arr[12];
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nGroup; i++) {
+    for(int j=0; j<pNfapiMsg->dl_tti_request_body.nUe[i]; j++) {
+      arr[j] = pNfapiMsg->dl_tti_request_body.PduIdx[i][j];
+    }
+
+    if(!(pullarrays32(ppReadPackedMsg,arr,12,pNfapiMsg->dl_tti_request_body.nUe[i], end)))
+      return 0;
+  }
+
+  for(int i=0; i<pNfapiMsg->dl_tti_request_body.nPDUs; i++) {
+    if(!unpack_dl_tti_request_body_value(ppReadPackedMsg, end, &pNfapiMsg->dl_tti_request_body.dl_tti_pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_prach_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_prach_pdu_t *prach_pdu = (nfapi_nr_prach_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &prach_pdu->phys_cell_id, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->num_prach_ocas, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->prach_format, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->num_ra, end) &&
+          pull8(ppReadPackedMsg, &prach_pdu->prach_start_symbol, end) &&
+          pull16(ppReadPackedMsg, &prach_pdu->num_cs, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_request_pucch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_pucch_pdu_t *pucch_pdu = (nfapi_nr_pucch_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &pucch_pdu->rnti, end) &&
+          pull32(ppReadPackedMsg, &pucch_pdu->handle, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->cyclic_prefix, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->format_type, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->multi_slot_tx_indicator, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->prb_start, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->prb_size, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->start_symbol_index, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->nr_of_symbols, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->freq_hop_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->second_hop_prb, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->group_hop_flag, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->sequence_hop_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->hopping_id, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->initial_cyclic_shift, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->data_scrambling_id, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->time_domain_occ_idx, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_idx, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->pre_dft_occ_len, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->add_dmrs_flag, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->dmrs_scrambling_id, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->dmrs_cyclic_shift, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->sr_flag, end) &&
+          pull8(ppReadPackedMsg, &pucch_pdu->bit_len_harq, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part1, end) &&
+          pull16(ppReadPackedMsg, &pucch_pdu->bit_len_csi_part2, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_request_pusch_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_pusch_pdu_t *pusch_pdu = (nfapi_nr_pusch_pdu_t *)tlv;
+
+  if (!(
+        pull16(ppReadPackedMsg, &pusch_pdu->pdu_bit_map, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rnti, end) &&
+        pull32(ppReadPackedMsg, &pusch_pdu->handle, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->bwp_size, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->bwp_start, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->subcarrier_spacing, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->cyclic_prefix, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->target_code_rate,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->qam_mod_order,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->mcs_index,  end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->mcs_table, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->transform_precoding, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->data_scrambling_id, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->nrOfLayers, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_symb_pos, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->dmrs_config_type, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->ul_dmrs_scrambling_id, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->scid, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->num_dmrs_cdm_grps_no_data, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->resource_alloc,end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->dmrs_ports, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rb_start, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->rb_size, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->vrb_to_prb_mapping, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->frequency_hopping, end) &&
+        pull16(ppReadPackedMsg, &pusch_pdu->tx_direct_current_location, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->uplink_frequency_shift_7p5khz, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->start_symbol_index, end) &&
+        pull8(ppReadPackedMsg, &pusch_pdu->nr_of_symbols, end)
+        // TODO: ignoring beamforming tlv for now
+      ))
+    return 0;
+
+  //Pack Optional Data only included if indicated in pduBitmap
+  switch(pusch_pdu->pdu_bit_map) {
+    case PUSCH_PDU_BITMAP_PUSCH_DATA: {
+      // pack optional TLVs
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.rv_index, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_data.harq_process_id, end) &&
+              pull32(ppReadPackedMsg, &pusch_pdu->pusch_data.tb_size, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_data.num_cb, end) &&
+              pullarray8(ppReadPackedMsg, pusch_pdu->pusch_data.cb_present_and_position,1,1,end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_UCI: {
+      return(
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.harq_ack_bit_length, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part1_bit_length, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->pusch_uci.csi_part2_bit_length, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.alpha_scaling, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_harq_ack, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi1, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_uci.beta_offset_csi2, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_PUSCH_PTRS: {
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.num_ptrs_ports, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_dmrs_port, end) &&
+              +               pull16(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_port_index, end) &&
+              +               pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_time_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ptrs_freq_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->pusch_ptrs.ul_ptrs_power, end)
+            );
+    }
+    break;
+
+    case PUSCH_PDU_BITMAP_DFTS_OFDM: {
+      return(
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_group_number, end) &&
+              pull16(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.low_papr_sequence_number, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_sample_density, end) &&
+              pull8(ppReadPackedMsg, &pusch_pdu->dfts_ofdm.ul_ptrs_time_density_transform_precoding, end)
+            );
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_INFO, "Invalid pdu bitmap %d \n", pusch_pdu->pdu_bit_map );
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request_srs_pdu(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nr_srs_pdu_t *srs_pdu = (nfapi_nr_srs_pdu_t *)tlv;
+  return(
+          pull16(ppReadPackedMsg, &srs_pdu->rnti, end) &&
+          pull32(ppReadPackedMsg, &srs_pdu->handle, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->bwp_size, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->bwp_start, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->subcarrier_spacing, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->cyclic_prefix, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_ant_ports, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_symbols,  end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->num_repetitions, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->time_start_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->config_index, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->sequence_id, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->bandwidth_index, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->comb_size, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->comb_offset, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->cyclic_shift, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_shift, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->frequency_hopping, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->group_or_sequence_hopping, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu->resource_type, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->t_srs, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu->t_offset, end)
+          // TODO: ignoring beamforming tlv for now
+        );
+}
+
+
+static uint8_t unpack_ul_tti_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_ul_tti_request_number_of_pdus_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_pdus_t *)msg;
+
+  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->pdu_type, end) ))
+    return 0;
+
+  // first natch the pdu type, then call the respective function
+  switch(pNfapiMsg->pdu_type) {
+    case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_prach_pdu(&pNfapiMsg->prach_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUCCH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_pucch_pdu(&pNfapiMsg->pucch_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE: {
+      if(!unpack_ul_tti_request_pusch_pdu(&pNfapiMsg->pusch_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    case NFAPI_NR_UL_CONFIG_SRS_PDU_TYPE: {
+      if(!unpack_ul_tti_request_srs_pdu(&pNfapiMsg->srs_pdu, ppReadPackedMsg, end))
+        return 0;
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", pNfapiMsg->pdu_type );
+    }
+    break;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_groups_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_ul_tti_request_number_of_groups_t *pNfapiMsg = (nfapi_nr_ul_tti_request_number_of_groups_t *)msg;
+
+  if(!pull8(ppReadPackedMsg, &pNfapiMsg->n_ue, end))
+    return 0;
+
+  for (int i = 0; i < pNfapiMsg->n_ue; i++) {
+    if(!pull8(ppReadPackedMsg, &pNfapiMsg->ue_list[i].pdu_idx,end) )
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t *)msg;
+
+  if (!(
+        pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_pdus, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_group, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->rach_present, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulcch, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->n_ulsch, end) ))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->n_pdus; i++) {
+    if (!unpack_ul_tti_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdus_list[i]))
+      return 0;
+  }
+
+  for(int i=0; i< pNfapiMsg->n_group; i++) {
+    if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_config_request_t *pNfapiMsg = (nfapi_dl_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->dl_config_request_body, &unpack_dl_config_request_body_value},
+  };
+  return ( pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+           unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel8_t *ulsch_pdu_rel8 = (nfapi_ul_config_ulsch_pdu_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &ulsch_pdu_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->size, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->number_of_resource_blocks, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->modulation_type, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->frequency_hopping_bits, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->new_data_indication, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->redundancy_version, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->harq_process_number, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->ul_tx_mode, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->current_tx_nb, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel8->n_srs, end ));
+}
+
+static uint8_t unpack_ul_config_ulsch_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel10_t *ulsch_pdu_rel10 = (nfapi_ul_config_ulsch_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ulsch_pdu_rel10->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &ulsch_pdu_rel10->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transport_blocks, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->transmission_scheme, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->number_of_layers, end) &
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->codebook_index, end) &&
+          pull8(ppReadPackedMsg, &ulsch_pdu_rel10->disable_sequence_hopping_flag, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel11_t *ulsch_pdu_rel11 = (nfapi_ul_config_ulsch_pdu_rel11_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &ulsch_pdu_rel11->virtual_cell_id_enabled_flag, end) &&
+           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->npusch_identity, end) &&
+           pull8(ppReadPackedMsg, &ulsch_pdu_rel11->dmrs_config_flag, end) &&
+           pull16(ppReadPackedMsg, &ulsch_pdu_rel11->ndmrs_csh_identity, end));
+}
+static uint8_t unpack_ul_config_ulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_pdu_rel13_t *ulsch_pdu_rel13 = (nfapi_ul_config_ulsch_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->ue_type, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->total_number_of_repetitions, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->repetition_number, end) &&
+          pull16(ppReadPackedMsg, &ulsch_pdu_rel13->initial_transmission_sf_io, end) &&
+          pull8(ppReadPackedMsg,  &ulsch_pdu_rel13->empty_symbols_due_to_re_tunning, end));
+}
+static uint8_t unpack_ul_config_cqi_ri_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel8_t *cqi_ri_info_rel8 = (nfapi_ul_config_cqi_ri_information_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_1, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->dl_cqi_pmi_size_rank_greater_1, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->ri_size, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_cqi, end) &&
+          pull8(ppReadPackedMsg, &cqi_ri_info_rel8->delta_offset_ri, end));
+}
+
+static uint8_t unpack_ul_config_cqi_ri_info_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel9_t *cqi_ri_info_rel9 = (nfapi_ul_config_cqi_ri_information_rel9_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->report_type, end) &&
+       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_cqi, end) &&
+       pull8(ppReadPackedMsg, &cqi_ri_info_rel9->delta_offset_ri, end)))
+    return 0;
+
+  switch(cqi_ri_info_rel9->report_type) {
+    case NFAPI_CSI_REPORT_TYPE_PERIODIC: {
+      if(!(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size, end) &&
+           pull8(ppReadPackedMsg, &cqi_ri_info_rel9->periodic_cqi_pmi_ri_report.control_type, end)))
+        return 0;
+    }
+    break;
+
+    case NFAPI_CSI_REPORT_TYPE_APERIODIC: {
+      if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc, end) ==0)
+        return 0;
+
+      uint8_t i;
+
+      for(i = 0; i < cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.number_of_cc; ++i) {
+        if(pull8(ppReadPackedMsg, &cqi_ri_info_rel9->aperiodic_cqi_pmi_ri_report.cc[i].ri_size, end) == 0)
+          return 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[j], end) == 0)
+            return 0;
+        }
+      }
+    }
+    break;
+
+    default: {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid report type %d \n", cqi_ri_info_rel9->report_type );
+      return 0;
+    }
+    break;
+  };
+
+  return 1;
+}
+
+// NOTE : This function is a little unconventional as we uese the side to
+// determine the report type
+static uint8_t unpack_ul_config_cqi_ri_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_ri_information_rel13_t *cqi_ri_info_rel13 = (nfapi_ul_config_cqi_ri_information_rel13_t *)tlv;
+
+  if(cqi_ri_info_rel13->tl.length == 0) {
+    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_APERIODIC;
+  } else {
+    cqi_ri_info_rel13->report_type = NFAPI_CSI_REPORT_TYPE_PERIODIC;
+
+    if(pull16(ppReadPackedMsg, &cqi_ri_info_rel13->periodic_cqi_pmi_ri_report.dl_cqi_pmi_ri_size_2, end) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+static uint8_t unpack_ul_config_cqi_init_tx_params_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_initial_transmission_parameters_rel8_t *init_tx_params_rel8 = (nfapi_ul_config_initial_transmission_parameters_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &init_tx_params_rel8->n_srs_initial, end) &&
+          pull8(ppReadPackedMsg, &init_tx_params_rel8->initial_number_of_resource_blocks, end));
+}
+static uint8_t unpack_ul_config_ulsch_harq_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel10_t *harq_info_rel10 = (nfapi_ul_config_ulsch_harq_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_rel10->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel10->delta_offset_harq, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel10->ack_nack_mode, end));
+}
+
+static uint8_t unpack_ul_config_ulsch_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ulsch_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_ulsch_harq_information_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->delta_offset_harq_2, end));
+}
+
+static uint8_t unpack_ul_config_ue_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel8_t *ue_info_rel8 = (nfapi_ul_config_ue_information_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &ue_info_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, (uint16_t *)&ue_info_rel8->rnti, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel11_t *ue_info_rel11 = (nfapi_ul_config_ue_information_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ue_info_rel11->virtual_cell_id_enabled_flag, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel11->npusch_identity, end));
+}
+static uint8_t unpack_ul_config_ue_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_ue_information_rel13_t *ue_info_rel13 = (nfapi_ul_config_ue_information_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &ue_info_rel13->ue_type, end) &&
+          pull8(ppReadPackedMsg, &ue_info_rel13->empty_symbols, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel13->total_number_of_repetitions, end) &&
+          pull16(ppReadPackedMsg, &ue_info_rel13->repetition_number, end));
+}
+
+static uint8_t unpack_ul_config_cqi_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel8_t *cqi_info_rel8 = (nfapi_ul_config_cqi_information_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &cqi_info_rel8->pucch_index, end) &&
+           pull8(ppReadPackedMsg, &cqi_info_rel8->dl_cqi_pmi_size, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel10_t *cqi_info_rel10 = (nfapi_ul_config_cqi_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_info_rel10->number_of_pucch_resource, end) &&
+          pull16(ppReadPackedMsg, &cqi_info_rel10->pucch_index_p1, end));
+}
+static uint8_t unpack_ul_config_cqi_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_cqi_information_rel13_t *cqi_info_rel13 = (nfapi_ul_config_cqi_information_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &cqi_info_rel13->csi_mode, end) &&
+          pull16(ppReadPackedMsg, &cqi_info_rel13->dl_cqi_pmi_size_2, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->starting_prb, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->n_prb, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->cdm_index, end) &&
+          pull8(ppReadPackedMsg, &cqi_info_rel13->n_srs, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel8_t *sr_info_rel8 = (nfapi_ul_config_sr_information_rel8_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &sr_info_rel8->pucch_index, end));
+}
+
+static uint8_t unpack_ul_config_sr_info_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_sr_information_rel10_t *sr_info_rel10 = (nfapi_ul_config_sr_information_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &sr_info_rel10->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &sr_info_rel10->pucch_index_p1, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel10_tdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel10_tdd_t *harq_info_tdd_rel10 = (nfapi_ul_config_harq_information_rel10_tdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_tdd_rel10->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->ack_nack_mode, end) &&
+          pull8(ppReadPackedMsg, &harq_info_tdd_rel10->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_tdd_rel10->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel8_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel8_fdd_t *harq_info_fdd_rel8 = (nfapi_ul_config_harq_information_rel8_fdd_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_fdd_rel8->n_pucch_1_0, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel8->harq_size, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel9_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel9_fdd_t *harq_info_fdd_rel9 = (nfapi_ul_config_harq_information_rel9_fdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_fdd_rel9->harq_size, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->ack_nack_mode, end) &&
+          pull8(ppReadPackedMsg, &harq_info_fdd_rel9->number_of_pucch_resources, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_fdd_rel9->n_pucch_1_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel11_t *harq_info_rel11 = (nfapi_ul_config_harq_information_rel11_t *)tlv;
+  return (pull8(ppReadPackedMsg, &harq_info_rel11->num_ant_ports, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_0, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_1, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_2, end) &&
+          pull16(ppReadPackedMsg, &harq_info_rel11->n_pucch_2_3, end));
+}
+
+static uint8_t unpack_ul_config_harq_info_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_harq_information_rel13_t *harq_info_rel13 = (nfapi_ul_config_harq_information_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &harq_info_rel13->harq_size_2, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->starting_prb, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->n_prb, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->cdm_index, end) &&
+          pull8(ppReadPackedMsg, &harq_info_rel13->n_srs, end));
+}
+
+
+static uint8_t unpack_ul_config_srs_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel8_t *srs_pdu_rel8 = (nfapi_ul_config_srs_pdu_rel8_t *)tlv;
+  return (pull32(ppReadPackedMsg, &srs_pdu_rel8->handle, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->size, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->frequency_domain_position, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->srs_hopping_bandwidth, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->transmission_comb, end) &&
+          pull16(ppReadPackedMsg, &srs_pdu_rel8->i_srs, end) &&
+          pull8(ppReadPackedMsg, &srs_pdu_rel8->sounding_reference_cyclic_shift, end));
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel10_t *srs_pdu_rel10 = (nfapi_ul_config_srs_pdu_rel10_t *)tlv;
+  return pull8(ppReadPackedMsg, &srs_pdu_rel10->antenna_port, end);
+}
+
+static uint8_t unpack_ul_config_srs_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_srs_pdu_rel13_t *srs_pdu_rel13 = (nfapi_ul_config_srs_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &srs_pdu_rel13->number_of_combs, end));
+}
+
+static uint8_t unpack_ul_nb_harq_info_rel13_fdd_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nb_harq_information_rel13_fdd_t *nb_harq_info_fdd_rel13 = (nfapi_ul_config_nb_harq_information_rel13_fdd_t *)tlv;
+  return (pull8(ppReadPackedMsg, &nb_harq_info_fdd_rel13->harq_ack_resource, end));
+}
+
+static uint8_t unpack_ul_config_nulsch_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nulsch_pdu_rel13_t *nulsch_pdu_rel13 = (nfapi_ul_config_nulsch_pdu_rel13_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &nulsch_pdu_rel13->nulsch_format, end) &&
+       pull32(ppReadPackedMsg, &nulsch_pdu_rel13->handle, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->size, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->rnti, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->subcarrier_indication, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->resource_assignment, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->mcs, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->redudancy_version, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->repetition_number, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->new_data_indication, end) &&
+       pull8(ppReadPackedMsg, &nulsch_pdu_rel13->n_srs, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->scrambling_sequence_initialization_cinit, end) &&
+       pull16(ppReadPackedMsg, &nulsch_pdu_rel13->sf_idx, end)))
+    return 0;
+
+  unpack_tlv_t unpack_fns[] = {
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value},
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value},
+    { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &nulsch_pdu_rel13->ue_information.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+    { NFAPI_UL_CONFIG_REQUEST_NB_HARQ_INFORMATION_REL13_FDD_TAG, &nulsch_pdu_rel13->nb_harq_information.nb_harq_information_rel13_fdd, &unpack_ul_nb_harq_info_rel13_fdd_value},
+  };
+  return unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, 0, 0);
+}
+
+static uint8_t unpack_ul_config_nrach_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_config_nrach_pdu_rel13_t *nrach_pdu_rel13 = (nfapi_ul_config_nrach_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_0, end) &&
+          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_1, end) &&
+          pull8(ppReadPackedMsg, &nrach_pdu_rel13->nprach_config_2, end));
+}
+
+
+static uint8_t unpack_ul_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+#define UL_CONFIG_ULSCH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL8_TAG, &_pdu.ulsch_pdu_rel8, &unpack_ul_config_ulsch_pdu_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL10_TAG, &_pdu.ulsch_pdu_rel10, &unpack_ul_config_ulsch_pdu_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL11_TAG, &_pdu.ulsch_pdu_rel11, &unpack_ul_config_ulsch_pdu_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_PDU_REL13_TAG, &_pdu.ulsch_pdu_rel13, &unpack_ul_config_ulsch_pdu_rel13_value},
+#define UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL8_TAG, &_pdu.cqi_ri_information_rel8, &unpack_ul_config_cqi_ri_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL9_TAG, &_pdu.cqi_ri_information_rel9, &unpack_ul_config_cqi_ri_info_rel9_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_RI_INFORMATION_REL13_TAG, &_pdu.cqi_ri_information_rel13, &unpack_ul_config_cqi_ri_info_rel13_value},
+#define UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL10_TAG, &_pdu.harq_information_rel10, &unpack_ul_config_ulsch_harq_info_rel10_value},\
+  { NFAPI_UL_CONFIG_REQUEST_ULSCH_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_ulsch_harq_info_rel13_value},
+#define UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_INITIAL_TRANSMISSION_PARAMETERS_REL8_TAG, &_pdu.initial_transmission_parameters_rel8, &unpack_ul_config_cqi_init_tx_params_rel8_value},
+#define UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL8_TAG, &_pdu.ue_information_rel8, &unpack_ul_config_ue_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL11_TAG, &_pdu.ue_information_rel11, &unpack_ul_config_ue_info_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_UE_INFORMATION_REL13_TAG, &_pdu.ue_information_rel13, &unpack_ul_config_ue_info_rel13_value},
+#define UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL8_TAG, &_pdu.cqi_information_rel8, &unpack_ul_config_cqi_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL10_TAG, &_pdu.cqi_information_rel10, &unpack_ul_config_cqi_info_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_CQI_INFORMATION_REL13_TAG, &_pdu.cqi_information_rel13, &unpack_ul_config_cqi_info_rel13_value},
+#define UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL8_TAG, &_pdu.sr_information_rel8, &unpack_ul_config_sr_info_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SR_INFORMATION_REL10_TAG, &_pdu.sr_information_rel10, &unpack_ul_config_sr_info_rel10_value},
+#define UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL10_TDD_TAG, &_pdu.harq_information_rel10_tdd, &unpack_ul_config_harq_info_rel10_tdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL8_FDD_TAG, &_pdu.harq_information_rel8_fdd, &unpack_ul_config_harq_info_rel8_fdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL9_FDD_TAG, &_pdu.harq_information_rel9_fdd, &unpack_ul_config_harq_info_rel9_fdd_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL11_TAG, &_pdu.harq_information_rel11, &unpack_ul_config_harq_info_rel11_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_HARQ_INFORMATION_REL13_TAG, &_pdu.harq_information_rel13, &unpack_ul_config_harq_info_rel13_value},
+#define UL_CONFIG_SRS_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL8_TAG, &_pdu.srs_pdu_rel8, &unpack_ul_config_srs_pdu_rel8_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL10_TAG, &_pdu.srs_pdu_rel10, &unpack_ul_config_srs_pdu_rel10_value}, \
+  { NFAPI_UL_CONFIG_REQUEST_SRS_PDU_REL13_TAG, &_pdu.srs_pdu_rel13, &unpack_ul_config_srs_pdu_rel13_value},
+#define UL_CONFIG_NULSCH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_NULSCH_PDU_REL13_TAG, &_pdu.nulsch_pdu_rel13, &unpack_ul_config_nulsch_pdu_rel13_value},
+#define UL_CONFIG_NRACH_PDU_UNPACK_FNS(_pdu) \
+  { NFAPI_UL_CONFIG_REQUEST_NRACH_PDU_REL13_TAG, &_pdu.nrach_pdu_rel13, &unpack_ul_config_nrach_pdu_rel13_value},
+  nfapi_ul_config_request_body_t *value = (nfapi_ul_config_request_body_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->number_of_pdus, end) &&
+       pull8(ppReadPackedMsg, &value->rach_prach_frequency_resources, end) &&
+       pull8(ppReadPackedMsg, &value->srs_present, end)))
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_UL_CONFIG_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of ul config pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_UL_CONFIG_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->ul_config_pdu_list = (nfapi_ul_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_ul_config_request_pdu_t) * value->number_of_pdus, config);
+
+    if(value->ul_config_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate ul config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->ul_config_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_ul_config_request_pdu_t *pdu = &(value->ul_config_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end is past buffer end
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_UL_CONFIG_ULSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_RI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.ulsch_pdu)
+          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.cqi_ri_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_ri_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_harq_pdu.ulsch_pdu)
+          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_harq_pdu.harq_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_harq_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CQI_HARQ_RI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.ulsch_pdu)
+          UL_CONFIG_CQI_RI_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.cqi_ri_information)
+          UL_CONFIG_ULSCH_HARQ_INFO_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.harq_information)
+          UL_CONFIG_INIT_TX_PARAMS_UNPACK_FNS(pdu->ulsch_cqi_harq_ri_pdu.initial_transmission_parameters)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_pdu.cqi_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_pdu.ue_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_pdu.sr_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_harq_pdu.ue_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_SR_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.ue_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.sr_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_sr_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.cqi_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.cqi_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_pdu.sr_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_UCI_CQI_SR_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.ue_information)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.cqi_information)
+          UL_CONFIG_UCI_SR_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.sr_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->uci_cqi_sr_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_SRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_SRS_PDU_UNPACK_FNS(pdu->srs_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_HARQ_BUFFER_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_UCI_UE_INFO_UNPACK_FNS(pdu->harq_buffer_pdu.ue_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_CSI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_uci_csi_pdu.csi_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_ULSCH_CSI_UCI_HARQ_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_ULSCH_PDU_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.ulsch_pdu)
+          UL_CONFIG_UCI_CQI_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.csi_information)
+          UL_CONFIG_UCI_HARQ_INFO_UNPACK_FNS(pdu->ulsch_csi_uci_harq_pdu.harq_information)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NULSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_NULSCH_PDU_UNPACK_FNS(pdu->nulsch_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_UL_CONFIG_NRACH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          UL_CONFIG_NRACH_PDU_UNPACK_FNS(pdu->nrach_pdu)
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+    }
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_ul_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_config_request_t *pNfapiMsg = (nfapi_ul_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_UL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->ul_config_request_body, &unpack_ul_config_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel8_t *hi_pdu_rel8 = (nfapi_hi_dci0_hi_pdu_rel8_t *)tlv;
+  return( pull8(ppReadPackedMsg, &hi_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->hi_value, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel8->i_phich, end) &&
+          pull16(ppReadPackedMsg, &hi_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_hi_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_hi_pdu_rel10_t *hi_pdu_rel10 = (nfapi_hi_dci0_hi_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &hi_pdu_rel10->flag_tb2, end) &&
+          pull8(ppReadPackedMsg, &hi_pdu_rel10->hi_value_2, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel8_t *dci_pdu_rel8 = (nfapi_hi_dci0_dci_pdu_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_pdu_rel8->dci_format, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cce_index, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->aggregation_level, end) &&
+          pull16(ppReadPackedMsg, &dci_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->number_of_resource_block, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->mcs_1, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cyclic_shift_2_for_drms, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_enabled_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->frequency_hopping_bits, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->new_data_indication_1, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->ue_tx_antenna_seleciton, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->tpc, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->cqi_csi_request, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->ul_index, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel8->dl_assignment_index, end) &&
+          pull32(ppReadPackedMsg, &dci_pdu_rel8->tpc_bitmap, end) &&
+          pull16(ppReadPackedMsg, &dci_pdu_rel8->transmission_power, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel10_t *dci_pdu_rel10 = (nfapi_hi_dci0_dci_pdu_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &dci_pdu_rel10->cross_carrier_scheduling_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->carrier_indicator, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->size_of_cqi_csi_feild, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->srs_request, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_flag, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->resource_allocation_type, end) &&
+          pull32(ppReadPackedMsg, &dci_pdu_rel10->resource_block_coding, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->mcs_2, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->new_data_indication_2, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->number_of_antenna_ports, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->tpmi, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->total_dci_length_including_padding, end) &&
+          pull8(ppReadPackedMsg, &dci_pdu_rel10->n_ul_rb, end));
+}
+
+static uint8_t unpack_hi_dci0_dci_pdu_rel12_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_dci_pdu_rel12_t *dci_pdu_rel12 = (nfapi_hi_dci0_dci_pdu_rel12_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &dci_pdu_rel12->pscch_resource, end) &&
+           pull8(ppReadPackedMsg, &dci_pdu_rel12->time_resource_pattern, end));
+}
+
+static uint8_t unpack_hi_dci0_mpdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_mpdcch_dci_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mpdcch_narrowband, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_prb_pairs, end) &&
+          pull8(ppReadPackedMsg, &value->resource_block_assignment, end) &&
+          pull8(ppReadPackedMsg, &value->mpdcch_transmission_type, end) &&
+          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+          pull8(ppReadPackedMsg, &value->ecce_index, end) &&
+          pull8(ppReadPackedMsg, &value->aggreagation_level, end) &&
+          pull8(ppReadPackedMsg, &value->rnti_type, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->ce_mode, end) &&
+          pull16(ppReadPackedMsg, &value->drms_scrambling_init, end) &&
+          pull16(ppReadPackedMsg, &value->initial_transmission_sf_io, end) &&
+          pull16(ppReadPackedMsg, &value->transmission_power, end) &&
+          pull8(ppReadPackedMsg, &value->dci_format, end) &&
+          pull8(ppReadPackedMsg, &value->resource_block_start, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_resource_blocks, end) &&
+          pull8(ppReadPackedMsg, &value->mcs, end) &&
+          pull8(ppReadPackedMsg, &value->pusch_repetition_levels, end) &&
+          pull8(ppReadPackedMsg, &value->frequency_hopping_flag, end) &&
+          pull8(ppReadPackedMsg, &value->new_data_indication, end) &&
+          pull8(ppReadPackedMsg, &value->harq_process, end) &&
+          pull8(ppReadPackedMsg, &value->redudency_version, end) &&
+          pull8(ppReadPackedMsg, &value->tpc, end) &&
+          pull8(ppReadPackedMsg, &value->csi_request, end) &&
+          pull8(ppReadPackedMsg, &value->ul_inex, end) &&
+          pull8(ppReadPackedMsg, &value->dai_presence_flag, end) &&
+          pull8(ppReadPackedMsg, &value->dl_assignment_index, end) &&
+          pull8(ppReadPackedMsg, &value->srs_request, end) &&
+          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end) &&
+          pull32(ppReadPackedMsg, &value->tcp_bitmap, end) &&
+          pull8(ppReadPackedMsg, &value->total_dci_length_include_padding, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_tx_antenna_ports, end) &&
+          pullarray16(ppReadPackedMsg, value->precoding_value, NFAPI_MAX_TX_PHYSICAL_ANTENNA_PORTS, value->number_of_tx_antenna_ports, end));
+}
+
+static uint8_t unpack_hi_dci0_npdcch_dci_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *value = (nfapi_hi_dci0_npdcch_dci_pdu_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->ncce_index, end) &&
+          pull8(ppReadPackedMsg, &value->aggregation_level, end) &&
+          pull8(ppReadPackedMsg, &value->start_symbol, end) &&
+          pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->scrambling_reinitialization_batch_index, end) &&
+          pull8(ppReadPackedMsg, &value->nrs_antenna_ports_assumed_by_the_ue, end) &&
+          pull8(ppReadPackedMsg, &value->subcarrier_indication, end) &&
+          pull8(ppReadPackedMsg, &value->resource_assignment, end) &&
+          pull8(ppReadPackedMsg, &value->scheduling_delay, end) &&
+          pull8(ppReadPackedMsg, &value->mcs, end) &&
+          pull8(ppReadPackedMsg, &value->redudancy_version, end) &&
+          pull8(ppReadPackedMsg, &value->repetition_number, end) &&
+          pull8(ppReadPackedMsg, &value->new_data_indicator, end) &&
+          pull8(ppReadPackedMsg, &value->dci_subframe_repetition_number, end));
+}
+
+static uint8_t unpack_hi_dci0_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_body_t *value = (nfapi_hi_dci0_request_body_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &value->sfnsf, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_dci, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_hi, end)))
+    return 0;
+
+  uint8_t totalNumPdus = value->number_of_hi + value->number_of_dci;
+
+  if(totalNumPdus > NFAPI_HI_DCI0_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of dci0 pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, totalNumPdus, NFAPI_HI_DCI0_MAX_PDU);
+    return 0;
+  }
+
+  if(totalNumPdus > 0) {
+    value->hi_dci0_pdu_list = (nfapi_hi_dci0_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_hi_dci0_request_pdu_t) * totalNumPdus, config);
+
+    if(value->hi_dci0_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate hi dci0 pdu list (count:%d)\n", __FUNCTION__, totalNumPdus);
+      return 0;
+    }
+  } else {
+    value->hi_dci0_pdu_list = 0;
+  }
+
+  uint8_t i;
+
+  for(i = 0; i < totalNumPdus; ++i) {
+    nfapi_hi_dci0_request_pdu_t *pdu = &(value->hi_dci0_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end) {
+      // pdu end if past buffer end
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s pdu size to big %d %d\n", __FUNCTION__, packedPduEnd, end);
+      return 0;
+    }
+
+    switch(pdu->pdu_type) {
+      case NFAPI_HI_DCI0_HI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL8_TAG, &pdu->hi_pdu.hi_pdu_rel8, &unpack_hi_dci0_hi_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_HI_PDU_REL10_TAG, &pdu->hi_pdu.hi_pdu_rel10, &unpack_hi_dci0_hi_pdu_rel10_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG, &pdu->dci_pdu.dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL10_TAG, &pdu->dci_pdu.dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+          { NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL12_TAG, &pdu->dci_pdu.dci_pdu_rel12, &unpack_hi_dci0_dci_pdu_rel12_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_EPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL8_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel8, &unpack_hi_dci0_dci_pdu_rel8_value},
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_DCI_PDU_REL10_TAG, &pdu->epdcch_dci_pdu.epdcch_dci_pdu_rel10, &unpack_hi_dci0_dci_pdu_rel10_value},
+          { NFAPI_HI_DCI0_REQUEST_EPDCCH_PARAMETERS_REL11_TAG, &pdu->epdcch_dci_pdu.epdcch_parameters_rel11, &unpack_dl_config_epdcch_params_rel11_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_MPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_MPDCCH_DCI_PDU_REL13_TAG, &pdu->mpdcch_dci_pdu.mpdcch_dci_pdu_rel13, &unpack_hi_dci0_mpdcch_dci_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_HI_DCI0_NPDCCH_DCI_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_HI_DCI0_REQUEST_NPDCCH_DCI_PDU_REL13_TAG, &pdu->npdcch_dci_pdu.npdcch_dci_pdu_rel13, &unpack_hi_dci0_npdcch_dci_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid pdu type %d \n", pdu->pdu_type );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+//unpack_ul_dci_pdu_list_value
+
+static uint8_t unpack_ul_dci_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg)
+{
+	nfapi_nr_ul_dci_request_pdus_t* value = (nfapi_nr_ul_dci_request_pdus_t*)msg;
+	for(uint8_t i = 0; i < MAX_DCI_CORESET; ++i)
+	{
+		if(!(pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].RNTI,  end) &&
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingId, end) &&
+
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].ScramblingRNTI, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].CceIndex, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].AggregationLevel, end) &&
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].beta_PDCCH_1_0, end) &&
+
+		pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].powerControlOffsetSS, end) &&
+		pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end) &&
+		
+		pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].Payload, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, value->pdcch_pdu.pdcch_pdu_rel15.dci_pdu[i].PayloadSizeBits, end)))
+	
+		return 0;
+	}
+
+	return (pull16(ppReadPackedMsg, &value->PDUType, end) &&
+	   	    pull16(ppReadPackedMsg, &value->PDUSize, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPSize, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.BWPStart, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.SubcarrierSpacing, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CyclicPrefix, end) &&
+
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.StartSymbolIndex, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.DurationSymbols, end) &&
+			pullarray8(ppReadPackedMsg, value->pdcch_pdu.pdcch_pdu_rel15.FreqDomainResource, 6, 6, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CceRegMappingType, end) &&
+
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.RegBundleSize, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.InterleaverSize, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.CoreSetType, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.ShiftIndex, end) &&
+			pull8(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.precoderGranularity, end) &&
+			pull16(ppReadPackedMsg, &value->pdcch_pdu.pdcch_pdu_rel15.numDlDci, end));
+		  
+}
+
+static uint8_t unpack_ul_dci_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_dci_request_t *pNfapiMsg = (nfapi_nr_ul_dci_request_t *)msg;
+
+  if (!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+        pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+        pull8(ppReadPackedMsg, &pNfapiMsg->numPdus, end)
+       ))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->numPdus; i++) {
+    if (!unpack_ul_dci_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->ul_dci_pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_hi_dci0_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_hi_dci0_request_t *pNfapiMsg = (nfapi_hi_dci0_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_HI_DCI0_REQUEST_BODY_TAG, &pNfapiMsg->hi_dci0_request_body, &unpack_hi_dci0_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_tx_data_pdu_list_value(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg) {
+  nfapi_nr_pdu_t *pNfapiMsg = (nfapi_nr_pdu_t *)msg;
+
+  if(!(pull32(ppReadPackedMsg, &pNfapiMsg->num_TLV, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_index, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->PDU_length, end)
+      ))
+    return 0;
+
+  uint16_t i = 0;
+  uint16_t total_number_of_tlvs = pNfapiMsg->num_TLV;
+
+  for(; i < total_number_of_tlvs; ++i) {
+    if (!(pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].length, end) &&
+          pull16(ppReadPackedMsg, &pNfapiMsg->TLVs[i].tag, end)))
+      return 0;
+
+    switch(pNfapiMsg->TLVs[i].tag) {
+      case 0: {
+        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.direct, 16384, pNfapiMsg->TLVs[i].length, end))
+          return 0;
+
+        break;
+      }
+
+      case 1: {
+        if(!pullarray32(ppReadPackedMsg, pNfapiMsg->TLVs[i].value.ptr, pNfapiMsg->TLVs[i].length, pNfapiMsg->TLVs[i].length, end))
+          return 0;
+
+        break;
+      }
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid tag value %d \n", pNfapiMsg->TLVs[i].tag );
+        break;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_tx_data_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_tx_data_request_t *pNfapiMsg = (nfapi_nr_tx_data_request_t *)msg;
+
+  if(!(pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->Slot, end) &&
+       pull16(ppReadPackedMsg, &pNfapiMsg->Number_of_PDUs, end)))
+    return 0;
+
+  for(int i=0; i< pNfapiMsg->Number_of_PDUs; i++) {
+    if (!unpack_tx_data_pdu_list_value(ppReadPackedMsg, end, &pNfapiMsg->pdu_list[i]))
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  uint8_t proceed = 1;
+  nfapi_tx_request_t *pNfapiMsg = (nfapi_tx_request_t *)msg;
+
+  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+    return 0;
+
+  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
+    nfapi_tl_t generic_tl;
+
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_TX_REQUEST_BODY_TAG: {
+        pNfapiMsg->tx_request_body.tl = generic_tl;
+
+        if( pull16(ppReadPackedMsg, &pNfapiMsg->tx_request_body.number_of_pdus, end) == 0)
+          return 0;
+
+        if(pNfapiMsg->tx_request_body.number_of_pdus > NFAPI_TX_MAX_PDU) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of tx pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus, NFAPI_TX_MAX_PDU);
+          return 0;
+        }
+
+        if(pNfapiMsg->tx_request_body.number_of_pdus > 0) {
+          pNfapiMsg->tx_request_body.tx_pdu_list = (nfapi_tx_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_tx_request_pdu_t) * pNfapiMsg->tx_request_body.number_of_pdus, config);
+
+          if(pNfapiMsg->tx_request_body.tx_pdu_list == NULL) {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate tx  pdu list (count:%d)\n", __FUNCTION__, pNfapiMsg->tx_request_body.number_of_pdus);
+            return 0;
+          }
+        } else {
+          pNfapiMsg->tx_request_body.tx_pdu_list = 0;
+        }
+
+        uint16_t i;
+        uint16_t totalNumPdus = pNfapiMsg->tx_request_body.number_of_pdus;
+
+        for(i = 0; i < totalNumPdus; ++i) {
+          nfapi_tx_request_pdu_t *pdu = &(pNfapiMsg->tx_request_body.tx_pdu_list[i]);
+
+          if (pdu) {
+            uint16_t length = 0;
+            uint16_t index = 0;
+
+            if(!(pull16(ppReadPackedMsg, &length, end) &&
+                 pull16(ppReadPackedMsg, &index, end)))
+              return 0;
+
+            pdu->pdu_length = length;
+            pdu->pdu_index = index;
+            // TODO : May need to rethink this bit
+            pdu->num_segments = 1;
+            pdu->segments[0].segment_length = pdu->pdu_length;
+            pdu->segments[0].segment_data = nfapi_p7_allocate(pdu->pdu_length, config);
+
+            if(pdu->segments[0].segment_data) {
+              if(!pullarray8(ppReadPackedMsg, pdu->segments[0].segment_data, pdu->segments[0].segment_length, pdu->segments[0].segment_length, end))
+                return 0;
+
+              if (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 {
+              NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request: Failed to allocate pdu (len:%d) %d/%d %d\n", pdu->pdu_length, totalNumPdus, i, pdu->pdu_index);
+            }
+          } else {
+            NFAPI_TRACE(NFAPI_TRACE_ERROR, "NULL pdu\n");
+          }
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_tx_request FIXME : Invalid pdu type %d \n", generic_tl.tag );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+
+//UNPACK NR UPLINK INDICATION FUNCTIONS 
+
+//SLOT INDICATION
+
+static uint8_t unpack_nr_slot_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_slot_indication_scf_t *msg, nfapi_p7_codec_config_t* config)
+{	
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+	
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end)
+		))
+			return 0;
+
+return 1;
+}
+
+//RX DATA INDICATION 
+
+static uint8_t unpack_nr_rx_data_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_rx_data_pdu_t* value = (nfapi_nr_rx_data_pdu_t*)tlv;
+
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
+		 pull16(ppReadPackedMsg, &value->pdu_length, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
+		 pull16(ppReadPackedMsg, &value->rssi, end) 
+		 ))
+		  return 0;
+	return 1;
+}
+
+
+static uint8_t unpack_nr_rx_data_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rx_data_indication_t *msg, nfapi_p7_codec_config_t* config)
+{	
+	nfapi_nr_rx_data_indication_t *pNfapiMsg = (nfapi_nr_rx_data_indication_t*)msg;
+	
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!unpack_nr_rx_data_indication_body(pNfapiMsg->pdu_list, ppReadPackedMsg, end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR CRC INDICATION
+
+static uint8_t unpack_nr_crc_indication_body(nfapi_nr_crc_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+{	
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->harq_id, end) &&
+		 pull8(ppReadPackedMsg, &value->tb_crc_status, end) &&
+		 pull16(ppReadPackedMsg, &value->num_cb, end) &&
+		 //pullarray8(ppReadPackedMsg, value->cb_crc_status, (int)(value->num_cb / 8) + 1, (int)(value->num_cb / 8) + 1, end) && //length is ceil(NumCb/8)
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) && 
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+
+	//memcpy((nfapi_nr_crc_t *)tlv,value,sizeof(nfapi_nr_crc_t));
+
+	return 1;
+}
+
+static uint8_t unpack_nr_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_crc_indication_t *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_crc_indication_t *pNfapiMsg = (nfapi_nr_crc_indication_t *) msg;
+	// pNfapiMsg = (nfapi_nr_crc_indication_t *) malloc(sizeof(nfapi_nr_crc_indication_t));
+	// pNfapiMsg->crc_list = (nfapi_nr_crc_t *) malloc(sizeof(nfapi_nr_crc_t));
+	
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn, end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot, end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->number_crcs, end)
+		))
+		return 0;
+
+	for(int i=0; i<pNfapiMsg->number_crcs;i++)	
+	{
+		if(!unpack_nr_crc_indication_body(pNfapiMsg->crc_list,ppReadPackedMsg,end))
+		//if(!unpack_nr_crc_indication_body(value,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//SRS INDICATION
+
+static uint8_t unpack_nr_srs_indication_body(void* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_srs_indication_pdu_t* value = (nfapi_nr_srs_indication_pdu_t*)tlv;
+
+	if(!(pull32(ppReadPackedMsg, &value->handle, end) &&
+	 	 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+		 pull8(ppReadPackedMsg, &value->num_symbols, end) &&
+		 pull8(ppReadPackedMsg, &value->wide_band_snr, end) &&
+		 pull8(ppReadPackedMsg, &value->num_reported_symbols, end) && 
+		 pull16(ppReadPackedMsg, &value->reported_symbol_list->num_rbs, end)
+		 ))
+		  return 0;
+	for(int i = 0; i < value->reported_symbol_list->num_rbs; i++)
+	{
+		if(!(pull8(ppReadPackedMsg, &value->reported_symbol_list->rb_list->rb_snr, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t unpack_nr_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_srs_indication_t *pNfapiMsg = (nfapi_nr_srs_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg,&pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg,&pNfapiMsg->slot , end) &&
+		pull8(ppReadPackedMsg,&pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!unpack_nr_srs_indication_body(&pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR RACH
+
+static uint8_t unpack_nr_rach_indication_body(nfapi_nr_prach_indication_pdu_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	nfapi_nr_prach_indication_pdu_t* value = (nfapi_nr_prach_indication_pdu_t*)tlv;
+
+	if(!(pull16(ppReadPackedMsg, &value->phy_cell_id, end) &&
+	 	 pull8(ppReadPackedMsg, &value->symbol_index, end) &&
+		 pull8(ppReadPackedMsg, &value->slot_index, end) &&
+		 pull8(ppReadPackedMsg, &value->freq_index, end) &&
+		 pull8(ppReadPackedMsg, &value->avg_rssi, end) &&
+		 pull8(ppReadPackedMsg, &value->avg_snr, end) && 
+		 pull8(ppReadPackedMsg, &value->num_preamble, end)
+		 ))
+		  return 0;
+	value->preamble_list = (nfapi_nr_prach_indication_preamble_t*) malloc(sizeof(nfapi_nr_prach_indication_preamble_t) * value->num_preamble);
+	for(int i = 0; i < value->num_preamble; i++)
+	{
+		if(!(pull8(ppReadPackedMsg, &value->preamble_list->preamble_index, end) &&
+			pull16(ppReadPackedMsg, &value->preamble_list->timing_advance, end) &&
+			pull32(ppReadPackedMsg, &value->preamble_list->preamble_pwr, end)
+			))
+			return 0;
+	}
+	return 1;
+}
+
+static uint8_t unpack_nr_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rach_indication_t* msg, nfapi_p7_codec_config_t* config) {
+
+	nfapi_nr_rach_indication_t *pNfapiMsg = (nfapi_nr_rach_indication_t*)msg;
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull8(ppReadPackedMsg, &pNfapiMsg->number_of_pdus, end)
+		))
+			return 0;
+	pNfapiMsg->pdu_list = (nfapi_nr_prach_indication_pdu_t*) malloc(sizeof(nfapi_nr_prach_indication_pdu_t) * pNfapiMsg->number_of_pdus);
+	for(int i=0; i< pNfapiMsg->number_of_pdus;i++)	
+	{
+		if(!unpack_nr_rach_indication_body(pNfapiMsg->pdu_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+//NR UCI 
+
+static uint8_t unpack_nr_uci_pucch_0_1(nfapi_nr_uci_pucch_pdu_format_0_1_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_0_1_t* value = (nfapi_nr_uci_pucch_pdu_format_0_1_t*)tlv;
+
+	// uint8_t *ptr = *ppReadPackedMsg;
+	// printf("\n Read P7 message uci_0_1 indication unpack: ");
+	// while(ptr < end){
+	// 	printf(" %d ", *ptr);
+	// 	ptr++;
+	// }
+	// printf("\n");
+
+	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
+	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
+		 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		value->sr = (nfapi_nr_sr_pdu_0_1_t*) malloc(sizeof(nfapi_nr_sr_pdu_0_1_t));
+		if(!(pull8(ppReadPackedMsg, &value->sr->sr_indication, end) &&
+	 	 pull8(ppReadPackedMsg, &value->sr->sr_confidence_level, end) 
+		 ))
+		  return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		value->harq = (nfapi_nr_harq_pdu_0_1_t*) malloc(sizeof(nfapi_nr_harq_pdu_0_1_t));
+		if(!(pull8(ppReadPackedMsg, &value->harq->num_harq, end) &&
+	 	 pull8(ppReadPackedMsg, &value->harq->harq_confidence_level, end) 
+		 ))
+			return 0;
+		value->harq->harq_list = (nfapi_nr_harq_t*) malloc(sizeof(nfapi_nr_harq_t*) * value->harq->num_harq);
+		for(int i=0; i<value->harq->num_harq;i++)	
+		{
+			if(!(pull8(ppReadPackedMsg, &value->harq->harq_list->harq_value, end) 
+			))
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+
+static uint8_t unpack_nr_uci_pucch_2_3_4(nfapi_nr_uci_pucch_pdu_format_2_3_4_t* tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+	nfapi_nr_uci_pucch_pdu_format_2_3_4_t* value = (nfapi_nr_uci_pucch_pdu_format_2_3_4_t*) tlv;
+
+	if(!(pull8(ppReadPackedMsg, &value->pduBitmap, end) &&
+	 	 pull32(ppReadPackedMsg, &value->handle, end) &&
+		 pull16(ppReadPackedMsg, &value->rnti, end) &&
+		 pull8(ppReadPackedMsg, &value->pucch_format, end) &&
+		 pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+		 pull16(ppReadPackedMsg, &value->timing_advance, end) && 
+		 pull16(ppReadPackedMsg, &value->rssi, end)
+		 ))
+		  return 0;
+	if (value->pduBitmap & 0x01) { //SR
+		if(!(pull16(ppReadPackedMsg, &value->sr.sr_bit_len, end)))
+			return 0; 
+
+		value->sr.sr_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->sr.sr_bit_len/8)));
+
+	 	if(!(pullarray8(ppReadPackedMsg, &value->sr.sr_payload[0], (int)(value->sr.sr_bit_len / 8), (int)(value->sr.sr_bit_len / 8), end)))
+		  	return 0;
+	}
+
+	if (((value->pduBitmap >> 1) & 0x01)) { //HARQ
+		if(!(pull8(ppReadPackedMsg, &value->harq.harq_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->harq.harq_bit_len, end)))
+			return 0; 
+		
+		value->harq.harq_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->harq.harq_bit_len/8 )));
+
+	 	if(!(pullarray8(ppReadPackedMsg, value->harq.harq_payload, (int)(value->harq.harq_bit_len / 8), (int)(value->harq.harq_bit_len / 8), end)))
+			return 0;
+	}
+
+	if (((value->pduBitmap >> 2) & 0x01)) { //CSI-1
+		if(!(pull8(ppReadPackedMsg, &value->csi_part1.csi_part1_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->csi_part1.csi_part1_bit_len, end)))
+			return 0; 
+
+		value->csi_part1.csi_part1_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part1.csi_part1_bit_len/8)));
+
+//		if(!(pullarray8(ppReadPackedMsg, value->csi_part1.csi_part1_payload, (int)(value->csi_part1.csi_part1_bit_len / 8), (int)(value->csi_part1.csi_part1_bit_len / 8), end)))
+//			return 0;
+	}
+
+	if (((value->pduBitmap >> 3) & 0x01)) { //CSI-2
+		if(!(pull8(ppReadPackedMsg, &value->csi_part2.csi_part2_crc, end)) &&
+			(pull16(ppReadPackedMsg, &value->csi_part2.csi_part2_bit_len, end)))
+			return 0; 
+
+		value->csi_part2.csi_part2_payload = (uint8_t*) malloc(sizeof(uint8_t) * ((value->csi_part2.csi_part2_bit_len/8 )));
+
+		if(!(pullarray8(ppReadPackedMsg, value->csi_part2.csi_part2_payload, (int)(value->csi_part2.csi_part2_bit_len / 8) , (int)(value->csi_part2.csi_part2_bit_len / 8) , end)))
+			return 0;
+	}
+
+	return 1;
+}
+
+static uint8_t unpack_nr_uci_indication_body(nfapi_nr_uci_t* value, uint8_t **ppReadPackedMsg, uint8_t *end)
+{
+	if(!(pull16(ppReadPackedMsg, &value->pdu_type, end) &&
+		pull16(ppReadPackedMsg, &value->pdu_size, end)
+		))
+		return 0;
+	
+	switch (value->pdu_type) {
+      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+        printf("Unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE \n");
+        break;
+
+      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_0_1_t* uci_pdu = &value->pucch_pdu_format_0_1;
+        unpack_nr_uci_pucch_0_1(uci_pdu, ppReadPackedMsg, end);
+		break;
+        }
+      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+        nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &value->pucch_pdu_format_2_3_4;
+        unpack_nr_uci_pucch_2_3_4(uci_pdu, ppReadPackedMsg, end);
+        break;
+    	}
+	}	
+
+	return 1;	
+}
+
+static uint8_t unpack_nr_uci_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
+{
+	nfapi_nr_uci_indication_t *pNfapiMsg = (nfapi_nr_uci_indication_t*)msg;
+
+	if (!(pull16(ppReadPackedMsg, &pNfapiMsg->sfn , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->slot , end) &&
+		pull16(ppReadPackedMsg, &pNfapiMsg->num_ucis, end)
+		))
+			return 0;
+
+	for(int i=0; i<pNfapiMsg->num_ucis;i++)	
+	{
+		if(!unpack_nr_uci_indication_body(pNfapiMsg->uci_list,ppReadPackedMsg,end))
+		return 0;
+	}
+
+return 1;
+}
+
+static uint8_t unpack_ue_release_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  uint8_t proceed = 1;
+  nfapi_ue_release_request_t *pNfapiMsg = (nfapi_ue_release_request_t *)msg;
+
+  if(pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) == 0)
+    return 0;
+
+  while (((uint8_t *)(*ppReadPackedMsg) < end) && proceed) {
+    nfapi_tl_t generic_tl;
+
+    if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_UE_RELEASE_BODY_TAG: {
+        pNfapiMsg->ue_release_request_body.tl = generic_tl;
+
+        if( pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.number_of_TLVs, end) == 0)
+          return 0;
+
+        if(pNfapiMsg->ue_release_request_body.number_of_TLVs > NFAPI_RELEASE_MAX_RNTI) {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of relese rnti's exceed maxium (count:%d max:%d)\n", __FUNCTION__, pNfapiMsg->ue_release_request_body.number_of_TLVs, NFAPI_RELEASE_MAX_RNTI);
+          return 0;
+        } else {
+          uint8_t j;
+          uint16_t num = pNfapiMsg->ue_release_request_body.number_of_TLVs;
+
+          for(j = 0; j < num; ++j) {
+            if(pull16(ppReadPackedMsg, &pNfapiMsg->ue_release_request_body.ue_release_request_TLVs_list[j].rnti, end) == 0) {
+              return 0;
+            }
+          }
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "unpack_ue_release_request FIXME : Invalid type %d \n", generic_tl.tag );
+      }
+      break;
+    };
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_bundling_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+          pull8(ppReadPackedMsg, &value->value_1, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_harq_data_multiplexing(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_multiplexing_t *value = (nfapi_harq_indication_tdd_harq_data_multiplexing_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->value_0, end) &&
+          pull8(ppReadPackedMsg, &value->value_1, end) &&
+          pull8(ppReadPackedMsg, &value->value_2, end) &&
+          pull8(ppReadPackedMsg, &value->value_3, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data_special_bundling(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_special_bundling_t *value = (nfapi_harq_indication_tdd_harq_data_special_bundling_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &value->value_0, end));
+}
+static uint8_t unpack_harq_indication_tdd_harq_data(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_harq_data_t *value = (nfapi_harq_indication_tdd_harq_data_t *)tlv;
+  return  (pull8(ppReadPackedMsg, &value->value_0, end));
+}
+
+static uint8_t unpack_harq_indication_tdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel8_t *value = (nfapi_harq_indication_tdd_rel8_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  uint8_t result = 0;
+
+  switch(value->mode) {
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+      result = unpack_harq_indication_tdd_harq_data_bundling(&value->harq_data.bundling, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+      result = unpack_harq_indication_tdd_harq_data_multiplexing(&value->harq_data.multiplex, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+      result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data.special_bundling, ppReadPackedMsg, end);
+      break;
+
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+    case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+      result = 1;
+      break;
+
+    default:
+      // TODO add error message
+      return 0;
+      break;
+  }
+
+  return result;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel9_t *value = (nfapi_harq_indication_tdd_rel9_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
+    // TODO : add error message
+    return 0;
+  }
+
+  uint16_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(value->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+        break;
+
+      default:
+        // TODO add error message
+        return 0;
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_tdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_tdd_rel13_t *value = (nfapi_harq_indication_tdd_rel13_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->mode, end) &&
+       pull16(ppReadPackedMsg, &value->number_of_ack_nack, end)))
+    return 0;
+
+  if(value->number_of_ack_nack > NFAPI_MAX_NUMBER_ACK_NACK_TDD) {
+    // TODO : add error message
+    return 0;
+  }
+
+  uint16_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_ack_nack; ++idx) {
+    uint8_t result = 0;
+
+    switch(value->mode) {
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_MULIPLEXING:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].multiplex, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_SPECIAL_BUNDLING:
+        result = unpack_harq_indication_tdd_harq_data_special_bundling(&value->harq_data[idx].special_bundling, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_CHANNEL_SELECTION:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].channel_selection, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_3:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_3, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_4:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_4, ppReadPackedMsg, end);
+        break;
+
+      case NFAPI_HARQ_INDICATION_TDD_HARQ_ACK_NACK_FORMAT_FORMAT_5:
+        result = unpack_harq_indication_tdd_harq_data(&value->harq_data[idx].format_5, ppReadPackedMsg, end);
+        break;
+
+      default:
+        // TODO add error message
+        return 0;
+        break;
+    }
+
+    if(result == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel8_t *value = (nfapi_harq_indication_fdd_rel8_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->harq_tb1, end) &&
+          pull8(ppReadPackedMsg, &value->harq_tb2, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel9_t *value = (nfapi_harq_indication_fdd_rel9_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mode, end) &&
+          pull8(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL9_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_harq_indication_fdd_rel13_t *value = (nfapi_harq_indication_fdd_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->mode, end) &&
+          pull16(ppReadPackedMsg, &value->number_of_ack_nack, end) &&
+          pullarray8(ppReadPackedMsg, value->harq_tb_n, NFAPI_HARQ_ACK_NACK_REL13_MAX, value->number_of_ack_nack, end));
+}
+
+static uint8_t unpack_ul_cqi_information_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_ul_cqi_information_t *value = (nfapi_ul_cqi_information_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+          pull8(ppReadPackedMsg, &value->channel, end));
+}
+
+
+
+static uint8_t unpack_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_body_t *value = (nfapi_harq_indication_body_t *)tlv;
+  uint8_t *harqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(harqBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+    return 0;
+
+  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+    return 0;
+  }
+
+  value->harq_pdu_list = (nfapi_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_harq_indication_pdu_t) * value->number_of_harqs, config);
+
+  if(value->harq_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_harqs; ++i) {
+    nfapi_harq_indication_pdu_t *pdu = &(value->harq_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_HARQ_INDICATION_TDD_REL8_TAG, &pdu->harq_indication_tdd_rel8, &unpack_harq_indication_tdd_rel8_value},
+      { NFAPI_HARQ_INDICATION_TDD_REL9_TAG, &pdu->harq_indication_tdd_rel9, &unpack_harq_indication_tdd_rel9_value},
+      { NFAPI_HARQ_INDICATION_TDD_REL13_TAG, &pdu->harq_indication_tdd_rel13, &unpack_harq_indication_tdd_rel13_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL8_TAG, &pdu->harq_indication_fdd_rel8, &unpack_harq_indication_fdd_rel8_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL9_TAG, &pdu->harq_indication_fdd_rel9, &unpack_harq_indication_fdd_rel9_value},
+      { NFAPI_HARQ_INDICATION_FDD_REL13_TAG, &pdu->harq_indication_fdd_rel13, &unpack_harq_indication_fdd_rel13_value},
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_harq_indication_t *pNfapiMsg = (nfapi_harq_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->harq_indication_body, &unpack_harq_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_crc_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_crc_indication_rel8_t *crc_pdu_rel8 = (nfapi_crc_indication_rel8_t *)tlv;
+  return ( pull8(ppReadPackedMsg, &crc_pdu_rel8->crc_flag, end) );
+}
+
+static uint8_t unpack_crc_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_body_t *value = (nfapi_crc_indication_body_t *)tlv;
+  uint8_t *crcBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(crcBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_crcs, end) == 0)
+    return 0;
+
+  if(value->number_of_crcs > NFAPI_CRC_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of crc ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_crcs, NFAPI_CRC_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_crcs > 0) {
+    value->crc_pdu_list = (nfapi_crc_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_crc_indication_pdu_t) * value->number_of_crcs, config);
+
+    if(value->crc_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate crc ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_crcs);
+      return 0;
+    }
+  } else {
+    value->crc_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_crcs; ++i) {
+    nfapi_crc_indication_pdu_t *pdu = &(value->crc_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *crcPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_CRC_INDICATION_REL8_TAG, &pdu->crc_indication_rel8, unpack_crc_indication_rel8_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, crcPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_crc_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_crc_indication_t *pNfapiMsg = (nfapi_crc_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_CRC_INDICATION_BODY_TAG, &pNfapiMsg->crc_indication_body, &unpack_crc_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_rx_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel8_t *value = (nfapi_rx_indication_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->length, end) &&
+          pull16(ppReadPackedMsg, &value->offset, end) &&
+          pull8(ppReadPackedMsg, &value->ul_cqi, end) &&
+          pull16(ppReadPackedMsg, &value->timing_advance, end));
+}
+static uint8_t unpack_rx_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_rx_indication_rel9_t *value = (nfapi_rx_indication_rel9_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->timing_advance_r9, end));
+}
+
+static uint8_t unpack_rx_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_body_t *value = (nfapi_rx_indication_body_t *)tlv;
+  // the rxBodyEnd points to the end of the cqi PDU's
+  uint8_t *rxBodyEnd = *ppReadPackedMsg + value->tl.length;
+  uint8_t *rxPduEnd = rxBodyEnd;
+  uint8_t *numberOfPdusAddress = *ppReadPackedMsg;
+
+  if(rxBodyEnd > end) {
+    // pdu end is past buffer end
+    return 0;
+  }
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_RX_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of rx ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_RX_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->rx_pdu_list = (nfapi_rx_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_rx_indication_pdu_t) * value->number_of_pdus, config);
+
+    if(value->rx_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate rx ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->rx_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+  nfapi_rx_indication_pdu_t *pdu = 0;
+
+  while((uint8_t *)(*ppReadPackedMsg) < rxBodyEnd && (uint8_t *)(*ppReadPackedMsg) < rxPduEnd) {
+    nfapi_tl_t generic_tl;
+
+    if( unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+      return 0;
+
+    switch(generic_tl.tag) {
+      case NFAPI_RX_UE_INFORMATION_TAG: {
+        pdu = &(value->rx_pdu_list[i++]);
+        pdu->rx_ue_information.tl = generic_tl;
+
+        if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+          return 0;
+      }
+      break;
+
+      case NFAPI_RX_INDICATION_REL8_TAG: {
+        if(pdu != 0) {
+          pdu->rx_indication_rel8.tl = generic_tl;
+
+          if(unpack_rx_indication_rel8_value(&pdu->rx_indication_rel8, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          if(pdu->rx_indication_rel8.offset > 0) {
+            // Need to check that the data is within the tlv
+            if(numberOfPdusAddress + pdu->rx_indication_rel8.offset + pdu->rx_indication_rel8.length <= rxBodyEnd) {
+              // If this the first pdu set the rxPduEnd
+              if(numberOfPdusAddress + pdu->rx_indication_rel8.offset < rxPduEnd) {
+                rxPduEnd = numberOfPdusAddress + pdu->rx_indication_rel8.offset;
+
+                if(rxPduEnd > end) {
+                  // pdu end is past buffer end
+                  return 0;
+                }
+              }
+            } else {
+              NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME: the rx data is outside of the tlv\n");
+            }
+          }
+        }
+      }
+      break;
+
+      case NFAPI_RX_INDICATION_REL9_TAG: {
+        if(pdu != 0) {
+          pdu->rx_indication_rel9.tl = generic_tl;
+
+          if(unpack_rx_indication_rel9_value(&pdu->rx_indication_rel9, ppReadPackedMsg, end) == 0)
+            return 0;
+        }
+      }
+      break;
+
+      default: {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_ULSCH.indication Invalid pdu type %d \n", generic_tl.tag );
+      }
+      break;
+    }
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_pdus; ++idx) {
+    if(value->rx_pdu_list[idx].rx_indication_rel8.tl.tag == NFAPI_RX_INDICATION_REL8_TAG) {
+      uint32_t length = value->rx_pdu_list[idx].rx_indication_rel8.length;
+      value->rx_pdu_list[idx].data = nfapi_p7_allocate(length, config);
+
+      if(pullarray8(ppReadPackedMsg, value->rx_pdu_list[idx].data, length, length, end) == 0) {
+        return 0;
+      }
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rx_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_rx_indication_t *pNfapiMsg = (nfapi_rx_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_RX_INDICATION_BODY_TAG, &pNfapiMsg->rx_indication_body, &unpack_rx_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_preamble_pdu_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel8_t *preamble_pdu_rel8 = (nfapi_preamble_pdu_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &preamble_pdu_rel8->rnti, end) &&
+          pull8(ppReadPackedMsg, &preamble_pdu_rel8->preamble, end) &&
+          pull16(ppReadPackedMsg, &preamble_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_preamble_pdu_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel9_t *preamble_pdu_rel9 = (nfapi_preamble_pdu_rel9_t *)tlv;
+  return pull16(ppReadPackedMsg, &preamble_pdu_rel9->timing_advance_r9, end);
+}
+
+static uint8_t unpack_preamble_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_preamble_pdu_rel13_t *preamble_pdu_rel13 = (nfapi_preamble_pdu_rel13_t *)tlv;
+  return pull8(ppReadPackedMsg, &preamble_pdu_rel13->rach_resource_type, end);
+}
+
+static uint8_t unpack_rach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_body_t *value = (nfapi_rach_indication_body_t *)tlv;
+  uint8_t *rachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(rachBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_preambles, end) == 0)
+    return 0;
+
+  if(value->number_of_preambles > NFAPI_PREAMBLE_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of preamble du's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_preambles, NFAPI_PREAMBLE_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_preambles > 0) {
+    value->preamble_list = (nfapi_preamble_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_preamble_pdu_t) * value->number_of_preambles, config);
+
+    if(value->preamble_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate preamble pdu list (count:%d)\n", __FUNCTION__, value->number_of_preambles);
+      return 0;
+    }
+  } else {
+    value->preamble_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_preambles; ++i) {
+    nfapi_preamble_pdu_t *pdu = &(value->preamble_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *preamblePduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_PREAMBLE_REL8_TAG, &pdu->preamble_rel8, unpack_preamble_pdu_rel8_value },
+      { NFAPI_PREAMBLE_REL9_TAG, &pdu->preamble_rel9, unpack_preamble_pdu_rel9_value },
+      { NFAPI_PREAMBLE_REL13_TAG, &pdu->preamble_rel13, unpack_preamble_pdu_rel13_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, preamblePduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_rach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_rach_indication_t *pNfapiMsg = (nfapi_rach_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_RACH_INDICATION_BODY_TAG, &pNfapiMsg->rach_indication_body, &unpack_rach_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel8_t *srs_pdu_fdd_rel8 = (nfapi_srs_indication_fdd_rel8_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->doppler_estimation, end) &&
+       pull16(ppReadPackedMsg, &srs_pdu_fdd_rel8->timing_advance, end) &&
+       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->number_of_resource_blocks, end) &&
+       pull8(ppReadPackedMsg, &srs_pdu_fdd_rel8->rb_start, end) &&
+       pullarray8(ppReadPackedMsg, srs_pdu_fdd_rel8->snr, NFAPI_NUM_RB_MAX, srs_pdu_fdd_rel8->number_of_resource_blocks, end)))
+    return 0;
+
+  return 1;
+}
+
+static uint8_t unpack_srs_indication_fdd_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel9_t *srs_pdu_fdd_rel9 = (nfapi_srs_indication_fdd_rel9_t *)tlv;
+  return (pull16(ppReadPackedMsg, &srs_pdu_fdd_rel9->timing_advance_r9, end));
+}
+
+static uint8_t unpack_srs_indication_tdd_rel10_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_ttd_rel10_t *srs_pdu_tdd_rel10 = (nfapi_srs_indication_ttd_rel10_t *)tlv;
+  return (pull8(ppReadPackedMsg, &srs_pdu_tdd_rel10->uppts_symbol, end));
+}
+
+static uint8_t unpack_srs_indication_fdd_rel11_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_srs_indication_fdd_rel11_t *srs_pdu_fdd_rel11 = (nfapi_srs_indication_fdd_rel11_t *)tlv;
+  return ( pull16(ppReadPackedMsg, &srs_pdu_fdd_rel11->ul_rtoa, end));
+}
+
+static uint8_t unpack_tdd_channel_measurement_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_tdd_channel_measurement_t *value = (nfapi_tdd_channel_measurement_t *)tlv;
+
+  if(!(pull8(ppReadPackedMsg, &value->num_prb_per_subband, end) &&
+       pull8(ppReadPackedMsg, &value->number_of_subbands, end) &&
+       pull8(ppReadPackedMsg, &value->num_atennas, end)))
+    return 0;
+
+  if(value->number_of_subbands > NFAPI_MAX_NUM_SUBBANDS) {
+    // todo : add error
+    return 0;
+  }
+
+  if(value->num_atennas > NFAPI_MAX_NUM_PHYSICAL_ANTENNAS) {
+    // todo : add error
+    return 0;
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_subbands; ++idx) {
+    if(!(pull8(ppReadPackedMsg, &value->subands[idx].subband_index, end) &&
+         pullarray16(ppReadPackedMsg, value->subands[idx].channel, NFAPI_MAX_NUM_PHYSICAL_ANTENNAS, value->num_atennas, end)))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+static uint8_t unpack_srs_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_body_t *value = (nfapi_srs_indication_body_t *)tlv;
+  uint8_t *srsBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(srsBodyEnd > end)
+    return 0;
+
+  if(pull8(ppReadPackedMsg, &value->number_of_ues, end) == 0)
+    return 0;
+
+  if(value->number_of_ues > NFAPI_SRS_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of srs ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_ues, NFAPI_SRS_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_ues > 0) {
+    value->srs_pdu_list = (nfapi_srs_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_srs_indication_pdu_t) * value->number_of_ues, config);
+
+    if(value->srs_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate srs ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_ues);
+      return 0;
+    }
+  } else {
+    value->srs_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_ues; ++i) {
+    nfapi_srs_indication_pdu_t *pdu = &(value->srs_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *srsPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_SRS_INDICATION_FDD_REL8_TAG, &pdu->srs_indication_fdd_rel8, unpack_srs_indication_fdd_rel8_value},
+      { NFAPI_SRS_INDICATION_FDD_REL9_TAG, &pdu->srs_indication_fdd_rel9, unpack_srs_indication_fdd_rel9_value},
+      { NFAPI_SRS_INDICATION_TDD_REL10_TAG, &pdu->srs_indication_tdd_rel10, unpack_srs_indication_tdd_rel10_value},
+      { NFAPI_SRS_INDICATION_FDD_REL11_TAG, &pdu->srs_indication_fdd_rel11, unpack_srs_indication_fdd_rel11_value},
+      { NFAPI_TDD_CHANNEL_MEASUREMENT_TAG, &pdu->tdd_channel_measurement, unpack_tdd_channel_measurement_value},
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srsPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_srs_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_srs_indication_t *pNfapiMsg = (nfapi_srs_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_SRS_INDICATION_BODY_TAG, &pNfapiMsg->srs_indication_body, &unpack_srs_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_sr_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_body_t *value = (nfapi_sr_indication_body_t *)tlv;
+  uint8_t *srBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(srBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_srs, end) == 0)
+    return 0;
+
+  if(value->number_of_srs > NFAPI_SR_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of sr ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_srs, NFAPI_SR_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_srs > 0) {
+    value->sr_pdu_list = (nfapi_sr_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_sr_indication_pdu_t) * value->number_of_srs, config);
+
+    if(value->sr_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate sr ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_srs);
+      return 0;
+    }
+  } else {
+    value->sr_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_srs; ++i) {
+    nfapi_sr_indication_pdu_t *pdu = &(value->sr_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *srPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, unpack_ul_cqi_information_value },
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, srPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static int unpack_sr_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_sr_indication_t *pNfapiMsg = (nfapi_sr_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_SR_INDICATION_BODY_TAG, &pNfapiMsg->sr_indication_body, &unpack_sr_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_cqi_indication_rel8_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel8_t *cqi_pdu_rel8 = (nfapi_cqi_indication_rel8_t *)tlv;
+  return (pull16(ppReadPackedMsg, &cqi_pdu_rel8->length, end) &&
+          pull16(ppReadPackedMsg, &cqi_pdu_rel8->data_offset, end) &&
+          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ul_cqi, end) &&
+          pull8(ppReadPackedMsg, &cqi_pdu_rel8->ri, end) &&
+          pull16(ppReadPackedMsg, &cqi_pdu_rel8->timing_advance, end));
+}
+
+static uint8_t unpack_cqi_indication_rel9_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_cqi_indication_rel9_t *cqi_pdu_rel9 = (nfapi_cqi_indication_rel9_t *)tlv;
+
+  if(!(pull16(ppReadPackedMsg, &cqi_pdu_rel9->length, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->data_offset, end) &&
+       pull8(ppReadPackedMsg, &cqi_pdu_rel9->ul_cqi, end) &&
+       pull8(ppReadPackedMsg, &cqi_pdu_rel9->number_of_cc_reported, end)))
+    return 0;
+
+  if(cqi_pdu_rel9->number_of_cc_reported > NFAPI_CC_MAX) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : out of bound array\n");
+    return 0;
+  }
+
+  if(!(pullarray8(ppReadPackedMsg, cqi_pdu_rel9->ri, NFAPI_CC_MAX, cqi_pdu_rel9->number_of_cc_reported, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance, end) &&
+       pull16(ppReadPackedMsg, &cqi_pdu_rel9->timing_advance_r9, end)))
+    return 0;
+
+  return 1;
+}
+
+static uint8_t  unpack_cqi_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end,  nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_body_t *value = (nfapi_cqi_indication_body_t *)tlv;
+  // the cqiBodyEnd points to the end of the cqi PDU's
+  uint8_t *cqiBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  //uint8_t* cqiPduEnd = cqiBodyEnd;
+  //uint8_t* numberOfPdusAddress = *ppReadPackedMsg;
+
+  if(cqiBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_cqis, end) == 0)
+    return 0;
+
+  if(value->number_of_cqis > NFAPI_CQI_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of cqi ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_cqis, NFAPI_CQI_IND_MAX_PDU);
+    return -1;
+  }
+
+  if(value->number_of_cqis > 0) {
+    value->cqi_pdu_list = (nfapi_cqi_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_pdu_t) * value->number_of_cqis, config);
+
+    if(value->cqi_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+      return 0;
+    }
+  } else {
+    value->cqi_pdu_list = 0;
+  }
+
+  if(value->number_of_cqis > 0) {
+    value->cqi_raw_pdu_list = (nfapi_cqi_indication_raw_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_cqi_indication_raw_pdu_t) * value->number_of_cqis, config);
+
+    if(value->cqi_raw_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate raw cqi ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_cqis);
+      return 0;
+    }
+  } else {
+    value->cqi_raw_pdu_list = 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_cqis; ++i) {
+    nfapi_cqi_indication_pdu_t *pdu = &(value->cqi_pdu_list[i]);
+    memset(pdu, 0, sizeof(nfapi_cqi_indication_pdu_t));
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *cqiPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+
+    while((uint8_t *)(*ppReadPackedMsg) < cqiPduInstanceEnd) {
+      nfapi_tl_t generic_tl;
+
+      if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
+        return 0;
+
+      switch(generic_tl.tag) {
+        case NFAPI_RX_UE_INFORMATION_TAG:
+          pdu->rx_ue_information.tl = generic_tl;
+
+          if(unpack_rx_ue_information_value(&pdu->rx_ue_information, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_CQI_INDICATION_REL8_TAG:
+          pdu->cqi_indication_rel8.tl = generic_tl;
+
+          if(unpack_cqi_indication_rel8_value(&pdu->cqi_indication_rel8, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_CQI_INDICATION_REL9_TAG:
+          pdu->cqi_indication_rel9.tl = generic_tl;
+
+          if(unpack_cqi_indication_rel9_value(&pdu->cqi_indication_rel9, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        case NFAPI_UL_CQI_INFORMATION_TAG:
+          pdu->ul_cqi_information.tl = generic_tl;
+
+          if(unpack_ul_cqi_information_value(&pdu->ul_cqi_information, ppReadPackedMsg, end) == 0)
+            return 0;
+
+          break;
+
+        default: {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "RX_CQI.indication Invalid pdu type %d \n", generic_tl.tag );
+        }
+        break;
+      };
+    }
+  }
+
+  uint8_t idx = 0;
+
+  for(idx = 0; idx < value->number_of_cqis; ++idx) {
+    if(value->cqi_pdu_list[idx].cqi_indication_rel8.tl.tag == NFAPI_CQI_INDICATION_REL8_TAG) {
+      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel8.length, end) == 0)
+        return 0;
+    } else if(value->cqi_pdu_list[idx].cqi_indication_rel9.tl.tag == NFAPI_CQI_INDICATION_REL9_TAG) {
+      if(pullarray8(ppReadPackedMsg, &(value->cqi_raw_pdu_list[idx].pdu[0]), NFAPI_CQI_RAW_MAX_LEN, value->cqi_pdu_list[idx].cqi_indication_rel9.length, end) == 0)
+        return 0;
+    }
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_cqi_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_cqi_indication_t *pNfapiMsg = (nfapi_cqi_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_CQI_INDICATION_BODY_TAG, &pNfapiMsg->cqi_indication_body, &unpack_cqi_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+static uint8_t unpack_lbt_pdsch_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_req_pdu_rel13_t *value = (nfapi_lbt_pdsch_req_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->mp_cca, end) &&
+          pull32(ppReadPackedMsg, &value->n_cca, end) &&
+          pull32(ppReadPackedMsg, &value->offset, end) &&
+          pull32(ppReadPackedMsg, &value->lte_txop_sf, end) &&
+          pull16(ppReadPackedMsg, &value->txop_sfn_sf_end, end) &&
+          pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+static uint8_t unpack_lbt_drs_req_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_req_pdu_rel13_t *value = (nfapi_lbt_drs_req_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->offset, end) &&
+          pull16(ppReadPackedMsg, &value->sfn_sf_end, end) &&
+          pull32(ppReadPackedMsg, &value->lbt_mode, end));
+}
+
+
+static uint8_t unpack_lbt_config_request_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_body_t *value = (nfapi_lbt_dl_config_request_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl config pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_DL_CONFIG_REQ_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus) {
+    value->lbt_dl_config_req_pdu_list = (nfapi_lbt_dl_config_request_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_config_request_pdu_t) * value->number_of_pdus, config);
+
+    if(value->lbt_dl_config_req_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->lbt_dl_config_req_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_config_request_pdu_t *pdu = &(value->lbt_dl_config_req_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_CONFIG_REQUEST_PDSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_PDSCH_REQ_PDU_REL13_TAG, &pdu->lbt_pdsch_req_pdu.lbt_pdsch_req_pdu_rel13, &unpack_lbt_pdsch_req_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_LBT_DL_CONFIG_REQUEST_DRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_DRS_REQ_PDU_REL13_TAG, &pdu->lbt_drs_req_pdu.lbt_drs_req_pdu_rel13, &unpack_lbt_drs_req_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL_CONFIG.request body invalid pdu type %d\n", pdu->pdu_type);
+        return 0;
+    }
+  }
+
+  return 1;
+}
+static uint8_t unpack_lbt_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_config_request_t *pNfapiMsg = (nfapi_lbt_dl_config_request_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_LBT_DL_CONFIG_REQUEST_BODY_TAG, &pNfapiMsg->lbt_dl_config_request_body, &unpack_lbt_config_request_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_lbt_pdsch_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_pdsch_rsp_pdu_rel13_t *value = (nfapi_lbt_pdsch_rsp_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->result, end) &&
+          pull32(ppReadPackedMsg, &value->lte_txop_symbols, end) &&
+          pull32(ppReadPackedMsg, &value->initial_partial_sf, end));
+}
+static uint8_t unpack_lbt_drs_rsp_pdu_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_lbt_drs_rsp_pdu_rel13_t *value = (nfapi_lbt_drs_rsp_pdu_rel13_t *)tlv;
+  return (pull32(ppReadPackedMsg, &value->handle, end) &&
+          pull32(ppReadPackedMsg, &value->result, end));
+}
+
+static uint8_t unpack_lbt_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_body_t *value = (nfapi_lbt_dl_indication_body_t *)tlv;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_pdus, end) == 0)
+    return 0;
+
+  if(value->number_of_pdus > NFAPI_LBT_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of lbt dl ind pdu's exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_pdus, NFAPI_LBT_IND_MAX_PDU);
+    return 0;
+  }
+
+  if(value->number_of_pdus > 0) {
+    value->lbt_indication_pdu_list = (nfapi_lbt_dl_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_lbt_dl_indication_pdu_t) * value->number_of_pdus, config);
+
+    if(value->lbt_indication_pdu_list == NULL) {
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate lbt dl ind config pdu list (count:%d)\n", __FUNCTION__, value->number_of_pdus);
+      return 0;
+    }
+  } else {
+    value->lbt_indication_pdu_list = 0;
+  }
+
+  uint16_t i;
+  uint16_t total_number_of_pdus = value->number_of_pdus;
+
+  for(i = 0; i < total_number_of_pdus; ++i) {
+    nfapi_lbt_dl_indication_pdu_t *pdu = &(value->lbt_indication_pdu_list[i]);
+
+    if(!(pull8(ppReadPackedMsg, &pdu->pdu_type, end) &&
+         pull8(ppReadPackedMsg, &pdu->pdu_size, end)))
+      return 0;
+
+    uint8_t *packedPduEnd = (*ppReadPackedMsg) + pdu->pdu_size - 2;
+
+    if(packedPduEnd > end)
+      return 0;
+
+    switch(pdu->pdu_type) {
+      case NFAPI_LBT_DL_RSP_PDSCH_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_PDSCH_RSP_PDU_REL13_TAG, &pdu->lbt_pdsch_rsp_pdu.lbt_pdsch_rsp_pdu_rel13, &unpack_lbt_pdsch_rsp_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      case NFAPI_LBT_DL_RSP_DRS_PDU_TYPE: {
+        unpack_tlv_t unpack_fns[] = {
+          { NFAPI_LBT_DRS_RSP_PDU_REL13_TAG, &pdu->lbt_drs_rsp_pdu.lbt_drs_rsp_pdu_rel13, &unpack_lbt_drs_rsp_pdu_rel13_value},
+        };
+        unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
+      }
+      break;
+
+      default:
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "LBT_DL.indication body invalid pdu type %d\n", pdu->pdu_type);
+        return 0;
+    }
+  }
+
+  return 1;
+}
+static uint8_t unpack_lbt_dl_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_lbt_dl_indication_t *pNfapiMsg = (nfapi_lbt_dl_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_LBT_DL_INDICATION_BODY_TAG, &pNfapiMsg->lbt_dl_indication_body, &unpack_lbt_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nb_harq_indication_fdd_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nb_harq_indication_fdd_rel13_t *value = (nfapi_nb_harq_indication_fdd_rel13_t *)tlv;
+  return (pull8(ppReadPackedMsg, &value->harq_tb1, end));
+}
+
+
+static uint8_t unpack_nb_harq_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_body_t *value = (nfapi_nb_harq_indication_body_t *)tlv;
+  uint8_t *nbharqBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(nbharqBodyEnd > end)
+    return 0;
+
+  if(pull16(ppReadPackedMsg, &value->number_of_harqs, end) == 0)
+    return 0;
+
+  if(value->number_of_harqs > NFAPI_HARQ_IND_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of harq ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_harqs, NFAPI_HARQ_IND_MAX_PDU);
+    return 0;
+  }
+
+  value->nb_harq_pdu_list = (nfapi_nb_harq_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nb_harq_indication_pdu_t) * value->number_of_harqs, config);
+
+  if(value->nb_harq_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate harq ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_harqs);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_harqs; ++i) {
+    nfapi_nb_harq_indication_pdu_t *pdu = &(value->nb_harq_pdu_list[i]);
+
+    if(pull16(ppReadPackedMsg, &pdu->instance_length, end) == 0)
+      return 0;
+
+    uint8_t *harqPduInstanceEnd = *ppReadPackedMsg + pdu->instance_length;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_RX_UE_INFORMATION_TAG, &pdu->rx_ue_information, unpack_rx_ue_information_value },
+      { NFAPI_NB_HARQ_INDICATION_FDD_REL13_TAG, &pdu->nb_harq_indication_fdd_rel13, &unpack_nb_harq_indication_fdd_rel13_value},
+      { NFAPI_UL_CQI_INFORMATION_TAG, &pdu->ul_cqi_information, &unpack_ul_cqi_information_value}
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, harqPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nb_harq_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nb_harq_indication_t *pNfapiMsg = (nfapi_nb_harq_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_NB_HARQ_INDICATION_BODY_TAG, &pNfapiMsg->nb_harq_indication_body, &unpack_nb_harq_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nrach_indication_rel13_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end) {
+  nfapi_nrach_indication_pdu_rel13_t *value = (nfapi_nrach_indication_pdu_rel13_t *)tlv;
+  return (pull16(ppReadPackedMsg, &value->rnti, end) &&
+          pull8(ppReadPackedMsg, &value->initial_sc, end) &&
+          pull16(ppReadPackedMsg, &value->timing_advance, end) &&
+          pull8(ppReadPackedMsg, &value->nrach_ce_level, end));
+}
+
+static uint8_t unpack_ue_release_resp(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ue_release_response_t *pNfapiMsg = (nfapi_ue_release_response_t *)msg;
+
+  if(pull32(ppReadPackedMsg, &pNfapiMsg->error_code, end) == 0) {
+    return 0;
+  } else {
+    NFAPI_TRACE(NFAPI_TRACE_INFO, "ue_release_response:error_code = %d\n", pNfapiMsg->error_code);
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nrach_indication_body_value(void *tlv, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_body_t *value = (nfapi_nrach_indication_body_t *)tlv;
+  uint8_t *nrachBodyEnd = *ppReadPackedMsg + value->tl.length;
+
+  if(nrachBodyEnd > end)
+    return 0;
+
+  if(pull8(ppReadPackedMsg, &value->number_of_initial_scs_detected, end) == 0)
+    return 0;
+
+  if(value->number_of_initial_scs_detected > NFAPI_PREAMBLE_MAX_PDU) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s number of detected scs ind pdus exceed maxium (count:%d max:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected, NFAPI_PREAMBLE_MAX_PDU);
+    return 0;
+  }
+
+  value->nrach_pdu_list = (nfapi_nrach_indication_pdu_t *)nfapi_p7_allocate(sizeof(nfapi_nrach_indication_pdu_t) * value->number_of_initial_scs_detected, config);
+
+  if(value->nrach_pdu_list == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s failed to allocate nrach ind pdu list (count:%d)\n", __FUNCTION__, value->number_of_initial_scs_detected);
+    return 0;
+  }
+
+  uint8_t i = 0;
+
+  for(i = 0; i < value->number_of_initial_scs_detected; ++i) {
+    nfapi_nrach_indication_pdu_t *pdu = &(value->nrach_pdu_list[i]);
+    uint8_t *nrachPduInstanceEnd = *ppReadPackedMsg + 4 + 6;
+    unpack_tlv_t unpack_fns[] = {
+      { NFAPI_NRACH_INDICATION_REL13_TAG, &pdu->nrach_indication_rel13, &unpack_nrach_indication_rel13_value},
+    };
+
+    if(unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, nrachPduInstanceEnd, 0, 0) == 0)
+      return 0;
+  }
+
+  return 1;
+}
+
+static uint8_t unpack_nrach_indication(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nrach_indication_t *pNfapiMsg = (nfapi_nrach_indication_t *)msg;
+  unpack_p7_tlv_t unpack_fns[] = {
+    { NFAPI_NRACH_INDICATION_BODY_TAG, &pNfapiMsg->nrach_indication_body, &unpack_nrach_indication_body_value},
+  };
+  return (pull16(ppReadPackedMsg, &pNfapiMsg->sfn_sf, end) &&
+          unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_nr_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_dl_node_sync_t *pNfapiMsg = (nfapi_nr_dl_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_slot, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_dl_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_dl_node_sync_t *pNfapiMsg = (nfapi_dl_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->delta_sfn_sf, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_ul_node_sync_t *pNfapiMsg = (nfapi_nr_ul_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_ul_node_sync(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_ul_node_sync_t *pNfapiMsg = (nfapi_ul_node_sync_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->t1, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t2, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->t3, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+static uint8_t unpack_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_timing_info_t *pNfapiMsg = (nfapi_timing_info_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn_sf, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->dl_config_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->tx_request_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_config_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_jitter, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_config_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_request_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_config_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->hi_dci0_earliest_arrival, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+static uint8_t unpack_nr_timing_info(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t *config) {
+  nfapi_nr_timing_info_t *pNfapiMsg = (nfapi_nr_timing_info_t *)msg;
+  return (pull32(ppReadPackedMsg, &pNfapiMsg->last_sfn, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->last_slot, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->time_since_last_timing_info, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->dl_tti_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_tti_jitter, end) &&
+          pull32(ppReadPackedMsg, &pNfapiMsg->ul_dci_jitter, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_latest_delay, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->dl_tti_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->tx_data_request_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_tti_earliest_arrival, end) &&
+          pulls32(ppReadPackedMsg, &pNfapiMsg->ul_dci_earliest_arrival, end) &&
+          unpack_p7_tlv_list(NULL, 0, ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+}
+
+
+
+// unpack length check
+
+static int check_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen) {
+  int retLen = 0;
+
+  switch (msgId) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_dl_config_request_t))
+        retLen = sizeof(nfapi_dl_config_request_t);
+
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_ul_config_request_t))
+        retLen = sizeof(nfapi_ul_config_request_t);
+
+      break;
+
+    case NFAPI_SUBFRAME_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+        retLen = sizeof(nfapi_subframe_indication_t);
+
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_hi_dci0_request_t))
+        retLen = sizeof(nfapi_hi_dci0_request_t);
+
+      break;
+
+    case NFAPI_TX_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_tx_request_t))
+        retLen = sizeof(nfapi_tx_request_t);
+
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_harq_indication_t))
+        retLen = sizeof(nfapi_harq_indication_t);
+
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_crc_indication_t))
+        retLen = sizeof(nfapi_crc_indication_t);
+
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rx_indication_t))
+        retLen = sizeof(nfapi_rx_indication_t);
+
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_rach_indication_t))
+        retLen = sizeof(nfapi_rach_indication_t);
+
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_srs_indication_t))
+        retLen = sizeof(nfapi_srs_indication_t);
+
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_sr_indication_t))
+        retLen = sizeof(nfapi_sr_indication_t);
+
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_cqi_indication_t))
+        retLen = sizeof(nfapi_cqi_indication_t);
+
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_config_request_t))
+        retLen = sizeof(nfapi_lbt_dl_config_request_t);
+
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_lbt_dl_indication_t))
+        retLen = sizeof(nfapi_lbt_dl_indication_t);
+
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_nb_harq_indication_t))
+        retLen = sizeof(nfapi_nb_harq_indication_t);
+
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      if (unpackedBufLen >= sizeof(nfapi_nrach_indication_t))
+        retLen = sizeof(nfapi_nrach_indication_t);
+
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      if (unpackedBufLen >= sizeof(nfapi_dl_node_sync_t))
+        retLen = sizeof(nfapi_dl_node_sync_t);
+
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      if (unpackedBufLen >= sizeof(nfapi_ul_node_sync_t))
+        retLen = sizeof(nfapi_ul_node_sync_t);
+
+      break;
+
+    case NFAPI_TIMING_INFO:
+      if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+        retLen = sizeof(nfapi_timing_info_t);
+
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+        retLen = sizeof(nfapi_ue_release_request_t);
+
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+        retLen = sizeof(nfapi_ue_release_response_t);
+
+      break;
+
+    default:
+      NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+      break;
+  }
+
+  return retLen;
+}
+
+static int check_nr_unpack_length(nfapi_message_id_e msgId, uint32_t unpackedBufLen)
+{
+	int retLen = 0;
+
+	switch (msgId)
+	{
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_dl_tti_request_t))
+				retLen = sizeof(nfapi_nr_dl_tti_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_tti_request_t))
+				retLen = sizeof(nfapi_nr_ul_tti_request_t);
+			break;
+
+		case NFAPI_SUBFRAME_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_subframe_indication_t))
+				retLen = sizeof(nfapi_subframe_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_dci_request_t))
+				retLen = sizeof(nfapi_nr_ul_dci_request_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_nr_tx_data_request_t))
+				retLen = sizeof(nfapi_nr_tx_data_request_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_rx_data_indication_t))
+				retLen = sizeof(nfapi_nr_rx_data_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_crc_indication_t))
+				retLen = sizeof(nfapi_nr_crc_indication_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_rach_indication_t))
+				retLen = sizeof(nfapi_nr_rach_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_uci_indication_t))
+				retLen = sizeof(nfapi_nr_uci_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			if (unpackedBufLen >= sizeof(nfapi_nr_srs_indication_t))
+				retLen = sizeof(nfapi_nr_srs_indication_t);
+			break;
+		
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			if (unpackedBufLen >= sizeof(nfapi_nr_dl_node_sync_t))
+				retLen = sizeof(nfapi_nr_dl_node_sync_t);
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			if (unpackedBufLen >= sizeof(nfapi_nr_ul_node_sync_t))
+				retLen = sizeof(nfapi_nr_ul_node_sync_t);
+			break;
+
+		case NFAPI_TIMING_INFO:
+			if (unpackedBufLen >= sizeof(nfapi_timing_info_t))
+				retLen = sizeof(nfapi_timing_info_t);
+			break;
+
+		case NFAPI_UE_RELEASE_REQUEST:
+			if (unpackedBufLen >= sizeof(nfapi_ue_release_request_t))
+				retLen = sizeof(nfapi_ue_release_request_t);
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			if (unpackedBufLen >= sizeof(nfapi_ue_release_response_t))
+				retLen = sizeof(nfapi_ue_release_response_t);
+			break;
+
+		default:
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown message ID %d\n", msgId);
+			break;
+	}
+
+	return retLen;
+}
+
+
+
+// Main unpack functions - public
+
+int nfapi_p7_message_header_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
+  nfapi_p7_message_header_t *pMessageHeader = pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 header unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+    return -1;
+
+  return 0;
+}
+
+int nfapi_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t *config) {
+  int result = 0;
+  nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t *)pUnpackedBuf;
+  uint8_t *pReadPackedMessage = pMessageBuf;
+  uint8_t *end = pMessageBuf + messageBufLen;
+
+  if (pMessageBuf == NULL || pUnpackedBuf == NULL) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+    return -1;
+  }
+
+  if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t)) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+    return -1;
+  }
+
+  /*
+    uint8_t *ptr = pMessageBuf;
+  printf("\n Read P7 message unpack: ");
+  while(ptr < end){
+    printf(" %d ", *ptr);
+    ptr++;
+  }
+  printf("\n");
+  */
+  // clean the supplied buffer for - tag value blanking
+  (void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+  // process the header
+  if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+       pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+       pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end))) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+    return -1;
+  }
+
+  if((uint8_t *)(pMessageBuf + pMessageHeader->message_length) > end) {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+    return -1;
+  }
+
+  /*
+  if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+  {
+    NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+    return -1;
+  }
+  */
+
+  // look for the specific message
+  switch (pMessageHeader->message_id) {
+    case NFAPI_DL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_DL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_UL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_ul_config_request(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_TX_REQUEST:
+      if (check_unpack_length(NFAPI_TX_REQUEST, unpackedBufLen))
+        result = unpack_tx_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_HI_DCI0_REQUEST:
+      if (check_unpack_length(NFAPI_HI_DCI0_REQUEST, unpackedBufLen))
+        result = unpack_hi_dci0_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UE_RELEASE_REQUEST:
+      if (check_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+        result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_HARQ_INDICATION:
+      if (check_unpack_length(NFAPI_HARQ_INDICATION, unpackedBufLen))
+        result = unpack_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_CRC_INDICATION:
+      if (check_unpack_length(NFAPI_CRC_INDICATION, unpackedBufLen))
+        result = unpack_crc_indication(&pReadPackedMessage,end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_ULSCH_INDICATION:
+      if (check_unpack_length(NFAPI_RX_ULSCH_INDICATION, unpackedBufLen))
+        result = unpack_rx_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RACH_INDICATION:
+      if (check_unpack_length(NFAPI_RACH_INDICATION, unpackedBufLen))
+        result = unpack_rach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_SRS_INDICATION:
+      if (check_unpack_length(NFAPI_SRS_INDICATION, unpackedBufLen))
+        result = unpack_srs_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_SR_INDICATION:
+      if (check_unpack_length(NFAPI_RX_SR_INDICATION, unpackedBufLen))
+        result = unpack_sr_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_RX_CQI_INDICATION:
+      if (check_unpack_length(NFAPI_RX_CQI_INDICATION, unpackedBufLen))
+        result = unpack_cqi_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_LBT_DL_CONFIG_REQUEST:
+      if (check_unpack_length(NFAPI_LBT_DL_CONFIG_REQUEST, unpackedBufLen))
+        result = unpack_lbt_dl_config_request(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_LBT_DL_INDICATION:
+      if (check_unpack_length(NFAPI_LBT_DL_INDICATION, unpackedBufLen))
+        result = unpack_lbt_dl_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_NB_HARQ_INDICATION:
+      if (check_unpack_length(NFAPI_NB_HARQ_INDICATION, unpackedBufLen))
+        result = unpack_nb_harq_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_NRACH_INDICATION:
+      if (check_unpack_length(NFAPI_NRACH_INDICATION, unpackedBufLen))
+        result = unpack_nrach_indication(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_DL_NODE_SYNC:
+      if (check_unpack_length(NFAPI_DL_NODE_SYNC, unpackedBufLen))
+        result = unpack_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UL_NODE_SYNC:
+      if (check_unpack_length(NFAPI_UL_NODE_SYNC, unpackedBufLen))
+        result = unpack_ul_node_sync(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_TIMING_INFO:
+      if (check_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+        result = unpack_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    case NFAPI_UE_RELEASE_RESPONSE:
+      if (check_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+        result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
+      else
+        return -1;
+
+      break;
+
+    default:
+      if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN &&
+          pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX) {
+        if(config && config->unpack_p7_vendor_extension) {
+          result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+        } else {
+          NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+        }
+      } else {
+        NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+      }
+
+      break;
+  }
+
+  if(result == 0)
+    return -1;
+  else
+    return 0;
+}
+
+int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *pUnpackedBuf, uint32_t unpackedBufLen, nfapi_p7_codec_config_t* config)
+{
+	int result = 0;
+	nfapi_p7_message_header_t *pMessageHeader = (nfapi_p7_message_header_t*)pUnpackedBuf;
+	uint8_t *pReadPackedMessage = pMessageBuf;
+	uint8_t *end = pMessageBuf + messageBufLen;
+	
+	if (pMessageBuf == NULL || pUnpackedBuf == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied pointers are null\n");
+		return -1;
+	}
+
+	if (messageBufLen < NFAPI_P7_HEADER_LENGTH || unpackedBufLen < sizeof(nfapi_p7_message_header_t))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack supplied message buffer is too small %d, %d\n", messageBufLen, unpackedBufLen);
+		return -1;
+	}
+  
+    // uint8_t *ptr = pMessageBuf;
+	// printf("\n Read P7 message unpack: ");
+	// while(ptr < end){
+	// 	printf(" %d ", *ptr);
+	// 	ptr++;
+	// }
+	// printf("\n");
+
+	// clean the supplied buffer for - tag value blanking
+	(void)memset(pUnpackedBuf, 0, unpackedBufLen);
+
+	// process the header
+	if(!(pull16(&pReadPackedMessage, &pMessageHeader->phy_id, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->message_id, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->message_length, end) &&
+		 pull16(&pReadPackedMessage, &pMessageHeader->m_segment_sequence, end) &&
+		 pull32(&pReadPackedMessage, &pMessageHeader->checksum, end) &&
+		 pull32(&pReadPackedMessage, &pMessageHeader->transmit_timestamp, end)))
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack header failed\n");
+		return -1;
+	}
+
+	if((uint8_t*)(pMessageBuf + pMessageHeader->message_length) > end)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack message length is greater than the message buffer \n");
+		return -1;
+	}
+
+	/*
+	if(check_unpack_length(pMessageHeader->message_id, unpackedBufLen) == 0)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "P7 unpack unpack buffer is not large enough \n");
+		return -1;
+	}
+	*/
+
+	// look for the specific message
+	switch (pMessageHeader->message_id)
+	{   
+		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, unpackedBufLen))
+				result = unpack_dl_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, unpackedBufLen))
+				result = unpack_ul_tti_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_TX_DATA_REQUEST, unpackedBufLen))
+				result = unpack_tx_data_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_DCI_REQUEST, unpackedBufLen))
+				result = unpack_ul_dci_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		
+		case NFAPI_UE_RELEASE_REQUEST:
+			if (check_nr_unpack_length(NFAPI_UE_RELEASE_REQUEST, unpackedBufLen))
+				result = unpack_ue_release_request(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION, unpackedBufLen)){
+				nfapi_nr_slot_indication_scf_t* msg = (nfapi_nr_slot_indication_scf_t*) pMessageHeader;
+				result = unpack_nr_slot_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION, unpackedBufLen)){
+				nfapi_nr_rx_data_indication_t* msg = (nfapi_nr_rx_data_indication_t*) pMessageHeader;
+				msg->pdu_list = (nfapi_nr_rx_data_pdu_t*) malloc(sizeof(nfapi_nr_rx_data_pdu_t));
+				msg->pdu_list->pdu = (uint8_t *) malloc(sizeof(uint8_t));
+				result = unpack_nr_rx_data_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION, unpackedBufLen)){
+
+				nfapi_nr_crc_indication_t* msg = (nfapi_nr_crc_indication_t*) pMessageHeader;
+				msg->crc_list = (nfapi_nr_crc_t*) malloc(sizeof(nfapi_nr_crc_t));
+				result = unpack_nr_crc_indication(&pReadPackedMessage,end , msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION, unpackedBufLen)){
+				nfapi_nr_uci_indication_t* msg = (nfapi_nr_uci_indication_t*) pMessageHeader;
+				msg->uci_list = (nfapi_nr_uci_t*) malloc(sizeof(nfapi_nr_uci_t));
+				result = unpack_nr_uci_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION, unpackedBufLen)){
+				nfapi_nr_srs_indication_t* msg = (nfapi_nr_srs_indication_t*) pMessageHeader;
+				msg->pdu_list = (nfapi_nr_srs_indication_pdu_t*) malloc(sizeof(nfapi_nr_srs_indication_pdu_t));
+				result = unpack_nr_srs_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case  NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION, unpackedBufLen)){
+				nfapi_nr_rach_indication_t* msg = (nfapi_nr_rach_indication_t*) pMessageHeader;
+				result = unpack_nr_rach_indication(&pReadPackedMessage,  end, msg, config);
+			}
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC, unpackedBufLen))
+				result = unpack_nr_dl_node_sync(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC:
+			if (check_nr_unpack_length(NFAPI_NR_PHY_MSG_TYPE_UL_NODE_SYNC, unpackedBufLen))
+				result = unpack_nr_ul_node_sync(&pReadPackedMessage, end , pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_TIMING_INFO:
+			if (check_nr_unpack_length(NFAPI_TIMING_INFO, unpackedBufLen))
+				result = unpack_nr_timing_info(&pReadPackedMessage, end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		case NFAPI_UE_RELEASE_RESPONSE:
+			if (check_nr_unpack_length(NFAPI_UE_RELEASE_RESPONSE, unpackedBufLen))
+				result = unpack_ue_release_resp(&pReadPackedMessage,  end, pMessageHeader, config);
+			else
+				return -1;
+			break;
+
+		default:
+
+			if(pMessageHeader->message_id >= NFAPI_VENDOR_EXT_MSG_MIN && 
+			   pMessageHeader->message_id <= NFAPI_VENDOR_EXT_MSG_MAX)
+			{
+				if(config && config->unpack_p7_vendor_extension)
+				{
+					result = (config->unpack_p7_vendor_extension)(pMessageHeader, &pReadPackedMessage, end, config);
+				}
+				else
+				{
+					NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s VE NFAPI message ID %d. No ve decoder provided\n", __FUNCTION__, pMessageHeader->message_id);
+				}
+			}
+			else
+			{
+				NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s NFAPI Unknown message ID %d\n", __FUNCTION__, pMessageHeader->message_id);
+			}
+			break;
+	}
+
+	if(result == 0)
+		return -1;
+	else 
+		return 0;
+}
+
+
diff --git a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
index 1e2e2fa21d25733a26ee24ffe4c1bd0381330db8..763b5c9abe11fc153aa453b54bd27e689cfe85c5 100644
--- a/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
+++ b/nfapi/open-nFAPI/pnf/inc/pnf_p7.h
@@ -153,10 +153,17 @@ int pnf_p7_send_message(pnf_p7_t* pnf_p7, uint8_t* msg, uint32_t msg_len);
 
 int pnf_p7_slot_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn, uint16_t slot);
 int pnf_p7_subframe_ind(pnf_p7_t* config, uint16_t phy_id, uint16_t sfn_sf);
-
+int nfapi_pnf_p7_nr_slot_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_slot_indication_scf_t* ind);
+int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_indication_t* ind);
+int nfapi_pnf_p7_nr_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_crc_indication_t* ind);
+int nfapi_pnf_p7_nr_srs_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_srs_indication_t* ind);
+int nfapi_pnf_p7_nr_uci_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_uci_indication_t* ind);
+int nfapi_pnf_p7_nr_rach_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rach_indication_t* ind);
 pnf_p7_rx_message_t* pnf_p7_rx_reassembly_queue_add_segment(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint16_t sequence_number, uint16_t segment_number, uint8_t m, uint8_t* data, uint16_t data_len);
 void pnf_p7_rx_reassembly_queue_remove_msg(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, pnf_p7_rx_message_t* msg);
 void pnf_p7_rx_reassembly_queue_remove_old_msgs(pnf_p7_t* pnf_p7, pnf_p7_rx_reassembly_queue_t* queue, uint32_t rx_hr_time, uint32_t delta);
 
+int pnf_nr_p7_pack_and_send_p7_message(pnf_p7_t* pnf_p7, nfapi_p7_message_header_t* header, uint32_t msg_len);
+
 #endif /* _PNF_P7_H_ */
 
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 8520a5d1620e74ad2b6848e27742f50412862113..fc9cd660774bbf497e77eb76ecfa1691c8a2f965 100644
--- a/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
+++ b/nfapi/open-nFAPI/pnf/public_inc/nfapi_pnf_interface.h
@@ -27,6 +27,7 @@ extern "C" {
 #include <openair2/PHY_INTERFACE/IF_Module.h>
 #include "nfapi_nr_interface.h"
 #include "nfapi_nr_interface_scf.h"
+
 #include <sys/types.h>
 #include "openair1/PHY/defs_gNB.h"
 
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
index 18891cdee955d24928b84f40967f0edb63d769f4..092b967189b5050d057aaa87171dc547ac071e97 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
@@ -156,17 +156,16 @@ nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7)
 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)
-	{	
-		//nfapi_nr_dl_tti_request_pdu_t *temp = &req->dl_tti_pdu_list;
-		(pnf_p7->_public.codec_config.deallocate)(req); 
-	}
-	else
-	{
-		free(req);
-	}
-*/
+	
+	// if(pnf_p7->_public.codec_config.deallocate)
+	// {	
+	// 	(pnf_p7->_public.codec_config.deallocate)(req); 
+	// }
+	// else
+	// {
+	// 	free(req);
+	// }
+
 	pnf_p7_free(pnf_p7, req);
 }
 
@@ -915,14 +914,13 @@ void send_dummy_subframe(pnf_p7_t* pnf_p7, uint16_t sfn_sf)
 
 
 int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t slot)
-{
+{	
+	//This function is aligned with rx sfn/slot
+
 	// We could either send an event to the p7 thread have have it run the
 	// subframe or we could handle it here and lock access to the subframe
 	// buffers. If we do it on the p7 thread then we run the risk of blocking
 	// on the udp send. 
-	//
-	// todo : start a timer to give us more of the 1 ms tick before send back
-	// the frame
 	
 	// todo : consider a more efficent lock mechasium
 	//uint16_t NUM_SLOTS = 20;//10* 2^mu
@@ -935,21 +933,21 @@ 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();
-	pnf_p7->sfn = sfn;
-	
-	pnf_p7->slot = slot;
-
-
-
+	slot_ahead = 6;
 	uint32_t sfn_slot_tx = sfnslot_add_slot(sfn, slot, slot_ahead);
-	uint16_t sfn_tx = sfn_slot_tx>>6;
-	uint16_t slot_tx = sfn_slot_tx & 0X3F;
+	uint16_t sfn_tx = NFAPI_SFNSLOT2SFN(sfn_slot_tx);
+	uint8_t slot_tx = NFAPI_SFNSLOT2SLOT(sfn_slot_tx);
 
-	// uint32_t tx_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot);
-	uint32_t tx_slot_dec = NFAPI_SFNSLOT2DEC(sfn,slot);
+	//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; 
 
-	//uint32_t tx_sfn_slot_dec = NFAPI_SFNSLOT2DEC(sfn_slot_tx);
+	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;
 
 	// If the subframe_buffer has been configured
 	if(pnf_p7->_public.slot_buffer_size!= 0) // for now value is same as sf_buffer_size
@@ -976,28 +974,20 @@ 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;
 		}
 
-		uint32_t slot_dec = NFAPI_SFNSLOT2DEC(sfn, slot);
-		uint8_t buffer_index = slot_dec % pnf_p7->_public.slot_buffer_size; 
-
-		nfapi_pnf_p7_slot_buffer_t* slot_buffer = &(pnf_p7->slot_buffer[buffer_index]);
-		// see where the PNF_P7 slot buffer its getting filled
+		nfapi_pnf_p7_slot_buffer_t* rx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_rx]);
 
-		uint8_t tx_buffer_index = tx_slot_dec % pnf_p7->_public.slot_buffer_size;
-		nfapi_pnf_p7_slot_buffer_t* tx_slot_buffer = &(pnf_p7->slot_buffer[tx_buffer_index]);
+		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(slot_buffer->sfn, slot_buffer->slot), 
-                    NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), 
-                       	slot_dec,    buffer_index,    slot_buffer->dl_tti_req,    slot_buffer->tx_data_req, 
-                    	tx_slot_dec, tx_buffer_index, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req);
+                // 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
 
-
-		// 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
 
@@ -1006,37 +996,39 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 		//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)
 		// {	
-			
-			if(tx_slot_buffer->tx_data_req != 0)
-			{
+		
+		//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)
-					{						
-						(pnf_p7->_public.tx_data_req_fn)(&(pnf_p7->_public), tx_slot_buffer->tx_data_req);
-					}
+			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 
+		}
+		else 
+		{
+			// send dummy
+			if(pnf_p7->_public.tx_data_req_fn && pnf_p7->_public.dummy_slot.tx_data_req)
 			{
-				// 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.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);
-				}
+				(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) // ADDED & TO BYPASS ERROR
+		}
+		 
+		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
@@ -1048,10 +1040,13 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			}
 		}
 
-		if(tx_slot_buffer->ul_dci_req!= 0)
+
+		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);
 			}
 		}
@@ -1065,10 +1060,14 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 				(pnf_p7->_public.ul_dci_req_fn)(NULL, &(pnf_p7->_public), pnf_p7->_public.dummy_slot.ul_dci_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)
@@ -1082,73 +1081,52 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			deallocate_nfapi_ul_dci_request(tx_slot_buffer->ul_dci_req, pnf_p7);
 			tx_slot_buffer->ul_dci_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);
-
-				// send_dummy_slot(pnf_p7, sfn_tx, slot_tx);
-		}
 
 
+		//checking in the rx slot buffers to see if a p7 msg is present.
 
-		if(slot_buffer->sfn == sfn && slot_buffer->slot == slot )
+		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(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), slot_buffer->ul_tti_req);
-				}
-				//deallocate_nfapi_ul_config_request(subframe_buffer->ul_config_req, pnf_p7);
+			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);
 			}
-			else
+		}
+		else
+		{
+			// send dummy
+			if(pnf_p7->_public.ul_tti_req_fn && pnf_p7->_public.dummy_slot.ul_tti_req)
 			{
-				// 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;
-					(pnf_p7->_public.ul_tti_req_fn)(NULL, &(pnf_p7->_public), 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(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(slot_buffer->ul_tti_req != 0)
-			{
-				deallocate_nfapi_ul_tti_request(slot_buffer->ul_tti_req, pnf_p7);
-				slot_buffer->ul_tti_req = 0;
+		}
+		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;
 
-			}
-			#if 0
-			if(slot_buffer->lbt_dl_config_req != 0)
-			{
-				deallocate_nfapi_lbt_dl_config_request(slot_buffer->lbt_dl_config_req, pnf_p7);
-				slot_buffer->lbt_dl_config_req = 0;
-			}
-			#endif
-		} // sfn_slot match
+		}
 
+		//reset slot buffer 
 
-		if ( slot_buffer->dl_tti_req == 0 &&
-			 slot_buffer->tx_data_req == 0 && 
-			 slot_buffer->ul_tti_req == 0)
-			 //slot_buffer->lbt_dl_config_req == 0 && 
-			 //slot_buffer->ue_release_req == 0)
+		if ( rx_slot_buffer->dl_tti_req == 0 &&
+			 rx_slot_buffer->tx_data_req == 0 && 
+			 rx_slot_buffer->ul_tti_req == 0)
 		{
-			memset(&(pnf_p7->slot_buffer[buffer_index]), 0, sizeof(nfapi_pnf_p7_slot_buffer_t));
-			pnf_p7->slot_buffer[buffer_index].sfn = -1;
-			pnf_p7->slot_buffer[buffer_index].slot = -1;
+			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;
 		}
 
 		//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
+		//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)
 		{
 			pnf_nr_pack_and_send_timing_info(pnf_p7);
@@ -1167,26 +1145,6 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 		}
 
 	}
-	else
-	{
-		//send_dummy_subframe(pnf_p7, sfn_sf_tx);
-	}
-
-
-        //printf("pnf_p7->tick:%d\n", pnf_p7->tick);
-	// if(pnf_p7->tick == 1000) // why?
-	// {
-	// 	// TODO: change stats to nr_stats
-	// 	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, 
-	// 				pnf_p7->stats.tx_ontime, pnf_p7->stats.tx_late);
-	// 	pnf_p7->tick = 0;
-	// 	memset(&pnf_p7->stats, 0, sizeof(pnf_p7->stats));
-	// }
-	// pnf_p7->tick++;
-
 
 	if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
 	{
@@ -1495,7 +1453,7 @@ uint8_t is_nr_p7_request_in_window(uint16_t sfn,uint16_t slot, const char* name,
 {
 	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);
+	//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;
 
@@ -1546,11 +1504,11 @@ uint8_t is_nr_p7_request_in_window(uint16_t sfn,uint16_t slot, const char* name,
 	// }
 	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);
+		//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);
+		//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] %s is in window %d\n", current_sfn_slot_dec, name, recv_sfn_slot_dec);
 	}
   
 	else
@@ -1630,7 +1588,6 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 		NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced 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)
@@ -1640,34 +1597,18 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
 			return;
 		}
-#if 0
-                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
-                      );
-#endif
 
-                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 % pnf_p7->_public.slot_buffer_size;
+        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);
+                struct timespec t;
+                clock_gettime(CLOCK_MONOTONIC, &t);
 
-                  //NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_TTI_REQ sfn_slot:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
+                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_config_req make sure we free it.
+			// 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);
@@ -1677,7 +1618,7 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 				deallocate_nfapi_dl_tti_request(pnf_p7->slot_buffer[buffer_index].dl_tti_req, pnf_p7);
 			}
 
-			// saving dl_config_request in subframe buffer
+			// 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;
@@ -1826,12 +1767,12 @@ void pnf_handle_ul_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 		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 % pnf_p7->_public.slot_buffer_size;
+			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 sfn_slot:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_slot_dec, buffer_index);
+                        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)
 			{
@@ -1841,6 +1782,8 @@ void pnf_handle_ul_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 
 				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;
@@ -1972,7 +1915,7 @@ void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 		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 % pnf_p7->_public.slot_buffer_size;
+			uint8_t buffer_index = sfn_slot_dec % 20;
 
 			if(pnf_p7->slot_buffer[buffer_index].ul_dci_req!= 0)
 			{
@@ -2010,7 +1953,7 @@ void pnf_handle_ul_dci_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 	}
 	else
 	{
-		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack hi_dci0_req\n");
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack UL DCI req\n");
 		deallocate_nfapi_ul_dci_request(req, pnf_p7);
 	}
 }
@@ -2111,12 +2054,12 @@ void pnf_handle_tx_data_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7
 		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 % pnf_p7->_public.slot_buffer_size;
+			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);
+                        //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__,
@@ -2678,9 +2621,7 @@ void pnf_nr_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7
 		case NFAPI_NR_PHY_MSG_TYPE_DL_NODE_SYNC:
 			pnf_nr_handle_dl_node_sync(pRecvMsg, recvMsgLen, pnf_p7, rx_hr_time);
 			break;
-
 		case NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST:
-		//printf("\nEntering pnf_handle_dl_tti_request sfn=%d,slot=%d \n",pnf_p7->sfn,pnf_p7->slot);
 			pnf_handle_dl_tti_request(pRecvMsg, recvMsgLen, pnf_p7);
 			break;
 		case NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST:
@@ -2989,13 +2930,11 @@ void pnf_nr_nfapi_p7_read_dispatch_message(pnf_p7_t* pnf_p7, uint32_t now_hr_tim
 	struct sockaddr_in remote_addr;
 	socklen_t remote_addr_size = sizeof(remote_addr);
 	remote_addr.sin_family = 2; //hardcoded
-
 	do
 	{
 		// peek the header
 		uint8_t header_buffer[NFAPI_P7_HEADER_LENGTH];
 		recvfrom_result = recvfrom(pnf_p7->p7_sock, header_buffer, NFAPI_P7_HEADER_LENGTH, MSG_DONTWAIT | MSG_PEEK, (struct sockaddr*)&remote_addr, &remote_addr_size);
-
 		if(recvfrom_result > 0)
 		{
 			// get the segment size
@@ -3272,7 +3211,7 @@ int pnf_nr_p7_message_pump(pnf_p7_t* pnf_p7)
 		FD_SET(pnf_p7->p7_sock, &rfds);
 
 		struct timeval timeout;
-		timeout.tv_sec = 1;
+		timeout.tv_sec = 100;
 		timeout.tv_usec = 0;
 
 		selectRetval = select(pnf_p7->p7_sock+1, &rfds, NULL, NULL, &timeout);
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
index efcb60ce9632e366927ca4cb6c4af18bdcc28775..0db1feb398cc8922c954d0782337b8fc0c3e4691 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
@@ -265,3 +265,77 @@ int nfapi_pnf_ue_release_resp(nfapi_pnf_p7_config_t* config, nfapi_ue_release_re
 
 	return pnf_p7_pack_and_send_p7_message(_this, &(resp->header), sizeof(nfapi_ue_release_response_t));
 }
+
+//NR UPLINK INDICATION 
+
+int nfapi_pnf_p7_nr_slot_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_slot_indication_scf_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+}
+
+int nfapi_pnf_p7_nr_rx_data_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rx_data_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rx_data_indication_t));
+}
+
+int nfapi_pnf_p7_nr_crc_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_crc_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_crc_indication_t));
+}
+
+int nfapi_pnf_p7_nr_srs_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_srs_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_srs_indication_t));
+}
+
+int nfapi_pnf_p7_nr_uci_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_uci_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_uci_indication_t));
+}
+
+int nfapi_pnf_p7_nr_rach_ind(nfapi_pnf_p7_config_t* config, nfapi_nr_rach_indication_t* ind)
+{
+	if(config == NULL || ind == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: invalid input params\n", __FUNCTION__);
+		return -1;
+	}
+
+	pnf_p7_t* _this = (pnf_p7_t*)(config);
+	return pnf_nr_p7_pack_and_send_p7_message(_this, (nfapi_p7_message_header_t*)ind, sizeof(nfapi_nr_rach_indication_t));
+}
diff --git a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
index 4fe5065ceac54c687c1fa73e159b87f3061fc549..1c2f0bef8078a072d7abd9eab6de65cbe3b5568d 100644
--- a/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
+++ b/nfapi/open-nFAPI/pnf_sim/src/fapi_stub.cpp
@@ -278,7 +278,7 @@ void *fapi_thread_start(void *ptr) {
 
     if(instance->tick == 1000) {
       if(instance->tx_byte_count > 0) {
-        printf("[FAPI] Tx rate %u bytes/sec\n", instance->tx_byte_count);
+        printf("[FAPI] Tx rate %d bytes/sec\n", instance->tx_byte_count);
         instance->tx_byte_count = 0;
       }
 
@@ -319,7 +319,7 @@ void *fapi_thread_start(void *ptr) {
       millisec = now_ts.tv_nsec / 1e6;
 
       if(last_millisec != -1 && ((last_millisec + 1 ) % 1000) != millisec) {
-        printf("*** missing millisec %u %u\n", last_millisec, millisec);
+        printf("*** missing millisec %d %d\n", last_millisec, millisec);
         catchup = millisec - last_millisec - 1;
       }
 
diff --git a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
index ad1c5e7944295028eab74897ae8db264d836e989..4fcc99f79b7bf27f6f817557932ee0834d0bb38b 100644
--- a/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
+++ b/nfapi/open-nFAPI/vnf/inc/vnf_p7.h
@@ -25,7 +25,6 @@
 #define TIME2TIMEHR(_time) (((uint32_t)(_time.tv_sec) & 0xFFF) << 20 | ((uint32_t)(_time.tv_usec) & 0xFFFFF))
 
 
-
 typedef struct {
 	uint8_t* buffer;
 	uint16_t length;
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 518b01864e5f60d4d5b041bf93a8a0b84c2c5e5d..31328393c9a5749f8dc784abf74c3a78638b4248 100644
--- a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
+++ b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
@@ -852,7 +852,15 @@ typedef struct nfapi_vnf_p7_config
 	 *  use the codec_config.deallocate function to release it at a future point
 	 */	
 	int (*nrach_indication)(struct nfapi_vnf_p7_config* config, nfapi_nrach_indication_t* ind);		
-	
+
+	//The NR indication functions below copy uplink information received at the VNF into the UL info struct
+	int (*nr_slot_indication)(nfapi_nr_slot_indication_scf_t* ind);
+	int (*nr_crc_indication)(nfapi_nr_crc_indication_t* ind);
+	int (*nr_rx_data_indication)(nfapi_nr_rx_data_indication_t* ind);
+	int (*nr_uci_indication)(nfapi_nr_uci_indication_t* ind);
+	int (*nr_rach_indication)(nfapi_nr_rach_indication_t* ind);
+	int (*nr_srs_indication)(nfapi_nr_srs_indication_t* ind);
+
 	/*! A callback for any vendor extension messages
      *  \param config A pointer to the vnf p7 configuration
 	 *  \param msg A data structure for the decoded vendor extention message allocated
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index ffbc5819bc4826eaf0a349edd680e4860c283131..e3900315540f00e1dc88bea25da468fcf48a49a1 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -22,7 +22,7 @@
 #include <string.h>
 #include <unistd.h>
 #include <errno.h>
-
+#include <stdio.h>
 #include "vnf_p7.h"
 
 #define SYNC_CYCLE_COUNT 2
@@ -456,7 +456,7 @@ int send_mac_subframe_indications(vnf_p7_t* vnf_p7)
 int vnf_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info, uint8_t* msg, const uint32_t len)
 {
 	int sendto_result = sendto(vnf_p7->socket, msg, len, 0, (struct sockaddr*)&(p7_info->remote_addr), sizeof(p7_info->remote_addr)); 
-	//printf("\nSending p7 message sfn=%d,slot=%d\n",vnf_p7->p7_connections->sfn,vnf_p7->p7_connections->slot);
+	//printf("P7 msg sent \n");
 	if(sendto_result != len)
 	{
 		NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() sendto_result %d %d\n", __FUNCTION__, sendto_result, errno);
@@ -533,6 +533,7 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
 				nfapi_p7_update_transmit_timestamp(buffer, calculate_transmit_timestamp(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);
+
 			}
 		}
 		else
@@ -549,7 +550,6 @@ int vnf_nr_p7_pack_and_send_p7_msg(vnf_p7_t* vnf_p7, nfapi_p7_message_header_t*
 		}
 
 		p7_connection->sequence_number++;
-
 		return send_result;
 	}
 	else
@@ -667,7 +667,6 @@ int vnf_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t
 
 int vnf_nr_build_send_dl_node_sync(vnf_p7_t* vnf_p7, nfapi_vnf_p7_connection_info_t* p7_info)
 {	
-	
 	nfapi_nr_dl_node_sync_t dl_node_sync;
 	memset(&dl_node_sync, 0, sizeof(dl_node_sync));
 
@@ -1290,7 +1289,7 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 					{
 						if(phy->in_sync == 0)
 						{
-							NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id); 
+							//NFAPI_TRACE(NFAPI_TRACE_NOTE, "VNF P7 In Sync with phy (phy_id:%d)\n", phy->phy_id); 
 
 							if(vnf_p7->_public.sync_indication)
 								(vnf_p7->_public.sync_indication)(&(vnf_p7->_public), 1);
@@ -1454,6 +1453,161 @@ void vnf_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 	}
 }
 
+//NR HANDLES FOR UPLINK MESSAGES
+void vnf_handle_nr_slot_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_slot_indication_scf_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_slot_indication)
+			{
+				(vnf_p7->_public.nr_slot_indication)(&ind);
+			}
+		}
+
+	}
+}
+void vnf_handle_nr_rx_data_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_rx_data_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_rx_data_indication)
+			{
+				(vnf_p7->_public.nr_rx_data_indication)(&ind);
+			}
+		}
+
+	}
+}
+
+void vnf_handle_nr_crc_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_crc_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_crc_indication)
+			{	
+				(vnf_p7->_public.nr_crc_indication)(&ind);
+			}
+		}
+		
+	}
+}
+
+void vnf_handle_nr_srs_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_srs_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_srs_indication)
+			{
+				(vnf_p7->_public.nr_srs_indication)(&ind);
+			}
+		}
+	}
+}
+
+void vnf_handle_nr_uci_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_uci_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_uci_indication)
+			{
+				(vnf_p7->_public.nr_uci_indication)(&ind);
+			}
+		}
+
+	}
+}
+
+void vnf_handle_nr_rach_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
+{
+	// ensure it's valid
+	if (pRecvMsg == NULL || vnf_p7 == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: NULL parameters\n", __FUNCTION__);
+	}
+	else
+	{
+		nfapi_nr_rach_indication_t ind;
+	
+		if(nfapi_nr_p7_message_unpack(pRecvMsg, recvMsgLen, &ind, sizeof(ind), &vnf_p7->_public.codec_config) < 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s: Failed to unpack message\n", __FUNCTION__);
+		}
+		else
+		{
+			if(vnf_p7->_public.nr_rach_indication)
+			{
+				(vnf_p7->_public.nr_rach_indication)(&ind);
+			}
+		}
+		
+	}
+}
+
 void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 {	
 	//printf("received UL Node sync");
@@ -1484,6 +1638,8 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 	// divide by 2 using shift operator
 	uint32_t latency =  (tx_2_rx - pnf_proc_time) >> 1;
 
+	//phy->in_sync = 1;
+
 	if(!(phy->filtered_adjust))
 	{
 		phy->latency[phy->min_sync_cycle_count] = latency;
@@ -1533,17 +1689,24 @@ void vnf_nr_handle_ul_node_sync(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
                   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", 
-			//		phy->sfn, phy->slot, 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->average_latency, phy->slot_offset, phy->slot_offset_filtered,
-					// (ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
+			// 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", 
+			// 		phy->sfn, phy->slot, 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->average_latency, phy->slot_offset, phy->slot_offset_filtered,
+			// 		(ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
 		}
 
 	}
 
         if (phy->filtered_adjust && (phy->slot_offset_filtered > 1e6 || phy->slot_offset_filtered < -1e6))
-        {
+        {  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", 
+					phy->sfn, phy->slot, 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->average_latency, phy->slot_offset, phy->slot_offset_filtered,
+					(ind.t1<phy->previous_t1), (ind.t2<phy->previous_t2));
+
           phy->filtered_adjust = 0;
           phy->zero_count=0;
           phy->min_sync_cycle_count = 2;
@@ -1575,7 +1738,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(sfn_slot_dec),NFAPI_SFNSLOTDEC2SLOT(sfn_slot_dec) ); 
 
 
 		}
@@ -2033,46 +2196,30 @@ void vnf_nr_dispatch_p7_message(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7
 		case NFAPI_TIMING_INFO:
 			vnf_nr_handle_timing_info(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-			
-		case NFAPI_HARQ_INDICATION:
-			vnf_handle_harq_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		
+		case NFAPI_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			vnf_handle_nr_slot_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-	
-		case NFAPI_CRC_INDICATION:
-			vnf_handle_crc_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		
+		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
+			vnf_handle_nr_rx_data_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
 	
-		case NFAPI_RX_ULSCH_INDICATION:
-			vnf_handle_rx_ulsch_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		case NFAPI_NR_PHY_MSG_TYPE_CRC_INDICATION:
+			vnf_handle_nr_crc_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
 	
-		case NFAPI_RACH_INDICATION:
-			vnf_handle_rach_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		case NFAPI_NR_PHY_MSG_TYPE_UCI_INDICATION:
+			vnf_handle_nr_uci_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
 	
-		case NFAPI_SRS_INDICATION:
-			vnf_handle_srs_indication(pRecvMsg, recvMsgLen, vnf_p7);
+		case NFAPI_NR_PHY_MSG_TYPE_SRS_INDICATION:
+			vnf_handle_nr_srs_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-
-		case NFAPI_RX_SR_INDICATION:
-			vnf_handle_rx_sr_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;
-
-		case NFAPI_RX_CQI_INDICATION:
-			vnf_handle_rx_cqi_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;
-			
-		case NFAPI_LBT_DL_INDICATION:
-			vnf_handle_lbt_dl_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;
-			
-		case NFAPI_NB_HARQ_INDICATION:
-			vnf_handle_nb_harq_indication(pRecvMsg, recvMsgLen, vnf_p7);
+	
+		case NFAPI_NR_PHY_MSG_TYPE_RACH_INDICATION:
+			vnf_handle_nr_rach_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
-			
-		case NFAPI_NRACH_INDICATION:
-			vnf_handle_nrach_indication(pRecvMsg, recvMsgLen, vnf_p7);
-			break;			
 
 		case NFAPI_UE_RELEASE_RESPONSE:
 			vnf_handle_ue_release_resp(pRecvMsg, recvMsgLen, vnf_p7);
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
index 3fa1f035fdc102e6c9a11d8032a7529ecb0e59ce..8cebf2b468b7f38b475d342639106ab421933617 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
@@ -25,9 +25,14 @@
 #include <errno.h>
 
 #include "vnf_p7.h"
+#include "nfapi_vnf.h"
 
+#include "common/ran_context.h"
+
+#include "openair1/PHY/defs_gNB.h"
 #define FAPI2_IP_DSCP	0
 
+extern RAN_CONTEXT_t RC;
 
 nfapi_vnf_p7_config_t* nfapi_vnf_p7_config_create()
 {
@@ -92,7 +97,9 @@ struct timespec timespec_sub(struct timespec lhs, struct timespec rhs)
 // monitor the p7 endpoints and the timing loop and 
 // 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;
 
@@ -145,40 +152,14 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 
 	//struct timespec original_pselect_timeout;
 	struct timespec pselect_timeout;
-	pselect_timeout.tv_sec = 0;
-	pselect_timeout.tv_nsec = 500000; // ns in a 0.5 ms
-	//pselect_timeout.tv_nsec = 500000;
-
-	struct timespec pselect_start;
-	struct timespec pselect_stop;
-
-	//struct timespec sf_end;
-
-	long last_millisecond = -1;
-
-
-//	struct timespec sf_duration; //Change to slot_duration?
-//	sf_duration.tv_sec = 0;
-//	sf_duration.tv_nsec = 0.5e6; // We want 1ms pause //We want 0.5 ms pause for NR
-	struct timespec slot_duration; 
-	slot_duration.tv_sec = 0;
-	//slot_duration.tv_nsec = 0.5e6;
-	slot_duration.tv_nsec = 0.5e6;
-
+	pselect_timeout.tv_sec = 100; 
+	pselect_timeout.tv_nsec = 0; 
 
-//	struct timespec sf_start; //Change to slot_start?
-	struct timespec slot_start;
-//	clock_gettime(CLOCK_MONOTONIC, &sf_start);
-	clock_gettime(CLOCK_MONOTONIC, &slot_start);
-	long millisecond = slot_start.tv_nsec / 1e6; //Check if we have to change
-	//long millisecond = slot_start.tv_nsec / 0.5e6;
-//	sf_start = timespec_add(sf_start, sf_duration);
-	slot_start = timespec_add(slot_start, slot_duration);
-
-	NFAPI_TRACE(NFAPI_TRACE_INFO, "next slot will start at %d.%d\n", slot_start.tv_sec, slot_start.tv_nsec);
-    
+    struct timespec ref_time;
+	clock_gettime(CLOCK_MONOTONIC, &ref_time);
+	uint8_t setup_time;
 	while(vnf_p7->terminate == 0)
-	{
+	{	
 		fd_set rfds;
 		int maxSock = 0;
 		FD_ZERO(&rfds);
@@ -188,239 +169,33 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 		FD_SET(vnf_p7->socket, &rfds);
 		maxSock = vnf_p7->socket;
 		
-		clock_gettime(CLOCK_MONOTONIC, &pselect_start);
-		//long millisecond = pselect_start.tv_nsec / 1e6;
-
-		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)))
-			if((pselect_start.tv_sec > slot_start.tv_sec) || ((pselect_start.tv_sec == slot_start.tv_sec) && (pselect_start.tv_nsec > slot_start.tv_nsec)))
-			{
-				// overran the end of the subframe we do not want to wait
-				pselect_timeout.tv_sec = 0;
-				pselect_timeout.tv_nsec = 0;
-
-				//struct timespec overrun = timespec_sub(pselect_start, sf_start);
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "Subframe overrun detected of %d.%d running to catchup\n", overrun.tv_sec, overrun.tv_nsec);
-			}
-			else
-			{
-				// still time before the end of the subframe wait
-				//pselect_timeout = timespec_sub(sf_start, pselect_start);
-				pselect_timeout = timespec_sub(slot_start, pselect_start);
-			}
-
-//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 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 underrun_possible =0;
-			/*
-			{
-				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 && pselect_start.tv_nsec != 0)
-				{
-					NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] Subframe minor adjustment %d (%d->%d)\n", phy->insync_minor_adjustment,
-							pselect_timeout.tv_nsec, pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000)) 
-					if(phy->insync_minor_adjustment > 0)
-					{
-						// todo check we don't go below 0
-						if((phy->insync_minor_adjustment * 1000) > pselect_timeout.tv_nsec)
-							pselect_timeout.tv_nsec = 0;
-						else
-							pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
-
-
-						//underrun_possible = 1;
-					}
-					else if(phy->insync_minor_adjustment < 0)
-					{
-						// todo check we don't go below 0
-						pselect_timeout.tv_nsec = pselect_timeout.tv_nsec - (phy->insync_minor_adjustment * 1000);
-					
-
-					//phy->insync_minor_adjustment = 0;
-					phy->insync_minor_adjustment_duration--;
-				}
-			}
-			*/
-			
-
-//long wraps = pselect_timeout.tv_nsec % 1e9;
-
-
-			selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
-		//	selectRetval = pselect(120, &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);
-
-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, 
-  slot_duration.tv_sec, slot_duration.tv_nsec);
-
-}
-			if(selectRetval == 0)
-			{
-				// calculate the start of the next slot
-				//sf_start = timespec_add(sf_start, sf_duration);
-				slot_start = timespec_add(slot_start, slot_duration);
-				//NFAPI_TRACE(NFAPI_TRACE_INFO, "next subframe will start at %d.%d\n", sf_start.tv_sec, sf_start.tv_nsec);
-
-				if(phy && phy->in_sync && phy->insync_minor_adjustment != 0 && phy->insync_minor_adjustment_duration > 0)
-				{
-                                        long insync_minor_adjustment_ns = (phy->insync_minor_adjustment * 1000);
-
-                                        //sf_start.tv_nsec -= insync_minor_adjustment_ns;
-										slot_start.tv_nsec -= insync_minor_adjustment_ns;
-
-#if 1
-/*                                        if (sf_start.tv_nsec > 1e9) //Change to 0.5e6?
-                                        {
-                                          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;
-                                        }*/
-										if (slot_start.tv_nsec > 1e9) 
-                                        {
-                                          slot_start.tv_sec++;
-                                          slot_start.tv_nsec-=1e9;
-                                        }
-                                        else if (slot_start.tv_nsec < 0)
-                                        {
-                                          slot_start.tv_sec--;
-                                          slot_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
-                                                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 += 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--;
-
-//                                        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);
-										// NFAPI_TRACE(NFAPI_TRACE_NOTE, "[VNF] AFTER adjustment - Slot minor adjustment %dus slot_start.tv_nsec:%d duration:%u\n", 
-                                        //     phy->insync_minor_adjustment, slot_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(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)
-				{
-					// we have overrun the subframe
-					NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe pselect overrun %ld %ld\n", millisecond, pselect_stop_millisecond);
-					NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe underrun %ld\n", millisecond);
-				}
-				last_millisecond = millisecond;
-				*/
-				
-				//millisecond ++;
-				millisecond = millisecond + 1;
-
-			}
+		struct timespec curr_time;
+		clock_gettime(CLOCK_MONOTONIC, &curr_time);
+		setup_time = curr_time.tv_sec - ref_time.tv_sec;
+
+		if(setup_time > 10 && prev_slot != gNB->UL_INFO.slot){ //Give the VNF sufficient time to setup before starting scheduling
+
+			//Call the scheduler
+			pthread_mutex_lock(&gNB->UL_INFO_mutex);
+			gNB->UL_INFO.module_id = gNB->Mod_id;
+			gNB->UL_INFO.CC_id     = gNB->CC_id;
+			gNB->if_inst->NR_UL_indication(&gNB->UL_INFO);
+			pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+			prev_slot = gNB->UL_INFO.slot;
 		}
-		else
-		{
-			// we have overrun the subframe advance to go and collect $200 
-
-			if((millisecond - last_millisecond) > 3)
-				NFAPI_TRACE(NFAPI_TRACE_WARN, "subframe overrun %ld %ld (%ld)\n", millisecond, last_millisecond, millisecond - last_millisecond + 1);
 
-			last_millisecond = ( last_millisecond + 1 ) % 1000;
-			selectRetval = 0;
-		}
+		selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
 
 		if(selectRetval == 0)
 		{
-			//vnf_p7->sf_start_time_hr = vnf_get_current_time_hr();
-			vnf_p7->slot_start_time_hr = vnf_get_current_time_hr();
-struct timespec current_time;
-	clock_gettime(CLOCK_MONOTONIC, &current_time);
-			// pselect timed out
-			nfapi_vnf_p7_connection_info_t* curr = vnf_p7->p7_connections;
-			while(curr != 0)
-			{
-				if (curr->slot == 19)
-				{  //curr->slot = 0; 
-				if(curr->sfn == 1023)
-				curr->sfn=0;
-				else	
-				curr->sfn++;
-				curr->slot=0;
-				}
-				else
-				{
-				curr->slot++;
-				}
-				vnf_nr_sync(vnf_p7, curr);	
-				curr = curr->next;	
-			}
-			send_mac_slot_indications(vnf_p7);
+			// pselect timed out, continue
 		}
 		else if(selectRetval > 0)
 		{
 			// have a p7 message
 			if(FD_ISSET(vnf_p7->socket, &rfds))
-			{
-				vnf_nr_p7_read_dispatch_message(vnf_p7); 
+			{	
+				vnf_nr_p7_read_dispatch_message(vnf_p7); 				
 			}
 		}
 		else
@@ -432,7 +207,7 @@ struct timespec current_time;
 			}
 			else
 			{
-				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);
+				//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
                                 {
@@ -440,10 +215,7 @@ struct timespec current_time;
                                 }
 			}
 		}
-
 	}
-
-	
 	NFAPI_TRACE(NFAPI_TRACE_INFO, "Closing p7 socket\n");
 	close(vnf_p7->socket);
 
@@ -862,7 +634,6 @@ int nfapi_vnf_p7_ul_tti_req(nfapi_vnf_p7_config_t* config, nfapi_nr_ul_tti_reque
 {
 	if(config == 0 || req == 0)
 		return -1;
-
 	vnf_p7_t* vnf_p7 = (vnf_p7_t*)config;
 	return vnf_nr_p7_pack_and_send_p7_msg(vnf_p7, &req->header);
 }
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 7f2f9780d14b7c47299d83fe3e5de46341c5b57b..0fbaad98eb41f87a1b076f0c4ba45b9f980a2047 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -495,6 +495,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
   gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
 
   nr_init_frame_parms(gNB_config, fp);
+  fp->ofdm_offset_divisor = UINT_MAX;
   gNB->configured    = 1;
   LOG_I(PHY,"gNB configured\n");
 }
@@ -546,7 +547,9 @@ void nr_phy_config_request(NR_PHY_Config_t *phy_config) {
 //  }
   RC.gNB[Mod_id]->configured     = 1;
 
+  fp->ofdm_offset_divisor = RC.gNB[Mod_id]->ofdm_offset_divisor;
   init_symbol_rotation(fp);
+  init_timeshift_rotation(fp);
 
   LOG_I(PHY,"gNB %d configured\n",Mod_id);
 }
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index b29d679fe543cbf2f11321624e38d07de47233f5..b60e77e814b41023cfec4f64cda18286058d4de5 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -124,7 +124,7 @@ void phy_init_nr_ue_PUSCH(NR_UE_PUSCH *const pusch,
   AssertFatal( pusch, "pusch==0" );
 
   for (int i=0; i<NR_MAX_NB_LAYERS; i++) {
-    pusch->txdataF_layers[i] = (int32_t *)malloc16_clear((NR_MAX_PUSCH_ENCODED_LENGTH)*sizeof(int32_t *));
+    pusch->txdataF_layers[i] = (int32_t *)malloc16_clear(NR_MAX_PUSCH_ENCODED_LENGTH*sizeof(int32_t));
   }
 }
 
diff --git a/openair1/PHY/MODULATION/modulation_common.h b/openair1/PHY/MODULATION/modulation_common.h
index f550eeca5f6c7f9b483e13c5a44b33eb41f1abd5..1a19bec78c83ea5b2772f91685d6235a0d5a994d 100644
--- a/openair1/PHY/MODULATION/modulation_common.h
+++ b/openair1/PHY/MODULATION/modulation_common.h
@@ -49,7 +49,7 @@ void PHY_ofdm_mod(int *input,
 
 
 void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms);
-void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms);
+void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms, uint32_t slot);
 
 void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
 
diff --git a/openair1/PHY/MODULATION/nr_modulation.c b/openair1/PHY/MODULATION/nr_modulation.c
index e32f6bf575add7a80ad80e60b9938bbccb770471..c81a88ff3075bd6071a8cc02b5230f29f51de7af 100644
--- a/openair1/PHY/MODULATION/nr_modulation.c
+++ b/openair1/PHY/MODULATION/nr_modulation.c
@@ -745,6 +745,23 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp) {
   }
 }
 
+void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp)
+{
+  for (int i = 0; i < fp->ofdm_symbol_size; i++) {
+    double poff = -i * 2.0 * M_PI * 144.0 / 2048.0 / fp->ofdm_offset_divisor;
+    double exp_re = cos(poff);
+    double exp_im = sin(-poff);
+    fp->timeshift_symbol_rotation[i*2] = (int16_t)round(exp_re * 32767);
+    fp->timeshift_symbol_rotation[i*2+1] = (int16_t)round(exp_im * 32767);
+
+    if (i < 10)
+      LOG_I(PHY,"Timeshift symbol rotation %d => (%d,%d) %f\n",i,
+            fp->timeshift_symbol_rotation[i*2],
+            fp->timeshift_symbol_rotation[i*2+1],
+            poff);
+  }
+}
+
 int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n_layers, int32_t re_offset)
 {
   int32_t precodatatx_F = 0;
diff --git a/openair1/PHY/MODULATION/nr_modulation.h b/openair1/PHY/MODULATION/nr_modulation.h
index 547d20952fb4d7e0b5e959535c00088d026af87c..75541a13615ce851db32f45e127c7285e5db971b 100644
--- a/openair1/PHY/MODULATION/nr_modulation.h
+++ b/openair1/PHY/MODULATION/nr_modulation.h
@@ -117,6 +117,8 @@ void apply_nr_rotation(NR_DL_FRAME_PARMS *fp,
 
 void init_symbol_rotation(NR_DL_FRAME_PARMS *fp);
 
+void init_timeshift_rotation(NR_DL_FRAME_PARMS *fp);
+
 void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 			  int32_t *rxdataF,
 			  int slot,
diff --git a/openair1/PHY/MODULATION/ofdm_mod.c b/openair1/PHY/MODULATION/ofdm_mod.c
index 8cf9f05b9b63acd4bd4bab2e0f0296013a279302..2f075e8218d7da918b8826a6167014aef7e93d95 100644
--- a/openair1/PHY/MODULATION/ofdm_mod.c
+++ b/openair1/PHY/MODULATION/ofdm_mod.c
@@ -63,20 +63,62 @@ void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRA
   
 }
 
-void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms)
+void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms, uint32_t slot)
 {
-  PHY_ofdm_mod(txdataF,        // input
-	       txdata,         // output
-	       frame_parms->ofdm_symbol_size,                
-	       1,                 // number of symbols
-	       frame_parms->nb_prefix_samples0,               // number of prefix samples
-	       CYCLIC_PREFIX);
-  PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,        // input
-	       txdata + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,         // output
-	       frame_parms->ofdm_symbol_size,                
-	       nsymb - 1,
-	       frame_parms->nb_prefix_samples,               // number of prefix samples
-	       CYCLIC_PREFIX);  
+  // This function works only slot wise. For more generic symbol generation refer nr_feptx0()
+  if (frame_parms->numerology_index != 0) { // case where numerology != 0
+    if (!(slot%(frame_parms->slots_per_subframe/2))) {
+      PHY_ofdm_mod(txdataF,
+             txdata,
+             frame_parms->ofdm_symbol_size,
+             1,
+             frame_parms->nb_prefix_samples0,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,
+             txdata + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,
+             frame_parms->ofdm_symbol_size,
+             nsymb - 1,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+    }
+    else {
+      PHY_ofdm_mod(txdataF,
+             txdata,
+             frame_parms->ofdm_symbol_size,
+             nsymb,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+    }
+  }
+  else { // numerology = 0, longer CP for every 7th symbol
+      PHY_ofdm_mod(txdataF,
+             txdata,
+             frame_parms->ofdm_symbol_size,
+             1,
+             frame_parms->nb_prefix_samples0,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF+frame_parms->ofdm_symbol_size,
+             txdata + frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,
+             frame_parms->ofdm_symbol_size,
+             6,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF + 7*frame_parms->ofdm_symbol_size,
+             txdata + 6*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples) +
+                    frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0,
+             frame_parms->ofdm_symbol_size,
+             1,
+             frame_parms->nb_prefix_samples0,
+             CYCLIC_PREFIX);
+      PHY_ofdm_mod(txdataF + 8*frame_parms->ofdm_symbol_size,
+             txdata + 6*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples) +
+                    2*(frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples0),
+             frame_parms->ofdm_symbol_size,
+             6,
+             frame_parms->nb_prefix_samples,
+             CYCLIC_PREFIX);
+  }
+
 }
 
 void PHY_ofdm_mod(int *input,                       /// pointer to complex input
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 39c730bfac3a5b8c973e9e9643e40acbaf61cee0..f3c8c108dca8d28d36fdac17d0cafd9429e582f3 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -107,7 +107,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
   rx_offset += frame_parms->ofdm_symbol_size * symbol;
 
   // use OFDM symbol from within 1/8th of the CP to avoid ISI
-  rx_offset -= nb_prefix_samples / 8;
+  rx_offset -= (nb_prefix_samples / frame_parms->ofdm_offset_divisor);
 
 #ifdef DEBUG_FEP
   //  if (ue->frame <100)
@@ -157,6 +157,15 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
 		      (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
 		      frame_parms->ofdm_symbol_size,
 		      15);
+
+    int16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
+
+    multadd_cpx_vector((int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+          shift_rot,
+          (int16_t *)&common_vars->common_vars_rx_data_per_thread[proc->thread_id].rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+          1,
+          frame_parms->ofdm_symbol_size,
+          15);
   }
 
 #ifdef DEBUG_FEP
@@ -292,14 +301,15 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
   // This is for misalignment issues
   int32_t tmp_dft_in[8192] __attribute__ ((aligned (32)));
 
-  unsigned int slot_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
-
   // offset of first OFDM symbol
-  int32_t rxdata_offset = slot_offset + nb_prefix_samples0;
-  // offset of n-th OFDM symbol
-  rxdata_offset += symbol * (frame_parms->ofdm_symbol_size + nb_prefix_samples);
+  unsigned int rxdata_offset = frame_parms->get_samples_slot_timestamp(Ns,frame_parms,0);
+  unsigned int abs_symbol = Ns * frame_parms->symbols_per_slot + symbol;
+  for (int idx_symb = Ns*frame_parms->symbols_per_slot; idx_symb <= abs_symbol; idx_symb++)
+    rxdata_offset += (idx_symb%(0x7<<frame_parms->numerology_index)) ? nb_prefix_samples : nb_prefix_samples0;
+  rxdata_offset += frame_parms->ofdm_symbol_size * symbol;
+
   // use OFDM symbol from within 1/8th of the CP to avoid ISI
-  rxdata_offset -= nb_prefix_samples / 8;
+  rxdata_offset -= (nb_prefix_samples / frame_parms->ofdm_offset_divisor);
 
   int16_t *rxdata_ptr;
 
@@ -333,9 +343,6 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
       (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size],
       1);
 
-  // clear DC carrier from OFDM symbols
-  rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
-
   return 0;
 }
 
@@ -349,7 +356,7 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 			  
   int symb_offset = (slot%frame_parms->slots_per_subframe)*frame_parms->symbols_per_slot;
 
-  for (int symbol=0;symbol<nsymb;symbol++) {
+  for (int symbol=first_symbol;symbol<nsymb;symbol++) {
     
     uint32_t rot2 = ((uint32_t*)frame_parms->symbol_rotation[1])[symbol + symb_offset];
     ((int16_t*)&rot2)[1]=-((int16_t*)&rot2)[1];
@@ -359,5 +366,14 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
 		      (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
 		      length,
 		      15);
+
+    int16_t *shift_rot = frame_parms->timeshift_symbol_rotation;
+
+    multadd_cpx_vector((int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
+          shift_rot,
+          (int16_t *)&rxdataF[frame_parms->ofdm_symbol_size*symbol],
+          1,
+          length,
+          15);
   }
 }
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index e942ef2c6b52a57b2b520dd405e98b5d03c65943..57470cf98864fb73643f7c1489b89208d5175e04 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -39,23 +39,22 @@ extern openair0_config_t openair0_cfg[MAX_CARDS];
 
 int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
 {
-  int i, aa, max_pos = 0, max_val = 0;
-  
+  int max_pos = 0, max_val = 0;
+
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
   NR_gNB_PUSCH *gNB_pusch_vars   = gNB->pusch_vars[UE_id];
   int32_t **ul_ch_estimates_time = gNB_pusch_vars->ul_ch_estimates_time;
-  
-  int sync_pos = frame_parms->nb_prefix_samples / 8;
 
-  for (i = 0; i < frame_parms->ofdm_symbol_size; i++) {
+  const int sync_pos = 0;
+
+  for (int i = 0; i < frame_parms->ofdm_symbol_size; i++) {
     int temp = 0;
 
-    for (aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
-      short Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
-      short Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
+    for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
+      int Re = ((int16_t*)ul_ch_estimates_time[aa])[(i<<1)];
+      int Im = ((int16_t*)ul_ch_estimates_time[aa])[1+(i<<1)];
       temp += (Re*Re/2) + (Im*Im/2);      
     }
-
     if (temp > max_val) {
       max_pos = i;
       max_val = temp;
@@ -65,7 +64,6 @@ int nr_est_timing_advance_pusch(PHY_VARS_gNB* gNB, int UE_id)
   if (max_pos > frame_parms->ofdm_symbol_size/2)
     max_pos = max_pos - frame_parms->ofdm_symbol_size;
 
-
   return max_pos - sync_pos;
 }
 
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 8f9a7a5edf9aef3cfa913b0584ead28b9c05e012..960ad826969403ee723b3a88228762798e6b114b 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -31,11 +31,13 @@
 #include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
 
 #include "PHY/NR_REFSIG/ul_ref_seq_nr.h"
+#include "executables/softmodem-common.h"
 
 
 //#define DEBUG_CH
 //#define DEBUG_PUSCH
 
+#define NO_INTERP 1
 #define dBc(x,y) (dB_fixed(((int32_t)(x))*(x) + ((int32_t)(y))*(y)))
 
 int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
@@ -187,8 +189,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 #endif
     //if ((gNB->frame_parms.N_RB_UL&1)==0) {
 
-    if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1){
-
+    if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1 && gNB->prb_interpolation == 0){
+      LOG_D(PHY,"PUSCH estimation DMRS type 1, Freq-domain interpolation");
       // Treat first 2 pilots specially (left edge)
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -212,7 +214,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ch,
                                          ul_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //for (int i= 0; i<8; i++)
@@ -243,7 +245,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ch,
                                          ul_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //printf("ul_ch addr %p\n",ul_ch);
@@ -277,12 +279,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       //for (int i= 0; i<16; i++)
       //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
       
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      ul_ch+=8;
+      ul_ch += 8;
 
-      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt+=2) {
+      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pusch-3); pilot_cnt += 2) {
 
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -295,7 +297,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                            ch,
                                            ul_ch,
                                            8);
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         //printf("ul_ch addr %p\n",ul_ch);
@@ -315,10 +317,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         //for (int i= 0; i<16; i++)
         //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-        ul_ch+=8;
+        ul_ch += 8;
 
       }
       
@@ -337,7 +339,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       //for (int i= 0; i<8; i++)
       //printf("ul_ch addr %p %d\n", ul_ch+i, *(ul_ch+i));
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
              
@@ -353,10 +355,10 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                          ul_ch,
                                          8);
                                          
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      ul_ch+=8;
+      ul_ch += 8;
       
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -425,15 +427,15 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 #ifdef DEBUG_PUSCH
       ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
       for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
-        for(uint8_t idxI=0; idxI<16; idxI+=2) {
+        for(uint8_t idxI=0; idxI<16; idxI += 2) {
           printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]);
         }
         printf("%d\n",idxP);
       }
 #endif    
     }
-    else { //pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
-
+    else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && gNB->prb_interpolation == 0) { //pusch_dmrs_type2  |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
+      LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation");
       // Treat first DMRS specially (left edge)
 
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
@@ -441,12 +443,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ul_ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ul_ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-        pil+=2;
-        ul_ch+=2;
+        pil += 2;
+        ul_ch += 2;
         re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size;
         ch_offset++;
 
-        for (re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt+=6){
+        for (re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt += 6){
 
           rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
 
@@ -456,8 +458,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
           ul_ch[0] = ch_l[0];
           ul_ch[1] = ch_l[1];
 
-          pil+=2;
-          ul_ch+=2;
+          pil += 2;
+          ul_ch += 2;
           ch_offset++;
 
           multadd_real_four_symbols_vector_complex_scalar(filt8_ml2,
@@ -476,17 +478,17 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                                           ch_r,
                                                           ul_ch);
 
-          //for (int re_idx = 0; re_idx < 8; re_idx+=2)
+          //for (int re_idx = 0; re_idx < 8; re_idx += 2)
             //printf("ul_ch = %d + j*%d\n", ul_ch[re_idx], ul_ch[re_idx+1]);
 
-          ul_ch+=8;
-          ch_offset+=4;
+          ul_ch += 8;
+          ch_offset += 4;
 
           ul_ch[0] = ch_r[0];
           ul_ch[1] = ch_r[1];
 
-          pil+=2;
-          ul_ch+=2;
+          pil += 2;
+          ul_ch += 2;
           ch_offset++;
           re_offset = (re_offset + 1)%gNB->frame_parms.ofdm_symbol_size;
 
@@ -502,7 +504,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ul_ch[0] = ch_l[0];
         ul_ch[1] = ch_l[1];
 
-        ul_ch+=2;
+        ul_ch += 2;
         ch_offset++;
 
         multadd_real_four_symbols_vector_complex_scalar(filt8_rr1,
@@ -518,6 +520,385 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ul_ch_128[0] = _mm_slli_epi16 (ul_ch_128[0], 2);
     }
 
+    else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) {// this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
+      LOG_D(PHY,"PUSCH estimation DMRS type 1, no Freq-domain interpolation");
+      int32_t ch_0, ch_1;
+      // First PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+
+
+
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         ul_ch,
+                                         8);
+      ul_ch -= 24;
+#endif
+
+      for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pusch-1); pilot_cnt += 6) {
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 6;
+        ch[1] = ch_1 / 6;
+
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
+        ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        ul_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           ul_ch,
+                                           8);
+        ul_ch -= 16;
+#endif
+      }
+      // Last PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+#if NO_INTERP
+      for (int i=0;i<12;i++) ((int32_t*)ul_ch)[i] = *(int32_t*)ch;
+      ul_ch+=24;
+#else
+      ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      ul_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         ul_ch,
+                                         8);
+#endif
+    }
+    else  { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
+      LOG_D(PHY,"PUSCH estimation DMRS type 2, no Freq-domain interpolation");
+      int32_t ch_0, ch_1;
+      //First PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         ul_ch,
+                                         8);
+      ul_ch -= 24;
+
+      for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pusch-1); pilot_cnt += 4) {
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 4;
+        ch[1] = ch_1 / 4;
+
+        ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        ul_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           ul_ch,
+                                           8);
+
+        ul_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           ul_ch,
+                                           8);
+        ul_ch -= 16;
+      }
+      // Last PRB
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % gNB->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      ul_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      ul_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      ul_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         ul_ch,
+                                         8);
+
+      ul_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         ul_ch,
+                                         8);
+    }
+#ifdef DEBUG_PUSCH
+    ul_ch = (int16_t *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
+    for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pusch*12/8); idxP++) {
+      for(uint8_t idxI=0; idxI<16; idxI += 2) {
+        printf("%d\t%d\t",ul_ch[idxP*16+idxI],ul_ch[idxP*16+idxI+1]);
+      }
+      printf("%d\n",idxP);
+    }
+#endif
 
     // Convert to time domain
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index 000348ae8728ef2fd2656f86db9ba317c827c5a6..4e2fbd4e715d05639ff011e5833c6247bf277194 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -174,7 +174,11 @@ void rx_nr_prach_ru(RU_t *ru,
 
   int msg1_frequencystart   = ru->config.prach_config.num_prach_fd_occasions_list[numRA].k1.value;
 
-  int sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  int sample_offset_slot;
+  if (!(slot%(fp->slots_per_subframe/2)))
+    sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  else
+    sample_offset_slot = (prachStartSymbol==0?0:prachStartSymbol*(fp->ofdm_symbol_size+fp->nb_prefix_samples));
   //to be checked for mu=0;
 
   LOG_D(PHY,"frame %d, slot %d: doing rx_nr_prach_ru for format %d, numRA %d, prachStartSymbol %d, prachOccasion %d\n",frame,slot,prachFormat,numRA,prachStartSymbol,prachOccasion);
diff --git a/openair1/PHY/NR_TRANSPORT/pucch_rx.c b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
index 1524c840c3458dc3a077123feb2f5b45af7c2668..e3b87ff233c3d9bdac5f5d461f2076b60a7aa60f 100644
--- a/openair1/PHY/NR_TRANSPORT/pucch_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/pucch_rx.c
@@ -48,6 +48,8 @@
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 
+#include "nfapi/oai_integration/vendor_ext.h"
+
 #include "T.h"
 
 //#define DEBUG_NR_PUCCH_RX 1
@@ -1437,7 +1439,7 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
 	  corr_tmp += corr_re*corr_re + corr_im*corr_im;	
 	} // aa loop
       }// group loop
-
+      LOG_D(PHY,"cw %d, metric %f dB\n",cw,10*log10(corr_tmp));
       if (corr_tmp > corr) {
 	corr = corr_tmp;
 	cw_ML=cw;
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index 990f3101fd181b42686e4faa044fa9af7c788097..65ae28825201321ced5139d9bc785e2284f1f076 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -239,3 +239,24 @@ short filt8_dcll2[8] = {
 
 short filt8_dclh2[8] = {
 0,0,0,0,1489,2979,4468,5958};
+
+short filt8_avlip0[8] = {
+16384,16384,16384,16384,16384,16384,16384,15019};
+
+short filt8_avlip1[8] = {
+13653,12288,10923,9557,8192,6827,5461,4096};
+
+short filt8_avlip2[8] = {
+2731,1365,0,0,0,0,0,0};
+
+short filt8_avlip3[8] = {
+2731,4096,5461,6827,8192,9557,10923,12288};
+
+short filt8_avlip4[8] = {
+13653,15019,16384,15019,13653,12288,10923,9557};
+
+short filt8_avlip5[8] = {
+8192,6827,5461,4096,2731,1365,0,0};
+
+short filt8_avlip6[8] = {
+13653,15019,16384,16384,16384,16384,16384,16384};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index ef6137a07f161e79ab97ea37a2b0061e73f6a4d1..e28736b51daf45dc7c133f1f210d46c89abfd571 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -169,4 +169,17 @@ extern short filt8_dcll2[8];
 
 extern short filt8_dclh2[8];
 
-#endif
\ No newline at end of file
+extern short filt8_avlip0[8];
+
+extern short filt8_avlip1[8];
+
+extern short filt8_avlip2[8];
+
+extern short filt8_avlip3[8];
+
+extern short filt8_avlip4[8];
+
+extern short filt8_avlip5[8];
+
+extern short filt8_avlip6[8];
+#endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
index a2f824e4686e70226b8e96478b7db1229b7a3053..3908febae9bf2531e941e18777bcd8154b1ede72 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_adjust_synch_ue.c
@@ -45,25 +45,23 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
   static int max_pos_fil = 0;
   static int count_max_pos_ok = 0;
   static int first_time = 1;
-  int temp = 0, i, aa, max_val = 0, max_pos = 0;
-  int diff;
-  short Re,Im,ncoef;
+  int max_val = 0, max_pos = 0;
+  const int sync_pos = 0;
   uint8_t sync_offset = 0;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
 
-  ncoef = 32767 - coef;
+  short ncoef = 32767 - coef;
 
   LOG_D(PHY,"AbsSubframe %d: rx_offset (before) = %d\n",subframe,ue->rx_offset);
 
-
   // we only use channel estimates from tx antenna 0 here
-  for (i = 0; i < frame_parms->nb_prefix_samples; i++) {
-    temp = 0;
+  for (int i = 0; i < frame_parms->nb_prefix_samples; i++) {
+    int temp = 0;
 
-    for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
-      Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
-      Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
+    for (int aa = 0; aa < frame_parms->nb_antennas_rx; aa++) {
+      int Re = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[(i<<1)];
+      int Im = ((int16_t*)ue->pbch_vars[gNB_id]->dl_ch_estimates_time[aa])[1+(i<<1)];
       temp += (Re*Re/2) + (Im*Im/2);
     }
 
@@ -73,6 +71,9 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
     }
   }
 
+  if (max_pos > frame_parms->ofdm_symbol_size/2)
+    max_pos = max_pos - frame_parms->ofdm_symbol_size;
+
   // filter position to reduce jitter
   if (clear == 1)
     max_pos_fil = max_pos;
@@ -82,61 +83,58 @@ void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
   // do not filter to have proactive timing adjustment
   //max_pos_fil = max_pos;
 
-      diff = max_pos_fil - (frame_parms->nb_prefix_samples>>3);
-
-      if (frame_parms->freq_range==nr_FR2) 
-		sync_offset = 2;
-      else
-		sync_offset = 0;
-	
-      if ( abs(diff) < (SYNCH_HYST+sync_offset) )
-          ue->rx_offset = 0;
-      else
-          ue->rx_offset = diff;
-
-      if(abs(diff)<5)
-          count_max_pos_ok ++;
-      else
-          count_max_pos_ok = 0;
-          
-      //printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok);
-
-      if(count_max_pos_ok > 10 && first_time == 1)
-      {
-          first_time = 0;
-          ue->time_sync_cell = 1;
-          if (get_softmodem_params()->do_ra || get_softmodem_params()->sa) {
-              LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
-              //mac_resynch();
-              //dl_phy_sync_success(ue->Mod_id,frame,0,1);//ue->common_vars.eNb_id);
-              ue->UE_mode[0] = PRACH;
-              ue->prach_resources[gNB_id]->sync_frame = frame;
-              ue->prach_resources[gNB_id]->init_msg1 = 0;
-          } else {
-              ue->UE_mode[0] = PUSCH;
-          }
-      }
-
-      if (ue->rx_offset < 0)
-        ue->rx_offset += frame_parms->samples_per_frame;
-
-      if (ue->rx_offset >= frame_parms->samples_per_frame)
-        ue->rx_offset -= frame_parms->samples_per_frame;
-
-
-
-      #ifdef DEBUG_PHY
-      LOG_D(PHY,"AbsSubframe %d: diff =%i rx_offset (final) = %i : clear %d,max_pos = %d,max_pos_fil = %d (peak %d) max_val %d target_pos %d \n",
-              subframe,
-              diff,
-              ue->rx_offset,
-              clear,
-              max_pos,
-              max_pos_fil,
-              temp,max_val,
-              (frame_parms->nb_prefix_samples>>3));
-      #endif //DEBUG_PHY
-
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
+  int diff = max_pos_fil - sync_pos;
+
+  if (frame_parms->freq_range==nr_FR2) 
+    sync_offset = 2;
+  else
+    sync_offset = 0;
+
+  if ( abs(diff) < (SYNCH_HYST+sync_offset) )
+    ue->rx_offset = 0;
+  else
+    ue->rx_offset = diff;
+
+  if(abs(diff)<5)
+    count_max_pos_ok ++;
+  else
+    count_max_pos_ok = 0;
+      
+  //printf("adjust sync count_max_pos_ok = %d\n",count_max_pos_ok);
+
+  if(count_max_pos_ok > 10 && first_time == 1)
+  {
+    first_time = 0;
+    ue->time_sync_cell = 1;
+    if (get_softmodem_params()->do_ra || get_softmodem_params()->sa) {
+      LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
+      //mac_resynch();
+      //dl_phy_sync_success(ue->Mod_id,frame,0,1);//ue->common_vars.eNb_id);
+      ue->UE_mode[0] = PRACH;
+      ue->prach_resources[gNB_id]->sync_frame = frame;
+      ue->prach_resources[gNB_id]->init_msg1 = 0;
+    } else {
+      ue->UE_mode[0] = PUSCH;
+    }
+  }
 
+  if (ue->rx_offset < 0)
+    ue->rx_offset += frame_parms->samples_per_frame;
+
+  if (ue->rx_offset >= frame_parms->samples_per_frame)
+    ue->rx_offset -= frame_parms->samples_per_frame;
+
+#ifdef DEBUG_PHY
+  LOG_D(PHY,"AbsSubframe %d: diff = %i, rx_offset (final) = %i : clear = %d, max_pos = %d, max_pos_fil = %d, max_val = %d, sync_pos %d\n",
+        subframe,
+        diff,
+        ue->rx_offset,
+        clear,
+        max_pos,
+        max_pos_fil,
+        max_val,
+        sync_pos);
+#endif //DEBUG_PHY
+
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
 }
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index e4a82e7021fe1603df0d447d92979aad79f56163..8097b9b3ea12b3d4fa6b6c06941d21ea39b08ea6 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -94,15 +94,15 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
     ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-    current_ssb->c_re +=ch[0];
-    current_ssb->c_im +=ch[1];
+    current_ssb->c_re += ch[0];
+    current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
     printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
     printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -110,29 +110,29 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
     ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-    current_ssb->c_re +=ch[0];
-    current_ssb->c_im +=ch[1];
+    current_ssb->c_re += ch[0];
+    current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
     printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
-    current_ssb->c_re +=ch[0];
-    current_ssb->c_im +=ch[1];
+    current_ssb->c_re += ch[0];
+    current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
     printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
-    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) {
+    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt += 3) {
 
       //	if (pilot_cnt == 30)
       //	  rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k)];
@@ -146,14 +146,14 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
       
-      current_ssb->c_re +=ch[0];
-      current_ssb->c_im +=ch[1];
+      current_ssb->c_re += ch[0];
+      current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -161,13 +161,13 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-      current_ssb->c_re +=ch[0];
-      current_ssb->c_im +=ch[1];
+      current_ssb->c_re += ch[0];
+      current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -175,14 +175,14 @@ int nr_pbch_dmrs_correlation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-      current_ssb->c_re +=ch[0];
-      current_ssb->c_im +=ch[1];
+      current_ssb->c_re += ch[0];
+      current_ssb->c_im += ch[1];
 
 #ifdef DEBUG_CH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -287,7 +287,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
     printf("rxF addr %p\n", rxF);
     printf("dl_ch addr %p\n",dl_ch);
 #endif
-    //if ((ue->frame_parms.N_RB_DL&1)==0) {
 
     // Treat first 2 pilots specially (left edge)
     ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -301,7 +300,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       ch,
 				       dl_ch,
 				       16);
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -319,7 +318,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       ch,
 				       dl_ch,
 				       16);
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
 
@@ -334,12 +333,12 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 				       ch,
 				       dl_ch,
 				       16);
-    pil+=2;
+    pil += 2;
     re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-    dl_ch+=24;
+    dl_ch += 24;
 
-    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt+=3) {
+    for (pilot_cnt=3; pilot_cnt<(3*20); pilot_cnt += 3) {
 
       //	if (pilot_cnt == 30)
       //	  rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k)];
@@ -365,7 +364,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
       //for (int i= 0; i<8; i++)
       //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -380,7 +379,7 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 					 ch,
 					 dl_ch,
 					 16);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
         
@@ -396,10 +395,10 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
 					 ch,
 					 dl_ch,
 					 16);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+re_offset)];
-      dl_ch+=24;
+      dl_ch += 24;
 
     }
 
@@ -458,8 +457,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
         }
     }
 
-    //}
-
   }
   return(0);
 }
@@ -526,111 +523,111 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
     printf("dl_ch addr %p\n",dl_ch);
 #endif
     //    if ((ue->frame_parms.N_RB_DL&1)==0) {
-      // Treat first 2 pilots specially (left edge)
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+    // Treat first 2 pilots specially (left edge)
+    ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+    ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-      printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
-      printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+    printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
+    printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
 #endif
-      multadd_real_vector_complex_scalar(fl,
-                                         ch,
-                                         dl_ch,
-                                         16);
-      pil+=2;
-      rxF+=8;
-      //for (int i= 0; i<8; i++)
-      //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
+    multadd_real_vector_complex_scalar(fl,
+				       ch,
+				       dl_ch,
+				       16);
+    pil += 2;
+    rxF += 8;
+    //for (int i= 0; i<8; i++)
+    //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
 
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+    ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+    ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-      printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+    printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-      multadd_real_vector_complex_scalar(fm,
-                                         ch,
-                                         dl_ch,
-                                         16);
-      pil+=2;
-      rxF+=8;
+    multadd_real_vector_complex_scalar(fm,
+				       ch,
+				       dl_ch,
+				       16);
+    pil += 2;
+    rxF += 8;
 
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+    ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+    ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
 #ifdef DEBUG_PDCCH
-      printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+    printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-      multadd_real_vector_complex_scalar(fr,
-                                         ch,
-                                         dl_ch,
-                                         16);
+    multadd_real_vector_complex_scalar(fr,
+				       ch,
+				       dl_ch,
+				       16);
                                          
 #ifdef DEBUG_PDCCH       
-      for (int m =0; m<12; m++)
-	printf("data :  dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]);
+    for (int m =0; m<12; m++)
+      printf("data :  dl_ch -> (%d,%d)\n",dl_ch[0+2*m],dl_ch[1+2*m]);
 #endif      
-      pil+=2;
-      rxF+=8;
-      dl_ch+=24;
-      k+=12;
+    pil += 2;
+    rxF += 8;
+    dl_ch += 24;
+    k += 12;
       
       
 
-      for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt+=3) {
+    for (pilot_cnt=3; pilot_cnt<(3*nb_rb_coreset); pilot_cnt += 3) {
 
-        if (k >= ue->frame_parms.ofdm_symbol_size){
-	  k-=ue->frame_parms.ofdm_symbol_size;
-	  rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];}
+      if (k >= ue->frame_parms.ofdm_symbol_size){
+	k-=ue->frame_parms.ofdm_symbol_size;
+	rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+1)];}
 
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-        multadd_real_vector_complex_scalar(fl,
-                                           ch,
-                                           dl_ch,
-                                           16);
+      multadd_real_vector_complex_scalar(fl,
+					 ch,
+					 dl_ch,
+					 16);
 
-        //for (int i= 0; i<8; i++)
-        //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
+      //for (int i= 0; i<8; i++)
+      //            printf("pilot_cnt %d dl_ch %d %d\n", pilot_cnt, dl_ch+i, *(dl_ch+i));
 
-        pil+=2;
-        rxF+=8;
+      pil += 2;
+      rxF += 8;
 
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDCCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
-        multadd_real_vector_complex_scalar(fm,
-                                           ch,
-                                           dl_ch,
-                                           16);
-        pil+=2;
-        rxF+=8;
+      multadd_real_vector_complex_scalar(fm,
+					 ch,
+					 dl_ch,
+					 16);
+      pil += 2;
+      rxF += 8;
 
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
 #ifdef DEBUG_PDCCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
 
-        multadd_real_vector_complex_scalar(fr,
-                                           ch,
-                                           dl_ch,
-                                           16);
-        pil+=2;
-        rxF+=8;
-        dl_ch+=24;
-        k+=12;
+      multadd_real_vector_complex_scalar(fr,
+					 ch,
+					 dl_ch,
+					 16);
+      pil += 2;
+      rxF += 8;
+      dl_ch += 24;
+      k += 12;
 
-      }
+    }
 
 
-      //}
+    //}
 
   }
 
@@ -653,7 +650,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
   unsigned short k;
   unsigned int pilot_cnt;
   int16_t ch_l[2],ch_r[2],ch[2],*pil,*rxF,*dl_ch;
-  int16_t *fl,*fm,*fr,*fml,*fmr,*fmm,*fdcl,*fdcr,*fdclh,*fdcrh, *frl, *frr;
+  int16_t *fl=NULL,*fm=NULL,*fr=NULL,*fml=NULL,*fmr=NULL,*fmm=NULL,*fdcl=NULL,*fdcr=NULL,*fdclh=NULL,*fdcrh=NULL, *frl=NULL, *frr=NULL;
   int ch_offset,symbol_offset;
 
   NR_UE_DLSCH_t  **dlsch = ue->dlsch[proc->thread_id][gNB_id];
@@ -698,99 +695,97 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
     if (p<4) ue->frame_parms.nushift = nushift;
     switch (delta) {
 
-      case 0://port 0,1
-        fl = filt8_l0;//left interpolation Filter for DMRS config. 1
-        fm = filt8_m0;//left middle interpolation Filter
-        fr = filt8_r0;//right interpolation Filter
-        fmm = filt8_mm0;;//middle middle interpolation Filter
-        fml = filt8_m0;//left middle interpolation Filter
-        fmr = filt8_mr0;//middle right interpolation Filter
-        fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
-        fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
-        fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
-        fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
-        frl = NULL;
-        frr = NULL;
-        break;
-
-      case 1://port2,3
-        fl = filt8_l1;
-        fm = filt8_m1;
-        fr = filt8_r1;
-        fmm = filt8_mm1;
-        fml = filt8_ml1;
-        fmr = filt8_m1;
-        fdcl = filt8_dcl1;
-        fdcr = filt8_dcr1;
-        fdclh = filt8_dcl1_h;
-        fdcrh = filt8_dcr1_h;
-        frl = NULL;
-        frr = NULL;
-        break;
-
-      default:
-        msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
-        return -1;
-        break;
+    case 0://port 0,1
+      fl = filt8_l0;//left interpolation Filter for DMRS config. 1
+      fm = filt8_m0;//left middle interpolation Filter
+      fr = filt8_r0;//right interpolation Filter
+      fmm = filt8_mm0;;//middle middle interpolation Filter
+      fml = filt8_m0;//left middle interpolation Filter
+      fmr = filt8_mr0;//middle right interpolation Filter
+      fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
+      fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
+      fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
+      fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
+      frl = NULL;
+      frr = NULL;
+      break;
+
+    case 1://port2,3
+      fl = filt8_l1;
+      fm = filt8_m1;
+      fr = filt8_r1;
+      fmm = filt8_mm1;
+      fml = filt8_ml1;
+      fmr = filt8_m1;
+      fdcl = filt8_dcl1;
+      fdcr = filt8_dcr1;
+      fdclh = filt8_dcl1_h;
+      fdcrh = filt8_dcr1_h;
+      frl = NULL;
+      frr = NULL;
+      break;
+
+    default:
+      LOG_E(PHY,"pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+      return -1;
+      break;
     }
   } else {//NFAPI_NR_DMRS_TYPE2
     nushift = delta;
     if (p<6) ue->frame_parms.nushift = nushift;
     switch (delta) {
-      case 0://port 0,1
-        fl = filt8_l2;//left interpolation Filter should be fml
-        fr = filt8_r2;//right interpolation Filter should be fmr
-        fm = filt8_l2;
-        fmm = filt8_r2;
-        fml = filt8_ml2;
-        fmr = filt8_mr2;
-        frl = filt8_rl2;
-        frr = filt8_rm2;
-        fdcl = filt8_dcl1;
-        fdcr = filt8_dcr1;
-        fdclh = filt8_dcl1_h;
-        fdcrh = filt8_dcr1_h;
-        break;
-
-      case 2://port2,3
-        fl = filt8_l3;
-        fm = filt8_m2;
-        fr = filt8_r3;
-        fmm = filt8_mm2;
-        fml = filt8_l2;
-        fmr = filt8_r2;
-        frl = filt8_rl3;
-        frr = filt8_rr3;
-        fdcl = NULL;
-        fdcr = NULL;
-        fdclh = NULL;
-        fdcrh = NULL;
-        break;
-
-      default:
-        msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
-        return -1;
-        break;
+    case 0://port 0,1
+      fl = filt8_l2;//left interpolation Filter should be fml
+      fr = filt8_r2;//right interpolation Filter should be fmr
+      fm = filt8_l2;
+      fmm = filt8_r2;
+      fml = filt8_ml2;
+      fmr = filt8_mr2;
+      frl = filt8_rl2;
+      frr = filt8_rm2;
+      fdcl = filt8_dcl1;
+      fdcr = filt8_dcr1;
+      fdclh = filt8_dcl1_h;
+      fdcrh = filt8_dcr1_h;
+      break;
+
+    case 2://port2,3
+      fl = filt8_l3;
+      fm = filt8_m2;
+      fr = filt8_r3;
+      fmm = filt8_mm2;
+      fml = filt8_l2;
+      fmr = filt8_r2;
+      frl = filt8_rl3;
+      frr = filt8_rr3;
+      fdcl = NULL;
+      fdcr = NULL;
+      fdclh = NULL;
+      fdcrh = NULL;
+      break;
+
+    default:
+      LOG_E(PHY,"pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+      return -1;
+      break;
     }
   }
 
   for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
-    pil   = (int16_t *)&pilot[rb_offset*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4)];
+    pil   = (int16_t *)&pilot[rb_offset*((config_type == NFAPI_NR_DMRS_TYPE1) ? 6:4)];
     k     = k % ue->frame_parms.ofdm_symbol_size;
     re_offset = k;
     rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+re_offset+nushift)];
     dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
 
     memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
-
 #ifdef DEBUG_PDSCH
     printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], ue->frame_parms.N_RB_DL);
     printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset);
     printf("rxF addr %p p %d\n", rxF,p);
     printf("dl_ch addr %p nushift %d\n",dl_ch,nushift);
 #endif
-
-    if (config_type == NFAPI_NR_DMRS_TYPE1) {
+    if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->prb_interpolation == 0) {
 
       // Treat first 2 pilots specially (left edge)
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -804,7 +799,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          ch,
                                          dl_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //for (int i= 0; i<8; i++)
@@ -819,7 +814,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          ch,
                                          dl_ch,
                                          8);
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       //printf("dl_ch addr %p\n",dl_ch);
@@ -834,18 +829,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
                                          
-      //for (int i= 0; i<16; i++)
-      //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
-      
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      dl_ch+=8;
+      dl_ch += 8;
 
-      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pdsch-3); pilot_cnt+=2) {
-    	//if ((pilot_cnt%6)==0)
-    		//dl_ch+=4;
-		//printf("re_offset %d\n",re_offset);
+      for (pilot_cnt=3; pilot_cnt<(6*nb_rb_pdsch-3); pilot_cnt += 2) {
 
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -857,7 +846,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       
@@ -870,10 +859,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            ch,
                                            dl_ch,
                                            8);
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-        dl_ch+=8;
+        dl_ch += 8;
 
       }
       
@@ -881,7 +870,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PDSCH
-	printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
 #endif
       multadd_real_vector_complex_scalar(fm,
                                          ch,
@@ -891,7 +880,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       //for (int i= 0; i<8; i++)
       //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
              
@@ -906,10 +895,10 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
                                          
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      dl_ch+=8;
+      dl_ch += 8;
       
       ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
@@ -921,59 +910,59 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
     
-    // check if PRB crosses DC and improve estimates around DC
-    if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
-      dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
-      uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
-      uint16_t idxPil = idxDC/2;
-      re_offset = k;
-      pil = (int16_t *)&pilot[rb_offset*((config_type==NFAPI_NR_DMRS_TYPE1) ? 6:4)];
-      pil += (idxPil-2);
-      dl_ch += (idxDC-4);
-      dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
-      re_offset = (re_offset+idxDC/2-2) % ue->frame_parms.ofdm_symbol_size;
-      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-      
-      // for proper allignment of SIMD vectors
-      if((ue->frame_parms.N_RB_DL&1)==0) {
-        
-        multadd_real_vector_complex_scalar(fdcl,
-                                           ch,
-                                           dl_ch-4,
-                                           8);
-        
-        pil += 4;
-        re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
+      // check if PRB crosses DC and improve estimates around DC
+      if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
+        dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
+        uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
+        uint16_t idxPil = idxDC/2;
+        re_offset = k;
+        pil = (int16_t *)&pilot[rb_offset*((config_type == NFAPI_NR_DMRS_TYPE1) ? 6:4)];
+        pil += (idxPil-2);
+        dl_ch += (idxDC-4);
+        dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
+        re_offset = (re_offset+idxDC/2-2) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-        
-        multadd_real_vector_complex_scalar(fdcr,
-                                           ch,
-                                           dl_ch-4,
-                                           8);
-      } else {
+          
+        // for proper allignment of SIMD vectors
+        if((ue->frame_parms.N_RB_DL&1) == 0) {
+              
+          multadd_real_vector_complex_scalar(fdcl,
+                     ch,
+                     dl_ch-4,
+                     8);
+              
+          pil += 4;
+          re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
+          rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+          ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+          ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+              
+          multadd_real_vector_complex_scalar(fdcr,
+                     ch,
+                     dl_ch-4,
+                     8);
+        } else {
 
-        multadd_real_vector_complex_scalar(fdclh,
-                                           ch,
-                                           dl_ch,
-                                           8);
-        
-        pil += 4;
-        re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
-        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
-        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
-        
-        multadd_real_vector_complex_scalar(fdcrh,
-                                           ch,
-                                           dl_ch,
-                                           8);
+          multadd_real_vector_complex_scalar(fdclh,
+                     ch,
+                     dl_ch,
+                     8);
+              
+          pil += 4;
+          re_offset = (re_offset+4) % ue->frame_parms.ofdm_symbol_size;
+          rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+          ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+          ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+              
+          multadd_real_vector_complex_scalar(fdcrh,
+                     ch,
+                     dl_ch,
+                     8);
+        }
       }
-    }
-    } else { //NFAPI_NR_DMRS_TYPE2  |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
+    } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->prb_interpolation == 0){ //pdsch_dmrs_type2  |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
 
       // Treat first 4 pilots specially (left edge)
       ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -984,7 +973,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
       printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch_l[0],ch_l[1],pil[0],pil[1]);
 #endif
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1003,13 +992,13 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
       ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-      pil+=2;
+      pil += 2;
       re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
       rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
       ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1023,20 +1012,20 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                          dl_ch,
                                          8);
 
-      dl_ch+=12;
+      dl_ch += 12;
       dl_ch[0+2*nushift] = ch[0];
       dl_ch[1+2*nushift] = ch[1];
       dl_ch[2+2*nushift] = ch[0];
       dl_ch[3+2*nushift] = ch[1];
-      dl_ch+=4;
+      dl_ch += 4;
 
-      for (pilot_cnt=4; pilot_cnt<4*nb_rb_pdsch; pilot_cnt+=4) {
+      for (pilot_cnt=4; pilot_cnt<4*nb_rb_pdsch; pilot_cnt += 4) {
 
         multadd_real_vector_complex_scalar(fml,
                                            ch,
                                            dl_ch,
                                            8);
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1046,7 +1035,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch_l[0],ch_l[1],pil[0],pil[1]);
 #endif
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1064,7 +1053,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        dl_ch+=8;
+        dl_ch += 8;
         dl_ch[0+2*nushift] = ch[0];
         dl_ch[1+2*nushift] = ch[1];
         dl_ch[2+2*nushift] = ch[0];
@@ -1075,13 +1064,13 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_l[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
         ch_l[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
-        pil+=2;
+        pil += 2;
         re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
         rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
         ch_r[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
@@ -1099,12 +1088,12 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
                                            dl_ch,
                                            8);
 
-        dl_ch+=12;
+        dl_ch += 12;
         dl_ch[0+2*nushift] = ch[0];
         dl_ch[1+2*nushift] = ch[1];
         dl_ch[2+2*nushift] = ch[0];
         dl_ch[3+2*nushift] = ch[1];
-        dl_ch+=4;
+        dl_ch += 4;
       }
 
       // Treat last 2 pilots specially (right edge)
@@ -1136,7 +1125,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         ch_l[1]= dl_ch[1] ;
 
         // for proper allignment of SIMD vectors
-        if((ue->frame_parms.N_RB_DL&1)==0) {
+        if((ue->frame_parms.N_RB_DL&1) == 0) {
           dl_ch -= 20;
           //Interpolate fdcrl1 with ch_r
           multadd_real_vector_complex_scalar(filt8_dcrl1,
@@ -1185,11 +1174,359 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
         }
       }
     }
+    else if (config_type == NFAPI_NR_DMRS_TYPE1) { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
+      int32_t ch_0, ch_1;
+      
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      dl_ch -= 24;
+
+      for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt += 6) {
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 6;
+        ch[1] = ch_1 / 6;
+        dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        dl_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           dl_ch,
+                                           8);
+        dl_ch -= 16;
+      }
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 6;
+      ch[1] = ch_1 / 6;
+
+      dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      dl_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         dl_ch,
+                                         8);
+    }
+    else  { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
+      int32_t ch_0, ch_1;
+
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
 
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      multadd_real_vector_complex_scalar(filt8_avlip0,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip1,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip2,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      dl_ch -= 24;
+
+      for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pdsch-1); pilot_cnt += 4) {
+        int32_t ch_0, ch_1;
+
+        ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+        ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+        pil += 2;
+        re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+        rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+        ch[0] = ch_0 / 4;
+        ch[1] = ch_1 / 4;
+
+        dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+        dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+        dl_ch += 8;
+        multadd_real_vector_complex_scalar(filt8_avlip3,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip4,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        dl_ch += 16;
+        multadd_real_vector_complex_scalar(filt8_avlip5,
+                                           ch,
+                                           dl_ch,
+                                           8);
+        dl_ch -= 16;
+      }
+
+      ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
+      ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
+
+      pil += 2;
+      re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
+      rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
+
+      ch[0] = ch_0 / 4;
+      ch[1] = ch_1 / 4;
+
+      dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
+      dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
+
+      dl_ch += 8;
+      multadd_real_vector_complex_scalar(filt8_avlip3,
+                                         ch,
+                                         dl_ch,
+                                         8);
+
+      dl_ch += 16;
+      multadd_real_vector_complex_scalar(filt8_avlip6,
+                                         ch,
+                                         dl_ch,
+                                         8);
+    }
 #ifdef DEBUG_PDSCH
     dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
     for(uint16_t idxP=0; idxP<ceil((float)nb_rb_pdsch*12/8); idxP++) {
-      for(uint8_t idxI=0; idxI<16; idxI+=2) {
+      for(uint8_t idxI=0; idxI<16; idxI += 2) {
         printf("%d\t%d\t",dl_ch[idxP*16+idxI],dl_ch[idxP*16+idxI+1]);
       }
       printf("%d\n",idxP);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index cadb4954c093cfd260640be1f26b1bb389ec1c9f..a4d4daed70a65d7337071f1586781fbf87306131 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -992,6 +992,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
       }
     }
   }
+  pdcch_vars->nb_search_space = 0;
   return(dci_ind->number_of_dcis);
 }
 
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index 34eb29d4f1eaf498c6f725e8e737da45508dba90..eae4a2eaa70f14e89e6d70674032432eab79c665 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -445,8 +445,6 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
           //LOG_I(PHY, "avgs Power per SC is %d\n", avgs);
           median[(aatx*frame_parms->nb_antennas_rx)+aarx] = avg[(aatx*frame_parms->nb_antennas_rx)+aarx];
         }
-      pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
-      //LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs,  pdsch_vars[gNB_id]->log2_maxh);
 
       if (dlsch0_harq->mimo_mode == NR_DUALSTREAM) {
         nr_dlsch_channel_level_median(pdsch_vars[gNB_id]->dl_ch_estimates_ext,
@@ -461,8 +459,10 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
             avgs = cmax(avgs, median[aatx*n_rx + aarx]);
           }
         }
-        pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
       }
+
+      pdsch_vars[gNB_id]->log2_maxh = (log2_approx(avgs)/2) + 1;
+      //LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs,  pdsch_vars[gNB_id]->log2_maxh);
     }
     LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d [log2_maxh0 %d log2_maxh1 %d] (%d,%d)\n",
           frame%1024,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
index e7cf3c15a913a3127a1516c9a80fc583d09f62b9..24299fd788f9373c39bed13bc9c47bd8d2d5dd96 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_prach.c
@@ -102,7 +102,11 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
                        nrUE_config->prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index,
                        ue->X_u);
 
-  sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  if (slot % (fp->slots_per_subframe / 2) == 0)
+    sample_offset_slot = (prachStartSymbol==0?0:fp->ofdm_symbol_size*prachStartSymbol+fp->nb_prefix_samples0+fp->nb_prefix_samples*(prachStartSymbol-1));
+  else
+    sample_offset_slot = (fp->ofdm_symbol_size + fp->nb_prefix_samples) * prachStartSymbol;
+
   prach_start = fp->get_samples_slot_timestamp(slot, fp, 0) + sample_offset_slot;
 
   //printf("prachstartsymbold %d, sample_offset_slot %d, prach_start %d\n",prachStartSymbol, sample_offset_slot, prach_start);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index bb61e1a173dbd799d6a9ba8f6279c4c48d0b326d..8d13d70ac14bc0c248058c9e80022bebfde26b12 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -1044,7 +1044,8 @@ uint32_t  nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
                          uint8_t is_crnti,
                          uint8_t llr8_flag);
 
-int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
+int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
+                     NR_UE_ULSCH_t *ulsch,
                      NR_DL_FRAME_PARMS* frame_parms,
                      uint8_t harq_pid,
                      unsigned int G);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
index 5733ef6eb3c3595481bdc9757a5877140e70e970..ba5c65ceb71086c01f6505bc4134ad9acfaaeb49 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
@@ -215,11 +215,13 @@ NR_UE_ULSCH_t *new_nr_ue_ulsch(uint16_t N_RB_UL,
 }
 
 
-int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
+int nr_ulsch_encoding(PHY_VARS_NR_UE *ue,
+                      NR_UE_ULSCH_t *ulsch,
                       NR_DL_FRAME_PARMS* frame_parms,
                       uint8_t harq_pid,
                       unsigned int G)
 {
+  start_meas(&ue->ulsch_encoding_stats);
 /////////////////////////parameters and variables declaration/////////////////////////
 ///////////
 
@@ -332,6 +334,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     }
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_IN);
+    start_meas(&ue->ulsch_segmentation_stats);
     Kb=nr_segmentation(harq_process->b,
                        harq_process->c,
                        harq_process->B,
@@ -340,6 +343,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                        pz,
                        &harq_process->F,
                        harq_process->BG);
+    stop_meas(&ue->ulsch_segmentation_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_SEGMENTATION, VCD_FUNCTION_OUT);
 
     F = harq_process->F;
@@ -374,14 +378,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     //for (int i=0;i<68*384;i++)
       //        printf("channel_input[%d]=%d\n",i,channel_input[i]);
 
-    int temp_opp = 0;
-
-    if (opp_enabled) {
-      opp_enabled = 0;
-      temp_opp = 1;
-    }
-
-
     /*printf("output %d %d %d %d %d \n", harq_process->d[0][0], harq_process->d[0][1], harq_process->d[r][2],harq_process->d[0][3], harq_process->d[0][4]);
       for (int cnt =0 ; cnt < 66*(*pz); cnt ++){
       printf("%d \n",  harq_process->d[0][cnt]);
@@ -397,11 +393,13 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_IN);
 
+    start_meas(&ue->ulsch_ldpc_encoding_stats);
     for(int j = 0; j < (harq_process->C/8 + 1); j++)
     {
       impp.macro_num = j;
       nrLDPC_encoder(harq_process->c,harq_process->d,*pz,Kb,Kr,harq_process->BG,&impp);
     }
+    stop_meas(&ue->ulsch_ldpc_encoding_stats);
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LDPC_ENCODER_OPTIM, VCD_FUNCTION_OUT);
 
@@ -412,8 +410,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     write_output("ulsch_enc_output0.m","enc0",&harq_process->d[0][0],(3*8*Kr_bytes)+12,1,4);
 #endif
 
-    if (temp_opp) opp_enabled = 1;
-
 ///////////
 ///////////////////////////////////////////////////////////////////////////////
     LOG_D(PHY,"setting ndi to %d from pusch_data\n", harq_process->pusch_pdu.pusch_data.new_data_indicator);
@@ -449,6 +445,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     Tbslbrm = nr_compute_tbslbrm(0,nb_rb,harq_process->pusch_pdu.nrOfLayers);
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_IN);
+    start_meas(&ue->ulsch_rate_matching_stats);
     nr_rate_matching_ldpc(Ilbrm,
                           Tbslbrm,
                           harq_process->BG,
@@ -460,6 +457,7 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
                           Kr-F-2*(*pz),
                           harq_process->pusch_pdu.pusch_data.rv_index,
                           E);
+    stop_meas(&ue->ulsch_rate_matching_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_RATE_MATCHING_LDPC, VCD_FUNCTION_OUT);
 
 
@@ -481,10 +479,12 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
     //start_meas(i_stats);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_IN);
     
+    start_meas(&ue->ulsch_interleaving_stats);
     nr_interleaving_ldpc(E,
             mod_order,
             harq_process->e+r_offset,
             harq_process->f+r_offset);
+    stop_meas(&ue->ulsch_interleaving_stats);
     
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_INTERLEAVING_LDPC, VCD_FUNCTION_OUT);
     //stop_meas(i_stats);
@@ -509,5 +509,6 @@ int nr_ulsch_encoding(NR_UE_ULSCH_t *ulsch,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_NR_UE_ULSCH_ENCODING, VCD_FUNCTION_OUT);
 
+  stop_meas(&ue->ulsch_encoding_stats);
   return(0);
 }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index 4ada19ba33108b8aa5804c12020c0edc35c0c1d2..b1addf740a2ee6c668eb03831b1841d1e1877c5e 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -159,7 +159,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                               nb_dmrs_re_per_rb, number_dmrs_symbols, mod_order, Nl);
     
 
-    nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid, G);
+    nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G);
 
     ///////////
     ////////////////////////////////////////////////////////////////////
@@ -529,7 +529,8 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
       nr_normal_prefix_mod(txdataF[ap],
                            &txdata[ap][tx_offset],
                            14,
-                           frame_parms);
+                           frame_parms,
+                           slot);
     }
   }
 
diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c
index f3dea58374486f106177ea413c77a15cbf7782f7..96ee211285bef6569a68737f2a409e4bcc0fcb4d 100644
--- a/openair1/PHY/TOOLS/signal_energy.c
+++ b/openair1/PHY/TOOLS/signal_energy.c
@@ -264,7 +264,7 @@ double signal_energy_fp(double *s_re[2],double *s_im[2],uint32_t nb_antennas,uin
   return(V/length/nb_antennas);
 }
 
-double signal_energy_fp2(struct complex *s,uint32_t length)
+double signal_energy_fp2(struct complexd *s,uint32_t length)
 {
 
   int32_t i;
@@ -273,7 +273,7 @@ double signal_energy_fp2(struct complex *s,uint32_t length)
   for (i=0; i<length; i++) {
     //    printf("signal_energy_fp2 : %f,%f => %f\n",s[i].x,s[i].y,V);
     //      V= V + (s[i].y*s[i].x) + (s[i].y*s[i].x);
-    V= V + (s[i].x*s[i].x) + (s[i].y*s[i].y);
+    V= V + (s[i].r*s[i].r) + (s[i].i*s[i].i);
   }
 
   return(V/length);
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index 4c68c15cb68fb60ee351c9cad227fb0ca63adef4..966e93440e9b017752734da7f4b4cc9398dc5019 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -39,11 +39,6 @@ extern "C" {
 #define CEILIDIV(a,b) ((a+b-1)/b)
 #define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
 
-struct complex {
-  double x;
-  double y;
-};
-
 struct complexd {
   double r;
   double i;
@@ -468,7 +463,7 @@ double signal_energy_fp(double *s_re[2], double *s_im[2], uint32_t nb_antennas,
 /*!\fn double signal_energy_fp2(struct complex *, uint32_t);
 \brief Computes the signal energy per subcarrier
 */
-double signal_energy_fp2(struct complex *s, uint32_t length);
+double signal_energy_fp2(struct complexd *s, uint32_t length);
 
 
 int32_t iSqrt(int32_t value);
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index d1fb886341ee5a494862525234fbe6b626eba548..778724218f97813c564b2bed407330624f049598 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -819,6 +819,8 @@ typedef struct PHY_VARS_gNB_s {
 
   uint32_t max_peak_val;
 
+  /// OFDM symbol offset divisor for UL
+  uint32_t ofdm_offset_divisor;
   /// \brief sinr for all subcarriers of the current link (used only for abstraction).
   /// first index: ? [0..N_RB_DL*12[
   double *sinr_dB;
@@ -838,6 +840,8 @@ typedef struct PHY_VARS_gNB_s {
   int              **dl_precoder_SgNB[3];
   char             log2_maxp; /// holds the maximum channel/precoder coefficient
 
+  int  prb_interpolation;
+
   /// if ==0 enables phy only test mode
   int mac_enabled;
   /// counter to average prach energh over first 100 prach opportunities
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index 3b1c03f3773f956eab7d24bc7fdbb0572d7eb17a..019d5e62591b649c26c53d8a8c2c0adca6c4b9a6 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -865,7 +865,9 @@ typedef struct {
 
 
   uint32_t perfect_ce;
-
+  // flag to activate PRB based averaging of channel estimates
+  // when off, defaults to frequency domain interpolation
+  int prb_interpolation;
   int generate_ul_signal[NUMBER_OF_CONNECTED_gNB_MAX];
 
   UE_NR_SCAN_INFO_t scan_info[NB_BANDS_MAX];
@@ -1002,6 +1004,7 @@ typedef struct {
 
   time_stats_t ofdm_mod_stats;
   time_stats_t ulsch_encoding_stats;
+  time_stats_t ulsch_ldpc_encoding_stats;
   time_stats_t ulsch_modulation_stats;
   time_stats_t ulsch_segmentation_stats;
   time_stats_t ulsch_rate_matching_stats;
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index d333732d1fdbadb64e0a491e88177c493277e855..c385d323e3b51e4deddd9a9e5606d8f3c045e00b 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -234,8 +234,6 @@ typedef struct {
   int RA_PCMAX;
   /// Corresponding RA-RNTI for UL-grant
   uint16_t ra_RNTI;
-  /// Pointer to Msg3 payload for UL-grant
-  uint8_t *Msg3;
   /// Frame of last completed synch
   uint16_t sync_frame;
   /// Flag to indicate that prach is ready to start: it is enabled with an initial delay after the sync
@@ -331,6 +329,9 @@ struct NR_DL_FRAME_PARMS {
   /// sequence which is computed based on carrier frequency and numerology to rotate/derotate each OFDM symbol according to Section 5.3 in 38.211
   /// First dimension is for the direction of the link (0 DL, 1 UL)
   int16_t symbol_rotation[2][224*2];
+  /// sequence used to compensate the phase rotation due to timeshifted OFDM symbols
+  /// First dimenstion is for different CP lengths
+  int16_t timeshift_symbol_rotation[4096*2] __attribute__ ((aligned (16)));
   /// shift of pilot position in one RB
   uint8_t nushift;
   /// SRS configuration from TS 38.331 RRC
@@ -364,6 +365,8 @@ struct NR_DL_FRAME_PARMS {
   uint8_t ssb_index;
   /// PBCH polar encoder params
   t_nrPolar_params pbch_polar_params;
+  /// OFDM symbol offset divisor for UL
+  uint32_t ofdm_offset_divisor;
 };
 
 
diff --git a/openair1/SCHED/nfapi_lte_dummy.c b/openair1/SCHED/nfapi_lte_dummy.c
index 9562e2de30ca6b7e7266888e31fabed83b6c664a..7d1e7e76843e02f791238f474d8373167e4eca86 100644
--- a/openair1/SCHED/nfapi_lte_dummy.c
+++ b/openair1/SCHED/nfapi_lte_dummy.c
@@ -17,6 +17,10 @@ void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int slot,
                             nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
                             uint8_t *sdu){
                             }
+void handle_nfapi_nr_csirs_pdu(PHY_VARS_gNB *gNB,
+			       int frame, int slot,
+			       nfapi_nr_dl_tti_csi_rs_pdu *csirs_pdu){
+                    }                           
 int l1_north_init_gNB(void){return 0;}
 
 uint8_t slot_ahead=6;
diff --git a/openair1/SCHED/nfapi_nr_dummy.c b/openair1/SCHED/nfapi_nr_dummy.c
index db20017fb81e828e50c9ae8754f941301b2c2bc5..1286a4e48a270c15e13a4c3b6153732bd3fe8b08 100644
--- a/openair1/SCHED/nfapi_nr_dummy.c
+++ b/openair1/SCHED/nfapi_nr_dummy.c
@@ -17,6 +17,10 @@ void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int slot,
                             nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
                             uint8_t *sdu){
                             }
+void handle_nfapi_nr_csirs_pdu(PHY_VARS_gNB *gNB,
+			       int frame, int slot,
+			       nfapi_nr_dl_tti_csi_rs_pdu *csirs_pdu){
+                    }
 int l1_north_init_gNB(void){return 0;}
 
 uint8_t slot_ahead=6;
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index f04401aac5f7ebdb19d09d4e16c1215b23036109..fa762fa5b802343d651b419f4e1ea4f4ff27ef06 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -181,71 +181,64 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
   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;
+
+  if (NFAPI_MODE == NFAPI_MONOLITHIC){
+    if (DL_req != NULL && TX_req!=NULL)
+      LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
+      frame,slot,
+      DL_req->SFN,DL_req->Slot,number_dl_pdu,
+      TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
+      number_ul_dci_pdu,number_ul_tti_pdu);
+
+    int pdcch_received=0;
+    gNB->num_pdsch_rnti[slot]=0;
+    for (int i=0; i<gNB->number_of_nr_dlsch_max; i++) {
+      gNB->dlsch[i][0]->rnti=0;
+      gNB->dlsch[i][0]->harq_mask=0;
+    }
 
-  if (DL_req != NULL && TX_req!=NULL)
-    LOG_D(PHY,"NFAPI: Sched_INFO:SFN/SLOT:%04d/%d DL_req:SFN/SLO:%04d/%d:dl_pdu:%d tx_req:SFN/SLOT:%04d/%d:pdus:%d;ul_dci %d ul_tti %d\n",
-	  frame,slot,
-	  DL_req->SFN,DL_req->Slot,number_dl_pdu,
-	  TX_req->SFN,TX_req->Slot,TX_req->Number_of_PDUs,
-	  number_ul_dci_pdu,number_ul_tti_pdu);
-
-  int pdcch_received=0;
-  gNB->num_pdsch_rnti[slot]=0;
-  for (int i=0; i<gNB->number_of_nr_dlsch_max; i++) {
-    gNB->dlsch[i][0]->rnti=0;
-    gNB->dlsch[i][0]->harq_mask=0;
-  }
-
-  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(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:
-
-        if(NFAPI_MODE != NFAPI_MODE_VNF)
-        handle_nr_nfapi_ssb_pdu(gNB,frame,slot,
-                                dl_tti_pdu);
+    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(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(gNB,frame,slot,
+                                  dl_tti_pdu);
+          break;
 
-      break;
+        case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
+          AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
+          handle_nfapi_nr_pdcch_pdu(gNB,
+            frame, slot,
+            &dl_tti_pdu->pdcch_pdu);
+          pdcch_received = 1;
+          break;
 
-      case NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE:
-	AssertFatal(pdcch_received == 0, "pdcch_received is not 0, we can only handle one PDCCH PDU per slot\n");
-        if(NFAPI_MODE != NFAPI_MODE_VNF)
-        handle_nfapi_nr_pdcch_pdu(gNB,
-				  frame, slot,
-				  &dl_tti_pdu->pdcch_pdu);
- 
-	pdcch_received = 1;
+        case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
+          LOG_D(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(gNB,
+            frame, slot,
+            &dl_tti_pdu->csi_rs_pdu);
+          break;
 
-      break;
-      case NFAPI_NR_DL_TTI_CSI_RS_PDU_TYPE:
-        LOG_D(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(gNB,
-				  frame, slot,
-				  &dl_tti_pdu->csi_rs_pdu);
-      break;
-      case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
-
-      {
-        LOG_D(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;
-        if(NFAPI_MODE != NFAPI_MODE_VNF)
-        handle_nr_nfapi_pdsch_pdu(gNB,frame,slot,&dl_tti_pdu->pdsch_pdu, sdu);
+        case NFAPI_NR_DL_TTI_PDSCH_PDU_TYPE:
+          LOG_D(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;
+          handle_nr_nfapi_pdsch_pdu(gNB,frame,slot,&dl_tti_pdu->pdsch_pdu, sdu);
+          break;
       }
     }
-  }
 
-  //  if (UL_tti_req!=NULL) memcpy(&gNB->UL_tti_req,UL_tti_req,sizeof(nfapi_nr_ul_tti_request_t));
-  if(NFAPI_MODE != NFAPI_MODE_VNF)
+
     for (int i=0;i<number_ul_dci_pdu;i++) {
       handle_nfapi_nr_ul_dci_pdu(gNB, frame, slot, &UL_dci_req->ul_dci_pdu_list[i]);
     }
-
-  if(NFAPI_MODE != NFAPI_MODE_VNF)
+  
     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:
@@ -264,30 +257,22 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
           break;
       }
     }
-
-  if(NFAPI_MODE != NFAPI_MONOLITHIC && number_ul_tti_pdu>0)
-  {
-    oai_nfapi_ul_tti_req(UL_tti_req);
   }
-  
-  if (NFAPI_MODE != NFAPI_MONOLITHIC && Sched_INFO->UL_dci_req->numPdus!=0)
-  {
-    oai_nfapi_ul_dci_req(Sched_INFO->UL_dci_req);
-  } 
-  
-  if (NFAPI_MODE != NFAPI_MONOLITHIC) 
-  { 
-    if(Sched_INFO->DL_req->dl_tti_request_body.nPDUs>0)
-    {
-      Sched_INFO->DL_req->SFN = frame;
-      Sched_INFO->DL_req->Slot = slot;
-      oai_nfapi_dl_tti_req(Sched_INFO->DL_req);
-    }
-    if (Sched_INFO->TX_req->Number_of_PDUs > 0)
-    {
-      oai_nfapi_tx_data_req(Sched_INFO->TX_req);
-    }
+
+  if (NFAPI_MODE == NFAPI_MODE_VNF) { //If VNF, oai_nfapi functions send respective p7 msgs to PNF for which nPDUs is greater than 0
+
+    if(number_ul_tti_pdu>0)
+      oai_nfapi_ul_tti_req(UL_tti_req);
+
+    if (number_ul_dci_pdu>0)
+      oai_nfapi_ul_dci_req(UL_dci_req);
     
-  }
+    if (number_dl_pdu>0)
+      oai_nfapi_dl_tti_req(DL_req);
 
+    if (number_tx_data_pdu>0)
+      oai_nfapi_tx_data_req(TX_req);
+
+  } 
+  
 }
diff --git a/openair1/SCHED_NR/nr_ru_procedures.c b/openair1/SCHED_NR/nr_ru_procedures.c
index 827e986f1b20c9e3bded717c95dc4811811ff523..eb0a4f8cdc3ee46145c7b7e3474d017716163cb0 100644
--- a/openair1/SCHED_NR/nr_ru_procedures.c
+++ b/openair1/SCHED_NR/nr_ru_procedures.c
@@ -119,6 +119,7 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                        fp->nb_prefix_samples,
                        CYCLIC_PREFIX);
           slot_offset += fp->nb_prefix_samples+fp->ofdm_symbol_size;
+          slot_offsetF += fp->ofdm_symbol_size;
         }
         else {
           PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
@@ -128,6 +129,7 @@ void nr_feptx0(RU_t *ru,int tti_tx,int first_symbol, int num_symbols, int aa) {
                        fp->nb_prefix_samples0,
                        CYCLIC_PREFIX);
           slot_offset += fp->nb_prefix_samples0+fp->ofdm_symbol_size;
+          slot_offsetF += fp->ofdm_symbol_size;
         }
       }
     }
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index e0b7387ab9d96f6a1efa5d94a12fe66a46306bd1..0a87a08a56e853d557fd271fd4af24b73cdf53af 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -147,14 +147,14 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,1);
-  if (NFAPI_MODE == NFAPI_MONOLITHIC || NFAPI_MODE == NFAPI_MODE_PNF) { 
-    for (int i=0; i<fp->Lmax; i++) {
-      if (gNB->ssb[i].active) {
-        nr_common_signal_procedures(gNB,frame,slot,gNB->ssb[i].ssb_pdu);
-        gNB->ssb[i].active = false;
-      }
+
+  for (int i=0; i<fp->Lmax; i++) {
+    if (gNB->ssb[i].active) {
+      nr_common_signal_procedures(gNB,frame,slot,gNB->ssb[i].ssb_pdu);
+      gNB->ssb[i].active = false;
     }
   }
+  
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_COMMON_TX,0);
 
   int pdcch_pdu_id=find_nr_pdcch(frame,slot,gNB,SEARCH_EXIST);
@@ -383,7 +383,13 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
 
   // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size
   uint16_t bw_scaling = 16 * gNB->frame_parms.ofdm_symbol_size / 2048;
-  timing_advance_update = sync_pos / bw_scaling;
+  int sync_pos_rounded;
+  // do some integer rounding to improve TA accuracy
+  if (sync_pos > 0)
+    sync_pos_rounded = sync_pos + (bw_scaling / 2) - 1;
+  else
+    sync_pos_rounded = sync_pos - (bw_scaling / 2) - 1;
+  timing_advance_update = sync_pos_rounded / bw_scaling;
 
   // put timing advance command in 0..63 range
   timing_advance_update += 31;
diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index ea1264639517b642310e1932f395333a085fbba7..4a17cb98b9bc7cb576a389c297d632fa0c4a17ed 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -70,7 +70,8 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
       for (i = 0; i < dl_config->number_pdus; ++i){
         AssertFatal(dl_config->number_pdus < FAPI_NR_DL_CONFIG_LIST_NUM,"dl_config->number_pdus %d out of bounds\n",dl_config->number_pdus);
         AssertFatal(dl_config->dl_config_list[i].pdu_type<=FAPI_NR_DL_CONFIG_TYPES,"pdu_type %d > 2\n",dl_config->dl_config_list[i].pdu_type);
-        LOG_D(PHY, "In %s: received 1 DL %s PDU of %d total DL PDUs:\n", __FUNCTION__, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus);
+        LOG_D(PHY, "In %s: frame %d slot %d received 1 DL %s PDU of %d total DL PDUs:\n",
+              __FUNCTION__, scheduled_response->frame, slot, dl_pdu_type[dl_config->dl_config_list[i].pdu_type - 1], dl_config->number_pdus);
 
         if (dl_config->dl_config_list[i].pdu_type == FAPI_NR_DL_CONFIG_TYPE_DCI) {
 
@@ -225,9 +226,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
         break;
         }
       }
-
       memset(ul_config, 0, sizeof(fapi_nr_ul_config_request_t));
-
     }
   }
   return 0;
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index bdec486f00839addbe71b5bffdaa5d981ef8001e..7c0e2c890688b2e7fdf68cde578ed0778b8c8843 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -253,7 +253,7 @@ void ue_ta_procedures(PHY_VARS_NR_UE *ue, int slot_tx, int frame_tx){
 
       ue->timing_advance += (ul_time_alignment->ta_command - 31) * bw_scaling;
 
-      LOG_D(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
+      LOG_I(PHY, "In %s: [UE %d] [%d.%d] Got timing advance command %u from MAC, new value is %d\n",
         __FUNCTION__,
         ue->Mod_id,
         frame_tx,
@@ -949,11 +949,11 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
 
     if (pdsch == RA_PDSCH) {
       if (ue->prach_resources[gNB_id]!=NULL)
-	      dlsch0->rnti = ue->prach_resources[gNB_id]->ra_RNTI;
+        dlsch0->rnti = ue->prach_resources[gNB_id]->ra_RNTI;
       else {
-	      LOG_E(PHY,"[UE %d] Frame %d, nr_slot_rx %d: FATAL, prach_resources is NULL\n", ue->Mod_id, frame_rx, nr_slot_rx);
-	      //mac_xface->macphy_exit("prach_resources is NULL");
-	      return;
+        LOG_E(PHY,"[UE %d] Frame %d, nr_slot_rx %d: FATAL, prach_resources is NULL\n", ue->Mod_id, frame_rx, nr_slot_rx);
+        //mac_xface->macphy_exit("prach_resources is NULL");
+        return;
       }
     }
 
@@ -1270,38 +1270,38 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
           default: break;
         }
 
-        /* d_2_1 */
-        int d_2_1;
-        if (mapping_type_ul == NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB && start_symbol != 0)
-          d_2_1 = 0;
-        else
-          d_2_1 = 1;
-
-        /* d_2_2 */
-        const double d_2_2 = pusch_d_2_2_timing_capability_1[numerology][1];
-
-        /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
-        // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
-        double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
-        double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
-        if (N_t_2 < d_2_2) N_t_2 = d_2_2;
-
-        /* Time alignment procedure */
-        // N_t_1 + N_t_2 + N_TA_max must be in msec
-        const double t_subframe = 1.0; // subframe duration of 1 msec
-        const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe);
-
-        if (ul_time_alignment->apply_ta == 1){
-          ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
-          if (nr_slot_rx + ul_tx_timing_adjustment > slots_per_frame){
-            ul_time_alignment->ta_frame = (frame_rx + 1) % 1024;
-          } else {
-            ul_time_alignment->ta_frame = frame_rx;
-          }
-          // reset TA flag
-          ul_time_alignment->apply_ta = 0;
-          LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
+      /* d_2_1 */
+      int d_2_1;
+      if (mapping_type_ul == NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeB && start_symbol != 0)
+        d_2_1 = 0;
+      else
+        d_2_1 = 1;
+
+      /* d_2_2 */
+      const double d_2_2 = pusch_d_2_2_timing_capability_1[numerology][1];
+
+      /* N_t_1 time duration in msec of N_1 symbols corresponding to a PDSCH reception time
+      // N_t_2 time duration in msec of N_2 symbols corresponding to a PUSCH preparation time */
+      double N_t_1 = (N_1 + d_1_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
+      double N_t_2 = (N_2 + d_2_1) * (ofdm_symbol_size + nb_prefix_samples) * tc_factor;
+      if (N_t_2 < d_2_2) N_t_2 = d_2_2;
+
+      /* Time alignment procedure */
+      // N_t_1 + N_t_2 + N_TA_max must be in msec
+      const double t_subframe = 1.0; // subframe duration of 1 msec
+      const int ul_tx_timing_adjustment = 1 + (int)ceil(slots_per_subframe*(N_t_1 + N_t_2 + N_TA_max + 0.5)/t_subframe);
+
+      if (ul_time_alignment->apply_ta == 1){
+        ul_time_alignment->ta_slot = (nr_slot_rx + ul_tx_timing_adjustment) % slots_per_frame;
+        if (nr_slot_rx + ul_tx_timing_adjustment > slots_per_frame){
+          ul_time_alignment->ta_frame = (frame_rx + 1) % 1024;
+        } else {
+          ul_time_alignment->ta_frame = frame_rx;
         }
+        // reset TA flag
+        ul_time_alignment->apply_ta = 0;
+        LOG_D(PHY,"Frame %d slot %d -- Starting UL time alignment procedures. TA update will be applied at frame %d slot %d\n", frame_rx, nr_slot_rx, ul_time_alignment->ta_frame, ul_time_alignment->ta_slot);
+      }
     }
   }
 }
@@ -2138,7 +2138,8 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
       int16_t ra_preamble_rx_power = (int16_t)(prach_resources->ra_PREAMBLE_RECEIVED_TARGET_POWER - pathloss + 30);
       ue->tx_power_dBm[nr_slot_tx] = min(nr_get_Pcmax(mod_id), ra_preamble_rx_power);
 
-      LOG_D(PHY,"DEBUG [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x)\n",
+      LOG_D(PHY, "In %s: [UE %d][RAPROC][%d.%d]: Generating PRACH Msg1 (preamble %d, PL %d dB, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, RA-RNTI %x)\n",
+        __FUNCTION__,
         mod_id,
         frame_tx,
         nr_slot_tx,
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index adfda7a0c85229dfa7ef9c153b7780c0c5685709..9a9ccaf1f7e303f1843b99a1d79031afc0b75408 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -200,8 +200,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
       for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
         for (aarx=0; aarx<eNB2UE[0]->nb_rx; aarx++) {
           for (aatx=0; aatx<eNB2UE[0]->nb_tx; aatx++) {
-            channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].x;
-            channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].y;
+            channelx = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].r;
+            channely = eNB2UE[0]->chF[aarx+(aatx*eNB2UE[0]->nb_rx)][u].i;
             fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
           }
         }
@@ -213,8 +213,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
         for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
           for (aarx=0; aarx<eNB2UE[1]->nb_rx; aarx++) {
             for (aatx=0; aatx<eNB2UE[1]->nb_tx; aatx++) {
-              channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].x;
-              channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].y;
+              channelx = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].r;
+              channely = eNB2UE[1]->chF[aarx+(aatx*eNB2UE[1]->nb_rx)][u].i;
               fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
             }
           }
@@ -225,8 +225,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
         for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
           for (aarx=0; aarx<eNB2UE[2]->nb_rx; aarx++) {
             for (aatx=0; aatx<eNB2UE[2]->nb_tx; aatx++) {
-              channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].x;
-              channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].y;
+              channelx = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].r;
+              channely = eNB2UE[2]->chF[aarx+(aatx*eNB2UE[2]->nb_rx)][u].i;
               fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
             }
           }
@@ -237,8 +237,8 @@ void DL_channel(RU_t *ru,PHY_VARS_UE *UE,uint subframe,int awgn_flag,double SNR,
         for (u=0; u<2*ru->frame_parms->N_RB_DL; u++) {
           for (aarx=0; aarx<eNB2UE[3]->nb_rx; aarx++) {
             for (aatx=0; aatx<eNB2UE[3]->nb_tx; aatx++) {
-              channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].x;
-              channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].y;
+              channelx = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].r;
+              channely = eNB2UE[3]->chF[aarx+(aatx*eNB2UE[3]->nb_rx)][u].i;
               fprintf(csv_fd,"%e+i*(%e),",channelx,channely);
             }
           }
diff --git a/openair1/SIMULATION/LTE_PHY/test.c b/openair1/SIMULATION/LTE_PHY/test.c
index 06785f7cdc2a533375b826bbbcb7cd510decae9b..6b78dad4e7e25f0b672f21b7c5eece38a654f349 100644
--- a/openair1/SIMULATION/LTE_PHY/test.c
+++ b/openair1/SIMULATION/LTE_PHY/test.c
@@ -75,7 +75,7 @@ int main(int argc, char **argv)
   double rx_gain;
   int rx_pwr2, target_rx_pwr_dB;
 
-  struct complex **ch;
+  struct complexd **ch;
   unsigned char first_call = 1;
 
   LTE_DL_FRAME_PARMS frame_parms;
@@ -169,10 +169,10 @@ int main(int argc, char **argv)
 
   channel_length = (int) 11+2*BW*Td;
 
-  ch = (struct complex**) malloc(4 * sizeof(struct complex*));
+  ch = (struct complexd**) malloc(4 * sizeof(struct complexd*));
 
   for (i = 0; i<4; i++)
-    ch[i] = (struct complex*) malloc(channel_length * sizeof(struct complex));
+    ch[i] = (struct complexd*) malloc(channel_length * sizeof(struct complexd));
 
   randominit(0);
   set_taus_seed(0);
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 0d39e6e533fd4159dd23fd9528b8f7e4dfcad641..20a348f6c337c469ac5b9cc35782efafd56888b7 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -1111,8 +1111,8 @@ int main(int argc, char **argv) {
                   for (aarx=0; aarx<UE2eNB->nb_rx; aarx++) {
                     for (aatx=0; aatx<UE2eNB->nb_tx; aatx++) {
                       // abs_channel = (eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].x*eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].x + eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].y*eNB2UE->chF[aarx+(aatx*eNB2UE->nb_rx)][u].y);
-                      channelx = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].x;
-                      channely = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].y;
+                      channelx = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].r;
+                      channely = UE2eNB->chF[aarx+(aatx*UE2eNB->nb_rx)][u].i;
                       // if(transmission_m==5){
                       fprintf(csv_fdUL,"%e+i*(%e),",channelx,channely);
                       // }
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim2.c b/openair1/SIMULATION/LTE_PHY/ulsim2.c
index 69d4dc2e3f1b5c8fdaeb6e39d58cc4e12a35250c..e994d4fc364695a13340fbb6bc4fe7eed2935f7d 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim2.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim2.c
@@ -49,7 +49,7 @@ int main(int argc, char **argv)
   double amps[8] = {0.3868472 , 0.3094778 , 0.1547389 , 0.0773694 , 0.0386847 , 0.0193424 , 0.0096712 , 0.0038685};
   double aoa=.03,ricean_factor=1; //0.0000005;
   int channel_length;
-  struct complex **ch;
+  struct complexd **ch;
   unsigned char pbch_pdu[6];
   int sync_pos, sync_pos_slot;
   FILE *rx_frame_file;
@@ -170,10 +170,10 @@ int main(int argc, char **argv)
     bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
   }
 
-  ch = (struct complex**) malloc(4 * sizeof(struct complex*));
+  ch = (struct complexd**) malloc(4 * sizeof(struct complexd*));
 
   for (i = 0; i<4; i++)
-    ch[i] = (struct complex*) malloc(channel_length * sizeof(struct complex));
+    ch[i] = (struct complexd*) malloc(channel_length * sizeof(struct complexd));
 
   generate_srs_tx(lte_frame_parms,lte_ue_common_vars->txdataF[0],AMP,0);
   generate_drs_puch(lte_frame_parms,lte_ue_common_vars->txdataF[0],AMP,0,first_rb,nb_rb);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index a8376dc3b89e09e19e164150f5a1bb1380edd172..df2356e324c96045a413ffaf5225d98e61d81dca 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -226,12 +226,17 @@ int DU_send_INITIAL_UL_RRC_MESSAGE_TRANSFER(module_id_t     module_idP,
 
 void processSlotTX(void *arg) {}
 
-//nFAPI P7 dummy functions
+//nFAPI P7 dummy functions to avoid linking errors 
 
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);  }
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+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);  }
 
 // needed for some functions
 openair0_config_t openair0_cfg[MAX_CARDS];
@@ -408,6 +413,7 @@ int main(int argc, char **argv)
   uint16_t rbSize = 106;
   uint8_t  mcsIndex = 9;
   uint8_t  dlsch_threads = 0;
+  int      prb_inter = 0;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0) {
     exit_fun("[NR_DLSIM] Error, configuration module init failed\n");
   }
@@ -418,7 +424,7 @@ int main(int argc, char **argv)
 
   FILE *scg_fd=NULL;
   
-  while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:m:w:T:U:q")) != -1) {
+  while ((c = getopt (argc, argv, "f:hA:pf:g:in:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:d:e:m:w:T:U:q")) != -1) {
     switch (c) {
     case 'f':
       scg_fd = fopen(optarg,"r");
@@ -474,14 +480,10 @@ int main(int argc, char **argv)
 
       break;
 
-    /*case 'i':
-      interf1=atoi(optarg);
+    case 'i':
+      prb_inter=1;
       break;
 
-    case 'j':
-      interf2=atoi(optarg);
-      break;*/
-
     case 'n':
       n_trials = atoi(optarg);
       break;
@@ -640,7 +642,7 @@ int main(int argc, char **argv)
       printf("-g [A,B,C,D,E,F,G,R] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models or R for MIMO model (ignores delay spread and Ricean factor)\n");
       printf("-y Number of TX antennas used in gNB\n");
       printf("-z Number of RX antennas used in UE\n");
-      //printf("-i Relative strength of first intefering gNB (in dB) - cell_id mod 3 = 1\n");
+      printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
       //printf("-j Relative strength of second intefering gNB (in dB) - cell_id mod 3 = 2\n");
       printf("-R N_RB_DL\n");
       printf("-O oversampling factor (1,2,4,8,16)\n");
@@ -686,6 +688,7 @@ int main(int argc, char **argv)
   memset(RC.gNB[0],0,sizeof(PHY_VARS_gNB));
 
   gNB = RC.gNB[0];
+  gNB->ofdm_offset_divisor = UINT_MAX;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
   frame_parms->nb_antennas_tx = n_tx;
   frame_parms->nb_antennas_rx = n_rx;
@@ -910,6 +913,7 @@ int main(int argc, char **argv)
   UE->if_inst->phy_config_request = nr_ue_phy_config_request;
   UE->if_inst->dl_indication = nr_ue_dl_indication;
   UE->if_inst->ul_indication = dummy_nr_ue_ul_indication;
+  UE->prb_interpolation = prb_inter;
 
 
   UE_mac->if_module = nr_ue_if_module_init(0);
@@ -1082,7 +1086,8 @@ int main(int argc, char **argv)
             nr_normal_prefix_mod(&gNB->common_vars.txdataF[aa][txdataF_offset],
                                  &txdata[aa][tx_offset],
                                  14,
-                                 frame_parms);
+                                 frame_parms,
+                                 slot);
           }
         }
        
@@ -1317,7 +1322,7 @@ int main(int argc, char **argv)
       LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0], frame_length_complex_samples, 1, 1);
       if (UE->frame_parms.nb_antennas_rx>1)
 	LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1], frame_length_complex_samples, 1, 1);
-      LOG_M("chestF0.m","chF0",UE->pdsch_vars[0][0]->dl_ch_estimates_ext,N_RB_DL*12*14,1,1);
+      LOG_M("chestF0.m","chF0",&UE->pdsch_vars[0][0]->dl_ch_estimates_ext[0][0],g_rbSize*12*14,1,1);
       write_output("rxF_comp.m","rxFc",&UE->pdsch_vars[0][0]->rxdataF_comp0[0][0],N_RB_DL*12*14,1,1);
       LOG_M("rxF_llr.m","rxFllr",UE->pdsch_vars[UE_proc.thread_id][0]->llr[0],available_bits,1,0);
       break;
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
index 70d65a3dc26cfdcf700b0a3b1496a6d397569190..056b018504ab6387e2eb82f5a3cae3a0d367c748 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions.c
@@ -8,6 +8,12 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+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);  }
+
 int32_t get_uldl_offset(int nr_bandP)                                       { return(0);  }
 NR_IF_Module_t *NR_IF_Module_init(int Mod_id)                               {return(NULL);}
 nfapi_mode_t nfapi_mod;
diff --git a/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c b/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c
index a930c96a755992604415953f7e18e84812ed6e42..76f4e826ee6ed740e63933def6c99682f65bdb2e 100644
--- a/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c
+++ b/openair1/SIMULATION/NR_PHY/nr_dummy_functions_prach.c
@@ -3,9 +3,15 @@ int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req)                            { re
 int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req)       { return(0);  }
 int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req)       { return(0);  }
 int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);  }
- int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
- int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
- int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
+int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
+int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+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);  }
+
 int32_t get_uldl_offset(int nr_bandP)                                       { return(0);  }
 NR_IF_Module_t *NR_IF_Module_init(int Mod_id)                               {return(NULL);}
 int dummy_nr_ue_dl_indication(nr_downlink_indication_t *dl_info)            { return(0);  }
@@ -315,7 +321,7 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
   mac->RA_attempt_number++;
 }
 
-void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id){
+void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id){
   AssertFatal(CC_id == 0, "Transmission on secondary CCs is not supported yet\n");
   LOG_D(MAC,"[UE %d][RAPROC] Frame %d : Msg3_tx: Starting contention resolution timer\n", mod_id, frameP);
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 448e1e7799c9a84dc15f4441c189cd98efe1b172..9d3ab17ebc3c11d21988698a4aafe01177d6874d 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -110,7 +110,9 @@ void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
 
   gNB_config->carrier_config.dl_bandwidth.value = config_bandwidth(mu, N_RB_DL, fp->nr_band);
 
+  fp->ofdm_offset_divisor = UINT_MAX;
   nr_init_frame_parms(gNB_config, fp);
+  init_timeshift_rotation(fp);
 
   init_symbol_rotation(fp);
 
@@ -406,6 +408,7 @@ int main(int argc, char **argv)
   RC.gNB = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *));
   RC.gNB[0] = malloc(sizeof(PHY_VARS_gNB));
   gNB = RC.gNB[0];
+  gNB->ofdm_offset_divisor = UINT_MAX;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
   frame_parms->nb_antennas_tx = n_tx;
   frame_parms->nb_antennas_rx = n_rx;
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index e601a0d7c1962a4dee3052d7ff7de535769d15eb..5d5d600d8403200e6da8c21244cbb743063430f4 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -81,6 +81,11 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+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);  }
 
 void
 rrc_data_ind(
diff --git a/openair1/SIMULATION/NR_PHY/ulschsim.c b/openair1/SIMULATION/NR_PHY/ulschsim.c
index c889e6dcb994803a39e906429178e2e0991fc3e7..94aea36a670ce960ffcc663080cb48473813b31d 100644
--- a/openair1/SIMULATION/NR_PHY/ulschsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulschsim.c
@@ -504,7 +504,7 @@ int main(int argc, char **argv)
   unsigned int G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, Nl);
 
   if (input_fd == NULL) {
-    nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid, G);
+    nr_ulsch_encoding(UE, ulsch_ue, frame_parms, harq_pid, G);
   }
   
   printf("\n");
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index b2e82060b83bb6ce2d6a00fbad4197957b6cbba2..0b5b9a86fc9dfddf4806cc3ad50aaaafc3e8dcdc 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -212,6 +212,11 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+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 nr_derive_key(int alg_type, uint8_t alg_id,
                const uint8_t key[32], uint8_t **out)
@@ -297,6 +302,7 @@ int main(int argc, char **argv)
   float effRate; 
   //float eff_tp_check = 0.7;
   uint8_t snrRun;
+  int prb_inter = 0;
 
   int enable_ptrs = 0;
   int modify_dmrs = 0;
@@ -330,7 +336,7 @@ int main(int argc, char **argv)
   /* initialize the sin-cos table */
    InitSinLUT();
 
-  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) {
+  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:ikl:m:n:p:r:s:u:w:y:z:F:G:H:M:N:PR:S:T:U:L:Z")) != -1) {
     printf("handling optarg %c\n",c);
     switch (c) {
 
@@ -422,14 +428,10 @@ int main(int argc, char **argv)
       
       break;
       
-      /*case 'i':
-        interf1 = atoi(optarg);
-        break;
+    case 'i':
+      prb_inter=1;
+      break;
 	
-	case 'j':
-        interf2 = atoi(optarg);
-        break;*/
-
     case 'k':
       printf("Setting threequarter_fs_flag\n");
       openair0_cfg[0].threequarter_fs= 1;
@@ -460,6 +462,14 @@ int main(int argc, char **argv)
       printf("Setting SNR0 to %f\n", snr0);
       break;
 
+    case 'u':
+      mu = atoi(optarg);
+      break;
+
+    case 'w':
+      start_rb = atoi(optarg);
+      break;
+
 /*
     case 't':
       eff_tp_check = (float)atoi(optarg)/100;
@@ -581,13 +591,15 @@ int main(int argc, char **argv)
       printf("-f Number of frames to simulate\n");
       printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
       printf("-h This message\n");
-      //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
+      printf("-i Activate PRB based averaging for channel estimation. Frequncy domain interpolation by default.\n");
       //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
       printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
       printf("-m MCS value\n");
       printf("-n Number of trials to simulate\n");
       printf("-p Use extended prefix mode\n");
       printf("-t Delay spread for multipath channel\n");
+      printf("-u Set the numerology\n");
+      printf("-w Start PRB for PUSCH\n");
       //printf("-x Transmission mode (1,2,6 for the moment)\n");
       printf("-y Number of TX antennas used in eNB\n");
       printf("-z Number of RX antennas used in UE\n");
@@ -628,10 +640,12 @@ int main(int argc, char **argv)
 
   if (N_RB_UL >= 217) sampling_frequency = 122.88;
   else if (N_RB_UL >= 106) sampling_frequency = 61.44;
+  else if (N_RB_UL >= 32) sampling_frequency = 32.72;
   else { printf("Need at least 106 PRBs\b"); exit(-1); }
   if (N_RB_UL == 273) bandwidth = 100;
   else if (N_RB_UL == 217) bandwidth = 80;
   else if (N_RB_UL == 106) bandwidth = 40;
+  else if (N_RB_UL == 32) bandwidth = 50;
   else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
 			   
   if (openair0_cfg[0].threequarter_fs == 1) sampling_frequency*=.75;
@@ -652,6 +666,7 @@ int main(int argc, char **argv)
   RC.gNB = (PHY_VARS_gNB **) malloc(sizeof(PHY_VARS_gNB *));
   RC.gNB[0] = calloc(1,sizeof(PHY_VARS_gNB));
   gNB = RC.gNB[0];
+  gNB->ofdm_offset_divisor = UINT_MAX;
   gNB->threadPool = (tpool_t*)malloc(sizeof(tpool_t));
   gNB->respDecode = (notifiedFIFO_t*) malloc(sizeof(notifiedFIFO_t));
   char tp_param[] = "n";
@@ -664,6 +679,7 @@ int main(int argc, char **argv)
   gNB->UL_INFO.crc_ind.crc_list = (nfapi_nr_crc_t *)malloc(NB_UE_INST*sizeof(nfapi_nr_crc_t));
   gNB->UL_INFO.rx_ind.number_of_pdus = 0;
   gNB->UL_INFO.crc_ind.number_crcs = 0;
+  gNB->prb_interpolation = prb_inter;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
 
 
@@ -796,7 +812,11 @@ int main(int argc, char **argv)
   nr_scheduled_response_t scheduled_response;
   fapi_nr_ul_config_request_t ul_config;
   fapi_nr_tx_request_t tx_req;
-  
+
+  memset(&scheduled_response, 0, sizeof(scheduled_response));
+  memset(&ul_config, 0, sizeof(ul_config));
+  memset(&tx_req, 0, sizeof(tx_req));
+
   uint8_t ptrs_mcs1 = 2;
   uint8_t ptrs_mcs2 = 4;
   uint8_t ptrs_mcs3 = 10;
@@ -944,9 +964,12 @@ int main(int argc, char **argv)
     input_fd);
     if (read_errors==0) exit(1);
     for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
-           slot_offset,
-           ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
-           ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
+				   slot_offset,
+				   ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
+				   ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
+
+    mod_order = nr_get_Qm_ul(Imcs, mcs_table);
+    code_rate = nr_get_code_rate_ul(Imcs, mcs_table);
   }
   
   for (SNR = snr0; SNR < snr1; SNR += snr_step) {
@@ -968,6 +991,10 @@ int main(int argc, char **argv)
     reset_meas(&gNB->ulsch_llr_stats);
     reset_meas(&gNB->ulsch_channel_compensation_stats);
     reset_meas(&gNB->ulsch_rbs_extraction_stats);
+    reset_meas(&UE->ulsch_ldpc_encoding_stats);
+    reset_meas(&UE->ulsch_rate_matching_stats);
+    reset_meas(&UE->ulsch_interleaving_stats);
+    reset_meas(&UE->ulsch_encoding_stats);
 
     clear_pusch_stats(gNB);
     for (trial = 0; trial < n_trials; trial++) {
@@ -1160,7 +1187,7 @@ int main(int argc, char **argv)
                                 frame_parms->ofdm_symbol_size/(12*nb_rb));
 
         for (i=0; i<slot_length; i++) {
-          for (int aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
+          for (int aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
             s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
             s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
           }
@@ -1228,6 +1255,8 @@ int main(int argc, char **argv)
 		&gNB->pusch_vars[0]->rxdataF_ext[0][start_symbol*NR_NB_SC_PER_RB * pusch_pdu->rb_size],nb_symb_sch*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
 	  LOG_M("chestF0.m","chF0",
 		&gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+	  LOG_M("chestT0.m","chT0",
+		&gNB->pusch_vars[0]->ul_ch_estimates_time[0][0],frame_parms->ofdm_symbol_size,1,1);
 	  LOG_M("chestF0_ext.m","chF0_ext",
 		&gNB->pusch_vars[0]->ul_ch_estimates_ext[0][(start_symbol+1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size))],
 		(nb_symb_sch-1)*(off+(NR_NB_SC_PER_RB * pusch_pdu->rb_size)),1,1);
@@ -1345,6 +1374,11 @@ int main(int argc, char **argv)
       printStatIndent2(&gNB->ulsch_llr_stats,"ULSCH llr computation");
       printStatIndent(&gNB->ulsch_unscrambling_stats,"ULSCH unscrambling");
       printStatIndent(&gNB->ulsch_decoding_stats,"ULSCH total decoding time");
+      printStatIndent(&UE->ulsch_encoding_stats,"ULSCH total encoding time");
+      printStatIndent2(&UE->ulsch_segmentation_stats,"ULSCH segmentation time");
+      printStatIndent2(&UE->ulsch_ldpc_encoding_stats,"ULSCH LDPC encoder time");
+      printStatIndent2(&UE->ulsch_rate_matching_stats,"ULSCH rate-matching time");
+      printStatIndent2(&UE->ulsch_interleaving_stats,"ULSCH interleaving time");
       //printStatIndent2(&gNB->ulsch_deinterleaving_stats,"ULSCH deinterleaving");
       //printStatIndent2(&gNB->ulsch_rate_unmatching_stats,"ULSCH rate matching rx");
       //printStatIndent2(&gNB->ulsch_ldpc_decoding_stats,"ULSCH ldpc decoding");
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
index 4d17fe723cd8653f2e3715ba5ae93dc8ba0da9bf..b8a5c7a78069cc88aa0072f68fefeea4c5bd776b 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
@@ -146,6 +146,11 @@ int oai_nfapi_dl_tti_req(nfapi_nr_dl_tti_request_t *dl_config_req) { return(0);
 int oai_nfapi_tx_data_req(nfapi_nr_tx_data_request_t *tx_data_req){ return(0);  }
 int oai_nfapi_ul_dci_req(nfapi_nr_ul_dci_request_t *ul_dci_req){ return(0);  }
 int oai_nfapi_ul_tti_req(nfapi_nr_ul_tti_request_t *ul_tti_req){ return(0);  }
+int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind) { return(0);  }
+int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind) { return(0);  }
+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_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); }
 
diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c
index 7ac19804176115087bb1db54b803543bd20a7bf9..d19afcd0305a9d6a0a56f17a8186d56d2d866924 100644
--- a/openair1/SIMULATION/TOOLS/abstraction.c
+++ b/openair1/SIMULATION/TOOLS/abstraction.c
@@ -111,14 +111,14 @@ int freq_channel(channel_desc_t *desc,uint16_t nb_rb,int16_t n_samples) {
 
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].x=0.0;
-        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y=0.0;
+        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].r=0.0;
+        desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].i=0.0;
 
         for (l=0; l<(int)desc->nb_taps; l++) {
-          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].x+=(desc->a[l][aarx+(aatx*desc->nb_rx)].x*clut[l]+
-              desc->a[l][aarx+(aatx*desc->nb_rx)].y*slut[l]);
-          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].y+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].x*slut[l]+
-              desc->a[l][aarx+(aatx*desc->nb_rx)].y*clut[l]);
+          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].r+=(desc->a[l][aarx+(aatx*desc->nb_rx)].r*clut[l]+
+              desc->a[l][aarx+(aatx*desc->nb_rx)].i*slut[l]);
+          desc->chF[aarx+(aatx*desc->nb_rx)][n_samples/2+f2].i+=(-desc->a[l][aarx+(aatx*desc->nb_rx)].r*slut[l]+
+              desc->a[l][aarx+(aatx*desc->nb_rx)].i*clut[l]);
         }
       }
     }
@@ -138,42 +138,42 @@ double compute_pbch_sinr(channel_desc_t *desc,
   uint16_t f;
   uint8_t aarx,aatx;
   double S;
-  struct complex S_i1;
-  struct complex S_i2;
+  struct complexd S_i1;
+  struct complexd S_i2;
   avg_sinr=0.0;
 
   //  printf("nb_rb %d\n",nb_rb);
   for (f=(nb_rb-6); f<(nb_rb+6); f++) {
     S = 0.0;
-    S_i1.x =0.0;
-    S_i1.y =0.0;
-    S_i2.x =0.0;
-    S_i2.y =0.0;
+    S_i1.r =0.0;
+    S_i1.i =0.0;
+    S_i2.r =0.0;
+    S_i2.i =0.0;
 
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                 desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc->chF[aarx+(aatx*desc->nb_rx)][f].y);
+        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                 desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc->chF[aarx+(aatx*desc->nb_rx)][f].i);
         //  printf("%d %d chF[%d] => (%f,%f)\n",aarx,aatx,f,desc->chF[aarx+(aatx*desc->nb_rx)][f].x,desc->chF[aarx+(aatx*desc->nb_rx)][f].y);
 
         if (desc_i1) {
-          S_i1.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i1.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i1.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i1.i += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
 
         if (desc_i2) {
-          S_i2.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i2.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i2.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i2.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
       }
     }
 
     //    printf("snr %f f %d : S %f, S_i1 %f, S_i2 %f\n",snr,f-nb_rb,S,snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y),snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y));
-    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y)+snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y)));
+    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.r*S_i1.r + S_i1.i*S_i1.i)+snr_i2*sqrt(S_i2.r*S_i2.r + S_i2.i*S_i2.i)));
   }
 
   //  printf("avg_sinr %f (%f,%f,%f)\n",avg_sinr/12.0,snr,snr_i1,snr_i2);
@@ -191,42 +191,42 @@ double compute_sinr(channel_desc_t *desc,
   uint16_t f;
   uint8_t aarx,aatx;
   double S;
-  struct complex S_i1;
-  struct complex S_i2;
+  struct complexd S_i1;
+  struct complexd S_i2;
   DevAssert( nb_rb > 0 );
   avg_sinr=0.0;
 
   //  printf("nb_rb %d\n",nb_rb);
   for (f=0; f<2*nb_rb; f++) {
     S = 0.0;
-    S_i1.x =0.0;
-    S_i1.y =0.0;
-    S_i2.x =0.0;
-    S_i2.y =0.0;
+    S_i1.r =0.0;
+    S_i1.i =0.0;
+    S_i2.r =0.0;
+    S_i2.i =0.0;
 
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                 desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc->chF[aarx+(aatx*desc->nb_rx)][f].y);
+        S    += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                 desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc->chF[aarx+(aatx*desc->nb_rx)][f].i);
 
         if (desc_i1) {
-          S_i1.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i1.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i1.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i1.i += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i1->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
 
         if (desc_i2) {
-          S_i2.x += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x +
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y);
-          S_i2.y += (desc->chF[aarx+(aatx*desc->nb_rx)][f].x*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].y -
-                     desc->chF[aarx+(aatx*desc->nb_rx)][f].y*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].x);
+          S_i2.r += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r +
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i);
+          S_i2.i += (desc->chF[aarx+(aatx*desc->nb_rx)][f].r*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].i -
+                     desc->chF[aarx+(aatx*desc->nb_rx)][f].i*desc_i2->chF[aarx+(aatx*desc->nb_rx)][f].r);
         }
       }
     }
 
     //        printf("f %d : S %f, S_i1 %f, S_i2 %f\n",f-nb_rb,snr*S,snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y),snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y));
-    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.x*S_i1.x + S_i1.y*S_i1.y)+snr_i2*sqrt(S_i2.x*S_i2.x + S_i2.y*S_i2.y)));
+    avg_sinr += (snr*S/(desc->nb_tx+snr_i1*sqrt(S_i1.r*S_i1.r + S_i1.i*S_i1.i)+snr_i2*sqrt(S_i2.r*S_i2.r + S_i2.i*S_i2.i)));
   }
 
   //  printf("avg_sinr %f (%f,%f,%f)\n",avg_sinr/12.0,snr,snr_i1,snr_i2);
diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c
index 3608eb7da25d623cfaa5a87d69bc41c6de8abfb9..3045d8ca6c0b36b7fb34bb529cb64e3281303a15 100644
--- a/openair1/SIMULATION/TOOLS/multipath_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_channel.c
@@ -156,7 +156,7 @@ void multipath_channel(channel_desc_t *desc,
 {
 
   int i,ii,j,l;
-  struct complex rx_tmp,tx;
+  struct complexd rx_tmp,tx;
 
   double path_loss = pow(10,desc->path_loss_dB/20);
   int dd;
@@ -183,32 +183,32 @@ void multipath_channel(channel_desc_t *desc,
 
   for (i=0; i<((int)length-dd); i++) {
     for (ii=0; ii<desc->nb_rx; ii++) {
-      rx_tmp.x = 0;
-      rx_tmp.y = 0;
+      rx_tmp.r = 0;
+      rx_tmp.i = 0;
 
       for (j=0; j<desc->nb_tx; j++) {
         for (l = 0; l<(int)desc->channel_length; l++) {
           if ((i>=0) && (i-l)>=0) {
-            tx.x = tx_sig_re[j][i-l];
-            tx.y = tx_sig_im[j][i-l];
+            tx.r = tx_sig_re[j][i-l];
+            tx.i = tx_sig_im[j][i-l];
           } else {
-            tx.x =0;
-            tx.y =0;
+            tx.r =0;
+            tx.i =0;
           }
 
-          rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
-          rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
+          rx_tmp.r += (tx.r * desc->ch[ii+(j*desc->nb_rx)][l].r) - (tx.i * desc->ch[ii+(j*desc->nb_rx)][l].i);
+          rx_tmp.i += (tx.i * desc->ch[ii+(j*desc->nb_rx)][l].r) + (tx.r * desc->ch[ii+(j*desc->nb_rx)][l].i);
 
           if (i==0 && log_channel == 1) {
-	           printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].x,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].y,2.0)),
-		         desc->ch[ii+(j*desc->nb_rx)][l].x,
-		         desc->ch[ii+(j*desc->nb_rx)][l].y);
+	           printf("channel[%d][%d][%d] = %f dB (%e,%e)\n",ii,j,l,10*log10(pow(desc->ch[ii+(j*desc->nb_rx)][l].r,2.0)+pow(desc->ch[ii+(j*desc->nb_rx)][l].i,2.0)),
+		         desc->ch[ii+(j*desc->nb_rx)][l].r,
+		         desc->ch[ii+(j*desc->nb_rx)][l].i);
 	        }
         } //l
       }  // j
 
-      rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
-      rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
+      rx_sig_re[ii][i+dd] = rx_tmp.r*path_loss;
+      rx_sig_im[ii][i+dd] = rx_tmp.i*path_loss;
 #ifdef DEBUG_CHANNEL      
       if ((i%32)==0) {
 	       printf("rx aa %d: %p %p %f,%f => %e,%e\n",ii,rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index 3acc3f485f9f03cb96ec7781301fa88aa98c6006..d393bb134296d82bf4964ad1087b75d2467d18a2 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -72,7 +72,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
                        uint8_t channel_length,
                        double *amps,
                        double *delays,
-                       struct complex *R_sqrt,
+                       struct complexd *R_sqrt,
                        double Td,
                        double sampling_rate,
                        double channel_bandwidth,
@@ -116,44 +116,44 @@ void fill_channel_desc(channel_desc_t *chan_desc,
   chan_desc->first_run                  = 1;
   chan_desc->ip                         = 0.0;
   chan_desc->max_Doppler                = max_Doppler;
-  chan_desc->ch                         = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->chF                        = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->a                          = (struct complex **) malloc(nb_taps*sizeof(struct complex *));
+  chan_desc->ch                         = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->chF                        = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->a                          = (struct complexd **) malloc(nb_taps*sizeof(struct complexd *));
   LOG_D(OCM,"[CHANNEL] Filling ch \n");
 
   for (i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->ch[i] = (struct complex *) malloc(channel_length * sizeof(struct complex));
+    chan_desc->ch[i] = (struct complexd *) malloc(channel_length * sizeof(struct complexd));
 
   for (i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex)); // allocate for up to 100 RBs, 12 samples per RB
+    chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd)); // allocate for up to 100 RBs, 12 samples per RB
 
   LOG_D(OCM,"[CHANNEL] Filling a (nb_taps %d)\n",nb_taps);
 
   for (i = 0; i<nb_taps; i++) {
-    LOG_D(OCM,"tap %d (%p,%zu)\n",i,&chan_desc->a[i],nb_tx*nb_rx * sizeof(struct complex));
-    chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+    LOG_D(OCM,"tap %d (%p,%zu)\n",i,&chan_desc->a[i],nb_tx*nb_rx * sizeof(struct complexd));
+    chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
   }
 
   LOG_D(OCM,"[CHANNEL] Doing R_sqrt ...\n");
 
   if (R_sqrt == NULL) {
-    chan_desc->R_sqrt         = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
+    chan_desc->R_sqrt         = (struct complexd **) calloc(nb_taps,sizeof(struct complexd *));
     chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_NTAPS ;
 
     for (i = 0; i<nb_taps; i++) {
-      chan_desc->R_sqrt[i]    = (struct complex *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
+      chan_desc->R_sqrt[i]    = (struct complexd *) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complexd));
 
       for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-        chan_desc->R_sqrt[i][j].x = 1.0;
-        chan_desc->R_sqrt[i][j].y = 0.0;
+        chan_desc->R_sqrt[i][j].r = 1.0;
+        chan_desc->R_sqrt[i][j].i = 0.0;
       }
     }
   } else {
-    chan_desc->R_sqrt = (struct complex **) calloc(nb_taps,sizeof(struct complex *));
+    chan_desc->R_sqrt = (struct complexd **) calloc(nb_taps,sizeof(struct complexd *));
 
     for (i = 0; i<nb_taps; i++) {
-      //chan_desc->R_sqrt[i]    = (struct complex*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complex));
-      //chan_desc->R_sqrt = (struct complex*)&R_sqrt[i][0];
+      //chan_desc->R_sqrt[i]    = (struct complexd*) calloc(nb_tx*nb_rx*nb_tx*nb_rx,sizeof(struct complexd));
+      //chan_desc->R_sqrt = (struct complexd*)&R_sqrt[i][0];
       /* all chan_desc share the same R_sqrt, coming from caller */
       chan_desc->R_sqrt[i] = R_sqrt;
     }
@@ -161,7 +161,7 @@ void fill_channel_desc(channel_desc_t *chan_desc,
 
   for (i = 0; i<nb_taps; i++) {
     for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-      LOG_D(OCM,"Rsqrt[%d][%d] %f %f\n",i,j,chan_desc->R_sqrt[i][j].x,chan_desc->R_sqrt[i][j].y);
+      LOG_D(OCM,"Rsqrt[%d][%d] %f %f\n",i,j,chan_desc->R_sqrt[i][j].r,chan_desc->R_sqrt[i][j].i);
     }
   }
 
@@ -418,61 +418,61 @@ static double default_amps_lin[] = {0.3868472, 0.3094778, 0.1547389, 0.0773694,
 static double default_amp_lin[] = {1};
 
 //correlation matrix for a 2x2 channel with full Tx correlation
-static struct complex R_sqrt_22_corr[16] = {{0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_corr[16] = {{0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0},
   {0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {0.70711,0}
 };
 
 //correlation matrix for a fully correlated 2x1 channel (h1==h2)
-static struct complex R_sqrt_21_corr[]  = {{0.70711,0}, {0.70711,0}, {0.70711,0}, {0.70711,0}};
+static struct complexd R_sqrt_21_corr[]  = {{0.70711,0}, {0.70711,0}, {0.70711,0}, {0.70711,0}};
 
 //correlation matrix for a 2x2 channel with full Tx anti-correlation
-static struct complex R_sqrt_22_anticorr[16] = {{0.70711,0}, {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_anticorr[16] = {{0.70711,0}, {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0}, {0.0, 0.0}, {-0.70711,0},
   {-0.70711,0}, {0.0, 0.0}, {0.70711,0}, {0.0, 0.0},
   {0.0, 0.0}, {-0.70711,0}, {0.0, 0.0}, {0.70711,0}
 };
 
 //correlation matrix for a fully anti-correlated 2x1 channel (h1==-h2)
-static struct complex R_sqrt_21_anticorr[4]  = {{0.70711,0}, {-0.70711,0}, {-0.70711,0}, {0.70711,0}};
+static struct complexd R_sqrt_21_anticorr[4]  = {{0.70711,0}, {-0.70711,0}, {-0.70711,0}, {0.70711,0}};
 
 // full correlation matrix in vectorized form for 2x2 channel, where h1 is  perfectly orthogonal to h2
 
-static struct complex R_sqrt_22_orthogonal[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_orthogonal[16] = {{0.70711,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, 0.0}, {0.0,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.0,0.0}, {0.0, 0.0}, {0.70711,0.0}
 };
 
 // full correlation matrix for TM4 to make orthogonal effective channel
-static struct complex R_sqrt_22_orth_eff_ch_TM4_prec_real[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
+static struct complexd R_sqrt_22_orth_eff_ch_TM4_prec_real[16] = {{0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {-0.70711,0.0},
   {0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0}, {0.70711,0.0}
 };
 
-static struct complex R_sqrt_22_orth_eff_ch_TM4_prec_imag[16] = {{0.70711,0.0}, {0.0,0.0}, {0.0, -0.70711}, {0.0,0.0},
+static struct complexd R_sqrt_22_orth_eff_ch_TM4_prec_imag[16] = {{0.70711,0.0}, {0.0,0.0}, {0.0, -0.70711}, {0.0,0.0},
   {0.0, 0.0}, {0.70711,0.0}, {0.0, 0.0}, {0.0,0.70711},
   {0.0,-0.70711}, {0.0, 0.0}, {-0.70711,0.0}, {0.0, 0.0},
   {0.0, 0.0}, {0.0,0.70711}, {0.0, 0.0}, {-0.70711,0.0}
 };
 
 //Correlation matrix for EPA channel
-static struct complex R_sqrt_22_EPA_low[16] = {{1.0,0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0},
+static struct complexd R_sqrt_22_EPA_low[16] = {{1.0,0.0}, {0.0,0.0}, {0.0,0.0}, {0.0,0.0},
   {0.0,0.0}, {1.0,0.0}, {0.0,0.0}, {0.0,0.0},
   {0.0,0.0}, {0.0,0.0}, {1.0,0.0}, {0.0,0.0},
   {0.0,0.0}, {0.0,0.0}, {0.0,0.0}, {1.0,0.0}
 };
 
-static struct complex R_sqrt_22_EPA_high[16] = {
+static struct complexd R_sqrt_22_EPA_high[16] = {
   {0.7179,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.2821,0.0},
   {0.4500,0.0}, {0.7179,0.0}, {0.2821,0.0}, {0.4500,0.0},
   {0.4500,0.0}, {0.2821,0.0}, {0.7179,0.0}, {0.4500,0.0},
   {0.2821,0.0}, {0.4500,0.0}, {0.4500,0.0}, {0.7179,0.0}
 };
 
-static struct complex R_sqrt_22_EPA_medium[16] = {{0.8375,0.0}, {0.5249,0.0}, {0.1286,0.0}, {0.0806,0.0},
+static struct complexd R_sqrt_22_EPA_medium[16] = {{0.8375,0.0}, {0.5249,0.0}, {0.1286,0.0}, {0.0806,0.0},
   {0.5249,0.0}, {0.8375,0.0}, {0.0806,0.0}, {0.1286,0.0},
   {0.1286,0.0}, {0.0806,0.0}, {0.8375,0.0}, {0.5249,0.0},
   {0.0806,0.0}, {0.1286,0.0}, {0.5249,0.0}, {0.8375,0.0}
@@ -511,37 +511,37 @@ void tdlModel(int  tdl_paths, double *tdl_delays, double *tdl_amps_dB, double DS
   chan_desc->delays         = tdl_delays;
   chan_desc->aoa            = 0;
   chan_desc->random_aoa     = 0;
-  chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-  chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+  chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+  chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
   for (int i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+    chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
   for (int i = 0; i<nb_tx*nb_rx; i++)
-    chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+    chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
   for (int i = 0; i<chan_desc->nb_taps; i++)
-    chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+    chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-  chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+  chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
   if (nb_tx==2 && nb_rx==2) {
     for (int i = 0; i<(tdl_pathsby3); i++)
-      chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+      chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
   } else if (nb_tx==2 && nb_rx==1) {
     for (int i = 0; i<(tdl_pathsby3); i++)
-      chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+      chan_desc->R_sqrt[i] = (struct complexd *) &R21_sqrt[i][0];
   } else if (nb_tx==1 && nb_rx==2) {
     for (int i = 0; i<(tdl_pathsby3); i++)
-      chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+      chan_desc->R_sqrt[i] = (struct complexd *) &R12_sqrt[i][0];
   } else {
     for (int i = 0; i<(tdl_pathsby3); i++) {
-      chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+      chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
       for (int j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-        chan_desc->R_sqrt[i][j].x = 1.0;
-        chan_desc->R_sqrt[i][j].y = 0.0;
+        chan_desc->R_sqrt[i][j].r = 1.0;
+        chan_desc->R_sqrt[i][j].i = 0.0;
       }
 
       LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
@@ -576,7 +576,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
   double sum_amps;
   double aoa,ricean_factor,Td,maxDoppler;
   int channel_length,nb_taps;
-  struct complex *R_sqrt_ptr2;
+  struct complexd *R_sqrt_ptr2;
   chan_desc->modelid                   = channel_model;
   chan_desc->nb_tx                      = nb_tx;
   chan_desc->nb_rx                      = nb_rx;
@@ -625,39 +625,39 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+      chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
       if (nb_tx==2 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else if (nb_tx==2 && nb_rx==1) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R21_sqrt[i][0];
       } else if (nb_tx==1 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R12_sqrt[i][0];
       } else {
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
@@ -687,39 +687,39 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 0.1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+      chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
       if (nb_tx==2 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else if (nb_tx==2 && nb_rx==1) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R21_sqrt[i][0];
       } else if (nb_tx==1 && nb_rx==2) {
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R12_sqrt[i][0];
       } else {
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
@@ -784,34 +784,34 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else {
-        chan_desc->R_sqrt         = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt         = (struct complexd **) malloc(6*sizeof(struct complexd **));
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -840,21 +840,21 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd **));
 
         for (i = 0; i<chan_desc->nb_taps; i++)
           chan_desc->R_sqrt[i] = R_sqrt_22_EPA_low;
@@ -863,9 +863,9 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       }
 
       /*else {
-        chan_desc->R_sqrt         = (struct complex**) malloc(6*sizeof(struct complex**));
+        chan_desc->R_sqrt         = (struct complexd**) malloc(6*sizeof(struct complexd**));
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
             chan_desc->R_sqrt[i][j].x = 1.0;
             chan_desc->R_sqrt[i][j].y = 0.0;
@@ -895,21 +895,21 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd **));
 
         for (i = 0; i<chan_desc->nb_taps; i++)
           chan_desc->R_sqrt[i] = R_sqrt_22_EPA_high;
@@ -918,9 +918,9 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       }
 
       /*else {
-        chan_desc->R_sqrt         = (struct complex**) malloc(6*sizeof(struct complex**));
+        chan_desc->R_sqrt         = (struct complexd**) malloc(6*sizeof(struct complexd**));
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
             chan_desc->R_sqrt[i][j].x = 1.0;
             chan_desc->R_sqrt[i][j].y = 0.0;
@@ -950,21 +950,21 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd **));
 
         for (i = 0; i<chan_desc->nb_taps; i++)
           chan_desc->R_sqrt[i] = R_sqrt_22_EPA_medium;
@@ -973,9 +973,9 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       }
 
       /*else {
-        chan_desc->R_sqrt         = (struct complex**) malloc(6*sizeof(struct complex**));
+        chan_desc->R_sqrt         = (struct complexd**) malloc(6*sizeof(struct complexd**));
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd*) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
             chan_desc->R_sqrt[i][j].x = 1.0;
             chan_desc->R_sqrt[i][j].y = 0.0;
@@ -1005,34 +1005,34 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else {
-        chan_desc->R_sqrt         = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt         = (struct complexd **) malloc(6*sizeof(struct complexd **));
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -1061,34 +1061,34 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
       if (nb_tx==2 && nb_rx==2) {
-        chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd **));
 
         for (i = 0; i<6; i++)
-          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+          chan_desc->R_sqrt[i] = (struct complexd *) &R22_sqrt[i][0];
       } else {
-        chan_desc->R_sqrt         = (struct complex **) malloc(6*sizeof(struct complex **));
+        chan_desc->R_sqrt         = (struct complexd **) malloc(6*sizeof(struct complexd **));
         chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6 ;
 
         for (i = 0; i<6; i++) {
-          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+          chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
           for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-            chan_desc->R_sqrt[i][j].x = 1.0;
-            chan_desc->R_sqrt[i][j].y = 0.0;
+            chan_desc->R_sqrt[i][j].r = 1.0;
+            chan_desc->R_sqrt[i][j].i = 0.0;
           }
 
           LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -1117,28 +1117,28 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       chan_desc->ricean_factor  = 1;
       chan_desc->aoa            = 0;
       chan_desc->random_aoa     = 0;
-      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
-      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+      chan_desc->ch             = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->chF            = (struct complexd **) malloc(nb_tx*nb_rx*sizeof(struct complexd *));
+      chan_desc->a              = (struct complexd **) malloc(chan_desc->nb_taps*sizeof(struct complexd *));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+        chan_desc->ch[i] = (struct complexd *) malloc(chan_desc->channel_length * sizeof(struct complexd));
 
       for (i = 0; i<nb_tx*nb_rx; i++)
-        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+        chan_desc->chF[i] = (struct complexd *) malloc(1200 * sizeof(struct complexd));
 
       for (i = 0; i<chan_desc->nb_taps; i++)
-        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->a[i]         = (struct complexd *) malloc(nb_tx*nb_rx * sizeof(struct complexd));
 
-      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex *));
+      chan_desc->R_sqrt  = (struct complexd **) malloc(6*sizeof(struct complexd *));
       chan_desc->free_flags=chan_desc->free_flags|CHANMODEL_FREE_RSQRT_6;
 
       for (i = 0; i<6; i++) {
-        chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+        chan_desc->R_sqrt[i]    = (struct complexd *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complexd));
 
         for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
-          chan_desc->R_sqrt[i][j].x = 1.0;
-          chan_desc->R_sqrt[i][j].y = 0.0;
+          chan_desc->R_sqrt[i][j].r = 1.0;
+          chan_desc->R_sqrt[i][j].i = 0.0;
         }
 
         LOG_W(OCM,"correlation matrix only implemented for nb_tx==2 and nb_rx==2, using identity\n");
@@ -1708,8 +1708,8 @@ void set_channeldesc_name(channel_desc_t *cdesc,char *modelname) {
 int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
   double s;
   int i,k,l,aarx,aatx;
-  struct complex anew[NB_ANTENNAS_TX*NB_ANTENNAS_RX],acorr[NB_ANTENNAS_TX*NB_ANTENNAS_RX];
-  struct complex phase, alpha, beta;
+  struct complexd anew[NB_ANTENNAS_TX*NB_ANTENNAS_RX],acorr[NB_ANTENNAS_TX*NB_ANTENNAS_RX];
+  struct complexd phase, alpha, beta;
   AssertFatal(desc->nb_tx<=NB_ANTENNAS_TX && desc->nb_rx <= NB_ANTENNAS_RX,
               "random_channel.c: Error: temporary buffer for channel not big enough (%d,%d)\n",desc->nb_tx,desc->nb_rx);
   start_meas(&desc->random_channel);
@@ -1717,8 +1717,8 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
   for (i=0; i<(int)desc->nb_taps; i++) {
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
-        anew[aarx+(aatx*desc->nb_rx)].x = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
-        anew[aarx+(aatx*desc->nb_rx)].y = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
+        anew[aarx+(aatx*desc->nb_rx)].r = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
+        anew[aarx+(aatx*desc->nb_rx)].i = sqrt(desc->ricean_factor*desc->amps[i]/2) * gaussdouble(0.0,1.0);
 
         if ((i==0) && (desc->ricean_factor != 1.0)) {
           if (desc->random_aoa==1) {
@@ -1728,10 +1728,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
           // this assumes that both RX and TX have linear antenna arrays with lambda/2 antenna spacing.
           // Furhter it is assumed that the arrays are parallel to each other and that they are far enough apart so
           // that we can safely assume plane wave propagation.
-          phase.x = cos(M_PI*((aarx-aatx)*sin(desc->aoa)));
-          phase.y = sin(M_PI*((aarx-aatx)*sin(desc->aoa)));
-          anew[aarx+(aatx*desc->nb_rx)].x += phase.x * sqrt(1.0-desc->ricean_factor);
-          anew[aarx+(aatx*desc->nb_rx)].y += phase.y * sqrt(1.0-desc->ricean_factor);
+          phase.r = cos(M_PI*((aarx-aatx)*sin(desc->aoa)));
+          phase.i = sin(M_PI*((aarx-aatx)*sin(desc->aoa)));
+          anew[aarx+(aatx*desc->nb_rx)].r += phase.r * sqrt(1.0-desc->ricean_factor);
+          anew[aarx+(aatx*desc->nb_rx)].i += phase.i * sqrt(1.0-desc->ricean_factor);
         }
 
 #ifdef DEBUG_CH
@@ -1752,10 +1752,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
     */
     //apply correlation matrix
     //compute acorr = R_sqrt[i] * anew
-    alpha.x = 1.0;
-    alpha.y = 0.0;
-    beta.x = 0.0;
-    beta.y = 0.0;
+    alpha.r = 1.0;
+    alpha.i = 0.0;
+    beta.r = 0.0;
+    beta.i = 0.0;
     cblas_zgemv(CblasRowMajor, CblasNoTrans, desc->nb_tx*desc->nb_rx, desc->nb_tx*desc->nb_rx,
                 (void *) &alpha, (void *) desc->R_sqrt[i/3], desc->nb_rx*desc->nb_tx,
                 (void *) anew, 1, (void *) &beta, (void *) acorr, 1);
@@ -1776,10 +1776,10 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
       // a = alpha*acorr+beta*a
       // a = beta*a
       // a = a+alpha*acorr
-      alpha.x = sqrt(1-desc->forgetting_factor);
-      alpha.y = 0;
-      beta.x = sqrt(desc->forgetting_factor);
-      beta.y = 0;
+      alpha.r = sqrt(1-desc->forgetting_factor);
+      alpha.i = 0;
+      beta.r = sqrt(desc->forgetting_factor);
+      beta.i = 0;
       cblas_zscal(desc->nb_tx*desc->nb_rx, (void *) &beta, (void *) desc->a[i], 1);
       cblas_zaxpy(desc->nb_tx*desc->nb_rx, (void *) &alpha, (void *) acorr, 1, (void *) desc->a[i], 1);
       //  desc->a[i][aarx+(aatx*desc->nb_rx)].x = (sqrt(desc->forgetting_factor)*desc->a[i][aarx+(aatx*desc->nb_rx)].x) + sqrt(1-desc->forgetting_factor)*anew.x;
@@ -1799,7 +1799,7 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
 
   stop_meas(&desc->random_channel);
 
-  //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complex));
+  //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complexd));
 
   if (abstraction_flag==0) {
     start_meas(&desc->interp_time);
@@ -1807,12 +1807,12 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
     for (aarx=0; aarx<desc->nb_rx; aarx++) {
       for (aatx=0; aatx<desc->nb_tx; aatx++) {
         if (desc->channel_length == 1) {
-          desc->ch[aarx+(aatx*desc->nb_rx)][0].x = desc->a[0][aarx+(aatx*desc->nb_rx)].x;
-          desc->ch[aarx+(aatx*desc->nb_rx)][0].y = desc->a[0][aarx+(aatx*desc->nb_rx)].y;
+          desc->ch[aarx+(aatx*desc->nb_rx)][0].r = desc->a[0][aarx+(aatx*desc->nb_rx)].r;
+          desc->ch[aarx+(aatx*desc->nb_rx)][0].i = desc->a[0][aarx+(aatx*desc->nb_rx)].i;
         } else {
           for (k=0; k<(int)desc->channel_length; k++) {
-            desc->ch[aarx+(aatx*desc->nb_rx)][k].x = 0.0;
-            desc->ch[aarx+(aatx*desc->nb_rx)][k].y = 0.0;
+            desc->ch[aarx+(aatx*desc->nb_rx)][k].r = 0.0;
+            desc->ch[aarx+(aatx*desc->nb_rx)][k].i = 0.0;
 
             for (l=0; l<desc->nb_taps; l++) {
               if ((k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset) == 0)
@@ -1821,8 +1821,8 @@ int random_channel(channel_desc_t *desc, uint8_t abstraction_flag) {
                 s = sin(M_PI*(k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset))/
                     (M_PI*(k - (desc->delays[l]*desc->sampling_rate) - desc->channel_offset));
 
-              desc->ch[aarx+(aatx*desc->nb_rx)][k].x += s*desc->a[l][aarx+(aatx*desc->nb_rx)].x;
-              desc->ch[aarx+(aatx*desc->nb_rx)][k].y += s*desc->a[l][aarx+(aatx*desc->nb_rx)].y;
+              desc->ch[aarx+(aatx*desc->nb_rx)][k].r += s*desc->a[l][aarx+(aatx*desc->nb_rx)].r;
+              desc->ch[aarx+(aatx*desc->nb_rx)][k].i += s*desc->a[l][aarx+(aatx*desc->nb_rx)].i;
               //        printf("l %d : desc->ch.x %f, s %e, delay %f\n",l,desc->a[l][aarx+(aatx*desc->nb_rx)].x,s,desc->delays[l]);
             } //nb_taps
 
@@ -2102,7 +2102,7 @@ int load_channellist(uint8_t nb_tx, uint8_t nb_rx, double sampling_rate, double
 #define Td 2.0
 main(int argc,char **argv) {
   double amps[8] = {.8,.2,.1,.04,.02,.01,.005};
-  struct complex ch[(int)(1+2*sampling_rate*Td)],phase;
+  struct complexd ch[(int)(1+2*sampling_rate*Td)],phase;
   int i;
   randominit();
   phase.x = 1.0;
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index 78e260b73f196142dc9d08da8fbe401e011583aa..4b3ac5f8623324594449f24aff6ed6902d55e51b 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -64,11 +64,11 @@ typedef struct {
   ///length of impulse response. should be set to 11+2*bw*t_max
   uint8_t channel_length;
   ///channel state vector. size(state) = nb_taps * (n_tx * n_rx);
-  struct complex **a;
+  struct complexd **a;
   ///interpolated (sample-spaced) channel impulse response. size(ch) = (n_tx * n_rx) * channel_length. ATTENTION: the dimensions of ch are the transposed ones of a. This is to allow the use of BLAS when applying the correlation matrices to the state.
-  struct complex **ch;
+  struct complexd **ch;
   ///Sampled frequency response (90 kHz resolution)
-  struct complex **chF;
+  struct complexd **chF;
   ///Maximum path delay in mus.
   double Td;
   ///Channel bandwidth in MHz.
@@ -84,7 +84,7 @@ typedef struct {
   ///in Hz. if >0 generate a channel with a Clarke's Doppler profile with a maximum Doppler bandwidth max_Doppler. CURRENTLY NOT IMPLEMENTED!
   double max_Doppler;
   ///Square root of the full correlation matrix size(R_tx) = nb_taps * (n_tx * n_rx) * (n_tx * n_rx).
-  struct complex **R_sqrt;
+  struct complexd **R_sqrt;
   ///path loss including shadow fading in dB
   double path_loss_dB;
   ///additional delay of channel in samples.
diff --git a/openair2/GNB_APP/L1_nr_paramdef.h b/openair2/GNB_APP/L1_nr_paramdef.h
index fc2bca19d5e25718e1c464e17da62565d353b541..0306713845b9f302a42a44b5bef53ae61b8030ed 100644
--- a/openair2/GNB_APP/L1_nr_paramdef.h
+++ b/openair2/GNB_APP/L1_nr_paramdef.h
@@ -47,6 +47,7 @@
 #define CONFIG_STRING_L1_REMOTE_N_PORTD                    "remote_n_portd"
 #define CONFIG_STRING_L1_TRANSPORT_N_PREFERENCE            "tr_n_preference"
 #define CONFIG_STRING_L1_PUSCH_PROC_THREADS                "pusch_proc_threads"
+#define CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR               "ofdm_offset_divisor"
 #define CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD              "pucch0_dtx_threshold"
 #define CONFIG_STRING_L1_PRACH_DTX_THRESHOLD               "prach_dtx_threshold"
 #define CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD               "pusch_dtx_threshold"
@@ -64,7 +65,8 @@
 {CONFIG_STRING_L1_REMOTE_N_PORTC,                    NULL,      0,         uptr:NULL,           defintval:50030,           TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_LOCAL_N_PORTD,                     NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_REMOTE_N_PORTD,                    NULL,      0,         uptr:NULL,           defintval:50031,           TYPE_UINT,     0},         \
-{CONFIG_STRING_L1_PUSCH_PROC_THREADS,                NULL,      0,         uptr:NULL,           defintval:1,               TYPE_UINT,     0},         \
+{CONFIG_STRING_L1_PUSCH_PROC_THREADS,                NULL,      0,         uptr:NULL,           defintval:3,               TYPE_UINT,     0}, \
+{CONFIG_STRING_L1_OFDM_OFFSET_DIVISOR,               NULL,      0,         uptr:NULL,           defuintval:8,              TYPE_UINT,     0}, \
 {CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD,              NULL,      0,         uptr:NULL,           defintval:100,             TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PRACH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:150,             TYPE_UINT,     0},         \
 {CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD,               NULL,      0,         uptr:NULL,           defintval:50,              TYPE_UINT,     0}          \
@@ -79,9 +81,10 @@
 #define L1_LOCAL_N_PORTD_IDX                               7
 #define L1_REMOTE_N_PORTD_IDX                              8
 #define L1_PUSCH_PROC_THREADS                              9
-#define L1_PUCCH0_DTX_THRESHOLD                            10
-#define L1_PRACH_DTX_THRESHOLD                             11
-#define L1_PUSCH_DTX_THRESHOLD                             12
+#define L1_OFDM_OFFSET_DIVISOR                             10
+#define L1_PUCCH0_DTX_THRESHOLD                            11
+#define L1_PRACH_DTX_THRESHOLD                             12
+#define L1_PUSCH_DTX_THRESHOLD                             13
 
 /*----------------------------------------------------------------------------------------------------------------------------------------------------*/
 #endif
diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c
index b1dc59f2e27bb816df2dd6c053955a2a9952e115..510402139995171f0dc43fab6b1eacbea3989cec 100644
--- a/openair2/GNB_APP/gnb_app.c
+++ b/openair2/GNB_APP/gnb_app.c
@@ -219,29 +219,30 @@ void *gNB_app_task(void *args_p)
     //registered_gnb = 0;
     __attribute__((unused)) uint32_t register_gnb_pending = gNB_app_register (gnb_id_start, gnb_id_end);
   }
+  
+  if (RC.nb_nr_inst > 0) {
+    if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
 
-  if (NODE_IS_CU(RC.nrrrc[0]->node_type)) {
-
-     if (itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL) < 0) {
-        LOG_E(F1AP, "Create task for F1AP CU failed\n");
-        AssertFatal(1==0,"exiting");
-     }
-  }
+      if (itti_create_task(TASK_CU_F1, F1AP_CU_task, NULL) < 0) {
+          LOG_E(F1AP, "Create task for F1AP CU failed\n");
+          AssertFatal(1==0,"exiting");
+      }
+    }
 
-  if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
+    if (NODE_IS_DU(RC.nrrrc[0]->node_type)) {
 
-    if (itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL) < 0) {
-       LOG_E(F1AP, "Create task for F1AP DU failed\n");
-       AssertFatal(1==0,"exiting");
+      if (itti_create_task(TASK_DU_F1, F1AP_DU_task, NULL) < 0) {
+        LOG_E(F1AP, "Create task for F1AP DU failed\n");
+        AssertFatal(1==0,"exiting");
+      }
+      // configure F1AP here for F1C
+      LOG_I(GNB_APP,"ngran_gNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n");
+      msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, F1AP_SETUP_REQ);
+      RCconfig_NR_DU_F1(msg_p, 0);
+      
+      itti_send_msg_to_task (TASK_DU_F1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
     }
-    // configure F1AP here for F1C
-    LOG_I(GNB_APP,"ngran_gNB_DU: Allocating ITTI message for F1AP_SETUP_REQ\n");
-    msg_p = itti_alloc_new_message (TASK_GNB_APP, 0, F1AP_SETUP_REQ);
-    RCconfig_NR_DU_F1(msg_p, 0);
-    
-    itti_send_msg_to_task (TASK_DU_F1, GNB_MODULE_ID_TO_INSTANCE(0), msg_p);
   }
-
   do {
     // Wait for a message
     itti_receive_msg (TASK_GNB_APP, &msg_p);
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 9bc86d94ea8ee59d8b6a1de460021253b4d8db28..1a59f333f322770351d4b785cda71ac582041101 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -590,6 +590,7 @@ void RCconfig_NR_L1(void) {
       }
 
       RC.gNB[j]->pusch_proc_threads = *(L1_ParamList.paramarray[j][L1_PUSCH_PROC_THREADS].uptr);
+      RC.gNB[j]->ofdm_offset_divisor = *(L1_ParamList.paramarray[j][L1_OFDM_OFFSET_DIVISOR].uptr);
       RC.gNB[j]->pucch0_thres       = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr);
       RC.gNB[j]->prach_thres        = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr);
       RC.gNB[j]->pusch_thres        = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr);
@@ -1406,7 +1407,6 @@ void NRRCConfig(void) {
  
   config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL); 
   RC.nb_nr_inst = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
- 
 
 	// Get num MACRLC instances
   config_getlist( &MACRLCParamList,NULL,0, NULL);
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index d1d60d236c06dd32eccd77b7a2a99852273f3f88..b73da4c4e71edc2a4c7c0aec1cedaf1494a415f5 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -292,8 +292,8 @@ typedef struct {
 
   /// Random-access Contention Resolution Timer active flag
   uint8_t RA_contention_resolution_timer_active;
-  /// Random-access Contention Resolution Timer count value
-  uint8_t RA_contention_resolution_cnt;
+  int RA_contention_resolution_target_frame;
+  int RA_contention_resolution_target_slot;
   /// Transmitted UE Contention Resolution Identifier
   uint8_t cont_res_id[6];
 
@@ -325,6 +325,15 @@ typedef struct {
 
 } RAR_grant_t;
 
+typedef struct {
+
+  uint8_t  phr_reporting;
+  uint16_t truncated_bsr;
+  uint16_t short_bsr;
+  uint16_t long_bsr;
+
+} NR_UE_MAC_CE_t;
+
 typedef struct {
   int n_HARQ_ACK;
   uint32_t ack_payload;
@@ -340,7 +349,6 @@ typedef struct {
   int8_t delta_pucch;
 } PUCCH_sched_t;
 
-
 /*!\brief Top level UE MAC structure */
 typedef struct {
 
@@ -407,12 +415,8 @@ typedef struct {
   nr_ue_if_module_t       *if_module;
   nr_phy_config_t         phy_config;
 
-  /// BSR report flag management
-  uint8_t BSR_reporting_active;
   NR_UE_SCHEDULING_INFO   scheduling_info;
-
-  /// PHR
-  uint8_t PHR_reporting_active;
+  NR_UE_MAC_CE_t          nr_ue_mac_ce;
 
   NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config;
   NR_SearchSpace_t *search_space_zero;
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index dac62cf9a6f9b02cb2b4d108d4c5a15a78ec68a2..41480d55a4ad45020564bb6d13d5d2b143cd9cdb 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -169,18 +169,8 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
                            NR_UL_TIME_ALIGNMENT_t *ul_time_alignment,
                            int pdu_id);
 
-uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload,
-                                    uint8_t *pdu,
-                                    uint8_t num_sdus,
-                                    uint16_t *sdu_lengths,
-                                    uint8_t *sdu_lcids,
-                                    uint8_t power_headroom,
-                                    uint16_t crnti,
-                                    uint16_t truncated_bsr,
-                                    uint16_t short_bsr,
-                                    uint16_t long_bsr,
-                                    unsigned short post_padding,
-                                    uint16_t buflen);
+int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
+                          NR_UE_MAC_INST_t *mac);
 
 void fill_dci_search_candidates(NR_SearchSpace_t *ss,fapi_nr_dl_config_dci_dl_pdu_rel15_t *rel15);
 
@@ -201,10 +191,12 @@ int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
                                                       uint8_t time_domain_ind,
                                                       bool use_default);
 
-uint8_t
-nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
-           sub_frame_t subframe, uint8_t eNB_index,
-           uint8_t *ulsch_buffer, uint16_t buflen, uint8_t *access_mode) ;
+uint8_t nr_ue_get_sdu(module_id_t module_idP,
+                      frame_t frameP,
+                      sub_frame_t subframe,
+                      uint8_t gNB_index,
+                      uint8_t *ulsch_buffer,
+                      uint16_t buflen);
 
 int set_tdd_config_nr_ue(fapi_nr_config_request_t *cfg, int mu,
                          int nrofDownlinkSlots, int nrofDownlinkSymbols,
@@ -360,7 +352,7 @@ void nr_get_prach_resources(module_id_t mod_id,
 
 void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
 
-void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id);
+void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id);
 
 void nr_ue_msg2_scheduler(module_id_t mod_id, uint16_t rach_frame, uint16_t rach_slot, uint16_t *msg2_frame, uint16_t *msg2_slot);
 
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 5d9126ad6954ac6207551b15e790da7030ffe0f8..452cc982ff603af342604679558e23afa8c69245 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -157,7 +157,7 @@ void init_RA(module_id_t mod_id,
   }
 
   if (nr_rach_ConfigCommon->ext1) {
-    if (nr_rach_ConfigCommon->ext1->ra_PrioritizationForAccessIdentity){
+    if (nr_rach_ConfigCommon->ext1->ra_PrioritizationForAccessIdentity_r16){
       LOG_D(MAC, "In %s:%d: Missing implementation for Access Identity initialization procedures\n", __FUNCTION__, __LINE__);
     }
   }
@@ -457,40 +457,45 @@ void nr_Msg1_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint
   ra->RA_attempt_number++;
 }
 
-void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, uint8_t gNB_id){
+void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot_t slotP, uint8_t gNB_id){
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
-  NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ? 
+  RA_config_t *ra = &mac->ra;
+  NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ?
     mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
     mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
-  RA_config_t *ra = &mac->ra;
+  long mu = (mac->scc) ? 
+    mac->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing :
+    mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
+  int subframes_per_slot = nr_slots_per_frame[mu]/10;
+
+  // start contention resolution timer (cnt in slots)
+  int RA_contention_resolution_timer_subframes = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1)<<3;
 
-  LOG_D(MAC,"In %s: [UE %d] Frame %d, CB-RA: starting contention resolution timer\n", __FUNCTION__, mod_id, frameP);
+  ra->RA_contention_resolution_target_frame = frameP + (RA_contention_resolution_timer_subframes/10);
+  ra->RA_contention_resolution_target_slot = (slotP + (RA_contention_resolution_timer_subframes * subframes_per_slot)) % nr_slots_per_frame[mu];
+
+  LOG_D(MAC,"In %s: [UE %d] CB-RA: contention resolution timer set in frame.slot %d.%d and expiring in %d.%d\n",
+       __FUNCTION__, mod_id, frameP, slotP, ra->RA_contention_resolution_target_frame, ra->RA_contention_resolution_target_slot);
 
-  // start contention resolution timer
-  ra->RA_contention_resolution_cnt = (nr_rach_ConfigCommon->ra_ContentionResolutionTimer + 1) * 8;
   ra->RA_contention_resolution_timer_active = 1;
   ra->ra_state = WAIT_CONTENTION_RESOLUTION;
 
 }
 
-/////////////////////////////////////////////////////////////////////////
-// This function handles:
-// - Random Access Preamble Initialization (5.1.1 TS 38.321)
-// - Random Access Response reception (5.1.4 TS 38.321)
-/// In the current implementation, RA is 4-step contention free only
-/////////////////////////////////////////////////////////////////////////
-// todo TS 38.321:
-// - BWP operation (subclause 5.15 TS 38.321)
-// - beam failure recovery
-// - handle initialization by handover
-// - handle DL assignment on PDCCH for RA-RNTI
-// - transmission on DCCH using PRACH (during handover, or sending SR for example)
-// - take into account MAC CEs in size_sdu (currently hardcoded size to 1 MAC subPDU and 1 padding subheader)
-// - fix rrc data req logic
-// - retrieve TBS
-// - add mac_rrc_nr_data_req_ue, etc ...
-// - Msg3 Retransmissions to be scheduled by DCI 0_0
+/**
+ * Function:            handles Random Access Preamble Initialization (5.1.1 TS 38.321)
+ *                      handles Random Access Response reception (5.1.4 TS 38.321)
+ * Note:                In SA mode the Msg3 contains a CCCH SDU, therefore no C-RNTI MAC CE is transmitted.
+ *
+ * @prach_resources     pointer to PRACH resources
+ * @prach_pdu           pointer to FAPI UL PRACH PDU
+ * @mod_id              module ID
+ * @CC_id               CC ID
+ * @frame               current UL TX frame
+ * @gNB_id              gNB ID
+ * @nr_slot_tx          current UL TX slot
+ */
 uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
                        fapi_nr_ul_config_prach_pdu *prach_pdu,
                        module_id_t mod_id,
@@ -501,11 +506,6 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
   RA_config_t *ra = &mac->ra;
-  uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES];
-  uint8_t lcid = UL_SCH_LCID_CCCH;
-  uint8_t *payload;
-  uint16_t size_sdu = 0;
-  unsigned short post_padding;
   NR_RACH_ConfigCommon_t *setup;
   if (mac->scc) setup = mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
   else          setup = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
@@ -513,11 +513,6 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
   NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
   NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = ra->rach_ConfigDedicated;
 
-  uint8_t sdu_lcids[NB_RB_MAX] = {0};
-  uint16_t sdu_lengths[NB_RB_MAX] = {0};
-  int num_sdus = 0;
-  int offset = 0;
-
   // Delay init RA procedure to allow the convergence of the IIR filter on PRACH noise measurements at gNB side
   if (!prach_resources->init_msg1) {
     if ( (mac->common_configuration_complete>0 || get_softmodem_params()->do_ra==1) && ((MAX_FRAME_NUMBER+frame-prach_resources->sync_frame)%MAX_FRAME_NUMBER)>150 ){
@@ -528,90 +523,107 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
     }
   }
 
-  LOG_D(NR_MAC,"frame %d prach_resources->init_msg1 %d, ra->ra_state %d, ra->RA_active %d\n",
-	frame,prach_resources->init_msg1,ra->ra_state,ra->RA_active);
+  LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: init_msg1 %d, ra_state %d, RA_active %d\n",
+    __FUNCTION__,
+    mod_id,
+    frame,
+    nr_slot_tx,
+    prach_resources->init_msg1,
+    ra->ra_state,
+    ra->RA_active);
 
   if (prach_resources->init_msg1 && ra->ra_state != RA_SUCCEEDED) {
 
     if (ra->RA_active == 0) {
       /* RA not active - checking if RRC is ready to initiate the RA procedure */
 
-      LOG_D(NR_MAC, "RA not active. Checking for data to transmit from upper layers...\n");
+      LOG_D(NR_MAC, "In %s: RA not active. Checking for data to transmit from upper layers...\n", __FUNCTION__);
 
-      uint8_t TBS_max = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT);
-      payload = (uint8_t*) mac->CCCH_pdu.payload;
+      const uint8_t lcid = UL_SCH_LCID_CCCH;
+      const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_FIXED);
+      const uint8_t TBS_max = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // Note: unclear the reason behind the selection of such TBS_max
+      int8_t size_sdu = 0;
+      uint8_t mac_ce[16] = {0};
+      uint8_t *pdu = get_softmodem_params()->sa ? mac->CCCH_pdu.payload : mac_ce;
+      uint8_t *payload = pdu;
 
-      num_sdus = 1;
-      post_padding = 1;
-      sdu_lcids[0] = lcid;
+      // Concerning the C-RNTI MAC CE, it has to be included if the UL transmission (Msg3) is not being made for the CCCH logical channel.
+      // Therefore it has been assumed that this event only occurs only when RA is done and it is not SA mode.
+      if (get_softmodem_params()->sa) {
 
-      // initialisation by RRC
+        NR_MAC_SUBHEADER_FIXED *header = (NR_MAC_SUBHEADER_FIXED *) pdu;
+        pdu += sh_size;
 
-      // TODO: To be removed after RA procedures fully implemented
-      if(get_softmodem_params()->do_ra) {
+        // initialisation by RRC
         nr_rrc_ue_generate_RRCSetupRequest(mod_id,gNB_id);
-      }
 
-      // CCCH PDU
-      size_sdu = (uint16_t) nr_mac_rrc_data_req_ue(mod_id, CC_id, gNB_id, frame, CCCH, mac_sdus);
+        // CCCH PDU
+        size_sdu = nr_mac_rrc_data_req_ue(mod_id, CC_id, gNB_id, frame, CCCH, pdu);
+        LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: Requested RRCConnectionRequest, got %d bytes for LCID 0x%02x \n", __FUNCTION__, mod_id, frame, nr_slot_tx, size_sdu, lcid);
+
+        if (size_sdu > 0) {
+
+          // UE Contention Resolution Identity
+          // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the
+          // Random Access Procedure has been successful after reception of Msg4
+          memcpy(ra->cont_res_id, pdu, sizeof(uint8_t) * 6);
 
-      sdu_lengths[0] = size_sdu;
+          pdu += size_sdu;
+          ra->Msg3_size = size_sdu + sh_size;
+
+          // Build header
+          header->R = 0;
+          header->LCID = lcid;
+
+        } else {
+          pdu -= sh_size;
+        }
 
-      LOG_D(NR_MAC,"[UE %d] Frame %d: Requested RRCConnectionRequest, got %d bytes\n", mod_id, frame, size_sdu);
+      } else {
 
-      if (size_sdu > 0) {
+        size_sdu = nr_write_ce_ulsch_pdu(pdu, mac);
+        pdu += size_sdu;
+        ra->Msg3_size = size_sdu;
 
-        // UE Contention Resolution Identity
-        // Store the first 48 bits belonging to the uplink CCCH SDU within Msg3 to determine whether or not the
-        // Random Access Procedure has been successful after reception of Msg4
-        memcpy(ra->cont_res_id, mac_sdus, sizeof(uint8_t) * 6);
+      }
 
-        LOG_D(NR_MAC, "[UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", mod_id, frame, nr_slot_tx);
+      if (size_sdu > 0 && ra->generate_nr_prach == GENERATE_PREAMBLE) {
 
-        ra->Msg3_size = size_sdu + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT);
+        LOG_D(NR_MAC, "In %s: [UE %d][%d.%d]: starting initialisation Random Access Procedure...\n", __FUNCTION__, mod_id, frame, nr_slot_tx);
+        AssertFatal(TBS_max > ra->Msg3_size, "In %s: allocated resources are not enough for Msg3!\n", __FUNCTION__);
 
+        // Init RA procedure
         init_RA(mod_id, prach_resources, setup, rach_ConfigGeneric, rach_ConfigDedicated);
-        prach_resources->Msg3 = payload;
         nr_get_RA_window(mac);
-
         // Fill in preamble and PRACH resources
-        if (ra->generate_nr_prach == GENERATE_PREAMBLE) {
-          nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated);
-        }
-        offset = nr_generate_ulsch_pdu((uint8_t *) mac_sdus,              // sdus buffer
-                                       (uint8_t *) payload,               // UL MAC pdu pointer
-                                       num_sdus,                          // num sdus
-                                       sdu_lengths,                       // sdu length
-                                       sdu_lcids,                         // sdu lcid
-                                       0,                                 // power headroom
-                                       0,                                 // crnti
-                                       0,                                 // truncated bsr
-                                       0,                                 // short bsr
-                                       0,                                 // long_bsr
-                                       post_padding,
-                                       0);
-
-        AssertFatal(TBS_max > offset, "Frequency resources are not enough for Msg3!\n");
+        nr_get_prach_resources(mod_id, CC_id, gNB_id, prach_resources, prach_pdu, rach_ConfigDedicated);
 
         // Padding: fill remainder with 0
-        if (post_padding > 0){
-          for (int j = 0; j < (TBS_max - offset); j++)
-            payload[offset + j] = 0;
+        if (TBS_max - ra->Msg3_size > 0) {
+          LOG_D(NR_MAC, "In %s: remaining %d bytes, filling with padding\n", __FUNCTION__, TBS_max - ra->Msg3_size);
+          ((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
+          ((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
+          pdu += sizeof(NR_MAC_SUBHEADER_FIXED);
+          for (int j = 0; j < TBS_max - ra->Msg3_size - sizeof(NR_MAC_SUBHEADER_FIXED); j++) {
+            pdu[j] = 0;
+          }
         }
-      }
 
-      LOG_D(MAC,"size_sdu = %i\n", size_sdu);
-      LOG_D(MAC,"offset = %i\n", offset);
-      for(int k = 0; k < TBS_max; k++) {
-        LOG_D(MAC,"(%i): %i\n", k, prach_resources->Msg3[k]);
-      }
+        // Dumping ULSCH payload
+        LOG_D(NR_MAC, "In %s: dumping UL Msg3 MAC PDU with length %d: \n", __FUNCTION__, TBS_max);
+        for(int k = 0; k < TBS_max; k++) {
+          LOG_D(NR_MAC,"(%i): %i\n", k, payload[k]);
+        }
 
-      // Msg3 was initialized with TBS_max bytes because the RA_Msg3_size will only be known after
-      // receiving Msg2 (which contains the Msg3 resource reserve).
-      // Msg3 will be transmitted with RA_Msg3_size bytes, removing unnecessary 0s.
-      mac->ulsch_pdu.Pdu_size = TBS_max;
-      memcpy(mac->ulsch_pdu.payload, prach_resources->Msg3, TBS_max);
+        // Msg3 was initialized with TBS_max bytes because the RA_Msg3_size will only be known after
+        // receiving Msg2 (which contains the Msg3 resource reserve).
+        // Msg3 will be transmitted with RA_Msg3_size bytes, removing unnecessary 0s.
+        mac->ulsch_pdu.Pdu_size = TBS_max;
+        memcpy(mac->ulsch_pdu.payload, payload, TBS_max);
 
+      } else {
+        return 0;
+      }
     } else if (ra->RA_window_cnt != -1) { // RACH is active
 
       LOG_D(MAC, "In %s [%d.%d] RA is active: RA window count %d, RA backoff count %d\n", __FUNCTION__, frame, nr_slot_tx, ra->RA_window_cnt, ra->RA_backoff_cnt);
@@ -736,20 +748,15 @@ void nr_ue_contention_resolution(module_id_t module_id, int cc_id, frame_t frame
   RA_config_t *ra = &mac->ra;
 
   if (ra->RA_contention_resolution_timer_active == 1) {
-
-      ra->RA_contention_resolution_cnt--;
-
-      LOG_D(MAC, "In %s: [%d.%d] RA contention resolution timer %d\n", __FUNCTION__, frame, slot, ra->RA_contention_resolution_cnt);
-
-      if (ra->RA_contention_resolution_cnt == 0) {
-        ra->t_crnti = 0;
-        ra->RA_active = 0;
-        ra->RA_contention_resolution_timer_active = 0;
-        // Signal PHY to quit RA procedure
-        LOG_E(MAC, "[UE %d] CB-RA: Contention resolution timer has expired, RA procedure has failed...\n", module_id);
-        nr_ra_failed(module_id, cc_id, prach_resources, frame, slot);
-      }
-    
+    if (frame >= ra->RA_contention_resolution_target_frame &&
+      slot >= ra->RA_contention_resolution_target_slot) {
+      ra->t_crnti = 0;
+      ra->RA_active = 0;
+      ra->RA_contention_resolution_timer_active = 0;
+      // Signal PHY to quit RA procedure
+      LOG_E(MAC, "[UE %d] CB-RA: Contention resolution timer has expired, RA procedure has failed...\n", module_id);
+      nr_ra_failed(module_id, cc_id, prach_resources, frame, slot);
+    }
   }
 }
 
@@ -767,13 +774,11 @@ void nr_ra_succeeded(module_id_t mod_id, frame_t frame, int slot){
     LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CF-RA: RAR successfully received.\n", mod_id, frame, slot);
 
     ra->RA_window_cnt = -1;
-    mac->crnti = ra->t_crnti;
 
   } else {
 
     LOG_I(MAC, "[UE %d][%d.%d][RAPROC] RA procedure succeeded. CB-RA: Contention Resolution is successful.\n", mod_id, frame, slot);
 
-    ra->RA_contention_resolution_cnt = -1;
     ra->RA_contention_resolution_timer_active = 0;
     mac->crnti = ra->t_crnti;
     ra->t_crnti = 0;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 42296254a575e304fcef9537bd372a80b5b07211..f9ba33c2b1014d7c4c1e6cb1731965700172983b 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -183,7 +183,8 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
       rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       rel15->BWPStart = NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
       rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
-      rel15->dci_length_options[0] = nr_dci_size(initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[0]], rel15->dci_format_options[0], NR_RNTI_TC, rel15->BWPSize, dl_bwp_id);
+      for (int i = 0; i < rel15->num_dci_options; i++)
+        rel15->dci_length_options[i] = nr_dci_size(initialUplinkBWP, mac->cg, &mac->def_dci_pdu_rel15[rel15->dci_format_options[i]], rel15->dci_format_options[i], NR_RNTI_TC, rel15->BWPSize, dl_bwp_id);
     break;
     case NR_RNTI_SP_CSI:
     break;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 7c9759bf03d47a73845fb175e8bdc79994fdf1a1..205b702b4e2b174793a6d47da9d920dbb9269735 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -171,7 +171,7 @@ int8_t nr_ue_decode_mib(module_id_t module_id,
                         uint16_t ssb_start_subcarrier,
                         uint16_t cell_id)
 {
-  LOG_D(MAC,"[L2][MAC] decode mib\n");
+  LOG_I(MAC,"[L2][MAC] decode mib\n");
 
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
   mac->physCellId = cell_id;
@@ -516,7 +516,10 @@ int nr_ue_process_dci_indication_pdu(module_id_t module_id,int cc_id, int gNB_in
 	dci->rnti,dci->dci_format,dci->n_CCE,dci->payloadSize,*(unsigned long long*)dci->payloadBits);
   int8_t ret = nr_extract_dci_info(mac, dci->dci_format, dci->payloadSize, dci->rnti, (uint64_t *)dci->payloadBits, def_dci_pdu_rel15);
   if ((ret&1) == 1) return -1;
-  else if (ret == 2) dci->dci_format = NR_UL_DCI_FORMAT_0_0;
+  else if (ret == 2) {
+    dci->dci_format = NR_UL_DCI_FORMAT_0_0;
+    def_dci_pdu_rel15 = &mac->def_dci_pdu_rel15[dci->dci_format];
+  }
   return (nr_ue_process_dci(module_id, cc_id, gNB_index, frame, slot, def_dci_pdu_rel15, dci));
 }
 
@@ -2388,14 +2391,6 @@ void nr_ue_send_sdu(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t *u
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
 
-  #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-    LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
-    for (i = 0; i < 32; i++) {
-      LOG_T(MAC, "%x.", sdu[i]);
-    }
-    LOG_T(MAC, "\n");
-  #endif
-
   LOG_D(MAC, "In %s [%d.%d] Handling DLSCH PDU...\n", __FUNCTION__, dl_info->frame, dl_info->slot);
 
   // Processing MAC PDU
@@ -2521,9 +2516,10 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
       dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
 
       //switch to DCI_0_0
-      if (dci_pdu_rel15->format_indicator == 0)
+      if (dci_pdu_rel15->format_indicator == 0) {
+        dci_pdu_rel15 = &mac->def_dci_pdu_rel15[NR_UL_DCI_FORMAT_0_0];
         return 2+nr_extract_dci_info(mac, NR_UL_DCI_FORMAT_0_0, dci_size, rnti, dci_pdu, dci_pdu_rel15);
-
+      }
 #ifdef DEBUG_EXTRACT_DCI
       LOG_D(MAC,"Format indicator %d (%d bits) N_RB_BWP %d => %d (0x%lx)\n",dci_pdu_rel15->format_indicator,1,N_RB,dci_size-pos,*dci_pdu);
 #endif
@@ -2725,6 +2721,12 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
       pos++;
       dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
 
+      //switch to DCI_0_0
+      if (dci_pdu_rel15->format_indicator == 0) {
+        dci_pdu_rel15 = &mac->def_dci_pdu_rel15[NR_UL_DCI_FORMAT_0_0];
+        return 2+nr_extract_dci_info(mac, NR_UL_DCI_FORMAT_0_0, dci_size, rnti, dci_pdu, dci_pdu_rel15);
+      }
+
       if (dci_pdu_rel15->format_indicator == 0)
         return 1; // discard dci, format indicator not corresponding to dci_format
 
@@ -2863,40 +2865,62 @@ uint8_t nr_extract_dci_info(NR_UE_MAC_INST_t *mac,
 	break;
 	
       case NR_RNTI_TC:
-	/*	
-	// indicating a DL DCI format 1bit
-	dci_pdu->= (*dci_pdu>>(dci_size-pos)format_indicator&1)<<(dci_size-pos++);
-	// Freq domain assignment  max 16 bit
+        //Identifier for DCI formats
+        pos++;
+        dci_pdu_rel15->format_indicator = (*dci_pdu>>(dci_size-pos))&1;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"Format indicator %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->format_indicator,1,dci_size-pos,*dci_pdu);
+#endif
+        if (dci_pdu_rel15->format_indicator == 1)
+          return 1; // discard dci, format indicator not corresponding to dci_format
 	fsize = (int)ceil( log2( (N_RB_UL*(N_RB_UL+1))>>1 ) );
-	for (int i=0; i<fsize; i++)
-	dci_pdu->= ((*dci_pdu>>(dci_size-pos)frequency_domain_assignment>>(fsize-i-1))&1)<<(dci_size-pos++);
+	pos+=fsize;
+	dci_pdu_rel15->frequency_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&((1<<fsize)-1);
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"Freq domain assignment %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->frequency_domain_assignment.val,fsize,dci_size-pos,*dci_pdu);
+#endif
 	// Time domain assignment 4bit
-	for (int i=0; i<4; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)time_domain_assignment>>(3-i))&1)<<(dci_size-pos++);
+	pos+=4;
+	dci_pdu_rel15->time_domain_assignment.val = (*dci_pdu>>(dci_size-pos))&0xf;
+#ifdef DEBUG_EXTRACT_DCI
+      LOG_I(MAC,"time-domain assignment %d  (4 bits)=> %d (0x%lx)\n",dci_pdu_rel15->time_domain_assignment.val,dci_size-pos,*dci_pdu);
+#endif
 	// Frequency hopping flag  E1 bit
-	dci_pdu->= ((uint64_t)*dci_pdu>>(dci_size-pos)frequency_hopping_flag&1)<<(dci_size-pos++);
+	pos++;
+	dci_pdu_rel15->frequency_hopping_flag.val= (*dci_pdu>>(dci_size-pos))&1;
+#ifdef DEBUG_EXTRACT_DCI
+      LOG_I(MAC,"frequency_hopping %d  (1 bit)=> %d (0x%lx)\n",dci_pdu_rel15->frequency_hopping_flag.val,dci_size-pos,*dci_pdu);
+#endif
 	// MCS  5 bit
-	for (int i=0; i<5; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)mcs>>(4-i))&1)<<(dci_size-pos++);
+	pos+=5;
+	dci_pdu_rel15->mcs= (*dci_pdu>>(dci_size-pos))&0x1f;
+#ifdef DEBUG_EXTRACT_DCI
+      LOG_I(MAC,"mcs %d  (5 bits)=> %d (0x%lx)\n",dci_pdu_rel15->mcs,dci_size-pos,*dci_pdu);
+#endif
 	// New data indicator 1bit
-	dci_pdu->= ((uint64_t)*dci_pdu>>(dci_size-pos)ndi&1)<<(dci_size-pos++);
+	pos++;
+	dci_pdu_rel15->ndi= (*dci_pdu>>(dci_size-pos))&1;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"NDI %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->ndi,1,dci_size-pos,*dci_pdu);
+#endif
 	// Redundancy version  2bit
-	for (int i=0; i<2; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)rv>>(1-i))&1)<<(dci_size-pos++);
+	pos+=2;
+	dci_pdu_rel15->rv= (*dci_pdu>>(dci_size-pos))&3;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"RV %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->rv,2,dci_size-pos,*dci_pdu);
+#endif
 	// HARQ process number  4bit
-	for (int i=0; i<4; i++)
-	*dci_pdu  |= (((uint64_t)*dci_pdu>>(dci_size-pos)harq_pid>>(3-i))&1)<<(dci_size-pos++);
-	
+	pos+=4;
+	dci_pdu_rel15->harq_pid = (*dci_pdu>>(dci_size-pos))&0xf;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"HARQ_PID %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->harq_pid,4,dci_size-pos,*dci_pdu);
+#endif
 	// TPC command for scheduled PUSCH  E2 bits
-	for (int i=0; i<2; i++)
-	dci_pdu->= (((uint64_t)*dci_pdu>>(dci_size-pos)tpc>>(1-i))&1)<<(dci_size-pos++);
-	*/	
-	// UL/SUL indicator  E1 bit
-	/*
-	  commented for now (RK): need to get this information from BWP descriptor
-	  if (cfg->pucch_config.pucch_GroupHopping.value)
-	  dci_pdu->= ((uint64_t)dci_pdu_rel15->ul_sul_indicator&1)<<(dci_size-pos++);
-	*/
+	pos+=2;
+	dci_pdu_rel15->tpc = (*dci_pdu>>(dci_size-pos))&3;
+#ifdef DEBUG_EXTRACT_DCI
+	LOG_I(MAC,"TPC %d (%d bits)=> %d (0x%lx)\n",dci_pdu_rel15->tpc,2,dci_size-pos,*dci_pdu);
+#endif
 	break;
 	
       }
@@ -3312,7 +3336,7 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
                 #endif
                 */
 
-                LOG_I(MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
+                LOG_D(MAC, "[%d.%d] Received TA_COMMAND %u TAGID %u CC_id %d\n", frameP, slot, ul_time_alignment->ta_command, ul_time_alignment->tag_id, CC_id);
 
                 break;
             case DL_SCH_LCID_CON_RES_ID:
@@ -3409,145 +3433,116 @@ void nr_ue_process_mac_pdu(nr_downlink_indication_t *dl_info,
     }
 }
 
-////////////////////////////////////////////////////////
-/////* ULSCH MAC PDU generation (6.1.2 TS 38.321) */////
-////////////////////////////////////////////////////////
-
-uint16_t nr_generate_ulsch_pdu(uint8_t *sdus_payload,
-                                    uint8_t *pdu,
-                                    uint8_t num_sdus,
-                                    uint16_t *sdu_lengths,
-                                    uint8_t *sdu_lcids,
-                                    uint8_t power_headroom,
-                                    uint16_t crnti,
-                                    uint16_t truncated_bsr,
-                                    uint16_t short_bsr,
-                                    uint16_t long_bsr,
-                                    unsigned short post_padding,
-                                    uint16_t buflen) {
+/**
+ * Function:      generating MAC CEs (MAC CE and subheader) for the ULSCH PDU
+ * Notes:         TODO: PHR and BSR reporting
+ * Parameters:
+ * @mac_ce        pointer to the MAC sub-PDUs including the MAC CEs
+ * @mac           pointer to the MAC instance
+ * Return:        number of written bytes
+ */
+int nr_write_ce_ulsch_pdu(uint8_t *mac_ce,
+                          NR_UE_MAC_INST_t *mac) {
 
-  NR_MAC_SUBHEADER_FIXED *mac_pdu_ptr = (NR_MAC_SUBHEADER_FIXED *) pdu;
+  int      mac_ce_len = 0;
+  uint8_t mac_ce_size = 0;
+  NR_UE_MAC_CE_t *nr_ue_mac_ce = &mac->nr_ue_mac_ce;
 
-  LOG_D(MAC, "[UE] Generating ULSCH PDU : num_sdus %d\n", num_sdus);
+  if (nr_ue_mac_ce->phr_reporting && mac->phr_Config != NULL) {
 
-  #ifdef DEBUG_HEADER_PARSING
+    // MAC CE fixed subheader
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_SINGLE_ENTRY_PHR;
+    mac_ce++;
 
-    for (int i = 0; i < num_sdus; i++)
-      LOG_D(MAC, "[UE] MAC subPDU %d (lcid %d length %d bytes \n", i, sdu_lcids[i], sdu_lengths[i]);
+    // PHR MAC CE (1 octet)
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PH = 0;
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R1 = 0;
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->PCMAX = 0;
+    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_ce)->R2 = 0;
 
-  #endif
+    // update pointer and length
+    mac_ce_size = sizeof(NR_SINGLE_ENTRY_PHR_MAC_CE);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
 
-  // Generating UL MAC subPDUs including MAC SDU and subheader
+  }
 
-  for (int i = 0; i < num_sdus; i++) {
-    LOG_D(MAC, "[UE] Generating UL MAC subPDUs for SDU with lenght %d ( num_sdus %d )\n", sdu_lengths[i], num_sdus);
+  if (!get_softmodem_params()->sa && get_softmodem_params()->do_ra && mac->ra.ra_state != RA_SUCCEEDED) {
 
-    if (sdu_lcids[i] != UL_SCH_LCID_CCCH){
-      if (sdu_lengths[i] < 128) {
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = sdu_lcids[i];
-        ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = (unsigned char) sdu_lengths[i];
-        mac_pdu_ptr += sizeof(NR_MAC_SUBHEADER_SHORT);
-      } else {
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->R = 0;
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->F = 1;
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->LCID = sdu_lcids[i];
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0x7f;
-        ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L2 = (unsigned short) sdu_lengths[i] & 0xff;
-        mac_pdu_ptr += sizeof(NR_MAC_SUBHEADER_LONG);
-      }
-    } else { // UL CCCH SDU
-      mac_pdu_ptr->R = 0;
-      mac_pdu_ptr->LCID = sdu_lcids[i];
-      mac_pdu_ptr ++;
-    }
+    LOG_D(NR_MAC, "In %s: generating C-RNTI MAC CE with C-RNTI %x\n", __FUNCTION__, mac->crnti);
 
-    // cycle through SDUs, compute each relevant and place ulsch_buffer in
-    memcpy((void *) mac_pdu_ptr, (void *) sdus_payload, sdu_lengths[i]);
-    sdus_payload += sdu_lengths[i]; 
-    mac_pdu_ptr  += sdu_lengths[i];
-  }
+    // MAC CE fixed subheader
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_C_RNTI;
+    mac_ce++;
 
-  // Generating UL MAC subPDUs including MAC CEs (MAC CE and subheader)
+    // C-RNTI MAC CE (2 octets)
+    *(uint16_t *) mac_ce = mac->crnti;
 
-  if (power_headroom) {
-    // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_SINGLE_ENTRY_PHR;
-    mac_pdu_ptr++;
+    // update pointer and length
+    mac_ce_size = sizeof(uint16_t);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
 
-    // PHR MAC CE (1 octet)
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->PH = power_headroom;
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->R1 = 0;
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->PCMAX = 0; // todo
-    ((NR_SINGLE_ENTRY_PHR_MAC_CE *) mac_pdu_ptr)->R2 = 0;
-    mac_pdu_ptr += sizeof(NR_SINGLE_ENTRY_PHR_MAC_CE);
   }
 
-  if (crnti) {
-    // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_C_RNTI;
-    mac_pdu_ptr++;
+  if (nr_ue_mac_ce->truncated_bsr) {
 
-    // C-RNTI MAC CE (2 octets)
-    * (uint16_t *) mac_pdu_ptr = crnti;
-    mac_pdu_ptr += sizeof(uint16_t);
-  }
+    LOG_D(NR_MAC, "In %s: generating short truncated BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->truncated_bsr);
 
-  if (truncated_bsr) {
     // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_S_TRUNCATED_BSR;
-    mac_pdu_ptr++;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_TRUNCATED_BSR;
+    mac_ce++;
 
     // Short truncated BSR MAC CE (1 octet)
-    ((NR_BSR_SHORT_TRUNCATED *) mac_pdu_ptr)-> Buffer_size = truncated_bsr;
-    ((NR_BSR_SHORT_TRUNCATED *) mac_pdu_ptr)-> LcgID = 0; // todo
-    mac_pdu_ptr+= sizeof(NR_BSR_SHORT_TRUNCATED);
-  } else if (short_bsr) {
+    ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> Buffer_size = 0;
+    ((NR_BSR_SHORT_TRUNCATED *) mac_ce)-> LcgID = 0;
+
+    // update pointer and length
+    mac_ce_size = sizeof(NR_BSR_SHORT_TRUNCATED);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+
+  } else if (nr_ue_mac_ce->short_bsr) {
+
+    LOG_D(NR_MAC, "In %s: generating short BSR MAC CE with command %x\n", __FUNCTION__, nr_ue_mac_ce->short_bsr);
+
     // MAC CE fixed subheader
-    mac_pdu_ptr->R = 0;
-    mac_pdu_ptr->LCID = UL_SCH_LCID_S_BSR;
-    mac_pdu_ptr++;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) mac_ce)->LCID = UL_SCH_LCID_S_BSR;
+    mac_ce++;
 
     // Short truncated BSR MAC CE (1 octet)
-    ((NR_BSR_SHORT *) mac_pdu_ptr)->Buffer_size = short_bsr;
-    ((NR_BSR_SHORT *) mac_pdu_ptr)->LcgID = 0; // todo
-     mac_pdu_ptr+= sizeof(NR_BSR_SHORT);
-  } else if (long_bsr) {
+    ((NR_BSR_SHORT *) mac_ce)->Buffer_size = nr_ue_mac_ce->short_bsr;
+    ((NR_BSR_SHORT *) mac_ce)->LcgID = 0;
+
+    // update pointer and length
+    mac_ce_size = sizeof(NR_BSR_SHORT);
+    mac_ce += mac_ce_size;
+    mac_ce_len += mac_ce_size + sizeof(NR_MAC_SUBHEADER_FIXED);
+
+  } else if (nr_ue_mac_ce->long_bsr) {
     // MAC CE variable subheader
     // todo ch 6.1.3.1. TS 38.321
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = UL_SCH_LCID_L_BSR;
     // ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = 0;
-    // last_size = 2;
-    // mac_pdu_ptr += last_size;
+    // sh_size = 2;
 
     // Short truncated BSR MAC CE (1 octet)
-    // ((NR_BSR_LONG *) ce_ptr)->Buffer_size0 = short_bsr;
-    // ((NR_BSR_LONG *) ce_ptr)->LCGID0 = 0;
+    // ((NR_BSR_LONG *) mac_ce)->Buffer_size0 = short_bsr;
+    // ((NR_BSR_LONG *) mac_ce)->LCGID0 = 0;
     // mac_ce_size = sizeof(NR_BSR_LONG); // size is variable
   }
-// compute offset before adding padding (if necessary)
-  int padding_bytes = 0; 
-
-  if(buflen > 0) // If the buflen is provided
-    padding_bytes = buflen + pdu - (unsigned char *) mac_pdu_ptr;
 
-  AssertFatal(padding_bytes>=0,"");
+  return mac_ce_len;
 
-  // Compute final offset for padding
-  if (post_padding || padding_bytes>0) {
-    ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
-    ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = UL_SCH_LCID_PADDING;
-    mac_pdu_ptr++;
-  } 
-  return (uint8_t *)mac_pdu_ptr-pdu;
 }
 
+
 /////////////////////////////////////
 //    Random Access Response PDU   //
 //         TS 38.213 ch 8.2        //
@@ -3596,7 +3591,6 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
   uint8_t is_Msg3          = 1;
   frame_t frame_tx         = 0;
   int slot_tx              = 0;
-  uint16_t rnti            = 0;
   int ret                  = 0;
   NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer; // RAR subheader pointer
   NR_MAC_RAR *rar          = (NR_MAC_RAR *) (dlsch_buffer + 1);   // RAR subPDU pointer
@@ -3648,9 +3642,6 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
     unsigned char csi_req;
 #endif
 
-  // TC-RNTI
-  ra->t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
-
   // TA command
   ul_time_alignment->apply_ta = 1;
   ul_time_alignment->ta_command = 31 + rar->TA2 + (rar->TA1 << 5);
@@ -3696,12 +3687,6 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
     rar_grant.Msg3_f_alloc = (uint16_t) ((rar->UL_GRANT_3 >> 4) | (rar->UL_GRANT_2 << 4) | ((rar->UL_GRANT_1 & 0x03) << 12));
     // frequency hopping
     rar_grant.freq_hopping = (unsigned char) (rar->UL_GRANT_1 >> 2);
-    // TC-RNTI
-    if (ra->t_crnti) {
-      rnti = ra->t_crnti;
-    } else {
-      rnti = mac->crnti;
-    }
 
 #ifdef DEBUG_RAR
     LOG_I(NR_MAC, "rarh->E = 0x%x\n", rarh->E);
@@ -3741,12 +3726,19 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
     if (ret != -1){
 
       fapi_nr_ul_config_request_t *ul_config = get_ul_config_request(mac, slot_tx);
+      uint16_t rnti = mac->crnti;
 
       if (!ul_config) {
         LOG_W(MAC, "In %s: ul_config request is NULL. Probably due to unexpected UL DCI in frame.slot %d.%d. Ignoring DCI!\n", __FUNCTION__, frame, slot);
         return -1;
       }
 
+      // Upon successful reception, set the T-CRNTI to the RAR value if the RA preamble is selected among the contention-based RA Preambles
+      if (!ra->cfra) {
+        ra->t_crnti = rar->TCRNTI_2 + (rar->TCRNTI_1 << 8);
+        rnti = ra->t_crnti;
+      }
+
       nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu = &ul_config->ul_config_list[ul_config->number_pdus].pusch_config_pdu;
 
       fill_ul_config(ul_config, frame_tx, slot_tx, FAPI_NR_UL_CONFIG_TYPE_PUSCH);
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 5daea8e84cffca3dfd446a8c8ee8d0b2a9449acb..659bf37371758aae5644177b6889072779c8fed8 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -947,12 +947,15 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
 	}
 	// this is for Msg2/Msg4
 	if (mac->ra.ra_state >= WAIT_RAR) {
-	  rel15->num_dci_options = 1;
+	  rel15->num_dci_options = mac->ra.ra_state == WAIT_RAR ? 1 : 2;
 	  rel15->dci_format_options[0] = NR_DL_DCI_FORMAT_1_0;
+          if (mac->ra.ra_state == WAIT_CONTENTION_RESOLUTION)
+            rel15->dci_format_options[1] = NR_UL_DCI_FORMAT_0_0; // msg3 retransmission
 	  config_dci_pdu(mac, rel15, dl_config, mac->ra.ra_state == WAIT_RAR ? NR_RNTI_RA : NR_RNTI_TC , -1);
 	  fill_dci_search_candidates(ss0, rel15);
 	  dl_config->number_pdus = 1;
-	  LOG_D(NR_MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d\n",mac->cg,rel15->rnti,dl_config->number_pdus);
+	  LOG_D(NR_MAC,"mac->cg %p: Calling fill_scheduled_response rnti %x, type0_pdcch, num_pdus %d frame %d slot %d\n",
+                mac->cg,rel15->rnti,dl_config->number_pdus,rx_frame,rx_slot);
 	  fill_scheduled_response(&scheduled_response, dl_config, NULL, NULL, mod_id, cc_id, rx_frame, rx_slot, dl_info->thread_id);
 	  if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
 	    mac->if_module->scheduled_response(&scheduled_response);
@@ -995,7 +998,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
     frame_t frame_tx      = ul_info->frame_tx;
     slot_t slot_tx        = ul_info->slot_tx;
     module_id_t mod_id    = ul_info->module_id;
-    uint8_t access_mode   = SCHEDULED_ACCESS;
+    uint32_t gNB_index    = ul_info->gNB_index;
 
     NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
     RA_config_t *ra       = &mac->ra;
@@ -1009,7 +1012,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
       LOG_D(NR_MAC, "In %s:[%d.%d]: number of UL PDUs: %d with UL transmission in [%d.%d]\n", __FUNCTION__, frame_tx, slot_tx, ul_config->number_pdus, ul_config->sfn, ul_config->slot);
 
       uint8_t ulsch_input_buffer[MAX_ULSCH_PAYLOAD_BYTES];
-      uint8_t data_existing = 0;
       nr_scheduled_response_t scheduled_response;
       fapi_nr_tx_request_t tx_req;
 
@@ -1020,7 +1022,7 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
         if (ulcfg_pdu->pdu_type == FAPI_NR_UL_CONFIG_TYPE_PUSCH) {
 
           uint16_t TBS_bytes = ulcfg_pdu->pusch_config_pdu.pusch_data.tb_size;
-          LOG_D(NR_MAC,"harq_id %d, NDI %d NDI_DCI %d, TBS_bytes %d (ra_state %d\n",
+          LOG_D(NR_MAC,"harq_id %d, NDI %d NDI_DCI %d, TBS_bytes %d (ra_state %d)\n",
                 ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id,
                 mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id],
                 ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator,
@@ -1041,45 +1043,14 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
                     mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id]==1)){
 
               // Getting IP traffic to be transmitted
-              data_existing = nr_ue_get_sdu(mod_id,
-                                            cc_id,
-                                            frame_tx,
-                                            slot_tx,
-                                            0,
-                                            ulsch_input_buffer,
-                                            TBS_bytes,
-                                            &access_mode);
+              nr_ue_get_sdu(mod_id, frame_tx, slot_tx, gNB_index, ulsch_input_buffer, TBS_bytes);
             }
 
             LOG_D(NR_MAC,"Flipping NDI for harq_id %d\n",ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator);
             mac->UL_ndi[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = ulcfg_pdu->pusch_config_pdu.pusch_data.new_data_indicator;
             mac->first_ul_tx[ulcfg_pdu->pusch_config_pdu.pusch_data.harq_process_id] = 0;
 
-            //Random traffic to be transmitted if there is no IP traffic available for this Tx opportunity
-            if (!data_existing) {
-              //Use zeros for the header bytes in noS1 mode, in order to make sure that the LCID is not valid
-              //and block this traffic from being forwarded to the upper layers at the gNB
-              LOG_D(PHY, "In %s: Random data to be transmitted: TBS_bytes %d \n", __FUNCTION__, TBS_bytes);
-
-              //Give the first byte a dummy value (a value not corresponding to any valid LCID based on 38.321, Table 6.2.1-2)
-              //in order to distinguish the PHY random packets at the MAC layer of the gNB receiver from the normal packets that should
-              //have a valid LCID (nr_process_mac_pdu function)
-              ulsch_input_buffer[0] = UL_SCH_LCID_PADDING;
-
-              for (int i = 1; i < TBS_bytes; i++) {
-                ulsch_input_buffer[i] = (unsigned char) rand();
-              }
-            }
-          }
-
-          #ifdef DEBUG_MAC_PDU
-          LOG_D(PHY, "Is data existing ?: %d \n", data_existing);
-          LOG_I(PHY, "Printing MAC PDU to be encoded, TBS is: %d \n", TBS_bytes);
-          for (i = 0; i < TBS_bytes; i++) {
-            printf("%02x", ulsch_input_buffer[i]);
           }
-          printf("\n");
-          #endif
 
           // Config UL TX PDU
           tx_req.slot = slot_tx;
@@ -1089,11 +1060,15 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
           tx_req.tx_request_body[0].pdu_index = j;
           tx_req.tx_request_body[0].pdu = ulsch_input_buffer;
 
+          if (ra->ra_state == WAIT_CONTENTION_RESOLUTION && !ra->cfra){
+            LOG_I(NR_MAC,"[RAPROC] RA-Msg3 retransmitted\n");
+            // 38.321 restart the ra-ContentionResolutionTimer at each HARQ retransmission in the first symbol after the end of the Msg3 transmission
+            nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index);
+          }
           if (ra->ra_state == WAIT_RAR && !ra->cfra){
             LOG_I(NR_MAC,"[RAPROC] RA-Msg3 transmitted\n");
-            nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->gNB_index);
+            nr_Msg3_transmitted(ul_info->module_id, ul_info->cc_id, ul_info->frame_tx, ul_info->slot_tx, ul_info->gNB_index);
           }
-
         }
       }
 
@@ -2062,90 +2037,174 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
   } // if is_nr_UL_slot
 }
 
-#define MAX_LCID 8 //Fixme: also defined in LCID table
-uint8_t
-nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
-           sub_frame_t subframe, uint8_t eNB_index,
-           uint8_t *ulsch_buffer, uint16_t buflen, uint8_t *access_mode) {
+#define MAX_LCID 8 // NR_MAX_NUM_LCID shall be used but the mac_rlc_data_req function can fetch data for max 8 LCID
+
+/**
+ * Function:      to fetch data to be transmitted from RLC, place it in the ULSCH PDU buffer
+                  to generate the complete MAC PDU with sub-headers and MAC CEs according to ULSCH MAC PDU generation (6.1.2 TS 38.321)
+                  the selected sub-header for the payload sub-PDUs is NR_MAC_SUBHEADER_LONG
+ * @module_idP    Module ID
+ * @frameP        current UL frame
+ * @subframe      current UL slot
+ * @gNB_index     gNB index
+ * @ulsch_buffer  Pointer to ULSCH PDU
+ * @buflen        TBS
+ */
+uint8_t nr_ue_get_sdu(module_id_t module_idP,
+                      frame_t frameP,
+                      sub_frame_t subframe,
+                      uint8_t gNB_index,
+                      uint8_t *ulsch_buffer,
+                      uint16_t buflen) {
+
+  int16_t buflen_remain = 0;
   uint8_t lcid = 0;
-  uint16_t sdu_lengths[MAX_LCID] = { 0 };
-  uint8_t sdu_lcids[MAX_LCID] = { 0 };
-  uint16_t payload_offset = 0, num_sdus = 0;
-  uint8_t ulsch_sdus[MAX_ULSCH_PAYLOAD_BYTES];
-  //unsigned short post_padding = 0;
+  uint16_t sdu_length = 0;
+  uint16_t num_sdus = 0;
+  uint16_t sdu_length_total = 0;
   NR_UE_MAC_INST_t *mac = get_mac_inst(module_idP);
+  const uint8_t sh_size = sizeof(NR_MAC_SUBHEADER_LONG);
+
+  // Pointer used to build the MAC PDU by placing the RLC SDUs in the ULSCH buffer
+  uint8_t *pdu = ulsch_buffer;
+
+  // Preparing the MAC CEs sub-PDUs and get the total size
+  unsigned char mac_header_control_elements[16] = {0};
+  int tot_mac_ce_len = nr_write_ce_ulsch_pdu(&mac_header_control_elements[0], mac);
+  uint8_t total_mac_pdu_header_len = tot_mac_ce_len;
+
+  LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] process UL transport block at with size TBS = %d bytes \n", __FUNCTION__, module_idP, frameP, subframe, buflen);
 
-  LOG_D(NR_MAC,
-        "[UE %d] MAC PROCESS UL TRANSPORT BLOCK at frame%d subframe %d TBS=%d\n",
-        module_idP, frameP, subframe, buflen);
-  AssertFatal(CC_id == 0,
-              "Transmission on secondary CCs is not supported yet\n");
-  
   // Check for DCCH first
   // TO DO: Multiplex in the order defined by the logical channel prioritization
-  int buflen_remain = buflen;
-  char * current_ulsch_ptr = (char*)ulsch_sdus;
   for (lcid = UL_SCH_LCID_SRB1;
        lcid < MAX_LCID; lcid++) {
-    while ( (sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,
-						   mac->crnti,
-						   eNB_index,
-						   frameP,
-						   ENB_FLAG_NO,
-						   MBMS_FLAG_NO,
-						   lcid,
-						   buflen_remain-MAX_RLC_SDU_SUBHEADER_SIZE*2,
-						   //Fixme: Laurent I removed MAX_RLC_SDU_SUBHEADER_SIZE*2 because else we get out the buffer silently
-						   // the interface with nr_generate_ulsch_pdu() looks over complex and not CPU optimized
-						   current_ulsch_ptr , 0,
-						      0)) > 0 ) {
-	  
-      AssertFatal(buflen_remain >= sdu_lengths[num_sdus],
-		  "LCID=%d RLC has segmented %d bytes but MAC has max=%d\n",
-		  lcid, sdu_lengths[num_sdus], buflen_remain);
-      AssertFatal(current_ulsch_ptr < (char*)ulsch_sdus+MAX_ULSCH_PAYLOAD_BYTES, "");
-      
-      current_ulsch_ptr += sdu_lengths[num_sdus];
-      buflen_remain -= sdu_lengths[num_sdus];
-      buflen_remain -=  MAX_RLC_SDU_SUBHEADER_SIZE;
-      sdu_lcids[num_sdus] = lcid;
-      num_sdus++;
+
+    buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
+
+    LOG_D(NR_MAC, "In %s: [UE %d] [%d.%d] UL-DXCH -> ULSCH, RLC with LCID 0x%02x (TBS %d bytes, sdu_length_total %d bytes, MAC header len %d bytes, buflen_remain %d bytes)\n",
+          __FUNCTION__,
+          module_idP,
+          frameP,
+          subframe,
+          lcid,
+          buflen,
+          sdu_length_total,
+          tot_mac_ce_len,
+          buflen_remain);
+
+    while (buflen_remain > 0){
+
+      // Pointer used to build the MAC sub-PDU headers in the ULSCH buffer for each SDU
+      NR_MAC_SUBHEADER_LONG *header = (NR_MAC_SUBHEADER_LONG *) pdu;
+
+      pdu += sh_size;
+
+      sdu_length = mac_rlc_data_req(module_idP,
+                                    mac->crnti,
+                                    gNB_index,
+                                    frameP,
+                                    ENB_FLAG_NO,
+                                    MBMS_FLAG_NO,
+                                    lcid,
+                                    buflen_remain,
+                                    (char *)pdu,
+                                    0,
+                                    0);
+
+      AssertFatal(buflen_remain >= sdu_length, "In %s: LCID = 0x%02x RLC has segmented %d bytes but MAC has max %d remaining bytes\n",
+                  __FUNCTION__,
+                  lcid,
+                  sdu_length,
+                  buflen_remain);
+
+      if (sdu_length > 0) {
+
+        LOG_D(MAC, "In %s: Generating UL MAC sub-PDU for SDU %d, length %d bytes, RB with LCID 0x%02x (buflen (TBS) %d bytes)\n", __FUNCTION__,
+          num_sdus + 1,
+          sdu_length,
+          lcid,
+          buflen);
+
+        header->R = 0;
+        header->F = 1;
+        header->LCID = lcid;
+        header->L1 = ((unsigned short) sdu_length >> 8) & 0x7f;
+        header->L2 = (unsigned short) sdu_length & 0xff;
+
+        #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+        LOG_I(NR_MAC, "In %s: dumping MAC sub-header with length %d: \n", __FUNCTION__, sh_size);
+        log_dump(NR_MAC, header, sh_size, LOG_DUMP_CHAR, "\n");
+        LOG_I(NR_MAC, "In %s: dumping MAC SDU with length %d \n", __FUNCTION__, sdu_length);
+        log_dump(NR_MAC, pdu, sdu_length, LOG_DUMP_CHAR, "\n");
+        #endif
+
+        pdu += sdu_length;
+        sdu_length_total += sdu_length;
+        total_mac_pdu_header_len += sh_size;
+
+        num_sdus++;
+
+      } else {
+        pdu -= sh_size;
+        LOG_D(MAC, "In %s: no data to transmit for RB with LCID 0x%02x\n", __FUNCTION__, lcid);
+        break;
+      }
+
+      buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total + sh_size);
+
     }
   }
-  
-  // Generate ULSCH PDU
-  if (num_sdus>0) {
-    payload_offset = nr_generate_ulsch_pdu(ulsch_sdus,
-					   ulsch_buffer,  // mac header
-					   num_sdus,  // num sdus
-					   sdu_lengths, // sdu length
-					   sdu_lcids, // sdu lcid
-					   0, // power_headroom
-					   mac->crnti, // crnti
-					   0, // truncated_bsr
-					   0, // short_bsr
-					   0, // long_bsr
-					   0, // post_padding 
-					   buflen);  // TBS in bytes
-  } else {
-    return 0;
-  }
 
-  // Padding: fill remainder of ULSCH with 0
-  if (buflen - payload_offset > 0){
-          for (int j = payload_offset; j < buflen; j++)
-                  ulsch_buffer[j] = 0;
+  if (tot_mac_ce_len > 0) {
+
+    LOG_D(NR_MAC, "In %s copying %d bytes of MAC CEs to the UL PDU \n", __FUNCTION__, tot_mac_ce_len);
+    memcpy((void *) pdu, (void *) mac_header_control_elements, tot_mac_ce_len);
+    pdu += (unsigned char) tot_mac_ce_len;
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: dumping MAC CE with length tot_mac_ce_len %d: \n", __FUNCTION__, tot_mac_ce_len);
+    log_dump(NR_MAC, mac_header_control_elements, tot_mac_ce_len, LOG_DUMP_CHAR, "\n");
+    #endif
+
   }
 
-#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-  LOG_I(NR_MAC, "Printing UL MAC payload UE side, payload_offset: %d \n", payload_offset);
-  for (int i = 0; i < buflen ; i++) {
-          //harq_process_ul_ue->a[i] = (unsigned char) rand();
-          //printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
-          printf("%02x ",(unsigned char)ulsch_buffer[i]);
+  buflen_remain = buflen - (total_mac_pdu_header_len + sdu_length_total);
+
+  // Compute final offset for padding and fill remainder of ULSCH with 0
+  if (buflen_remain > 0) {
+
+    ((NR_MAC_SUBHEADER_FIXED *) pdu)->R = 0;
+    ((NR_MAC_SUBHEADER_FIXED *) pdu)->LCID = UL_SCH_LCID_PADDING;
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: padding MAC sub-header with length %ld bytes \n", __FUNCTION__, sizeof(NR_MAC_SUBHEADER_FIXED));
+    log_dump(NR_MAC, pdu, sizeof(NR_MAC_SUBHEADER_FIXED), LOG_DUMP_CHAR, "\n");
+    #endif
+
+    pdu++;
+    buflen_remain--;
+
+    if (IS_SOFTMODEM_RFSIM) {
+      for (int j = 0; j < buflen_remain; j++) {
+        pdu[j] = (unsigned char) rand();
+      }
+    } else {
+      memset(pdu, 0, buflen_remain);
+    }
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: MAC padding sub-PDU with length %d bytes \n", __FUNCTION__, buflen_remain);
+    log_dump(NR_MAC, pdu, buflen_remain, LOG_DUMP_CHAR, "\n");
+    #endif
+
   }
-  printf("\n");
-#endif
 
-  return 1;
+  #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+  LOG_I(NR_MAC, "In %s: dumping MAC PDU with length %d: \n", __FUNCTION__, buflen);
+  log_dump(NR_MAC, ulsch_buffer, buflen, LOG_DUMP_CHAR, "\n");
+  #endif
+
+  return num_sdus > 0 ? 1 : 0;
+
 }
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 14581b2706d353cd39e1990d8b9b55562cf0af1a..041bb22768a550702b0dd19451a0dbf8940e4888 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -60,6 +60,8 @@
 
 uint16_t nr_pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
 
+uint8_t vnf_first_sched_entry = 1;
+
 void clear_mac_stats(gNB_MAC_INST *gNB) {
   memset((void*)gNB->UE_info.mac_stats,0,MAX_MOBILES_PER_GNB*sizeof(NR_mac_stats_t));
 }
@@ -150,34 +152,32 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
 
   gNB->pdu_index[CC_idP] = 0;
 
-  if (NFAPI_MODE == NFAPI_MONOLITHIC || NFAPI_MODE == NFAPI_MODE_PNF) { // monolithic or PNF
-
-    DL_req[CC_idP].SFN                                   = frameP;
-    DL_req[CC_idP].Slot                                  = slotP;
-    DL_req[CC_idP].dl_tti_request_body.nPDUs             = 0;
-    DL_req[CC_idP].dl_tti_request_body.nGroup            = 0;
-    //DL_req[CC_idP].dl_tti_request_body.transmission_power_pcfich           = 6000;
-    memset(pdcch, 0, sizeof(**pdcch) * MAX_NUM_BWP * MAX_NUM_CORESET);
+  DL_req[CC_idP].SFN                                   = frameP;
+  DL_req[CC_idP].Slot                                  = slotP;
+  DL_req[CC_idP].dl_tti_request_body.nPDUs             = 0;
+  DL_req[CC_idP].dl_tti_request_body.nGroup            = 0;
+  //DL_req[CC_idP].dl_tti_request_body.transmission_power_pcfich           = 6000;
+  memset(pdcch, 0, sizeof(**pdcch) * MAX_NUM_BWP * MAX_NUM_CORESET);
 
-    UL_dci_req[CC_idP].SFN                         = frameP;
-    UL_dci_req[CC_idP].Slot                        = slotP;
-    UL_dci_req[CC_idP].numPdus                     = 0;
+  UL_dci_req[CC_idP].SFN                         = frameP;
+  UL_dci_req[CC_idP].Slot                        = slotP;
+  UL_dci_req[CC_idP].numPdus                     = 0;
 
-    /* advance last round's future UL_tti_req to be ahead of current frame/slot */
-    future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024;
-    /* future_ul_tti_req->Slot is fixed! */
-    future_ul_tti_req->n_pdus = 0;
-    future_ul_tti_req->n_ulsch = 0;
-    future_ul_tti_req->n_ulcch = 0;
-    future_ul_tti_req->n_group = 0;
+  /* advance last round's future UL_tti_req to be ahead of current frame/slot */
+  future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024;
+  LOG_D(MAC,"Future_ul_tti SFN = %d for slot %d \n", future_ul_tti_req->SFN, (slotP + num_slots - 1) % num_slots);
+  /* future_ul_tti_req->Slot is fixed! */
+  future_ul_tti_req->n_pdus = 0;
+  future_ul_tti_req->n_ulsch = 0;
+  future_ul_tti_req->n_ulcch = 0;
+  future_ul_tti_req->n_group = 0;
 
-    /* UL_tti_req is a simple pointer into the current UL_tti_req_ahead, i.e.,
-     * it walks over UL_tti_req_ahead in a circular fashion */
-    gNB->UL_tti_req[CC_idP] = &gNB->UL_tti_req_ahead[CC_idP][slotP];
+  /* UL_tti_req is a simple pointer into the current UL_tti_req_ahead, i.e.,
+   * it walks over UL_tti_req_ahead in a circular fashion */
+  gNB->UL_tti_req[CC_idP] = &gNB->UL_tti_req_ahead[CC_idP][slotP];
 
-    TX_req[CC_idP].Number_of_PDUs                  = 0;
+  TX_req[CC_idP].Number_of_PDUs                  = 0;
 
-  }
 }
 /*
 void check_nr_ul_failure(module_id_t module_idP,
@@ -401,6 +401,22 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     memset(&vrb_map_UL[last_slot * MAX_BWP_SIZE], 0, sizeof(uint16_t) * MAX_BWP_SIZE);
 
     clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame, slot);
+
+    /*VNF first entry into scheduler. Since frame numbers for future_ul_tti_req of some future slots 
+    will not be set before we encounter them, set them here */
+
+    if (NFAPI_MODE == NFAPI_MODE_VNF){
+      if(vnf_first_sched_entry == 1)
+      {
+        for (int i = 0; i<num_slots; i++){
+          if(i < slot)
+            gNB->UL_tti_req_ahead[CC_id][i].SFN = (frame + 1) % 1024;
+          else
+            gNB->UL_tti_req_ahead[CC_id][i].SFN = frame;
+        }
+        vnf_first_sched_entry = 0;
+      }
+    }
   }
 
 
@@ -429,7 +445,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
     schedule_nr_prach(module_idP, f, s);
   }
 
-  // This schedule SR
+    // This schedule SR
   nr_sr_reporting(module_idP, frame, slot);
 
   // Schedule CSI-RS transmission
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index cfe4ebfb6edfa995890d007db373f61230751201..b55fee2af62513a07104696c077b6ed1d9ed91d9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -545,7 +545,7 @@ void nr_initiate_ra_proc(module_id_t module_idP,
       if (ra->CellGroup && ra->CellGroup->spCellConfig && ra->CellGroup->spCellConfig->spCellConfigDedicated &&
           ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
         ra->bwp_id = 1;
-	      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
+        bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id - 1];
       }
 
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 1);
@@ -653,33 +653,222 @@ void nr_initiate_ra_proc(module_id_t module_idP,
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_INITIATE_RA_PROC, 0);
 }
 
-  void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
-  {
-    gNB_MAC_INST *mac = RC.nrmac[module_idP];
-
-    start_meas(&mac->schedule_ra);
-    for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
-      NR_COMMON_channels_t *cc = &mac->common_channels[CC_id];
-      for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
-        NR_RA_t *ra = &cc->ra[i];
-        LOG_D(NR_MAC, "RA[state:%d]\n", ra->state);
-        switch (ra->state) {
-          case Msg2:
-            nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra);
-            break;
-          case Msg4:
-            nr_generate_Msg4(module_idP, CC_id, frameP, slotP, ra);
-            break;
-          case WAIT_Msg4_ACK:
-            nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP, ra);
-            break;
-          default:
-            break;
-        }
+void nr_schedule_RA(module_id_t module_idP, frame_t frameP, sub_frame_t slotP) {
+
+  gNB_MAC_INST *mac = RC.nrmac[module_idP];
+
+  start_meas(&mac->schedule_ra);
+  for (int CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
+    NR_COMMON_channels_t *cc = &mac->common_channels[CC_id];
+    for (int i = 0; i < NR_NB_RA_PROC_MAX; i++) {
+      NR_RA_t *ra = &cc->ra[i];
+      LOG_D(NR_MAC, "RA[state:%d]\n", ra->state);
+      switch (ra->state) {
+        case Msg2:
+          nr_generate_Msg2(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        case Msg3_retransmission:
+          nr_generate_Msg3_retransmission(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        case Msg4:
+          nr_generate_Msg4(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        case WAIT_Msg4_ACK:
+          nr_check_Msg4_Ack(module_idP, CC_id, frameP, slotP, ra);
+          break;
+        default:
+          break;
       }
     }
-    stop_meas(&mac->schedule_ra);
   }
+  stop_meas(&mac->schedule_ra);
+}
+
+
+void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t frame, sub_frame_t slot, NR_RA_t *ra) {
+
+  gNB_MAC_INST *nr_mac = RC.nrmac[module_idP];
+  NR_COMMON_channels_t *cc = &nr_mac->common_channels[CC_id];
+  NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
+
+  NR_BWP_Uplink_t *ubwp = ra->CellGroup ?
+    ra->CellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[ra->bwp_id-1] :
+    NULL;
+
+  NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList= ubwp ?
+    ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
+    scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+
+  int mu = ubwp ?
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing :
+    scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+
+  uint8_t K2 = *pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->k2;
+
+  const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
+  const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
+
+  if (is_xlsch_in_slot(RC.nrmac[module_idP]->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) {
+    // beam association for FR2
+    int16_t *tdd_beam_association = nr_mac->tdd_beam_association;
+    if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) {
+      uint8_t tdd_period_slot =  scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots + scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
+      if ((scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols > 0) || (scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols > 0))
+        tdd_period_slot++;
+      int num_tdd_period = sched_slot/tdd_period_slot;
+      if((tdd_beam_association[num_tdd_period]!=-1)&&(tdd_beam_association[num_tdd_period]!=ra->beam_id))
+        return; // can't schedule retransmission in this slot
+      else
+        tdd_beam_association[num_tdd_period] = ra->beam_id;
+    }
+
+    int bwpSize = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+    int bwpStart = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+    int scs = scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+    int fh = 0;
+    int startSymbolAndLength = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
+    int mappingtype = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
+
+    if (ra->CellGroup) {
+      AssertFatal(ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
+                  "downlinkBWP_ToAddModList has %d BWP!\n", ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
+      int act_bwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      int act_bwp_size  = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
+      startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
+      mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
+      scs = ubwp->bwp_Common->genericParameters.subcarrierSpacing;
+      fh = ubwp->bwp_Dedicated->pusch_Config->choice.setup->frequencyHopping ? 1 : 0;
+      if ((bwpStart < act_bwp_start) || (bwpSize > act_bwp_size))
+        bwpStart = act_bwp_start;
+    }
+    uint16_t *vrb_map_UL =
+        &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+
+    int rbStart = 0;
+    for (int i = 0; (i < ra->msg3_nb_rb) && (rbStart <= (bwpSize - ra->msg3_nb_rb)); i++) {
+      if (vrb_map_UL[rbStart + bwpStart + i]) {
+        rbStart += i;
+        i = 0;
+      }
+    }
+    if (rbStart > (bwpSize - ra->msg3_nb_rb)) {
+      // cannot find free vrb_map for msg3 retransmission in this slot
+      return;
+    }
+
+    LOG_I(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d Scheduling retransmission of Msg3 in (%d,%d)\n",
+          module_idP, frame, slot, CC_id, sched_frame, sched_slot);
+
+    nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][sched_slot];
+    AssertFatal(future_ul_tti_req->SFN == sched_frame
+                && future_ul_tti_req->Slot == sched_slot,
+                "future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
+                future_ul_tti_req->SFN,
+                future_ul_tti_req->Slot,
+                sched_frame,
+                sched_slot);
+    future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_type = NFAPI_NR_UL_CONFIG_PUSCH_PDU_TYPE;
+    future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
+    nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
+    memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
+
+    fill_msg3_pusch_pdu(pusch_pdu, scc,
+                        ra->msg3_round,
+                        startSymbolAndLength,
+                        ra->rnti, scs,
+                        bwpSize, bwpStart,
+                        mappingtype, fh,
+                        rbStart, ra->msg3_nb_rb);
+    future_ul_tti_req->n_pdus += 1;
+
+    // generation of DCI 0_0 to schedule msg3 retransmission
+    NR_SearchSpace_t *ss = ra->ra_ss;
+    NR_BWP_Downlink_t *bwp = NULL;
+    NR_ControlResourceSet_t *coreset = NULL;
+
+    if (ra->CellGroup &&
+        ra->CellGroup->spCellConfig &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList &&
+        ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1])
+      bwp = ra->CellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[ra->bwp_id-1];
+
+    if (*ss->controlResourceSetId == 0)
+      coreset = nr_mac->sched_ctrlCommon->coreset; // this is coreset 0
+    else
+      coreset = get_coreset(scc, bwp, ss, NR_SearchSpace__searchSpaceType_PR_common);
+    AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg3 retransmission\n");
+
+    nfapi_nr_ul_dci_request_t *ul_dci_req = &nr_mac->UL_dci_req[CC_id];
+
+    const int coresetid = coreset->controlResourceSetId;
+    nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid];
+    if (!pdcch_pdu_rel15) {
+      nfapi_nr_ul_dci_request_pdus_t *ul_dci_request_pdu = &ul_dci_req->ul_dci_pdu_list[ul_dci_req->numPdus];
+      memset(ul_dci_request_pdu, 0, sizeof(nfapi_nr_ul_dci_request_pdus_t));
+      ul_dci_request_pdu->PDUType = NFAPI_NR_DL_TTI_PDCCH_PDU_TYPE;
+      ul_dci_request_pdu->PDUSize = (uint8_t)(2+sizeof(nfapi_nr_dl_tti_pdcch_pdu));
+      pdcch_pdu_rel15 = &ul_dci_request_pdu->pdcch_pdu.pdcch_pdu_rel15;
+      ul_dci_req->numPdus += 1;
+      nr_configure_pdcch(pdcch_pdu_rel15, ss, coreset, scc, bwp);
+      nr_mac->pdcch_pdu_idx[CC_id][ra->bwp_id][coresetid] = pdcch_pdu_rel15;
+    }
+
+    uint8_t aggregation_level;
+    uint8_t nr_of_candidates;
+    find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
+    int CCEIndex = allocate_nr_CCEs(nr_mac, bwp, coreset, aggregation_level, 0, 0, nr_of_candidates);
+    if (CCEIndex < 0) {
+      LOG_E(NR_MAC, "%s(): cannot find free CCE for RA RNTI %04x!\n", __func__, ra->rnti);
+      return;
+    }
+
+    // Fill PDCCH DL DCI PDU
+    nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[pdcch_pdu_rel15->numDlDci];
+    pdcch_pdu_rel15->numDlDci++;
+    dci_pdu->RNTI = ra->rnti;
+    dci_pdu->ScramblingId = *scc->physCellId;
+    dci_pdu->ScramblingRNTI = 0;
+    dci_pdu->AggregationLevel = aggregation_level;
+    dci_pdu->CceIndex = CCEIndex;
+    dci_pdu->beta_PDCCH_1_0 = 0;
+    dci_pdu->powerControlOffsetSS = 1;
+
+    dci_pdu_rel15_t uldci_payload;
+    memset(&uldci_payload, 0, sizeof(uldci_payload));
+
+    config_uldci(ubwp,
+                 scc,
+                 pusch_pdu,
+                 &uldci_payload,
+                 NR_UL_DCI_FORMAT_0_0,
+                 ra->Msg3_tda_id,
+                 ra->msg3_TPC,
+                 0, // not used in format 0_0
+                 ra->bwp_id);
+
+    fill_dci_pdu_rel15(scc,
+                       ra->CellGroup,
+                       dci_pdu,
+                       &uldci_payload,
+                       NR_UL_DCI_FORMAT_0_0,
+                       NR_RNTI_TC,
+                       pusch_pdu->bwp_size,
+                       ra->bwp_id);
+
+    // Mark the corresponding RBs as used
+    for (int rb = 0; rb < ra->msg3_nb_rb; rb++) {
+      vrb_map_UL[rbStart + bwpStart + rb] = 1;
+    }
+
+    // reset state to wait msg3
+    ra->state = WAIT_Msg3;
+    ra->Msg3_frame = sched_frame;
+    ra->Msg3_slot = sched_slot;
+
+  }
+
+}
 
 void nr_get_Msg3alloc(module_id_t module_id,
                       int CC_id,
@@ -690,45 +879,45 @@ void nr_get_Msg3alloc(module_id_t module_id,
                       NR_RA_t *ra,
                       int16_t *tdd_beam_association) {
 
-    // msg3 is schedulend in mixed slot in the following TDD period
-
-    uint16_t msg3_nb_rb = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // sdu has 6 or 8 bytes
-
-    int mu = ubwp ?
-      ubwp->bwp_Common->genericParameters.subcarrierSpacing :
-      scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
-    int StartSymbolIndex = 0;
-    int NrOfSymbols = 0;
-    int startSymbolAndLength = 0;
-    int temp_slot = 0;
-    ra->Msg3_tda_id = 16; // initialization to a value above limit
-
-    NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList= ubwp ?
-      ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
-      scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
-
-    uint8_t k2 = 0;
-    for (int i=0; i<pusch_TimeDomainAllocationList->list.count; i++) {
-      startSymbolAndLength = pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength;
-      SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols);
-      // we want to transmit in the uplink symbols of mixed slot
-      if (NrOfSymbols == scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols) {
-        k2 = *pusch_TimeDomainAllocationList->list.array[i]->k2;
-        temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213
-        ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu];
-        if (is_xlsch_in_slot(RC.nrmac[module_id]->ulsch_slot_bitmap[ra->Msg3_slot / 64], ra->Msg3_slot)) {
-          ra->Msg3_tda_id = i;
-          break;
-        }
+  // msg3 is scheduled in mixed slot in the following TDD period
+
+  uint16_t msg3_nb_rb = 8 + sizeof(NR_MAC_SUBHEADER_SHORT) + sizeof(NR_MAC_SUBHEADER_SHORT); // sdu has 6 or 8 bytes
+
+  int mu = ubwp ?
+    ubwp->bwp_Common->genericParameters.subcarrierSpacing :
+    scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.subcarrierSpacing;
+  int StartSymbolIndex = 0;
+  int NrOfSymbols = 0;
+  int startSymbolAndLength = 0;
+  int temp_slot = 0;
+  ra->Msg3_tda_id = 16; // initialization to a value above limit
+
+  NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList= ubwp ?
+    ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
+    scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+
+  uint8_t k2 = 0;
+  for (int i=0; i<pusch_TimeDomainAllocationList->list.count; i++) {
+    startSymbolAndLength = pusch_TimeDomainAllocationList->list.array[i]->startSymbolAndLength;
+    SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols);
+    // we want to transmit in the uplink symbols of mixed slot
+    if (NrOfSymbols == scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols) {
+      k2 = *pusch_TimeDomainAllocationList->list.array[i]->k2;
+      temp_slot = current_slot + k2 + DELTA[mu]; // msg3 slot according to 8.3 in 38.213
+      ra->Msg3_slot = temp_slot%nr_slots_per_frame[mu];
+      if (is_xlsch_in_slot(RC.nrmac[module_id]->ulsch_slot_bitmap[ra->Msg3_slot / 64], ra->Msg3_slot)) {
+        ra->Msg3_tda_id = i;
+        break;
       }
     }
+  }
 
-    AssertFatal(ra->Msg3_tda_id<16,"Unable to find Msg3 time domain allocation in list\n");
+  AssertFatal(ra->Msg3_tda_id<16,"Unable to find Msg3 time domain allocation in list\n");
 
-    if (nr_slots_per_frame[mu]>temp_slot)
-      ra->Msg3_frame = current_frame;
-    else
-      ra->Msg3_frame = (current_frame + (temp_slot/nr_slots_per_frame[mu]))%1024;
+  if (nr_slots_per_frame[mu]>temp_slot)
+    ra->Msg3_frame = current_frame;
+  else
+    ra->Msg3_frame = (current_frame + (temp_slot/nr_slots_per_frame[mu]))%1024;
 
   // beam association for FR2
   if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) {
@@ -750,7 +939,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
 				    scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth,
 				    MAX_BWP_SIZE);
 
-    /* search msg3_nb_rb free RBs */
+  /* search msg3_nb_rb free RBs */
   int rbSize = 0;
   int rbStart = 0;
   while (rbSize < msg3_nb_rb) {
@@ -768,6 +957,75 @@ void nr_get_Msg3alloc(module_id_t module_id,
   ra->msg3_first_rb = rbStart;
 }
 
+
+void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
+                         NR_ServingCellConfigCommon_t *scc,
+                         int round,
+                         int startSymbolAndLength,
+                         rnti_t rnti, int scs,
+                         int bwp_size, int bwp_start,
+                         int mappingtype, int fh,
+                         int msg3_first_rb, int msg3_nb_rb) {
+
+
+  int start_symbol_index,nr_of_symbols;
+  SLIV2SL(startSymbolAndLength, &start_symbol_index, &nr_of_symbols);
+
+  pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
+  pusch_pdu->rnti = rnti;
+  pusch_pdu->handle = 0;
+  pusch_pdu->bwp_start = bwp_start;
+  pusch_pdu->bwp_size = bwp_size;
+  pusch_pdu->subcarrier_spacing = scs;
+  pusch_pdu->cyclic_prefix = 0;
+  pusch_pdu->mcs_index = 0;
+  pusch_pdu->mcs_table = 0;
+  pusch_pdu->target_code_rate = nr_get_code_rate_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
+  pusch_pdu->qam_mod_order = nr_get_Qm_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
+  if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL)
+    pusch_pdu->transform_precoding = 1;
+  else
+    pusch_pdu->transform_precoding = 0;
+  pusch_pdu->data_scrambling_id = *scc->physCellId;
+  pusch_pdu->nrOfLayers = 1;
+  pusch_pdu->ul_dmrs_symb_pos = get_l_prime(nr_of_symbols,mappingtype,pusch_dmrs_pos2,pusch_len1,start_symbol_index, scc->dmrs_TypeA_Position);
+  LOG_D(MAC, "MSG3 start_sym:%d NR Symb:%d mappingtype:%d , ul_dmrs_symb_pos:%x\n", start_symbol_index, nr_of_symbols, mappingtype, pusch_pdu->ul_dmrs_symb_pos);
+  pusch_pdu->dmrs_config_type = 0;
+  pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId; //If provided and the PUSCH is not a msg3 PUSCH, otherwise, L2 should set this to physical cell id.
+  pusch_pdu->scid = 0; //DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]. Should match what is sent in DCI 0_1, otherwise set to 0.
+  pusch_pdu->dmrs_ports = 1;  // 6.2.2 in 38.214 only port 0 to be used
+  pusch_pdu->num_dmrs_cdm_grps_no_data = 2;  // no data in dmrs symbols as in 6.2.2 in 38.214
+  pusch_pdu->resource_alloc = 1; //type 1
+
+  pusch_pdu->rb_start = msg3_first_rb;
+  if (msg3_nb_rb > pusch_pdu->bwp_size)
+    AssertFatal(1==0,"MSG3 allocated number of RBs exceed the BWP size\n");
+  else
+    pusch_pdu->rb_size = msg3_nb_rb;
+  pusch_pdu->vrb_to_prb_mapping = 0;
+
+  pusch_pdu->frequency_hopping = fh;
+  //pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
+  pusch_pdu->uplink_frequency_shift_7p5khz = 0;
+  //Resource Allocation in time domain
+  pusch_pdu->start_symbol_index = start_symbol_index;
+  pusch_pdu->nr_of_symbols = nr_of_symbols;
+  //Optional Data only included if indicated in pduBitmap
+  pusch_pdu->pusch_data.rv_index = nr_rv_round_map[round];
+  pusch_pdu->pusch_data.harq_process_id = 0;
+  pusch_pdu->pusch_data.new_data_indicator = 1;
+  pusch_pdu->pusch_data.num_cb = 0;
+  pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
+                                                 pusch_pdu->target_code_rate,
+                                                 pusch_pdu->rb_size,
+                                                 pusch_pdu->nr_of_symbols,
+                                                 12, // nb dmrs set for no data in dmrs symbol
+                                                 0, //nb_rb_oh
+                                                 0, // to verify tb scaling
+                                                 pusch_pdu->nrOfLayers)>>3;
+
+}
+
 void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra, uint8_t *RAR_pdu)
 {
   gNB_MAC_INST                                   *mac = RC.nrmac[module_idP];
@@ -790,7 +1048,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
     vrb_map_UL[i + ra->msg3_first_rb] = 1;
   }
 
-  LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Subframe %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
+  LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
 
   nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][ra->Msg3_slot];
   AssertFatal(future_ul_tti_req->SFN == ra->Msg3_frame
@@ -804,7 +1062,7 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
   future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
   nfapi_nr_pusch_pdu_t *pusch_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].pusch_pdu;
   memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
-  future_ul_tti_req->n_pdus += 1;
+
   int ibwp_size  = NRRIV2BW(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   int ibwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
   int abwp_size = ibwp_size;
@@ -837,67 +1095,20 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
     ra->msg3_round,
     ra->rnti);
 
-  int start_symbol_index,nr_of_symbols;
-  SLIV2SL(startSymbolAndLength, &start_symbol_index, &nr_of_symbols);
-
-  pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;
-  pusch_pdu->rnti = ra->rnti;
-  pusch_pdu->handle = 0;
-
+  int bwp_start;
   if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size))
-    pusch_pdu->bwp_start = abwp_start;
-  else
-    pusch_pdu->bwp_start = ibwp_start;
-  pusch_pdu->bwp_size = ibwp_size;
-  pusch_pdu->subcarrier_spacing = scs;
-  pusch_pdu->cyclic_prefix = 0;
-  pusch_pdu->mcs_index = 0;
-  pusch_pdu->mcs_table = 0;
-  pusch_pdu->target_code_rate = nr_get_code_rate_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
-  pusch_pdu->qam_mod_order = nr_get_Qm_ul(pusch_pdu->mcs_index,pusch_pdu->mcs_table);
-  if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL)
-    pusch_pdu->transform_precoding = 1;
-  else
-    pusch_pdu->transform_precoding = 0;
-  pusch_pdu->data_scrambling_id = *scc->physCellId;
-  pusch_pdu->nrOfLayers = 1;
-
-  pusch_pdu->ul_dmrs_symb_pos = get_l_prime(nr_of_symbols,mappingtype,pusch_dmrs_pos2,pusch_len1,start_symbol_index, scc->dmrs_TypeA_Position);
-  LOG_D(MAC, "MSG3 start_sym:%d NR Symb:%d mappingtype:%d , ul_dmrs_symb_pos:%x\n", start_symbol_index, nr_of_symbols, mappingtype, pusch_pdu->ul_dmrs_symb_pos);
-
-  pusch_pdu->dmrs_config_type = 0;
-  pusch_pdu->ul_dmrs_scrambling_id = *scc->physCellId; //If provided and the PUSCH is not a msg3 PUSCH, otherwise, L2 should set this to physical cell id.
-  pusch_pdu->scid = 0; //DMRS sequence initialization [TS38.211, sec 6.4.1.1.1]. Should match what is sent in DCI 0_1, otherwise set to 0.
-  pusch_pdu->dmrs_ports = 1;  // 6.2.2 in 38.214 only port 0 to be used
-  pusch_pdu->num_dmrs_cdm_grps_no_data = 2;  // no data in dmrs symbols as in 6.2.2 in 38.214
-  pusch_pdu->resource_alloc = 1; //type 1
-  //pusch_pdu->rb_start = ra->msg3_first_rb + ibwp_start - abwp_start; // as for 6.3.1.7 in 38.211
-  pusch_pdu->rb_start = ra->msg3_first_rb;
-  if (ra->msg3_nb_rb > pusch_pdu->bwp_size)
-    AssertFatal(1==0,"MSG3 allocated number of RBs exceed the BWP size\n");
+    bwp_start = abwp_start;
   else
-    pusch_pdu->rb_size = ra->msg3_nb_rb;
-  pusch_pdu->vrb_to_prb_mapping = 0;
-
-  pusch_pdu->frequency_hopping = fh;
-  //pusch_pdu->tx_direct_current_location;//The uplink Tx Direct Current location for the carrier. Only values in the value range of this field between 0 and 3299, which indicate the subcarrier index within the carrier corresponding 1o the numerology of the corresponding uplink BWP and value 3300, which indicates "Outside the carrier" and value 3301, which indicates "Undetermined position within the carrier" are used. [TS38.331, UplinkTxDirectCurrentBWP IE]
-  pusch_pdu->uplink_frequency_shift_7p5khz = 0;
-  //Resource Allocation in time domain
-  pusch_pdu->start_symbol_index = start_symbol_index;
-  pusch_pdu->nr_of_symbols = nr_of_symbols;
-  //Optional Data only included if indicated in pduBitmap
-  pusch_pdu->pusch_data.rv_index = 0;  // 8.3 in 38.213
-  pusch_pdu->pusch_data.harq_process_id = 0;
-  pusch_pdu->pusch_data.new_data_indicator = 1; // new data
-  pusch_pdu->pusch_data.num_cb = 0;
-  pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
-                                                 pusch_pdu->target_code_rate,
-                                                 pusch_pdu->rb_size,
-                                                 pusch_pdu->nr_of_symbols,
-                                                 12, // nb dmrs set for no data in dmrs symbol
-                                                 0, //nb_rb_oh
-                                                 0, // to verify tb scaling
-                                                 pusch_pdu->nrOfLayers = 1)>>3;
+    bwp_start = ibwp_start;
+
+  fill_msg3_pusch_pdu(pusch_pdu,scc,
+                      ra->msg3_round,
+                      startSymbolAndLength,
+                      ra->rnti, scs,
+                      ibwp_size, bwp_start,
+                      mappingtype, fh,
+                      ra->msg3_first_rb, ra->msg3_nb_rb);
+  future_ul_tti_req->n_pdus += 1;
 
   // calling function to fill rar message
   nr_fill_rar(module_idP, ra, RAR_pdu, pusch_pdu);
@@ -1479,6 +1690,9 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
       }
     }
 
+    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->tb, harq->tb_size));
+
     // DL TX request
     nfapi_nr_pdu_t *tx_req = &nr_mac->TX_req[CC_id].pdu_list[nr_mac->TX_req[CC_id].Number_of_PDUs];
     memcpy(tx_req->TLVs[0].value.direct, harq->tb, sizeof(uint8_t) * harq->tb_size);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 93d2e959ddf4857935edd61e98b407aa25fc724e..c5cd9ac80334b729b30fbd584faedd4480224c78 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -47,6 +47,7 @@
 
 /*Softmodem params*/
 #include "executables/softmodem-common.h"
+#include "../../../nfapi/oai_integration/vendor_ext.h"
 
 ////////////////////////////////////////////////////////
 /////* DLSCH MAC PDU generation (6.1.2 TS 38.321) */////
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 3383dd7504f9a16dd2f398a7f1a41e29b788c26a..41890866c824047eb2ac494ba4089d71b633f9a9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -607,6 +607,7 @@ void config_uldci(const NR_BWP_Uplink_t *ubwp,
                   uint8_t tpc,
                   int n_ubwp,
                   int bwp_id) {
+
   const int bw = NRRIV2BW(ubwp ?
 			  ubwp->bwp_Common->genericParameters.locationAndBandwidth :
 			  scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
@@ -1386,41 +1387,53 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
       break;
 
     case NFAPI_NR_RNTI_TC:
-      // indicating a DL DCI format 1bit
-      *dci_pdu |= (dci_pdu_rel15->format_indicator & 1) << (dci_size - pos++);
+      // indicating a UL DCI format 1bit
+      pos=1;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->format_indicator & 1) << (dci_size - pos);
       // Freq domain assignment  max 16 bit
       fsize = (int)ceil(log2((N_RB * (N_RB + 1)) >> 1));
-      for (int i = 0; i < fsize; i++)
-        *dci_pdu |= ((dci_pdu_rel15->frequency_domain_assignment.val >> (fsize - i - 1)) & 1) << (dci_size - pos++);
+      pos+=fsize;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->frequency_domain_assignment.val & ((1 << fsize) - 1)) << (dci_size - pos);
       // Time domain assignment 4bit
-      for (int i = 0; i < 4; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->time_domain_assignment.val >> (3 - i)) & 1) << (dci_size - pos++);
+      pos += 4;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->time_domain_assignment.val & ((1 << 4) - 1)) << (dci_size - pos);
       // Frequency hopping flag – 1 bit
-      *dci_pdu |= ((uint64_t)dci_pdu_rel15->frequency_hopping_flag.val & 1) << (dci_size - pos++);
+      pos++;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->frequency_hopping_flag.val & 1) << (dci_size - pos);
       // MCS  5 bit
-      for (int i = 0; i < 5; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->mcs >> (4 - i)) & 1) << (dci_size - pos++);
+      pos+=5;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->mcs & 0x1f) << (dci_size - pos);
       // New data indicator 1bit
-      *dci_pdu |= ((uint64_t)dci_pdu_rel15->ndi & 1) << (dci_size - pos++);
+      pos++;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->ndi & 1) << (dci_size - pos);
       // Redundancy version  2bit
-      for (int i = 0; i < 2; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->rv >> (1 - i)) & 1) << (dci_size - pos++);
+      pos+=2;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->rv & 0x3) << (dci_size - pos);
       // HARQ process number  4bit
-      for (int i = 0; i < 4; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->harq_pid >> (3 - i)) & 1) << (dci_size - pos++);
-      // TPC command for scheduled PUSCH – 2 bits
-      for (int i = 0; i < 2; i++)
-        *dci_pdu |= (((uint64_t)dci_pdu_rel15->tpc >> (1 - i)) & 1) << (dci_size - pos++);
+      pos+=4;
+      *dci_pdu |= ((uint64_t)dci_pdu_rel15->harq_pid & 0xf) << (dci_size - pos);
       // Padding bits
       for (int a = pos; a < 32; a++)
         *dci_pdu |= ((uint64_t)dci_pdu_rel15->padding & 1) << (dci_size - pos++);
       // UL/SUL indicator – 1 bit
-      /*
-        commented for now (RK): need to get this information from BWP descriptor
-        if (cfg->pucch_config.pucch_GroupHopping.value)
+      /* commented for now (RK): need to get this from BWP descriptor
+      if (cfg->pucch_config.pucch_GroupHopping.value)
         *dci_pdu |=
-        ((uint64_t)dci_pdu_rel15->ul_sul_indicator.val&1)<<(dci_size-pos++);
+      ((uint64_t)dci_pdu_rel15->ul_sul_indicator.val&1)<<(dci_size-pos++);
         */
+      LOG_D(NR_MAC,"N_RB = %i\n", N_RB);
+      LOG_D(NR_MAC,"dci_size = %i\n", dci_size);
+      LOG_D(NR_MAC,"fsize = %i\n", fsize);
+      LOG_D(NR_MAC,"dci_pdu_rel15->frequency_domain_assignment.val = %i\n", dci_pdu_rel15->frequency_domain_assignment.val);
+      LOG_D(NR_MAC,"dci_pdu_rel15->time_domain_assignment.val = %i\n", dci_pdu_rel15->time_domain_assignment.val);
+      LOG_D(NR_MAC,"dci_pdu_rel15->frequency_hopping_flag.val = %i\n", dci_pdu_rel15->frequency_hopping_flag.val);
+      LOG_D(NR_MAC,"dci_pdu_rel15->mcs = %i\n", dci_pdu_rel15->mcs);
+      LOG_D(NR_MAC,"dci_pdu_rel15->ndi = %i\n", dci_pdu_rel15->ndi);
+      LOG_D(NR_MAC,"dci_pdu_rel15->rv = %i\n", dci_pdu_rel15->rv);
+      LOG_D(NR_MAC,"dci_pdu_rel15->harq_pid = %i\n", dci_pdu_rel15->harq_pid);
+      LOG_D(NR_MAC,"dci_pdu_rel15->tpc = %i\n", dci_pdu_rel15->tpc);
+      LOG_D(NR_MAC,"dci_pdu_rel15->padding = %i\n", dci_pdu_rel15->padding);
+
       break;
     }
     break;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index fbd8a4b5ca0f924041a912dc7fa38292999033c2..c854dd7b2e4a08194ec93881ec8f61071ea9ad9f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -174,60 +174,63 @@ void calculate_preferred_ul_tda(module_id_t module_id, const NR_BWP_Uplink_t *ub
           tdd->nrofUplinkSlots);
 }
 
+//  For both UL-SCH except:
+//   - UL-SCH: fixed-size MAC CE(known by LCID)
+//   - UL-SCH: padding
+//   - UL-SCH: MSG3 48-bits
+//  |0|1|2|3|4|5|6|7|  bit-wise
+//  |R|F|   LCID    |
+//  |       L       |
+//  |0|1|2|3|4|5|6|7|  bit-wise
+//  |R|F|   LCID    |
+//  |       L       |
+//  |       L       |
+//
+//  For:
+//   - UL-SCH: fixed-size MAC CE(known by LCID)
+//   - UL-SCH: padding, for single/multiple 1-oct padding CE(s)
+//   - UL-SCH: MSG3 48-bits
+//  |0|1|2|3|4|5|6|7|  bit-wise
+//  |R|R|   LCID    |
+//
+//  LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
+//  L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
+//  F: length of L is 0:8 or 1:16 bits wide
+//  R: Reserved bit, set to zero.
+
 void nr_process_mac_pdu(module_id_t module_idP,
                         int UE_id,
                         uint8_t CC_id,
                         frame_t frameP,
                         sub_frame_t slot,
                         uint8_t *pduP,
-                        uint16_t mac_pdu_len)
+                        int pdu_len)
 {
 
-    // This function is adapting code from the old
-    // parse_header(...) and ue_send_sdu(...) functions of OAI LTE
-
-    uint8_t *pdu_ptr = pduP, rx_lcid, done = 0;
-    int pdu_len = mac_pdu_len;
-    uint16_t mac_ce_len, mac_subheader_len, mac_sdu_len;
+    uint8_t rx_lcid;
+    uint8_t done = 0;
+    uint16_t mac_ce_len;
+    uint16_t mac_subheader_len;
+    uint16_t mac_sdu_len;
 
     NR_UE_info_t *UE_info = &RC.nrmac[module_idP]->UE_info;
     NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
 
     if ( pduP[0] != UL_SCH_LCID_PADDING )
-      trace_NRpdu(DIRECTION_UPLINK, pduP, mac_pdu_len ,UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0);
-
-    //  For both DL/UL-SCH
-    //  Except:
-    //   - UL/DL-SCH: fixed-size MAC CE(known by LCID)
-    //   - UL/DL-SCH: padding
-    //   - UL-SCH:    MSG3 48-bits
-    //  |0|1|2|3|4|5|6|7|  bit-wise
-    //  |R|F|   LCID    |
-    //  |       L       |
-    //  |0|1|2|3|4|5|6|7|  bit-wise
-    //  |R|F|   LCID    |
-    //  |       L       |
-    //  |       L       |
-
-    //  For both DL/UL-SCH
-    //  For:
-    //   - UL/DL-SCH: fixed-size MAC CE(known by LCID)
-    //   - UL/DL-SCH: padding, for single/multiple 1-oct padding CE(s)
-    //   - UL-SCH:    MSG3 48-bits
-    //  |0|1|2|3|4|5|6|7|  bit-wise
-    //  |R|R|   LCID    |
-    //  LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
-    //  L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
-    //  F: lenght of L is 0:8 or 1:16 bits wide
-    //  R: Reserved bit, set to zero.
+      trace_NRpdu(DIRECTION_UPLINK, pduP, pdu_len, UE_id, WS_C_RNTI, UE_info->rnti[UE_id], frameP, 0, 0, 0);
+
+    #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+    LOG_I(NR_MAC, "In %s: dumping MAC PDU in %d.%d:\n", __func__, frameP, slot);
+    log_dump(NR_MAC, pduP, pdu_len, LOG_DUMP_CHAR, "\n");
+    #endif
 
     while (!done && pdu_len > 0){
         mac_ce_len = 0;
-        mac_subheader_len = 1; //  default to fixed-length subheader = 1-oct
+        mac_subheader_len = sizeof(NR_MAC_SUBHEADER_FIXED);
         mac_sdu_len = 0;
-        rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID;
+        rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID;
 
-        LOG_D(NR_MAC, "LCID received at gNB side: %d \n", rx_lcid);
+        LOG_D(NR_MAC, "In %s: received UL-SCH sub-PDU with LCID 0x%x in %d.%d (remaining PDU length %d)\n", __func__, rx_lcid, frameP, slot, pdu_len);
 
         unsigned char *ce_ptr;
         int n_Lcg = 0;
@@ -236,7 +239,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
             //  MAC CE
 
             /*#ifdef DEBUG_HEADER_PARSING
-              LOG_D(NR_MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID, pdu_len);
+              LOG_D(NR_MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pduP)->LCID, pdu_len);
             #endif*/
         case UL_SCH_LCID_RECOMMENDED_BITRATE_QUERY:
               // 38.321 Ch6.1.3.20
@@ -252,7 +255,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
                //fixed length
                mac_ce_len =1;
                /* Extract short BSR value */
-               ce_ptr = &pdu_ptr[mac_subheader_len];
+               ce_ptr = &pduP[mac_subheader_len];
                NR_BSR_SHORT *bsr_s = (NR_BSR_SHORT *) ce_ptr;
                sched_ctrl->estimated_ul_buffer = 0;
                sched_ctrl->estimated_ul_buffer = NR_SHORT_BSR_TABLE[bsr_s->Buffer_size];
@@ -270,14 +273,14 @@ void nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_L_TRUNCATED_BSR:
         	//38.321 section 6.1.3.1
         	//variable length
-        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
-        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
         	/* Extract long BSR value */
-               ce_ptr = &pdu_ptr[mac_subheader_len];
+               ce_ptr = &pduP[mac_subheader_len];
                NR_BSR_LONG *bsr_l = (NR_BSR_LONG *) ce_ptr;
                sched_ctrl->estimated_ul_buffer = 0;
 
@@ -290,18 +293,18 @@ void nr_process_mac_pdu(module_id_t module_idP,
 
                for (int n = 0; n < n_Lcg; n++){
                  LOG_D(NR_MAC, "LONG BSR, %d/%d (n/n_Lcg), BS Index %d, BS value < %d",
-                       n, n_Lcg, pdu_ptr[mac_subheader_len + 1 + n],
-                       NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]]);
+                       n, n_Lcg, pduP[mac_subheader_len + 1 + n],
+                       NR_LONG_BSR_TABLE[pduP[mac_subheader_len + 1 + n]]);
                  sched_ctrl->estimated_ul_buffer +=
-                       NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]];
+                       NR_LONG_BSR_TABLE[pduP[mac_subheader_len + 1 + n]];
                  LOG_D(NR_MAC,
                        "LONG BSR at %4d.%2d, %d/%d (n/n_Lcg), BS Index %d, BS value < %d, total %d\n",
                        frameP,
                        slot,
                        n,
                        n_Lcg,
-                       pdu_ptr[mac_subheader_len + 1 + n],
-                       NR_LONG_BSR_TABLE[pdu_ptr[mac_subheader_len + 1 + n]],
+                       pduP[mac_subheader_len + 1 + n],
+                       NR_LONG_BSR_TABLE[pduP[mac_subheader_len + 1 + n]],
                        sched_ctrl->estimated_ul_buffer);
                }
 
@@ -319,7 +322,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
         	//fixed length
         	mac_ce_len = 2;
         	/* Extract SINGLE ENTRY PHR elements for PHR calculation */
-        	ce_ptr = &pdu_ptr[mac_subheader_len];
+        	ce_ptr = &pduP[mac_subheader_len];
         	NR_SINGLE_ENTRY_PHR_MAC_CE *phr = (NR_SINGLE_ENTRY_PHR_MAC_CE *) ce_ptr;
         	/* Save the phr info */
         	const int PH = phr->PH;
@@ -338,10 +341,10 @@ void nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_MULTI_ENTRY_PHR_1_OCT:
         	//38.321 section 6.1.3.9
         	//  varialbe length
-        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
-        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
         	/* Extract MULTI ENTRY PHR elements from single octet bitmap for PHR calculation */
@@ -350,10 +353,10 @@ void nr_process_mac_pdu(module_id_t module_idP,
         case UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT:
         	//38.321 section 6.1.3.9
         	//  varialbe length
-        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
         	mac_subheader_len = 2;
-        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
         		mac_subheader_len = 3;
         	}
         	/* Extract MULTI ENTRY PHR elements from four octets bitmap for PHR calculation */
@@ -366,13 +369,13 @@ void nr_process_mac_pdu(module_id_t module_idP,
 
         case UL_SCH_LCID_SRB1:
         case UL_SCH_LCID_SRB2:
-          if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
-            //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+          if(((NR_MAC_SUBHEADER_SHORT *)pduP)->F){
+            //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
             mac_subheader_len = 3;
-            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L1 & 0x7f) << 8)
-                | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L2 & 0xff);
+            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pduP)->L1 & 0x7f) << 8)
+                | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pduP)->L2 & 0xff);
           } else {
-            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
             mac_subheader_len = 2;
           }
           LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-DCCH %d (gNB %d, %d bytes), rnti: %d \n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len, UE_info->rnti[UE_id]);
@@ -383,7 +386,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
                            ENB_FLAG_YES,
                            MBMS_FLAG_NO,
                            rx_lcid,
-                           (char *) (pdu_ptr + mac_subheader_len),
+                           (char *) (pduP + mac_subheader_len),
                            mac_sdu_len,
                            1,
                            NULL);
@@ -404,7 +407,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
             // Check if it is a valid CCCH1 message, we get all 00's messages very often
             int i = 0;
             for(i=0; i<(mac_subheader_len+mac_sdu_len); i++) {
-              if(pdu_ptr[i] != 0) {
+              if(pduP[i] != 0) {
                 break;
               }
             }
@@ -425,35 +428,34 @@ void nr_process_mac_pdu(module_id_t module_idP,
                               0,
                               UE_info->rnti[UE_id],
                               CCCH,
-                              pdu_ptr+mac_subheader_len,
+                              pduP + mac_subheader_len,
                               mac_sdu_len,
                               0);
           break;
 
         case UL_SCH_LCID_DTCH:
           //  check if LCID is valid at current time.
-          if (((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F) {
-            // mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+          if (((NR_MAC_SUBHEADER_SHORT *)pduP)->F) {
+            // mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L2)<<8;
             mac_subheader_len = 3;
-            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L1 & 0x7f) << 8)
-                          | ((uint16_t)((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2 & 0xff);
+            mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *)pduP)->L1 & 0x7f) << 8)
+                          | ((uint16_t)((NR_MAC_SUBHEADER_LONG *)pduP)->L2 & 0xff);
 
           } else {
-            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+            mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pduP)->L;
             mac_subheader_len = 2;
           }
 
-          LOG_D(NR_MAC, "[UE %d] Frame %d : ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
+          LOG_D(NR_MAC, "In %s: [UE %d] %d.%d : ULSCH -> UL-%s %d (gNB %d, %d bytes)\n",
+                __func__,
                 module_idP,
                 frameP,
+                slot,
                 rx_lcid<4?"DCCH":"DTCH",
                 rx_lcid,
                 module_idP,
                 mac_sdu_len);
           UE_info->mac_stats[UE_id].lc_bytes_rx[rx_lcid] += mac_sdu_len;
-#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-            log_dump(NR_MAC, pdu_ptr + mac_subheader_len, 32, LOG_DUMP_CHAR, "\n");
-#endif
 
           mac_rlc_data_ind(module_idP,
                            UE_info->rnti[UE_id],
@@ -462,7 +464,7 @@ void nr_process_mac_pdu(module_id_t module_idP,
                            ENB_FLAG_YES,
                            MBMS_FLAG_NO,
                            rx_lcid,
-                           (char *)(pdu_ptr + mac_subheader_len),
+                           (char *)(pduP + mac_subheader_len),
                            mac_sdu_len,
                            1,
                            NULL);
@@ -479,14 +481,27 @@ void nr_process_mac_pdu(module_id_t module_idP,
           return;
           break;
         }
-        pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+
+        #ifdef ENABLE_MAC_PAYLOAD_DEBUG
+        if (rx_lcid < 45 || rx_lcid == 52 || rx_lcid == 63) {
+          LOG_I(NR_MAC, "In %s: dumping UL MAC SDU sub-header with length %d (LCID = 0x%02x):\n", __func__, mac_subheader_len, rx_lcid);
+          log_dump(NR_MAC, pduP, mac_subheader_len, LOG_DUMP_CHAR, "\n");
+          LOG_I(NR_MAC, "In %s: dumping UL MAC SDU with length %d (LCID = 0x%02x):\n", __func__, mac_sdu_len, rx_lcid);
+          log_dump(NR_MAC, pduP + mac_subheader_len, mac_sdu_len, LOG_DUMP_CHAR, "\n");
+        } else {
+          LOG_I(NR_MAC, "In %s: dumping UL MAC CE with length %d (LCID = 0x%02x):\n", __func__, mac_ce_len, rx_lcid);
+          log_dump(NR_MAC, pduP + mac_subheader_len + mac_sdu_len, mac_ce_len, LOG_DUMP_CHAR, "\n");
+        }
+        #endif
+
+        pduP += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
         pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
 
         if (pdu_len < 0) {
-          LOG_E(NR_MAC, "%s() residual mac pdu length < 0!, pdu_len: %d\n", __func__, pdu_len);
+          LOG_E(NR_MAC, "In %s: residual UL MAC PDU in %d.%d with length < 0!, pdu_len %d \n", __func__, frameP, slot, pdu_len);
           LOG_E(NR_MAC, "MAC PDU ");
           for (int i = 0; i < 20; i++) // Only printf 1st - 20nd bytes
-            printf("%02x ", pdu_ptr[i]);
+            printf("%02x ", pduP[i]);
           printf("\n");
           return;
         }
@@ -511,19 +526,26 @@ void abort_nr_ul_harq(module_id_t mod_id, int UE_id, int8_t harq_pid)
     sched_ctrl->sched_ul_bytes = 0;
 }
 
-void handle_nr_ul_harq(module_id_t mod_id,
+void handle_nr_ul_harq(const int CC_idP,
+                       module_id_t mod_id,
                        frame_t frame,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu)
 {
+  gNB_MAC_INST *gNB_mac = RC.nrmac[mod_id];
   int UE_id = find_nr_UE_id(mod_id, crc_pdu->rnti);
   if (UE_id < 0) {
+    for (int i = 0; i < NR_NB_RA_PROC_MAX; ++i) {
+      NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[i];
+      if (ra->state >= WAIT_Msg3 &&
+          ra->rnti == crc_pdu->rnti)
+        return;
+    }
     LOG_E(NR_MAC, "%s(): unknown RNTI %04x in PUSCH\n", __func__, crc_pdu->rnti);
     return;
   }
   NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
   NR_UE_sched_ctrl_t *sched_ctrl = &UE_info->UE_sched_ctrl[UE_id];
-
   int8_t harq_pid = sched_ctrl->feedback_ul_harq.head;
   while (crc_pdu->harq_id != harq_pid || harq_pid < 0) {
     LOG_W(NR_MAC,
@@ -586,6 +608,7 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
                const uint16_t timing_advance,
                const uint8_t ul_cqi,
                const uint16_t rssi){
+
   gNB_MAC_INST *gNB_mac = RC.nrmac[gnb_mod_idP];
   NR_UE_info_t *UE_info = &gNB_mac->UE_info;
 
@@ -784,9 +807,19 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
       if (ra->state != WAIT_Msg3)
         continue;
 
-      LOG_W(NR_MAC, "Random Access %i failed at state %i (state is not WAIT_Msg3)\n", i, ra->state);
-      nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
-      nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
+      if( (frameP!=ra->Msg3_frame) || (slotP!=ra->Msg3_slot))
+        continue;
+
+      if (ra->msg3_round >= MAX_HARQ_ROUNDS - 1) {
+        LOG_W(NR_MAC, "Random Access %i failed at state %i (Reached msg3 max harq rounds)\n", i, ra->state);
+        nr_mac_remove_ra_rnti(gnb_mod_idP, ra->rnti);
+        nr_clear_ra_proc(gnb_mod_idP, CC_idP, frameP, ra);
+        return;
+      }
+
+      LOG_W(NR_MAC, "Random Access %i Msg3 CRC did not pass)\n", i);
+      ra->msg3_round++;
+      ra->state = Msg3_retransmission;
     }
   }
 }
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 7af01850ae0d81707677b386851be65f30e1db48..83de1ba49b83a2bfd11ba54c391422196c032683 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -124,6 +124,8 @@ void nr_get_Msg3alloc(module_id_t module_id,
                       NR_RA_t *ra,
                       int16_t *tdd_beam_association);
 
+void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t slotP, NR_RA_t *ra);
+
 /* \brief Function in gNB to fill RAR pdu when requested by PHY.
 @param ra Instance of RA resources of gNB
 @param dlsch_buffer Pointer to RAR input buffer
@@ -134,6 +136,15 @@ void nr_fill_rar(uint8_t Mod_idP,
                  uint8_t * dlsch_buffer,
                  nfapi_nr_pusch_pdu_t  *pusch_pdu);
 
+void fill_msg3_pusch_pdu(nfapi_nr_pusch_pdu_t *pusch_pdu,
+                         NR_ServingCellConfigCommon_t *scc,
+                         int round,
+                         int startSymbolAndLength,
+                         rnti_t rnti, int scs,
+                         int bwp_size, int bwp_start,
+                         int mappingtype, int fh,
+                         int msg3_first_rb, int msg3_nb_rb);
+
 
 void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP);
 
@@ -388,7 +399,8 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
                const uint8_t ul_cqi,
                const uint16_t rssi);
 
-void handle_nr_ul_harq(module_id_t mod_id,
+void handle_nr_ul_harq(const int CC_idP,
+                       module_id_t mod_id,
                        frame_t frame,
                        sub_frame_t slot,
                        const nfapi_nr_crc_t *crc_pdu);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 56b8566f22f90146d24f96fafb94b738411e3a32..5d546a57c91ff1fc286d3645aaf8fcaae0607ff4 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -93,8 +93,9 @@ typedef enum {
   RA_IDLE = 0,
   Msg2 = 1,
   WAIT_Msg3 = 2,
-  Msg4 = 3,
-  WAIT_Msg4_ACK = 4
+  Msg3_retransmission = 3,
+  Msg4 = 4,
+  WAIT_Msg4_ACK = 5
 } RA_gNB_state_t;
 
 typedef struct NR_preamble_ue {
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index e196b56f1cf0a0d608f8e2afa3578c6409839426..2d28343f9be65bc36c55fff70b3aa0e3c7939774 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -208,7 +208,10 @@ tbs_size_t mac_rlc_data_req(
   switch (channel_idP) {
   case 1 ... 3: rb = ue->srb[channel_idP - 1]; break;
   case 4 ... 8: rb = ue->drb[channel_idP - 4]; break;
-  default:      rb = NULL;                     break;
+  default:
+  rb = NULL;
+  LOG_E(RLC, "In %s:%d:%s: data request for unknown RB with LCID 0x%02x !\n", __FILE__, __LINE__, __FUNCTION__, channel_idP);
+  break;
   }
 
   if (rb != NULL) {
@@ -216,10 +219,6 @@ tbs_size_t mac_rlc_data_req(
     maxsize = tb_sizeP;
     ret = rb->generate_pdu(rb, buffer_pP, maxsize);
   } else {
-    // Laurent: the query loop was checking all possible RB, but by  mac_rlc_get_buffer_occupancy_ind
-    // so it is more straitforward to try to get data
-    //LOG_E(RLC, "%s:%d:%s: fatal: data req for unknown RB, channel_idP: %d\n", __FILE__, __LINE__, __FUNCTION__, channel_idP);
-    //exit(1);
     ret = 0;
   }
 
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index fa76fd00bca0e7446f594bf0a0c6818a4a1f9307..cb5bef5ab0ed7e76648d75f16e7646fefecf7ed1 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -48,59 +48,83 @@ extern int oai_nfapi_crc_indication(nfapi_crc_indication_t *crc_ind);
 extern int oai_nfapi_cqi_indication(nfapi_cqi_indication_t *cqi_ind);
 extern int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind);
 extern int oai_nfapi_rx_ind(nfapi_rx_indication_t *ind);
+extern int oai_nfapi_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind);
+extern int oai_nfapi_nr_rx_data_indication(nfapi_nr_rx_data_indication_t *ind);
+extern int oai_nfapi_nr_crc_indication(nfapi_nr_crc_indication_t *ind);
+extern int oai_nfapi_nr_srs_indication(nfapi_nr_srs_indication_t *ind);
+extern int oai_nfapi_nr_uci_indication(nfapi_nr_uci_indication_t *ind);
+extern int oai_nfapi_nr_rach_indication(nfapi_nr_rach_indication_t *ind);
 extern uint8_t nfapi_mode;
 extern uint16_t sf_ahead;
 extern uint16_t sl_ahead;
 
 void handle_nr_rach(NR_UL_IND_t *UL_info) {
-
-  if (UL_info->rach_ind.number_of_pdus>0) {
-    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);
-    int npdus = UL_info->rach_ind.number_of_pdus;
-    for(int i = 0; i < npdus; i++) {
-      UL_info->rach_ind.number_of_pdus--;
-      if (UL_info->rach_ind.pdu_list[i].num_preamble>0)
-      AssertFatal(UL_info->rach_ind.pdu_list[i].num_preamble==1,
-                  "More than 1 preamble not supported\n");
-    
-      nr_initiate_ra_proc(UL_info->module_id,
-                          UL_info->CC_id,
-                          UL_info->rach_ind.sfn,
-                          UL_info->rach_ind.slot,
-                          UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_index,
-                          UL_info->rach_ind.pdu_list[i].freq_index,
-                          UL_info->rach_ind.pdu_list[i].symbol_index,
-                          UL_info->rach_ind.pdu_list[i].preamble_list[0].timing_advance);
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->rach_ind.number_of_pdus>0) {
+      LOG_D(PHY,"UL_info->UL_info->rach_ind.number_of_pdus:%d SFN/Slot:%d.%d \n", UL_info->rach_ind.number_of_pdus, UL_info->rach_ind.sfn,UL_info->rach_ind.slot);
+      oai_nfapi_nr_rach_indication(&UL_info->rach_ind);
+      UL_info->rach_ind.number_of_pdus = 0;
+    }
+  }
+  else{
+    if (UL_info->rach_ind.number_of_pdus>0) {
+      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);
+      int npdus = UL_info->rach_ind.number_of_pdus;
+      for(int i = 0; i < npdus; i++) {
+        UL_info->rach_ind.number_of_pdus--;
+        if (UL_info->rach_ind.pdu_list[i].num_preamble>0)
+        AssertFatal(UL_info->rach_ind.pdu_list[i].num_preamble==1,
+                    "More than 1 preamble not supported\n");
+      
+        nr_initiate_ra_proc(UL_info->module_id,
+                            UL_info->CC_id,
+                            UL_info->rach_ind.sfn,
+                            UL_info->rach_ind.slot,
+                            UL_info->rach_ind.pdu_list[i].preamble_list[0].preamble_index,
+                            UL_info->rach_ind.pdu_list[i].freq_index,
+                            UL_info->rach_ind.pdu_list[i].symbol_index,
+                            UL_info->rach_ind.pdu_list[i].preamble_list[0].timing_advance);
+      }
     }
   }
 }
 
 
 void handle_nr_uci(NR_UL_IND_t *UL_info)
-{
-  const module_id_t mod_id = UL_info->module_id;
-  const frame_t frame = UL_info->frame;
-  const sub_frame_t slot = UL_info->slot;
-  int num_ucis = UL_info->uci_ind.num_ucis;
-  nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
-
-  for (int i = 0; i < num_ucis; i++) {
-    switch (uci_list[i].pdu_type) {
-      case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
-        LOG_E(MAC, "%s(): unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE\n", __func__);
-        break;
+{ 
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->uci_ind.num_ucis>0) {
+      LOG_D(PHY,"PNF Sending UL_info->num_ucis:%d PDU_type: %d, SFN/SF:%d.%d \n", UL_info->uci_ind.num_ucis, UL_info->uci_ind.uci_list[0].pdu_type ,UL_info->frame, UL_info->slot);
+      oai_nfapi_nr_uci_indication(&UL_info->uci_ind);
+      UL_info->uci_ind.num_ucis = 0;
+    }
+  }
+  else{
+    const module_id_t mod_id = UL_info->module_id;
+    const frame_t frame = UL_info->frame;
+    const sub_frame_t slot = UL_info->slot;
+    int num_ucis = UL_info->uci_ind.num_ucis;
+    nfapi_nr_uci_t *uci_list = UL_info->uci_ind.uci_list;
+    LOG_D(MAC,"handling UCI SFN/slot: %d.%d, num_ucis: %d \n", frame,slot, num_ucis);
+    for (int i = 0; i < num_ucis; i++) {
+      switch (uci_list[i].pdu_type) {
+        case NFAPI_NR_UCI_PUSCH_PDU_TYPE:
+          LOG_E(MAC, "%s(): unhandled NFAPI_NR_UCI_PUSCH_PDU_TYPE\n", __func__);
+          break;
 
-      case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
-        const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
-        handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
-        break;
-      }
+        case NFAPI_NR_UCI_FORMAT_0_1_PDU_TYPE: {
+          const nfapi_nr_uci_pucch_pdu_format_0_1_t *uci_pdu = &uci_list[i].pucch_pdu_format_0_1;
+          handle_nr_uci_pucch_0_1(mod_id, frame, slot, uci_pdu);
+          break;
+        }
 
-      case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
-        const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
-        handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
-        break;
+        case NFAPI_NR_UCI_FORMAT_2_3_4_PDU_TYPE: {
+          const nfapi_nr_uci_pucch_pdu_format_2_3_4_t *uci_pdu = &uci_list[i].pucch_pdu_format_2_3_4;
+          handle_nr_uci_pucch_2_3_4(mod_id, frame, slot, uci_pdu);
+          break;
+        }
       }
+      LOG_D(MAC, "UCI handled \n");
     }
   }
 
@@ -109,60 +133,75 @@ void handle_nr_uci(NR_UL_IND_t *UL_info)
 
 void handle_nr_ulsch(NR_UL_IND_t *UL_info)
 {
-  if (UL_info->rx_ind.number_of_pdus > 0 && UL_info->crc_ind.number_crcs > 0) {
-    for (int i = 0; i < UL_info->rx_ind.number_of_pdus; i++) {
-      for (int j = 0; j < UL_info->crc_ind.number_crcs; j++) {
-        // find crc_indication j corresponding rx_indication i
-        const nfapi_nr_rx_data_pdu_t *rx = &UL_info->rx_ind.pdu_list[i];
-        const nfapi_nr_crc_t *crc = &UL_info->crc_ind.crc_list[j];
-        LOG_D(PHY,
-              "UL_info->crc_ind.pdu_list[%d].rnti:%04x "
-              "UL_info->rx_ind.pdu_list[%d].rnti:%04x\n",
-              j,
-              crc->rnti,
-              i,
-              rx->rnti);
+  if(NFAPI_MODE == NFAPI_MODE_PNF) {
+    if (UL_info->crc_ind.number_crcs>0) {
+      LOG_D(PHY,"UL_info->UL_info->crc_ind.number_crcs:%d CRC_IND:SFN/Slot:%d.%d\n", UL_info->crc_ind.number_crcs, UL_info->crc_ind.sfn, UL_info->crc_ind.slot);
+      oai_nfapi_nr_crc_indication(&UL_info->crc_ind);
+      UL_info->crc_ind.number_crcs = 0;
+    }
 
-        if (crc->rnti != rx->rnti)
-          continue;
+    if (UL_info->rx_ind.number_of_pdus>0) {
+      LOG_D(PHY,"UL_info->rx_ind.number_of_pdus:%d RX_IND:SFN/Slot:%d.%d \n", UL_info->rx_ind.number_of_pdus, UL_info->rx_ind.sfn, UL_info->rx_ind.slot);
+      oai_nfapi_nr_rx_data_indication(&UL_info->rx_ind);
+      UL_info->rx_ind.number_of_pdus = 0;
+    }
+  }
+  else{
+    if (UL_info->rx_ind.number_of_pdus > 0 && UL_info->crc_ind.number_crcs > 0) {
+      for (int i = 0; i < UL_info->rx_ind.number_of_pdus; i++) {
+        for (int j = 0; j < UL_info->crc_ind.number_crcs; j++) {
+          // find crc_indication j corresponding rx_indication i
+          const nfapi_nr_rx_data_pdu_t *rx = &UL_info->rx_ind.pdu_list[i];
+          const nfapi_nr_crc_t *crc = &UL_info->crc_ind.crc_list[j];
+          LOG_D(PHY,
+                "UL_info->crc_ind.pdu_list[%d].rnti:%04x "
+                "UL_info->rx_ind.pdu_list[%d].rnti:%04x\n",
+                j,
+                crc->rnti,
+                i,
+                rx->rnti);
+
+          if (crc->rnti != rx->rnti)
+            continue;
 
-        LOG_D(MAC,
-              "%4d.%2d Calling rx_sdu (CRC %s/tb_crc_status %d)\n",
-              UL_info->frame,
-              UL_info->slot,
-              crc->tb_crc_status ? "error" : "ok",
-              crc->tb_crc_status);
+          LOG_D(MAC,
+                "%4d.%2d Calling rx_sdu (CRC %s/tb_crc_status %d)\n",
+                UL_info->frame,
+                UL_info->slot,
+                crc->tb_crc_status ? "error" : "ok",
+                crc->tb_crc_status);
 
-        /* if CRC passes, pass PDU, otherwise pass NULL as error indication */
-        nr_rx_sdu(UL_info->module_id,
-                  UL_info->CC_id,
-                  UL_info->rx_ind.sfn,
-                  UL_info->rx_ind.slot,
-                  rx->rnti,
-                  crc->tb_crc_status ? NULL : rx->pdu,
-                  rx->pdu_length,
-                  rx->timing_advance,
-                  rx->ul_cqi,
-                  rx->rssi);
-        handle_nr_ul_harq(UL_info->module_id, UL_info->frame, UL_info->slot, crc);
-        break;
-      } //    for (j=0;j<UL_info->crc_ind.number_crcs;j++)
-    } //   for (i=0;i<UL_info->rx_ind.number_of_pdus;i++)
+          /* if CRC passes, pass PDU, otherwise pass NULL as error indication */
+          nr_rx_sdu(UL_info->module_id,
+                    UL_info->CC_id,
+                    UL_info->rx_ind.sfn,
+                    UL_info->rx_ind.slot,
+                    rx->rnti,
+                    crc->tb_crc_status ? NULL : rx->pdu,
+                    rx->pdu_length,
+                    rx->timing_advance,
+                    rx->ul_cqi,
+                    rx->rssi);
+          handle_nr_ul_harq(UL_info->CC_id, UL_info->module_id, UL_info->frame, UL_info->slot, crc);
+          break;
+        } //    for (j=0;j<UL_info->crc_ind.number_crcs;j++)
+      } //   for (i=0;i<UL_info->rx_ind.number_of_pdus;i++)
 
-    UL_info->crc_ind.number_crcs = 0;
-    UL_info->rx_ind.number_of_pdus = 0;
-  } else if (UL_info->rx_ind.number_of_pdus != 0
-             || UL_info->crc_ind.number_crcs != 0) {
-    LOG_E(PHY,
-          "hoping not to have mis-match between CRC ind and RX ind - "
-          "hopefully the missing message is coming shortly "
-          "rx_ind:%d(SFN/SL:%d/%d) crc_ind:%d(SFN/SL:%d/%d) \n",
-          UL_info->rx_ind.number_of_pdus,
-          UL_info->rx_ind.sfn,
-          UL_info->rx_ind.slot,
-          UL_info->crc_ind.number_crcs,
-          UL_info->rx_ind.sfn,
-          UL_info->rx_ind.slot);
+      UL_info->crc_ind.number_crcs = 0;
+      UL_info->rx_ind.number_of_pdus = 0;
+    } else if (UL_info->rx_ind.number_of_pdus != 0
+              || UL_info->crc_ind.number_crcs != 0) {
+      LOG_E(PHY,
+            "hoping not to have mis-match between CRC ind and RX ind - "
+            "hopefully the missing message is coming shortly "
+            "rx_ind:%d(SFN/SL:%d/%d) crc_ind:%d(SFN/SL:%d/%d) \n",
+            UL_info->rx_ind.number_of_pdus,
+            UL_info->rx_ind.sfn,
+            UL_info->rx_ind.slot,
+            UL_info->crc_ind.number_crcs,
+            UL_info->rx_ind.sfn,
+            UL_info->rx_ind.slot);
+    }
   }
 }
 
@@ -181,7 +220,15 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
         module_id,CC_id, UL_info->rach_ind.number_of_pdus,
         UL_info->rx_ind.number_of_pdus, UL_info->crc_ind.number_crcs);
 
+  handle_nr_rach(UL_info);
+  
+  handle_nr_uci(UL_info);
+  // clear UL DCI prior to handling ULSCH
+  mac->UL_dci_req[CC_id].numPdus = 0;
+  handle_nr_ulsch(UL_info);
+
   if (NFAPI_MODE != NFAPI_MODE_PNF) {
+
     if (ifi->CC_mask==0) {
       ifi->current_frame    = UL_info->frame;
       ifi->current_slot = UL_info->slot;
@@ -191,16 +238,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
     }
 
     ifi->CC_mask |= (1<<CC_id);
-  }
 
-  handle_nr_rach(UL_info);
-  
-  handle_nr_uci(UL_info);
-  // clear HI prior to handling ULSCH
-  mac->UL_dci_req[CC_id].numPdus = 0;
-  handle_nr_ulsch(UL_info);
-
-  if (NFAPI_MODE != NFAPI_MODE_PNF) {
     if (ifi->CC_mask == ((1<<MAX_NUM_CCs)-1)) {
       /*
       eNB_dlsch_ulsch_scheduler(module_id,
diff --git a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl
index 81193afd1daf62fec0761ec6a83c092604acbc8c..bdcdef59391744827a23b0d9d106be0489e312c6 100755
--- a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl
+++ b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/extract_asn1_from_spce.pl
@@ -26,38 +26,52 @@ while (<INPUT_FILE>) {
 
     syswrite OUTPUT_FILE,"END\n\n";
 
-	while(<INPUT_FILE>) {
-  	  if( m/NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=/){
-         
-          syswrite OUTPUT_FILE,"$_ \n";
-          syswrite OUTPUT_FILE,"BEGIN\n\n";
+	  while(<INPUT_FILE>) {
+      if( m/PC5-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=/){
+        syswrite OUTPUT_FILE,"$_ \n";
+        syswrite OUTPUT_FILE,"BEGIN\n\n";
 
-          # Get all the text delimited by -- ASN1START and -- ASN1STOP
-          extract_asn1();
+        # Get all the text delimited by -- ASN1START and -- ASN1STOP
+        extract_asn1();
 
-          syswrite OUTPUT_FILE,"END\n\n";
+        syswrite OUTPUT_FILE,"END\n\n";
           
-          	while(<INPUT_FILE>) {
+        while(<INPUT_FILE>) {
+          if( m/NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=/){
+            syswrite OUTPUT_FILE,"$_ \n";
+            syswrite OUTPUT_FILE,"BEGIN\n\n";
+
+            # Get all the text delimited by -- ASN1START and -- ASN1STOP
+            extract_asn1();
+            syswrite OUTPUT_FILE,"END\n\n";
+            while(<INPUT_FILE>) {
+              if( m/NR-Sidelink-Preconf DEFINITIONS AUTOMATIC TAGS ::=/){
+                syswrite OUTPUT_FILE,"$_ \n";
+                syswrite OUTPUT_FILE,"BEGIN\n\n";
+
+                # Get all the text delimited by -- ASN1START and -- ASN1STOP
+                extract_asn1();
+
+                syswrite OUTPUT_FILE,"END\n\n";
+                while(<INPUT_FILE>) {
                   if( m/NR-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::=/){
-		  
-          	  syswrite OUTPUT_FILE,"$_ \n";
-          	  syswrite OUTPUT_FILE,"BEGIN\n\n";
+                    syswrite OUTPUT_FILE,"$_ \n";
+                    syswrite OUTPUT_FILE,"BEGIN\n\n";
 
-          	  # Get all the text delimited by -- ASN1START and -- ASN1STOP
-          	  extract_asn1();
+                    # Get all the text delimited by -- ASN1START and -- ASN1STOP
+                    extract_asn1();
 
-          	  syswrite OUTPUT_FILE,"END\n\n";
-
-		  }
+                    syswrite OUTPUT_FILE,"END\n\n";
+                  }
                 }
-
-	  }	
-	}	  
-
+              }
+            }
+          }
+        }
+	    }
+    }
     close(OUTPUT_FILE);
   }
-
-
 }
 
 close(INPUT_FILE);
diff --git a/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1 b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1
new file mode 100644
index 0000000000000000000000000000000000000000..80112fa2ff689f9b6b3d878bfe3575a99881199d
--- /dev/null
+++ b/openair2/RRC/NR/MESSAGES/asn1c/ASN1_files/nr-rrc-16.4.1.asn1
@@ -0,0 +1,14304 @@
+NR-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+-- TAG-BCCH-BCH-MESSAGE-START
+
+BCCH-BCH-Message ::=            SEQUENCE {
+    message                         BCCH-BCH-MessageType
+}
+
+BCCH-BCH-MessageType ::=        CHOICE {
+    mib                             MIB,
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-BCCH-BCH-MESSAGE-STOP
+-- TAG-BCCH-DL-SCH-MESSAGE-START
+
+BCCH-DL-SCH-Message ::=         SEQUENCE {
+    message                         BCCH-DL-SCH-MessageType
+}
+
+BCCH-DL-SCH-MessageType ::=     CHOICE {
+    c1                              CHOICE {
+        systemInformation               SystemInformation,
+        systemInformationBlockType1     SIB1
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-BCCH-DL-SCH-MESSAGE-STOP
+-- TAG-DL-CCCH-MESSAGE-START
+
+DL-CCCH-Message ::=             SEQUENCE {
+    message                         DL-CCCH-MessageType
+}
+
+DL-CCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        rrcReject                       RRCReject,
+        rrcSetup                        RRCSetup,
+        spare2                          NULL,
+        spare1                          NULL
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-DL-CCCH-MESSAGE-STOP
+-- TAG-DL-DCCH-MESSAGE-START
+
+DL-DCCH-Message ::=                  SEQUENCE {
+    message                             DL-DCCH-MessageType
+}
+
+DL-DCCH-MessageType ::=             CHOICE {
+    c1                                  CHOICE {
+        rrcReconfiguration                  RRCReconfiguration,
+        rrcResume                           RRCResume,
+        rrcRelease                          RRCRelease,
+        rrcReestablishment                  RRCReestablishment,
+        securityModeCommand                 SecurityModeCommand,
+        dlInformationTransfer               DLInformationTransfer,
+        ueCapabilityEnquiry                 UECapabilityEnquiry,
+        counterCheck                        CounterCheck,
+        mobilityFromNRCommand               MobilityFromNRCommand,
+        dlDedicatedMessageSegment-r16       DLDedicatedMessageSegment-r16,
+        ueInformationRequest-r16            UEInformationRequest-r16,
+        dlInformationTransferMRDC-r16       DLInformationTransferMRDC-r16,
+        loggedMeasurementConfiguration-r16  LoggedMeasurementConfiguration-r16,
+                spare3 NULL, spare2 NULL, spare1 NULL
+    },
+    messageClassExtension   SEQUENCE {}
+}
+
+-- TAG-DL-DCCH-MESSAGE-STOP
+-- TAG-PCCH-PCH-MESSAGE-START
+
+PCCH-Message ::=                SEQUENCE {
+    message                         PCCH-MessageType
+}
+
+PCCH-MessageType ::=            CHOICE {
+    c1                              CHOICE {
+        paging                          Paging,
+        spare1  NULL
+    },
+    messageClassExtension       SEQUENCE {}
+}
+
+-- TAG-PCCH-PCH-MESSAGE-STOP
+-- TAG-UL-CCCH-MESSAGE-START
+
+
+UL-CCCH-Message ::=             SEQUENCE {
+    message                         UL-CCCH-MessageType
+}
+
+UL-CCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        rrcSetupRequest                 RRCSetupRequest,
+        rrcResumeRequest                RRCResumeRequest,
+        rrcReestablishmentRequest       RRCReestablishmentRequest,
+        rrcSystemInfoRequest            RRCSystemInfoRequest
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-UL-CCCH-MESSAGE-STOP
+-- TAG-UL-CCCH1-MESSAGE-START
+
+
+UL-CCCH1-Message ::=            SEQUENCE {
+    message                         UL-CCCH1-MessageType
+}
+
+UL-CCCH1-MessageType ::=        CHOICE {
+    c1                              CHOICE {
+        rrcResumeRequest1               RRCResumeRequest1,
+        spare3 NULL,
+        spare2 NULL,
+        spare1 NULL
+
+    },
+    messageClassExtension SEQUENCE {}
+}
+
+-- TAG-UL-CCCH1-MESSAGE-STOP
+-- TAG-UL-DCCH-MESSAGE-START
+
+UL-DCCH-Message ::=             SEQUENCE {
+    message                         UL-DCCH-MessageType
+}
+
+UL-DCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        measurementReport               MeasurementReport,
+        rrcReconfigurationComplete      RRCReconfigurationComplete,
+        rrcSetupComplete                RRCSetupComplete,
+        rrcReestablishmentComplete      RRCReestablishmentComplete,
+        rrcResumeComplete               RRCResumeComplete,
+        securityModeComplete            SecurityModeComplete,
+        securityModeFailure             SecurityModeFailure,
+        ulInformationTransfer           ULInformationTransfer,
+        locationMeasurementIndication   LocationMeasurementIndication,
+        ueCapabilityInformation         UECapabilityInformation,
+        counterCheckResponse            CounterCheckResponse,
+        ueAssistanceInformation         UEAssistanceInformation,
+        failureInformation              FailureInformation,
+        ulInformationTransferMRDC       ULInformationTransferMRDC,
+        scgFailureInformation           SCGFailureInformation,
+        scgFailureInformationEUTRA      SCGFailureInformationEUTRA
+    },
+    messageClassExtension           CHOICE {
+        c2                              CHOICE {
+            ulDedicatedMessageSegment-r16    ULDedicatedMessageSegment-r16,
+            dedicatedSIBRequest-r16         DedicatedSIBRequest-r16,
+            mcgFailureInformation-r16       MCGFailureInformation-r16,
+            ueInformationResponse-r16       UEInformationResponse-r16,
+            sidelinkUEInformationNR-r16     SidelinkUEInformationNR-r16,
+            ulInformationTransferIRAT-r16   ULInformationTransferIRAT-r16,
+            iabOtherInformation-r16         IABOtherInformation-r16,
+            spare9 NULL, spare8 NULL, spare7 NULL, spare6 NULL,
+            spare5 NULL, spare4 NULL, spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        messageClassExtensionFuture-r16    SEQUENCE {}
+    }
+}
+
+-- TAG-UL-DCCH-MESSAGE-STOP
+-- TAG-COUNTERCHECK-START
+
+
+CounterCheck ::=                SEQUENCE {
+    rrc-TransactionIdentifier       RRC-TransactionIdentifier,
+    criticalExtensions              CHOICE {
+        counterCheck                    CounterCheck-IEs,
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+CounterCheck-IEs ::=            SEQUENCE {
+    drb-CountMSB-InfoList           DRB-CountMSB-InfoList,
+    lateNonCriticalExtension        OCTET STRING                        OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                         OPTIONAL
+}
+
+DRB-CountMSB-InfoList ::=       SEQUENCE (SIZE (1..maxDRB)) OF DRB-CountMSB-Info
+
+DRB-CountMSB-Info ::=           SEQUENCE {
+    drb-Identity                    DRB-Identity,
+    countMSB-Uplink                 INTEGER(0..33554431),
+    countMSB-Downlink               INTEGER(0..33554431)
+}
+
+-- TAG-COUNTERCHECK-STOP
+-- TAG-COUNTERCHECKRESPONSE-START
+
+CounterCheckResponse ::=        SEQUENCE {
+    rrc-TransactionIdentifier       RRC-TransactionIdentifier,
+    criticalExtensions              CHOICE {
+        counterCheckResponse            CounterCheckResponse-IEs,
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+CounterCheckResponse-IEs ::=    SEQUENCE {
+    drb-CountInfoList               DRB-CountInfoList,
+    lateNonCriticalExtension        OCTET STRING                        OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                         OPTIONAL
+
+}
+
+DRB-CountInfoList ::=           SEQUENCE (SIZE (0..maxDRB)) OF DRB-CountInfo
+
+DRB-CountInfo ::=               SEQUENCE {
+    drb-Identity                    DRB-Identity,
+    count-Uplink                    INTEGER(0..4294967295),
+    count-Downlink                  INTEGER(0..4294967295)
+}
+
+-- TAG-COUNTERCHECKRESPONSE-STOP
+-- TAG-DEDICATEDSIBREQUEST-START
+
+DedicatedSIBRequest-r16 ::=      SEQUENCE {
+    criticalExtensions               CHOICE {
+        dedicatedSIBRequest-r16          DedicatedSIBRequest-r16-IEs,
+        criticalExtensionsFuture         SEQUENCE {}
+    }
+}
+
+DedicatedSIBRequest-r16-IEs ::=  SEQUENCE {
+    onDemandSIB-RequestList-r16       SEQUENCE {
+
+        requestedSIB-List-r16            SEQUENCE (SIZE (1..maxOnDemandSIB-r16)) OF SIB-ReqInfo-r16                OPTIONAL,
+        requestedPosSIB-List-r16         SEQUENCE (SIZE (1..maxOnDemandPosSIB-r16)) OF PosSIB-ReqInfo-r16          OPTIONAL
+    } OPTIONAL,
+    lateNonCriticalExtension         OCTET STRING             OPTIONAL,
+    nonCriticalExtension             SEQUENCE {}              OPTIONAL
+}
+
+SIB-ReqInfo-r16 ::=                   ENUMERATED { sib12, sib13, sib14, spare5, spare4, spare3, spare2, spare1 }
+
+PosSIB-ReqInfo-r16 ::=       SEQUENCE {
+    gnss-id-r16                  GNSS-ID-r16                  OPTIONAL,
+    sbas-id-r16                  SBAS-ID-r16                  OPTIONAL,
+    posSibType-r16               ENUMERATED { posSibType1-1, posSibType1-2, posSibType1-3, posSibType1-4, posSibType1-5, posSibType1-6,
+                                              posSibType1-7, posSibType1-8, posSibType2-1, posSibType2-2, posSibType2-3, posSibType2-4,
+                                              posSibType2-5, posSibType2-6, posSibType2-7, posSibType2-8, posSibType2-9, posSibType2-10,
+                                              posSibType2-11, posSibType2-12, posSibType2-13, posSibType2-14, posSibType2-15,
+                                              posSibType2-16, posSibType2-17, posSibType2-18, posSibType2-19, posSibType2-20,
+                                              posSibType2-21, posSibType2-22, posSibType2-23, posSibType3-1, posSibType4-1,
+                                              posSibType5-1, posSibType6-1, posSibType6-2, posSibType6-3,... }
+}
+
+-- TAG-DEDICATEDSIBREQUEST-STOP
+-- TAG-DLDEDICATEDMESSAGESEGMENT-START
+
+
+DLDedicatedMessageSegment-r16 ::=       SEQUENCE {
+    criticalExtensions                      CHOICE {
+        dlDedicatedMessageSegment-r16           DLDedicatedMessageSegment-r16-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+DLDedicatedMessageSegment-r16-IEs ::=   SEQUENCE {
+    segmentNumber-r16                       INTEGER(0..4),
+    rrc-MessageSegmentContainer-r16         OCTET STRING,
+    rrc-MessageSegmentType-r16              ENUMERATED {notLastSegment, lastSegment},
+    lateNonCriticalExtension                OCTET STRING                                  OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                   OPTIONAL
+}
+
+-- TAG-DLDEDICATEDMESSAGESEGMENT-STOP
+-- TAG-DLINFORMATIONTRANSFER-START
+
+DLInformationTransfer ::=           SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        dlInformationTransfer           DLInformationTransfer-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+DLInformationTransfer-IEs ::=       SEQUENCE {
+    dedicatedNAS-Message                DedicatedNAS-Message                OPTIONAL,   -- Need N
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                DLInformationTransfer-v1610-IEs     OPTIONAL
+}
+
+DLInformationTransfer-v1610-IEs ::= SEQUENCE {
+    referenceTimeInfo-r16               ReferenceTimeInfo-r16               OPTIONAL,   -- Need R
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-DLINFORMATIONTRANSFER-STOP
+-- TAG-DLINFORMATIONTRANSFERMRDC-START
+
+DLInformationTransferMRDC-r16 ::=       SEQUENCE {
+    criticalExtensions                      CHOICE {
+        c1                                      CHOICE {
+            dlInformationTransferMRDC-r16           DLInformationTransferMRDC-r16-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+DLInformationTransferMRDC-r16-IEs::=    SEQUENCE {
+    dl-DCCH-MessageNR-r16                   OCTET STRING             OPTIONAL, -- Need N
+    dl-DCCH-MessageEUTRA-r16                OCTET STRING             OPTIONAL, -- Need N
+    lateNonCriticalExtension                OCTET STRING             OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}              OPTIONAL
+}
+
+-- TAG-DLINFORMATIONTRANSFERMRDC-STOP
+-- TAG-FAILUREINFORMATION-START
+
+FailureInformation ::=         SEQUENCE {
+    criticalExtensions             CHOICE {
+        failureInformation             FailureInformation-IEs,
+        criticalExtensionsFuture       SEQUENCE {}
+    }
+}
+
+FailureInformation-IEs ::=     SEQUENCE {
+    failureInfoRLC-Bearer          FailureInfoRLC-Bearer        OPTIONAL,
+    lateNonCriticalExtension       OCTET STRING                 OPTIONAL,
+    nonCriticalExtension           FailureInformation-v1610-IEs OPTIONAL
+}
+
+FailureInfoRLC-Bearer ::=      SEQUENCE {
+    cellGroupId                    CellGroupId,
+    logicalChannelIdentity         LogicalChannelIdentity,
+    failureType                    ENUMERATED {rlc-failure, spare3, spare2, spare1}
+}
+
+FailureInformation-v1610-IEs ::= SEQUENCE {
+    failureInfoDAPS-r16              FailureInfoDAPS-r16        OPTIONAL,
+    nonCriticalExtension             SEQUENCE {}                OPTIONAL
+}
+
+FailureInfoDAPS-r16 ::=          SEQUENCE {
+    failureType-r16                  ENUMERATED {daps-failure, spare3, spare2, spare1}
+}
+
+-- TAG-FAILUREINFORMATION-STOP
+-- TAG-IABOTHERINFORMATION-START
+
+IABOtherInformation-r16 ::=     SEQUENCE {
+    rrc-TransactionIdentifier       RRC-TransactionIdentifier,
+    criticalExtensions              CHOICE {
+        iabOtherInformation-r16         IABOtherInformation-r16-IEs,
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+IABOtherInformation-r16-IEs ::=         SEQUENCE {
+    ip-InfoType-r16                         CHOICE {
+        iab-IP-Request-r16                      SEQUENCE {
+            iab-IPv4-AddressNumReq-r16              IAB-IP-AddressNumReq-r16                OPTIONAL,
+            iab-IPv6-AddressReq-r16                 CHOICE {
+                iab-IPv6-AddressNumReq-r16              IAB-IP-AddressNumReq-r16,
+                iab-IPv6-AddressPrefixReq-r16           IAB-IP-AddressPrefixReq-r16,
+                ...
+            }                                                                               OPTIONAL
+        },
+        iab-IP-Report-r16               SEQUENCE {
+            iab-IPv4-AddressReport-r16      IAB-IP-AddressAndTraffic-r16                    OPTIONAL,
+            iab-IPv6-Report-r16             CHOICE {
+                iab-IPv6-AddressReport-r16      IAB-IP-AddressAndTraffic-r16,
+                iab-IPv6-PrefixReport-r16       IAB-IP-PrefixAndTraffic-r16,
+                ...
+            }                                                                               OPTIONAL
+        },
+        ...
+    },
+    lateNonCriticalExtension        OCTET STRING                                            OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                                             OPTIONAL
+}
+
+IAB-IP-AddressNumReq-r16 ::=    SEQUENCE {
+    all-Traffic-NumReq-r16          INTEGER (1..8)                                  OPTIONAL,
+    f1-C-Traffic-NumReq-r16         INTEGER (1..8)                                  OPTIONAL,
+    f1-U-Traffic-NumReq-r16         INTEGER (1..8)                                  OPTIONAL,
+    non-F1-Traffic-NumReq-r16       INTEGER (1..8)                                  OPTIONAL,
+    ...
+}
+
+IAB-IP-AddressPrefixReq-r16 ::= SEQUENCE {
+    all-Traffic-PrefixReq-r16       ENUMERATED {true}                               OPTIONAL,
+    f1-C-Traffic-PrefixReq-r16      ENUMERATED {true}                               OPTIONAL,
+    f1-U-Traffic-PrefixReq-r16      ENUMERATED {true}                               OPTIONAL,
+    non-F1-Traffic-PrefixReq-r16    ENUMERATED {true}                               OPTIONAL,
+    ...
+}
+
+IAB-IP-AddressAndTraffic-r16 ::= SEQUENCE {
+    all-Traffic-IAB-IP-Address-r16  SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL,
+    f1-C-Traffic-IP-Address-r16     SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL,
+    f1-U-Traffic-IP-Address-r16     SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL,
+    non-F1-Traffic-IP-Address-r16   SEQUENCE (SIZE(1..8)) OF IAB-IP-Address-r16     OPTIONAL
+}
+
+IAB-IP-PrefixAndTraffic-r16 ::= SEQUENCE {
+    all-Traffic-IAB-IP-Address-r16  IAB-IP-Address-r16                              OPTIONAL,
+    f1-C-Traffic-IP-Address-r16     IAB-IP-Address-r16                              OPTIONAL,
+    f1-U-Traffic-IP-Address-r16     IAB-IP-Address-r16                              OPTIONAL,
+    non-F1-Traffic-IP-Address-r16   IAB-IP-Address-r16                              OPTIONAL
+}
+
+-- TAG-IABOTHERINFORMATION-STOP
+-- TAG-LOCATIONMEASUREMENTINDICATION-START
+
+LocationMeasurementIndication ::=           SEQUENCE {
+    criticalExtensions                          CHOICE {
+        locationMeasurementIndication               LocationMeasurementIndication-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+LocationMeasurementIndication-IEs ::=       SEQUENCE {
+    measurementIndication                       SetupRelease {LocationMeasurementInfo},
+    lateNonCriticalExtension                    OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                        SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-LOCATIONMEASUREMENTINDICATION-STOP
+-- TAG-LOGGEDMEASUREMENTCONFIGURATION-START
+
+LoggedMeasurementConfiguration-r16 ::=  SEQUENCE {
+    criticalExtensions                      CHOICE {
+        loggedMeasurementConfiguration-r16      LoggedMeasurementConfiguration-r16-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+LoggedMeasurementConfiguration-r16-IEs ::=  SEQUENCE {
+    traceReference-r16                          TraceReference-r16,
+    traceRecordingSessionRef-r16                OCTET STRING (SIZE (2)),
+    tce-Id-r16                                  OCTET STRING (SIZE (1)),
+    absoluteTimeInfo-r16                        AbsoluteTimeInfo-r16,
+    areaConfiguration-r16                       AreaConfiguration-r16                    OPTIONAL,  --Need R
+    plmn-IdentityList-r16                       PLMN-IdentityList2-r16                   OPTIONAL,  --Need R
+    bt-NameList-r16                             SetupRelease {BT-NameList-r16}           OPTIONAL,  --Need M
+    wlan-NameList-r16                           SetupRelease {WLAN-NameList-r16}         OPTIONAL,  --Need M
+    sensor-NameList-r16                         SetupRelease {Sensor-NameList-r16}       OPTIONAL,  --Need M
+    loggingDuration-r16                         LoggingDuration-r16,
+    reportType                                  CHOICE {
+        periodical                                  LoggedPeriodicalReportConfig-r16,
+        eventTriggered                              LoggedEventTriggerConfig-r16,
+        ...
+    },
+    lateNonCriticalExtension                    OCTET STRING                             OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                              OPTIONAL
+}
+
+LoggedPeriodicalReportConfig-r16 ::=            SEQUENCE {
+    loggingInterval-r16                             LoggingInterval-r16,
+    ...
+ }
+
+LoggedEventTriggerConfig-r16 ::=                SEQUENCE {
+    eventType-r16                                   EventType-r16,
+    loggingInterval-r16                             LoggingInterval-r16,
+    ...
+}
+
+EventType-r16 ::= CHOICE {
+    outOfCoverage     NULL,
+    eventL1           SEQUENCE {
+        l1-Threshold      MeasTriggerQuantity,
+        hysteresis        Hysteresis,
+        timeToTrigger     TimeToTrigger
+    },
+    ...
+}
+
+-- TAG-LOGGEDMEASUREMENTCONFIGURATION-STOP
+-- TAG-MCGFAILUREINFORMATION-START
+
+MCGFailureInformation-r16 ::=    SEQUENCE {
+    criticalExtensions               CHOICE {
+        mcgFailureInformation-r16        MCGFailureInformation-r16-IEs,
+        criticalExtensionsFuture         SEQUENCE {}
+    }
+}
+
+MCGFailureInformation-r16-IEs ::= SEQUENCE {
+    failureReportMCG-r16              FailureReportMCG-r16                             OPTIONAL,
+    lateNonCriticalExtension          OCTET STRING                                     OPTIONAL,
+    nonCriticalExtension              SEQUENCE {}                                      OPTIONAL
+}
+
+FailureReportMCG-r16 ::=          SEQUENCE {
+    failureType-r16                   ENUMERATED {t310-Expiry, randomAccessProblem, rlc-MaxNumRetx,
+                                                         t312-Expiry-r16, lbt-Failure-r16, beamFailureRecoveryFailure-r16,
+                                         bh-RLF-r16, spare1}                                                                            OPTIONAL,
+    measResultFreqList-r16            MeasResultList2NR                                                                     OPTIONAL,
+    measResultFreqListEUTRA-r16       MeasResultList2EUTRA                                                                  OPTIONAL,
+    measResultSCG-r16                 OCTET STRING (CONTAINING MeasResultSCG-Failure)                                       OPTIONAL,
+    measResultSCG-EUTRA-r16           OCTET STRING                                                                          OPTIONAL,
+    measResultFreqListUTRA-FDD-r16    MeasResultList2UTRA                                                                   OPTIONAL,
+    ...
+}
+
+MeasResultList2UTRA ::=    SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2UTRA-FDD-r16
+
+MeasResult2UTRA-FDD-r16 ::=       SEQUENCE {
+    carrierFreq-r16                   ARFCN-ValueUTRA-FDD-r16,
+    measResultNeighCellList-r16       MeasResultListUTRA-FDD-r16
+}
+
+MeasResultList2EUTRA ::=          SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2EUTRA-r16
+
+-- TAG-MCGFAILUREINFORMATION-STOP
+-- TAG-MEASUREMENTREPORT-START
+
+MeasurementReport ::=               SEQUENCE {
+    criticalExtensions                  CHOICE {
+        measurementReport                   MeasurementReport-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+MeasurementReport-IEs ::=           SEQUENCE {
+    measResults                         MeasResults,
+
+    lateNonCriticalExtension                OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                    SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-MEASUREMENTREPORT-STOP
+-- TAG-MIB-START
+
+MIB ::=                             SEQUENCE {
+    systemFrameNumber                   BIT STRING (SIZE (6)),
+    subCarrierSpacingCommon             ENUMERATED {scs15or60, scs30or120},
+    ssb-SubcarrierOffset                INTEGER (0..15),
+    dmrs-TypeA-Position                 ENUMERATED {pos2, pos3},
+    pdcch-ConfigSIB1                    PDCCH-ConfigSIB1,
+    cellBarred                          ENUMERATED {barred, notBarred},
+    intraFreqReselection                ENUMERATED {allowed, notAllowed},
+    spare                               BIT STRING (SIZE (1))
+}
+
+-- TAG-MIB-STOP
+-- TAG-MOBILITYFROMNRCOMMAND-START
+
+MobilityFromNRCommand ::=           SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+            mobilityFromNRCommand           MobilityFromNRCommand-IEs,
+            criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+MobilityFromNRCommand-IEs ::=       SEQUENCE {
+    targetRAT-Type                      ENUMERATED { eutra, utra-fdd-v1610, spare2, spare1, ...},
+    targetRAT-MessageContainer          OCTET STRING,
+    nas-SecurityParamFromNR             OCTET STRING                                                OPTIONAL,   -- Cond HO-ToEPCUTRAN
+    lateNonCriticalExtension            OCTET STRING                                                OPTIONAL,
+    nonCriticalExtension                MobilityFromNRCommand-v1610-IEs                             OPTIONAL
+}
+
+MobilityFromNRCommand-v1610-IEs ::=     SEQUENCE {
+    voiceFallbackIndication-r16             ENUMERATED {true}                                       OPTIONAL,   -- Need N
+    nonCriticalExtension                    SEQUENCE {}                                             OPTIONAL
+}
+
+-- TAG-MOBILITYFROMNRCOMMAND-STOP
+-- TAG-PAGING-START
+
+Paging ::=                          SEQUENCE {
+    pagingRecordList                    PagingRecordList                                                        OPTIONAL, -- Need N
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+PagingRecordList ::=                SEQUENCE (SIZE(1..maxNrofPageRec)) OF PagingRecord
+
+PagingRecord ::=                    SEQUENCE {
+    ue-Identity                         PagingUE-Identity,
+    accessType                          ENUMERATED {non3GPP}    OPTIONAL,   -- Need N
+    ...
+}
+
+PagingUE-Identity ::=               CHOICE {
+    ng-5G-S-TMSI                        NG-5G-S-TMSI,
+    fullI-RNTI                          I-RNTI-Value,
+    ...
+}
+
+-- TAG-PAGING-STOP
+-- TAG-RRCREESTABLISHMENT-START
+
+RRCReestablishment ::=              SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcReestablishment                  RRCReestablishment-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCReestablishment-IEs ::=          SEQUENCE {
+    nextHopChainingCount                NextHopChainingCount,
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-RRCREESTABLISHMENT-STOP
+-- TAG-RRCREESTABLISHMENTCOMPLETE-START
+
+RRCReestablishmentComplete ::=              SEQUENCE {
+    rrc-TransactionIdentifier                   RRC-TransactionIdentifier,
+    criticalExtensions                          CHOICE {
+        rrcReestablishmentComplete                  RRCReestablishmentComplete-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+RRCReestablishmentComplete-IEs ::=          SEQUENCE {
+    lateNonCriticalExtension                    OCTET STRING                            OPTIONAL,
+    nonCriticalExtension                        RRCReestablishmentComplete-v1610-IEs    OPTIONAL
+}
+
+RRCReestablishmentComplete-v1610-IEs ::=    SEQUENCE {
+    ue-MeasurementsAvailable-r16                UE-MeasurementsAvailable-r16    OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                     OPTIONAL
+}
+
+-- TAG-RRCREESTABLISHMENTCOMPLETE-STOP
+-- TAG-RRCREESTABLISHMENTREQUEST-START
+
+
+RRCReestablishmentRequest ::=       SEQUENCE {
+    rrcReestablishmentRequest           RRCReestablishmentRequest-IEs
+}
+
+RRCReestablishmentRequest-IEs ::=   SEQUENCE {
+    ue-Identity                         ReestabUE-Identity,
+    reestablishmentCause                ReestablishmentCause,
+    spare                               BIT STRING (SIZE (1))
+}
+
+ReestabUE-Identity ::=              SEQUENCE {
+    c-RNTI                              RNTI-Value,
+    physCellId                          PhysCellId,
+    shortMAC-I                          ShortMAC-I
+}
+
+ReestablishmentCause ::=            ENUMERATED {reconfigurationFailure, handoverFailure, otherFailure, spare1}
+
+-- TAG-RRCREESTABLISHMENTREQUEST-STOP
+-- TAG-RRCRECONFIGURATION-START
+
+RRCReconfiguration ::=                  SEQUENCE {
+    rrc-TransactionIdentifier               RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        rrcReconfiguration                      RRCReconfiguration-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+RRCReconfiguration-IEs ::=              SEQUENCE {
+    radioBearerConfig                       RadioBearerConfig                                                      OPTIONAL, -- Need M
+    secondaryCellGroup                      OCTET STRING (CONTAINING CellGroupConfig)                              OPTIONAL, -- Cond SCG
+    measConfig                              MeasConfig                                                             OPTIONAL, -- Need M
+    lateNonCriticalExtension                OCTET STRING                                                           OPTIONAL,
+    nonCriticalExtension                    RRCReconfiguration-v1530-IEs                                           OPTIONAL
+}
+
+RRCReconfiguration-v1530-IEs ::=            SEQUENCE {
+    masterCellGroup                         OCTET STRING (CONTAINING CellGroupConfig)                              OPTIONAL, -- Need M
+    fullConfig                              ENUMERATED {true}                                                      OPTIONAL, -- Cond FullConfig
+    dedicatedNAS-MessageList                SEQUENCE (SIZE(1..maxDRB)) OF DedicatedNAS-Message                     OPTIONAL, -- Cond nonHO
+    masterKeyUpdate                         MasterKeyUpdate                                                        OPTIONAL, -- Cond MasterKeyChange
+    dedicatedSIB1-Delivery                  OCTET STRING (CONTAINING SIB1)                                         OPTIONAL, -- Need N
+    dedicatedSystemInformationDelivery      OCTET STRING (CONTAINING SystemInformation)                            OPTIONAL, -- Need N
+    otherConfig                             OtherConfig                                                            OPTIONAL, -- Need M
+    nonCriticalExtension                    RRCReconfiguration-v1540-IEs                                           OPTIONAL
+}
+
+RRCReconfiguration-v1540-IEs ::=        SEQUENCE {
+    otherConfig-v1540                       OtherConfig-v1540                                                      OPTIONAL, -- Need M
+    nonCriticalExtension                    RRCReconfiguration-v1560-IEs                                           OPTIONAL
+}
+
+RRCReconfiguration-v1560-IEs ::=         SEQUENCE {
+    mrdc-SecondaryCellGroupConfig            SetupRelease { MRDC-SecondaryCellGroupConfig }                        OPTIONAL,   -- Need M
+    radioBearerConfig2                       OCTET STRING (CONTAINING RadioBearerConfig)                           OPTIONAL,   -- Need M
+    sk-Counter                               SK-Counter                                                            OPTIONAL,   -- Need N
+    nonCriticalExtension                     RRCReconfiguration-v1610-IEs                                          OPTIONAL
+}
+RRCReconfiguration-v1610-IEs ::=        SEQUENCE {
+    otherConfig-v1610                       OtherConfig-v1610                                                    OPTIONAL, -- Need M
+    bap-Config-r16                          SetupRelease { BAP-Config-r16 }                                      OPTIONAL, -- Need M
+    iab-IP-AddressConfigurationList-r16     IAB-IP-AddressConfigurationList-r16                                  OPTIONAL, -- Need M
+    conditionalReconfiguration-r16          ConditionalReconfiguration-r16                                       OPTIONAL, -- Need M
+    daps-SourceRelease-r16                  ENUMERATED{true}                                                     OPTIONAL, -- Need N
+    t316-r16                                SetupRelease {T316-r16}                                              OPTIONAL, -- Need M
+    needForGapsConfigNR-r16                 SetupRelease {NeedForGapsConfigNR-r16}                               OPTIONAL, -- Need M
+    onDemandSIB-Request-r16                 SetupRelease { OnDemandSIB-Request-r16 }                             OPTIONAL, -- Need M
+    dedicatedPosSysInfoDelivery-r16         OCTET STRING (CONTAINING PosSystemInformation-r16-IEs)               OPTIONAL, -- Need N
+    sl-ConfigDedicatedNR-r16                SetupRelease {SL-ConfigDedicatedNR-r16}                              OPTIONAL, -- Need M
+    sl-ConfigDedicatedEUTRA-Info-r16        SetupRelease {SL-ConfigDedicatedEUTRA-Info-r16}                      OPTIONAL, -- Need M
+    targetCellSMTC-SCG-r16                  SSB-MTC                                                              OPTIONAL, -- Need S
+    nonCriticalExtension                    SEQUENCE {}                                                          OPTIONAL
+}
+
+MRDC-SecondaryCellGroupConfig ::=       SEQUENCE {
+    mrdc-ReleaseAndAdd                      ENUMERATED {true}                                                     OPTIONAL,   -- Need N
+    mrdc-SecondaryCellGroup                 CHOICE {
+        nr-SCG                                  OCTET STRING  (CONTAINING RRCReconfiguration),
+        eutra-SCG                               OCTET STRING
+    }
+}
+
+BAP-Config-r16 ::=                      SEQUENCE {
+    bap-Address-r16                         BIT STRING (SIZE (10))                                    OPTIONAL, -- Need M
+    defaultUL-BAP-RoutingID-r16             BAP-RoutingID-r16                                         OPTIONAL, -- Need M
+    defaultUL-BH-RLC-Channel-r16            BH-RLC-ChannelID-r16                                      OPTIONAL, -- Need M
+    flowControlFeedbackType-r16             ENUMERATED {perBH-RLC-Channel, perRoutingID, both}        OPTIONAL, -- Need R
+    ...
+}
+
+MasterKeyUpdate ::=                 SEQUENCE {
+    keySetChangeIndicator           BOOLEAN,
+    nextHopChainingCount            NextHopChainingCount,
+    nas-Container                   OCTET STRING                                                     OPTIONAL,    -- Cond securityNASC
+    ...
+}
+
+OnDemandSIB-Request-r16 ::=                  SEQUENCE {
+    onDemandSIB-RequestProhibitTimer-r16         ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30}
+}
+
+T316-r16 ::=         ENUMERATED {ms50, ms100, ms200, ms300, ms400, ms500, ms600, ms1000, ms1500, ms2000}
+
+IAB-IP-AddressConfigurationList-r16 ::= SEQUENCE {
+    iab-IP-AddressToAddModList-r16      SEQUENCE (SIZE(1..maxIAB-IP-Address-r16)) OF IAB-IP-AddressConfiguration-r16 OPTIONAL, -- Need N
+    iab-IP-AddressToReleaseList-r16     SEQUENCE (SIZE(1..maxIAB-IP-Address-r16)) OF IAB-IP-AddressIndex-r16         OPTIONAL, -- Need N
+    ...
+}
+
+IAB-IP-AddressConfiguration-r16 ::=     SEQUENCE {
+    iab-IP-AddressIndex-r16                 IAB-IP-AddressIndex-r16,
+    iab-IP-Address-r16                      IAB-IP-Address-r16                                                OPTIONAL,  -- Need M
+    iab-IP-Usage-r16                        IAB-IP-Usage-r16                                                  OPTIONAL,  -- Need M
+    iab-donor-DU-BAP-Address-r16            BIT STRING (SIZE(10))                                             OPTIONAL,  -- Need M
+...
+}
+
+SL-ConfigDedicatedEUTRA-Info-r16 ::=            SEQUENCE {
+    sl-ConfigDedicatedEUTRA-r16                    OCTET STRING                                              OPTIONAL,  -- Need M
+    sl-TimeOffsetEUTRA-List-r16                    SEQUENCE (SIZE (8)) OF SL-TimeOffsetEUTRA-r16             OPTIONAL    -- Need M
+}
+
+SL-TimeOffsetEUTRA-r16 ::=        ENUMERATED {ms0, ms0dot25, ms0dot5, ms0dot625, ms0dot75, ms1, ms1dot25, ms1dot5, ms1dot75,
+                                              ms2, ms2dot5, ms3, ms4, ms5, ms6, ms8, ms10, ms20}
+
+-- TAG-RRCRECONFIGURATION-STOP
+-- TAG-RRCRECONFIGURATIONCOMPLETE-START
+
+RRCReconfigurationComplete ::=              SEQUENCE {
+    rrc-TransactionIdentifier                   RRC-TransactionIdentifier,
+    criticalExtensions                          CHOICE {
+        rrcReconfigurationComplete                  RRCReconfigurationComplete-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+RRCReconfigurationComplete-IEs ::=          SEQUENCE {
+    lateNonCriticalExtension                    OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1530-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1530-IEs ::=    SEQUENCE {
+    uplinkTxDirectCurrentList                   UplinkTxDirectCurrentList                                               OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1560-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1560-IEs ::=    SEQUENCE {
+    scg-Response                                CHOICE {
+        nr-SCG-Response                             OCTET STRING (CONTAINING RRCReconfigurationComplete),
+        eutra-SCG-Response                          OCTET STRING
+    }                                                                                                                       OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1610-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1610-IEs ::=    SEQUENCE {
+    ue-MeasurementsAvailable-r16                UE-MeasurementsAvailable-r16                                            OPTIONAL,
+    needForGapsInfoNR-r16                       NeedForGapsInfoNR-r16                                                   OPTIONAL,
+    nonCriticalExtension                        RRCReconfigurationComplete-v1640-IEs                                    OPTIONAL
+}
+
+RRCReconfigurationComplete-v1640-IEs ::=    SEQUENCE {
+    uplinkTxDirectCurrentTwoCarrierList-r16     UplinkTxDirectCurrentTwoCarrierList-r16                                 OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                                                             OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONCOMPLETE-STOP
+-- TAG-RRCREJECT-START
+
+RRCReject ::=                       SEQUENCE {
+    criticalExtensions                  CHOICE {
+        rrcReject                           RRCReject-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCReject-IEs ::=                   SEQUENCE {
+    waitTime                            RejectWaitTime                                                          OPTIONAL,   -- Need N
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-RRCREJECT-STOP
+-- TAG-RRCRELEASE-START
+
+RRCRelease ::=                      SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcRelease                          RRCRelease-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCRelease-IEs ::=                  SEQUENCE {
+    redirectedCarrierInfo               RedirectedCarrierInfo                                                       OPTIONAL,   -- Need N
+    cellReselectionPriorities           CellReselectionPriorities                                                   OPTIONAL,   -- Need R
+    suspendConfig                       SuspendConfig                                                               OPTIONAL,   -- Need R
+    deprioritisationReq                 SEQUENCE {
+        deprioritisationType                ENUMERATED {frequency, nr},
+        deprioritisationTimer               ENUMERATED {min5, min10, min15, min30}
+    }                                                                                                               OPTIONAL,   -- Need N
+    lateNonCriticalExtension                OCTET STRING                                                        OPTIONAL,
+    nonCriticalExtension                    RRCRelease-v1540-IEs                                                OPTIONAL
+}
+
+RRCRelease-v1540-IEs ::=            SEQUENCE {
+    waitTime                           RejectWaitTime                OPTIONAL, -- Need N
+    nonCriticalExtension               RRCRelease-v1610-IEs          OPTIONAL
+}
+
+RRCRelease-v1610-IEs ::=            SEQUENCE {
+    voiceFallbackIndication-r16        ENUMERATED {true}                             OPTIONAL, -- Need N
+    measIdleConfig-r16                 SetupRelease {MeasIdleConfigDedicated-r16}    OPTIONAL, -- Need M
+    nonCriticalExtension               SEQUENCE {}                                   OPTIONAL
+}
+
+RedirectedCarrierInfo ::=           CHOICE {
+    nr                                  CarrierInfoNR,
+    eutra                               RedirectedCarrierInfo-EUTRA,
+    ...
+}
+
+RedirectedCarrierInfo-EUTRA ::=     SEQUENCE {
+    eutraFrequency                      ARFCN-ValueEUTRA,
+    cnType                              ENUMERATED {epc,fiveGC}                                             OPTIONAL    -- Need N
+}
+
+CarrierInfoNR ::=                   SEQUENCE {
+    carrierFreq                         ARFCN-ValueNR,
+    ssbSubcarrierSpacing                SubcarrierSpacing,
+    smtc                                SSB-MTC                                                             OPTIONAL,      -- Need S
+    ...
+}
+
+SuspendConfig ::=                   SEQUENCE {
+    fullI-RNTI                          I-RNTI-Value,
+    shortI-RNTI                         ShortI-RNTI-Value,
+    ran-PagingCycle                     PagingCycle,
+    ran-NotificationAreaInfo            RAN-NotificationAreaInfo                                            OPTIONAL,   -- Need M
+    t380                                PeriodicRNAU-TimerValue                                             OPTIONAL,   -- Need R
+    nextHopChainingCount                NextHopChainingCount,
+    ...
+}
+
+PeriodicRNAU-TimerValue ::=         ENUMERATED { min5, min10, min20, min30, min60, min120, min360, min720}
+
+
+CellReselectionPriorities ::=       SEQUENCE {
+    freqPriorityListEUTRA               FreqPriorityListEUTRA                                               OPTIONAL,       -- Need M
+    freqPriorityListNR                  FreqPriorityListNR                                                  OPTIONAL,       -- Need M
+    t320                                ENUMERATED {min5, min10, min20, min30, min60, min120, min180, spare1} OPTIONAL,     -- Need R
+    ...
+}
+
+PagingCycle ::=                     ENUMERATED {rf32, rf64, rf128, rf256}
+
+FreqPriorityListEUTRA ::=           SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityEUTRA
+
+FreqPriorityListNR ::=              SEQUENCE (SIZE (1..maxFreq)) OF FreqPriorityNR
+
+FreqPriorityEUTRA ::=               SEQUENCE {
+    carrierFreq                         ARFCN-ValueEUTRA,
+    cellReselectionPriority             CellReselectionPriority,
+    cellReselectionSubPriority          CellReselectionSubPriority                                          OPTIONAL        -- Need R
+}
+
+FreqPriorityNR ::=                  SEQUENCE {
+    carrierFreq                         ARFCN-ValueNR,
+    cellReselectionPriority             CellReselectionPriority,
+    cellReselectionSubPriority          CellReselectionSubPriority                                          OPTIONAL        -- Need R
+}
+
+RAN-NotificationAreaInfo ::=        CHOICE {
+    cellList                            PLMN-RAN-AreaCellList,
+    ran-AreaConfigList                  PLMN-RAN-AreaConfigList,
+    ...
+}
+
+PLMN-RAN-AreaCellList ::=           SEQUENCE (SIZE (1.. maxPLMNIdentities)) OF PLMN-RAN-AreaCell
+
+PLMN-RAN-AreaCell ::=               SEQUENCE {
+    plmn-Identity                       PLMN-Identity                                                       OPTIONAL,   -- Need S
+    ran-AreaCells                       SEQUENCE (SIZE (1..32)) OF  CellIdentity
+}
+
+PLMN-RAN-AreaConfigList ::=         SEQUENCE (SIZE (1..maxPLMNIdentities)) OF PLMN-RAN-AreaConfig
+
+PLMN-RAN-AreaConfig ::=             SEQUENCE {
+    plmn-Identity                       PLMN-Identity                                                       OPTIONAL,   -- Need S
+    ran-Area                            SEQUENCE (SIZE (1..16)) OF  RAN-AreaConfig
+}
+
+RAN-AreaConfig ::=                  SEQUENCE {
+    trackingAreaCode                    TrackingAreaCode,
+    ran-AreaCodeList                    SEQUENCE (SIZE (1..32)) OF  RAN-AreaCode                            OPTIONAL    -- Need R
+}
+
+-- TAG-RRCRELEASE-STOP
+-- TAG-RRCRESUME-START
+
+RRCResume ::=                       SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcResume                           RRCResume-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCResume-IEs ::=                   SEQUENCE {
+    radioBearerConfig                   RadioBearerConfig                                               OPTIONAL, -- Need M
+    masterCellGroup                     OCTET STRING (CONTAINING CellGroupConfig)                       OPTIONAL, -- Need M
+    measConfig                          MeasConfig                                                      OPTIONAL, -- Need M
+    fullConfig                          ENUMERATED {true}                                               OPTIONAL, -- Need N
+    lateNonCriticalExtension            OCTET STRING                                                    OPTIONAL,
+    nonCriticalExtension                RRCResume-v1560-IEs                                             OPTIONAL
+}
+
+RRCResume-v1560-IEs ::=             SEQUENCE {
+    radioBearerConfig2                  OCTET STRING (CONTAINING RadioBearerConfig)                     OPTIONAL, -- Need M
+    sk-Counter                          SK-Counter                                                      OPTIONAL, -- Need N
+    nonCriticalExtension                RRCResume-v1610-IEs                                             OPTIONAL
+}
+
+RRCResume-v1610-IEs ::=             SEQUENCE {
+    idleModeMeasurementReq-r16          ENUMERATED {true}                                               OPTIONAL, -- Need N
+    restoreMCG-SCells-r16               ENUMERATED {true}                                               OPTIONAL, -- Need N
+    restoreSCG-r16                      ENUMERATED {true}                                               OPTIONAL, -- Need N
+    mrdc-SecondaryCellGroup-r16         CHOICE {
+        nr-SCG-r16                          OCTET STRING (CONTAINING RRCReconfiguration),
+        eutra-SCG-r16                       OCTET STRING
+    }                                                                                                   OPTIONAL, -- Cond RestoreSCG
+    needForGapsConfigNR-r16             SetupRelease {NeedForGapsConfigNR-r16}                          OPTIONAL, -- Need M
+    nonCriticalExtension                SEQUENCE{}                                                      OPTIONAL
+}
+
+-- TAG-RRCRESUME-STOP
+-- TAG-RRCRESUMECOMPLETE-START
+
+RRCResumeComplete ::=                   SEQUENCE {
+    rrc-TransactionIdentifier               RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        rrcResumeComplete                       RRCResumeComplete-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+RRCResumeComplete-IEs ::=               SEQUENCE {
+    dedicatedNAS-Message                    DedicatedNAS-Message                                                    OPTIONAL,
+    selectedPLMN-Identity                   INTEGER (1..maxPLMN)                                                    OPTIONAL,
+    uplinkTxDirectCurrentList               UplinkTxDirectCurrentList                                               OPTIONAL,
+    lateNonCriticalExtension                OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                    RRCResumeComplete-v1610-IEs                                             OPTIONAL
+}
+
+RRCResumeComplete-v1610-IEs ::=         SEQUENCE {
+    idleMeasAvailable-r16                   ENUMERATED {true}                                                       OPTIONAL,
+    measResultIdleEUTRA-r16                 MeasResultIdleEUTRA-r16                                                 OPTIONAL,
+    measResultIdleNR-r16                    MeasResultIdleNR-r16                                                    OPTIONAL,
+    scg-Response-r16                        CHOICE {
+        nr-SCG-Response                         OCTET STRING (CONTAINING RRCReconfigurationComplete),
+        eutra-SCG-Response                      OCTET STRING
+    }                                                                                                               OPTIONAL,
+    ue-MeasurementsAvailable-r16            UE-MeasurementsAvailable-r16                                            OPTIONAL,
+    mobilityHistoryAvail-r16                ENUMERATED {true}                                                       OPTIONAL,
+    mobilityState-r16                       ENUMERATED {normal, medium, high, spare}                                OPTIONAL,
+    needForGapsInfoNR-r16                   NeedForGapsInfoNR-r16                                                   OPTIONAL,
+    nonCriticalExtension                    RRCResumeComplete-v1640-IEs                                             OPTIONAL
+}
+
+RRCResumeComplete-v1640-IEs ::=         SEQUENCE {
+    uplinkTxDirectCurrentTwoCarrierList-r16 UplinkTxDirectCurrentTwoCarrierList-r16                                 OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                                             OPTIONAL
+}
+
+-- TAG-RRCRESUMECOMPLETE-STOP
+-- TAG-RRCRESUMEREQUEST-START
+
+RRCResumeRequest ::=            SEQUENCE {
+        rrcResumeRequest            RRCResumeRequest-IEs
+}
+
+RRCResumeRequest-IEs ::=        SEQUENCE {
+    resumeIdentity                  ShortI-RNTI-Value,
+    resumeMAC-I                     BIT STRING (SIZE (16)),
+    resumeCause                     ResumeCause,
+    spare                           BIT STRING (SIZE (1))
+}
+
+-- TAG-RRCRESUMEREQUEST-STOP
+-- TAG-RRCRESUMEREQUEST1-START
+
+RRCResumeRequest1 ::=         SEQUENCE {
+       rrcResumeRequest1          RRCResumeRequest1-IEs
+}
+
+RRCResumeRequest1-IEs ::=    SEQUENCE {
+    resumeIdentity               I-RNTI-Value,
+    resumeMAC-I                  BIT STRING (SIZE (16)),
+    resumeCause                  ResumeCause,
+    spare                        BIT STRING (SIZE (1))
+}
+
+-- TAG-RRCRESUMEREQUEST1-STOP
+-- TAG-RRCSETUP-START
+
+RRCSetup ::=                        SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcSetup                            RRCSetup-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCSetup-IEs ::=                    SEQUENCE {
+    radioBearerConfig                   RadioBearerConfig,
+    masterCellGroup                     OCTET STRING (CONTAINING CellGroupConfig),
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-RRCSETUP-STOP
+-- TAG-RRCSETUPCOMPLETE-START
+
+RRCSetupComplete ::=                SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        rrcSetupComplete                    RRCSetupComplete-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+RRCSetupComplete-IEs ::=            SEQUENCE {
+    selectedPLMN-Identity               INTEGER (1..maxPLMN),
+    registeredAMF                       RegisteredAMF                                   OPTIONAL,
+    guami-Type                          ENUMERATED {native, mapped}                     OPTIONAL,
+    s-NSSAI-List                        SEQUENCE (SIZE (1..maxNrofS-NSSAI)) OF S-NSSAI  OPTIONAL,
+    dedicatedNAS-Message                DedicatedNAS-Message,
+    ng-5G-S-TMSI-Value                  CHOICE {
+        ng-5G-S-TMSI                        NG-5G-S-TMSI,
+        ng-5G-S-TMSI-Part2                  BIT STRING (SIZE (9))
+    }                                                                                   OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                                    OPTIONAL,
+    nonCriticalExtension                RRCSetupComplete-v1610-IEs                      OPTIONAL
+}
+
+RRCSetupComplete-v1610-IEs ::=      SEQUENCE {
+    iab-NodeIndication-r16              ENUMERATED {true}                               OPTIONAL,
+    idleMeasAvailable-r16               ENUMERATED {true}                               OPTIONAL,
+    ue-MeasurementsAvailable-r16        UE-MeasurementsAvailable-r16                    OPTIONAL,
+    mobilityHistoryAvail-r16            ENUMERATED {true}                               OPTIONAL,
+    mobilityState-r16                   ENUMERATED {normal, medium, high, spare}        OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                      OPTIONAL
+}
+
+RegisteredAMF ::=                   SEQUENCE {
+    plmn-Identity                       PLMN-Identity                                   OPTIONAL,
+    amf-Identifier                      AMF-Identifier
+}
+
+-- TAG-RRCSETUPCOMPLETE-STOP
+-- TAG-RRCSETUPREQUEST-START
+
+RRCSetupRequest ::=                 SEQUENCE {
+    rrcSetupRequest                     RRCSetupRequest-IEs
+}
+
+RRCSetupRequest-IEs ::=             SEQUENCE {
+    ue-Identity                         InitialUE-Identity,
+    establishmentCause                  EstablishmentCause,
+    spare                               BIT STRING (SIZE (1))
+}
+
+InitialUE-Identity ::=              CHOICE {
+    ng-5G-S-TMSI-Part1                  BIT STRING (SIZE (39)),
+    randomValue                         BIT STRING (SIZE (39))
+}
+
+EstablishmentCause ::=              ENUMERATED {
+                                        emergency, highPriorityAccess, mt-Access, mo-Signalling,
+                                        mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, mps-PriorityAccess, mcs-PriorityAccess,
+                                        spare6, spare5, spare4, spare3, spare2, spare1}
+
+-- TAG-RRCSETUPREQUEST-STOP
+-- TAG-RRCSYSTEMINFOREQUEST-START
+
+RRCSystemInfoRequest ::=            SEQUENCE {
+    criticalExtensions                  CHOICE {
+        rrcSystemInfoRequest                RRCSystemInfoRequest-IEs,
+        criticalExtensionsFuture-r16        CHOICE {
+            rrcPosSystemInfoRequest-r16         RRC-PosSystemInfoRequest-r16-IEs,
+            criticalExtensionsFuture            SEQUENCE {}
+        }
+    }
+}
+
+RRCSystemInfoRequest-IEs ::=    SEQUENCE {
+    requested-SI-List                   BIT STRING (SIZE (maxSI-Message)),  --32bits
+    spare                               BIT STRING (SIZE (12))
+}
+
+RRC-PosSystemInfoRequest-r16-IEs ::=  SEQUENCE {
+    requestedPosSI-List                   BIT STRING (SIZE (maxSI-Message)),  --32bits
+    spare                                 BIT STRING (SIZE (11))
+}
+
+-- TAG-RRCSYSTEMINFOREQUEST-STOP
+-- TAG-SCGFAILUREINFORMATION-START
+
+SCGFailureInformation ::=                   SEQUENCE {
+    criticalExtensions                           CHOICE {
+        scgFailureInformation                        SCGFailureInformation-IEs,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+SCGFailureInformation-IEs ::=            SEQUENCE {
+    failureReportSCG                         FailureReportSCG                    OPTIONAL,
+    nonCriticalExtension                     SCGFailureInformation-v1590-IEs     OPTIONAL
+}
+
+SCGFailureInformation-v1590-IEs ::=       SEQUENCE {
+    lateNonCriticalExtension                OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                         OPTIONAL
+}
+
+FailureReportSCG ::=                       SEQUENCE {
+    failureType                                    ENUMERATED {
+                                                               t310-Expiry, randomAccessProblem,
+                                                               rlc-MaxNumRetx,
+                                                               synchReconfigFailureSCG, scg-ReconfigFailure,
+                                                               srb3-IntegrityFailure, other-r16, spare1},
+    measResultFreqList                          MeasResultFreqList                                                      OPTIONAL,
+    measResultSCG-Failure                      OCTET STRING (CONTAINING MeasResultSCG-Failure)                OPTIONAL,
+    ...,
+    [[
+    locationInfo-r16                            LocationInfo-r16            OPTIONAL,
+   failureType-v1610                        ENUMERATED {scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+                                                        t312-Expiry-r16, bh-RLF-r16, spare4, spare3, spare2, spare1} OPTIONAL
+    ]]
+}
+
+MeasResultFreqList ::=                   SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2NR
+
+
+-- TAG-SCGFAILUREINFORMATION-STOP
+-- TAG-SCGFAILUREINFORMATIONEUTRA-START
+
+SCGFailureInformationEUTRA ::=                SEQUENCE {
+    criticalExtensions                                CHOICE {
+        scgFailureInformationEUTRA                       SCGFailureInformationEUTRA-IEs,
+        criticalExtensionsFuture                          SEQUENCE {}
+    }
+}
+
+SCGFailureInformationEUTRA-IEs ::=           SEQUENCE {
+    failureReportSCG-EUTRA                           FailureReportSCG-EUTRA                      OPTIONAL,
+    nonCriticalExtension                              SCGFailureInformationEUTRA-v1590-IEs                                    OPTIONAL
+}
+
+SCGFailureInformationEUTRA-v1590-IEs ::=  SEQUENCE {
+    lateNonCriticalExtension                  OCTET STRING            OPTIONAL,
+    nonCriticalExtension                               SEQUENCE {}                  OPTIONAL
+}
+
+FailureReportSCG-EUTRA ::=                       SEQUENCE {
+    failureType                                           ENUMERATED {
+                                                                       t313-Expiry, randomAccessProblem,rlc-MaxNumRetx,
+                                                                             scg-ChangeFailure,scg-lbtFailure-r16,
+                                                                             beamFailureRecoveryFailure-r16, t312-Expiry-r16, spare},
+    measResultFreqListMRDC                             MeasResultFreqListFailMRDC                                                   OPTIONAL,
+    measResultSCG-FailureMRDC                         OCTET STRING                                                         OPTIONAL,
+    ...,
+    [[
+    locationInfo-r16                                    LocationInfo-r16                                                         OPTIONAL
+    ]]
+}
+
+MeasResultFreqListFailMRDC ::=      SEQUENCE (SIZE (1.. maxFreq)) OF MeasResult2EUTRA
+
+-- TAG-SCGFAILUREINFORMATIONEUTRA-STOP
+-- TAG-SECURITYMODECOMMAND-START
+
+SecurityModeCommand ::=             SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        securityModeCommand                 SecurityModeCommand-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SecurityModeCommand-IEs ::=         SEQUENCE {
+    securityConfigSMC                   SecurityConfigSMC,
+
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+SecurityConfigSMC ::=               SEQUENCE {
+    securityAlgorithmConfig             SecurityAlgorithmConfig,
+    ...
+}
+
+-- TAG-SECURITYMODECOMMAND-STOP
+-- TAG-SECURITYMODECOMPLETE-START
+
+SecurityModeComplete ::=            SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        securityModeComplete                SecurityModeComplete-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SecurityModeComplete-IEs ::=        SEQUENCE {
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-SECURITYMODECOMPLETE-STOP
+-- TAG-SECURITYMODEFAILURE-START
+
+SecurityModeFailure ::=             SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        securityModeFailure                 SecurityModeFailure-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SecurityModeFailure-IEs ::=         SEQUENCE {
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-SECURITYMODEFAILURE-STOP
+-- TAG-SIB1-START
+
+SIB1 ::=        SEQUENCE {
+    cellSelectionInfo                   SEQUENCE {
+        q-RxLevMin                          Q-RxLevMin,
+        q-RxLevMinOffset                    INTEGER (1..8)                                              OPTIONAL,   -- Need S
+        q-RxLevMinSUL                       Q-RxLevMin                                                  OPTIONAL,   -- Need R
+        q-QualMin                           Q-QualMin                                                   OPTIONAL,   -- Need S
+        q-QualMinOffset                     INTEGER (1..8)                                              OPTIONAL    -- Need S
+    }                                                                                                   OPTIONAL,   -- Cond Standalone
+    cellAccessRelatedInfo               CellAccessRelatedInfo,
+    connEstFailureControl               ConnEstFailureControl                                           OPTIONAL,   -- Need R
+    si-SchedulingInfo                   SI-SchedulingInfo                                               OPTIONAL,   -- Need R
+    servingCellConfigCommon             ServingCellConfigCommonSIB                                      OPTIONAL,   -- Need R
+    ims-EmergencySupport                ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    eCallOverIMS-Support                ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    ue-TimersAndConstants               UE-TimersAndConstants                                           OPTIONAL,   -- Need R
+    uac-BarringInfo                     SEQUENCE {
+        uac-BarringForCommon                UAC-BarringPerCatList                                           OPTIONAL,   -- Need S
+        uac-BarringPerPLMN-List             UAC-BarringPerPLMN-List                                         OPTIONAL,   -- Need S
+        uac-BarringInfoSetList              UAC-BarringInfoSetList,
+        uac-AccessCategory1-SelectionAssistanceInfo CHOICE {
+            plmnCommon                           UAC-AccessCategory1-SelectionAssistanceInfo,
+            individualPLMNList                   SEQUENCE (SIZE (2..maxPLMN)) OF UAC-AccessCategory1-SelectionAssistanceInfo
+        }                                                                                                   OPTIONAL    -- Need S
+    }                                                                                                   OPTIONAL,   -- Need R
+    useFullResumeID                     ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    lateNonCriticalExtension            OCTET STRING                                                    OPTIONAL,
+    nonCriticalExtension                SIB1-v1610-IEs                                                  OPTIONAL
+}
+
+SIB1-v1610-IEs ::=               SEQUENCE {
+    idleModeMeasurementsEUTRA-r16    ENUMERATED{true}                                                   OPTIONAL,  -- Need R
+    idleModeMeasurementsNR-r16       ENUMERATED{true}                                                   OPTIONAL,  -- Need R
+    posSI-SchedulingInfo-r16         PosSI-SchedulingInfo-r16                                           OPTIONAL,  -- Need R
+    nonCriticalExtension             SIB1-v1630-IEs                                                     OPTIONAL
+}
+
+SIB1-v1630-IEs ::=               SEQUENCE {
+    uac-BarringInfo-v1630            SEQUENCE {
+        uac-AC1-SelectAssistInfo-r16     SEQUENCE (SIZE (2..maxPLMN)) OF UAC-AC1-SelectAssistInfo-r16
+    }                                                                                                   OPTIONAL,  -- Need R
+    nonCriticalExtension             SEQUENCE {}                                                        OPTIONAL
+}
+
+UAC-AccessCategory1-SelectionAssistanceInfo ::=    ENUMERATED {a, b, c}
+
+UAC-AC1-SelectAssistInfo-r16 ::=     ENUMERATED {a, b, c, notConfigured}
+
+-- TAG-SIB1-STOP
+-- TAG-SIDELINKUEINFORMATIONNR-START
+
+SidelinkUEInformationNR-r16::=         SEQUENCE {
+    criticalExtensions                  CHOICE {
+        sidelinkUEInformationNR-r16         SidelinkUEInformationNR-r16-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+SidelinkUEInformationNR-r16-IEs ::=    SEQUENCE {
+    sl-RxInterestedFreqList-r16            SL-InterestedFreqList-r16           OPTIONAL,
+    sl-TxResourceReqList-r16               SL-TxResourceReqList-r16            OPTIONAL,
+    sl-FailureList-r16                     SL-FailureList-r16                  OPTIONAL,
+    lateNonCriticalExtension               OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                   SEQUENCE {}                         OPTIONAL
+}
+
+SL-InterestedFreqList-r16 ::=          SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF INTEGER (1..maxNrofFreqSL-r16)
+
+SL-TxResourceReqList-r16 ::=           SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-TxResourceReq-r16
+
+SL-TxResourceReq-r16 ::=               SEQUENCE {
+    sl-DestinationIdentity-r16             SL-DestinationIdentity-r16,
+    sl-CastType-r16                        ENUMERATED {broadcast, groupcast, unicast, spare1},
+    sl-RLC-ModeIndicationList-r16          SEQUENCE (SIZE (1.. maxNrofSLRB-r16)) OF SL-RLC-ModeIndication-r16         OPTIONAL,
+    sl-QoS-InfoList-r16                    SEQUENCE (SIZE (1..maxNrofSL-QFIsPerDest-r16)) OF SL-QoS-Info-r16          OPTIONAL,
+    sl-TypeTxSyncList-r16                  SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-TypeTxSync-r16                OPTIONAL,
+    sl-TxInterestedFreqList-r16            SL-TxInterestedFreqList-r16                                                OPTIONAL,
+    sl-CapabilityInformationSidelink-r16   OCTET STRING                                                               OPTIONAL
+}
+
+SL-TxInterestedFreqList-r16 ::=        SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF INTEGER (1..maxNrofFreqSL-r16)
+
+SL-QoS-Info-r16 ::=                    SEQUENCE {
+    sl-QoS-FlowIdentity-r16               SL-QoS-FlowIdentity-r16,
+    sl-QoS-Profile-r16                    SL-QoS-Profile-r16                                                          OPTIONAL
+}
+
+SL-RLC-ModeIndication-r16 ::=          SEQUENCE {
+    sl-Mode-r16                            CHOICE  {
+        sl-AM-Mode-r16                         NULL,
+        sl-UM-Mode-r16                         NULL
+    },
+    sl-QoS-InfoList-r16                SEQUENCE (SIZE (1..maxNrofSL-QFIsPerDest-r16)) OF SL-QoS-Info-r16
+}
+
+SL-FailureList-r16 ::=                 SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-Failure-r16
+
+SL-Failure-r16 ::=                     SEQUENCE {
+    sl-DestinationIdentity-r16             SL-DestinationIdentity-r16,
+    sl-Failure-r16                         ENUMERATED {rlf,configFailure, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+-- TAG-SIDELINKUEINFORMATIONNR-STOP
+-- TAG-SYSTEMINFORMATION-START
+
+SystemInformation ::=               SEQUENCE {
+    criticalExtensions                  CHOICE {
+        systemInformation                   SystemInformation-IEs,
+        criticalExtensionsFuture-r16    CHOICE {
+            posSystemInformation-r16        PosSystemInformation-r16-IEs,
+            criticalExtensionsFuture        SEQUENCE {}
+        }
+    }
+}
+
+SystemInformation-IEs ::=           SEQUENCE {
+    sib-TypeAndInfo                     SEQUENCE (SIZE (1..maxSIB)) OF CHOICE {
+        sib2                                SIB2,
+        sib3                                SIB3,
+        sib4                                SIB4,
+        sib5                                SIB5,
+        sib6                                SIB6,
+        sib7                                SIB7,
+        sib8                                SIB8,
+        sib9                                SIB9,
+        ...,
+        sib10-v1610                         SIB10-r16,
+        sib11-v1610                         SIB11-r16,
+        sib12-v1610                         SIB12-r16,
+        sib13-v1610                         SIB13-r16,
+        sib14-v1610                         SIB14-r16
+    },
+
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-SYSTEMINFORMATION-STOP
+-- TAG-UEASSISTANCEINFORMATION-START
+
+UEAssistanceInformation ::=         SEQUENCE {
+    criticalExtensions                  CHOICE {
+        ueAssistanceInformation             UEAssistanceInformation-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UEAssistanceInformation-IEs ::=     SEQUENCE {
+    delayBudgetReport                   DelayBudgetReport                   OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                UEAssistanceInformation-v1540-IEs   OPTIONAL
+}
+
+DelayBudgetReport::=                CHOICE {
+    type1                               ENUMERATED {
+                                            msMinus1280, msMinus640, msMinus320, msMinus160,msMinus80, msMinus60, msMinus40,
+                                            msMinus20, ms0, ms20,ms40, ms60, ms80, ms160, ms320, ms640, ms1280},
+    ...
+}
+
+UEAssistanceInformation-v1540-IEs ::= SEQUENCE {
+    overheatingAssistance               OverheatingAssistance               OPTIONAL,
+    nonCriticalExtension                UEAssistanceInformation-v1610-IEs   OPTIONAL
+}
+
+OverheatingAssistance ::=           SEQUENCE {
+    reducedMaxCCs                       ReducedMaxCCs-r16                   OPTIONAL,
+    reducedMaxBW-FR1                    ReducedMaxBW-FRx-r16                OPTIONAL,
+    reducedMaxBW-FR2                    ReducedMaxBW-FRx-r16                OPTIONAL,
+    reducedMaxMIMO-LayersFR1            SEQUENCE {
+        reducedMIMO-LayersFR1-DL            MIMO-LayersDL,
+        reducedMIMO-LayersFR1-UL            MIMO-LayersUL
+    } OPTIONAL,
+    reducedMaxMIMO-LayersFR2            SEQUENCE {
+        reducedMIMO-LayersFR2-DL            MIMO-LayersDL,
+        reducedMIMO-LayersFR2-UL            MIMO-LayersUL
+    } OPTIONAL
+}
+
+ReducedAggregatedBandwidth ::= ENUMERATED {mhz0, mhz10, mhz20, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100, mhz200, mhz300, mhz400}
+
+UEAssistanceInformation-v1610-IEs ::= SEQUENCE {
+    idc-Assistance-r16                  IDC-Assistance-r16                  OPTIONAL,
+    drx-Preference-r16                  DRX-Preference-r16                  OPTIONAL,
+    maxBW-Preference-r16                MaxBW-Preference-r16                OPTIONAL,
+    maxCC-Preference-r16                MaxCC-Preference-r16                OPTIONAL,
+    maxMIMO-LayerPreference-r16         MaxMIMO-LayerPreference-r16         OPTIONAL,
+    minSchedulingOffsetPreference-r16   MinSchedulingOffsetPreference-r16   OPTIONAL,
+    releasePreference-r16               ReleasePreference-r16               OPTIONAL,
+    sl-UE-AssistanceInformationNR-r16   SL-UE-AssistanceInformationNR-r16   OPTIONAL,
+    referenceTimeInfoPreference-r16     BOOLEAN                             OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+IDC-Assistance-r16 ::=                  SEQUENCE {
+    affectedCarrierFreqList-r16             AffectedCarrierFreqList-r16               OPTIONAL,
+    affectedCarrierFreqCombList-r16         AffectedCarrierFreqCombList-r16           OPTIONAL,
+    ...
+}
+
+AffectedCarrierFreqList-r16 ::= SEQUENCE (SIZE (1.. maxFreqIDC-r16)) OF AffectedCarrierFreq-r16
+
+AffectedCarrierFreq-r16 ::=     SEQUENCE {
+    carrierFreq-r16                 ARFCN-ValueNR,
+    interferenceDirection-r16       ENUMERATED {nr, other, both, spare}
+}
+
+AffectedCarrierFreqCombList-r16 ::= SEQUENCE (SIZE (1..maxCombIDC-r16)) OF AffectedCarrierFreqComb-r16
+
+AffectedCarrierFreqComb-r16 ::=     SEQUENCE {
+    affectedCarrierFreqComb-r16         SEQUENCE (SIZE (2..maxNrofServingCells)) OF  ARFCN-ValueNR    OPTIONAL,
+    victimSystemType-r16                VictimSystemType-r16
+}
+
+VictimSystemType-r16 ::=    SEQUENCE {
+    gps-r16                     ENUMERATED {true}        OPTIONAL,
+    glonass-r16                 ENUMERATED {true}        OPTIONAL,
+    bds-r16                     ENUMERATED {true}        OPTIONAL,
+    galileo-r16                 ENUMERATED {true}        OPTIONAL,
+    navIC-r16                   ENUMERATED {true}        OPTIONAL,
+    wlan-r16                    ENUMERATED {true}        OPTIONAL,
+    bluetooth-r16               ENUMERATED {true}        OPTIONAL,
+    ...
+}
+
+DRX-Preference-r16 ::=              SEQUENCE {
+    preferredDRX-InactivityTimer-r16    ENUMERATED {
+                                            ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+                                            ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+                                            spare7, spare6, spare5, spare4, spare3, spare2, spare1} OPTIONAL,
+    preferredDRX-LongCycle-r16          ENUMERATED {
+                                            ms10, ms20, ms32, ms40, ms60, ms64, ms70, ms80, ms128, ms160, ms256, ms320, ms512,
+                                            ms640, ms1024, ms1280, ms2048, ms2560, ms5120, ms10240, spare12, spare11, spare10,
+                                            spare9, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL,
+    preferredDRX-ShortCycle-r16         ENUMERATED {
+                                            ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+                                            ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+                                            spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 } OPTIONAL,
+    preferredDRX-ShortCycleTimer-r16    INTEGER (1..16)    OPTIONAL
+}
+
+MaxBW-Preference-r16 ::=            SEQUENCE {
+    reducedMaxBW-FR1-r16                ReducedMaxBW-FRx-r16                     OPTIONAL,
+    reducedMaxBW-FR2-r16                ReducedMaxBW-FRx-r16                     OPTIONAL
+}
+
+MaxCC-Preference-r16 ::=            SEQUENCE {
+    reducedMaxCCs-r16                   ReducedMaxCCs-r16                        OPTIONAL
+}
+
+MaxMIMO-LayerPreference-r16 ::=     SEQUENCE {
+    reducedMaxMIMO-LayersFR1-r16        SEQUENCE {
+        reducedMIMO-LayersFR1-DL-r16        INTEGER (1..8),
+        reducedMIMO-LayersFR1-UL-r16        INTEGER (1..4)
+    } OPTIONAL,
+    reducedMaxMIMO-LayersFR2-r16        SEQUENCE {
+        reducedMIMO-LayersFR2-DL-r16        INTEGER (1..8),
+        reducedMIMO-LayersFR2-UL-r16        INTEGER (1..4)
+    } OPTIONAL
+}
+
+MinSchedulingOffsetPreference-r16 ::= SEQUENCE {
+    preferredK0-r16                       SEQUENCE {
+        preferredK0-SCS-15kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}              OPTIONAL,
+        preferredK0-SCS-30kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}              OPTIONAL,
+        preferredK0-SCS-60kHz-r16             ENUMERATED {sl2, sl4, sl8, sl12}             OPTIONAL,
+        preferredK0-SCS-120kHz-r16            ENUMERATED {sl2, sl4, sl8, sl12}             OPTIONAL
+    }                                                                                  OPTIONAL,
+    preferredK2-r16                       SEQUENCE {
+        preferredK2-SCS-15kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}             OPTIONAL,
+        preferredK2-SCS-30kHz-r16             ENUMERATED {sl1, sl2, sl4, sl6}             OPTIONAL,
+        preferredK2-SCS-60kHz-r16             ENUMERATED {sl2, sl4, sl8, sl12}            OPTIONAL,
+        preferredK2-SCS-120kHz-r16            ENUMERATED {sl2, sl4, sl8, sl12}            OPTIONAL
+    }                                                                                 OPTIONAL
+}
+
+ReleasePreference-r16 ::=           SEQUENCE {
+    preferredRRC-State-r16              ENUMERATED {idle, inactive, connected, outOfConnected}
+}
+
+ReducedMaxBW-FRx-r16 ::=            SEQUENCE {
+    reducedBW-DL-r16                    ReducedAggregatedBandwidth,
+    reducedBW-UL-r16                    ReducedAggregatedBandwidth
+}
+
+ReducedMaxCCs-r16 ::=               SEQUENCE {
+    reducedCCsDL-r16                    INTEGER (0..31),
+    reducedCCsUL-r16                    INTEGER (0..31)
+}
+
+SL-UE-AssistanceInformationNR-r16 ::= SEQUENCE (SIZE (1..maxNrofTrafficPattern-r16)) OF SL-TrafficPatternInfo-r16
+
+SL-TrafficPatternInfo-r16::=          SEQUENCE {
+    trafficPeriodicity-r16                ENUMERATED {ms20, ms50, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+    timingOffset-r16                      INTEGER (0..10239),
+    messageSize-r16                       BIT STRING (SIZE (8)),
+    sl-QoS-FlowIdentity-r16               SL-QoS-FlowIdentity-r16
+}
+
+-- TAG-UEASSISTANCEINFORMATION-STOP
+-- TAG-UECAPABILITYENQUIRY-START
+
+UECapabilityEnquiry ::=             SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        ueCapabilityEnquiry                 UECapabilityEnquiry-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UECapabilityEnquiry-IEs ::=         SEQUENCE {
+    ue-CapabilityRAT-RequestList        UE-CapabilityRAT-RequestList,
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    ue-CapabilityEnquiryExt             OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs)                 OPTIONAL
+}
+
+UECapabilityEnquiry-v1560-IEs ::=   SEQUENCE {
+    capabilityRequestFilterCommon       UE-CapabilityRequestFilterCommon                                        OPTIONAL, -- Need N
+    nonCriticalExtension                UECapabilityEnquiry-v1610-IEs                                           OPTIONAL
+}
+
+UECapabilityEnquiry-v1610-IEs ::=   SEQUENCE {
+    rrc-SegAllowed-r16                    ENUMERATED {enabled}           OPTIONAL, -- Need N
+    nonCriticalExtension                SEQUENCE {}                    OPTIONAL
+}
+
+-- TAG-UECAPABILITYENQUIRY-STOP
+-- TAG-UECAPABILITYINFORMATION-START
+
+UECapabilityInformation ::=         SEQUENCE {
+    rrc-TransactionIdentifier           RRC-TransactionIdentifier,
+    criticalExtensions                  CHOICE {
+        ueCapabilityInformation             UECapabilityInformation-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UECapabilityInformation-IEs ::=     SEQUENCE {
+    ue-CapabilityRAT-ContainerList      UE-CapabilityRAT-ContainerList                                          OPTIONAL,
+
+    lateNonCriticalExtension            OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-UECAPABILITYINFORMATION-STOP
+-- TAG-UEINFORMATIONREQUEST-START
+
+UEInformationRequest-r16 ::=     SEQUENCE {
+    rrc-TransactionIdentifier        RRC-TransactionIdentifier,
+    criticalExtensions               CHOICE {
+        ueInformationRequest-r16         UEInformationRequest-r16-IEs,
+        criticalExtensionsFuture         SEQUENCE {}
+    }
+}
+
+UEInformationRequest-r16-IEs ::= SEQUENCE {
+    idleModeMeasurementReq-r16       ENUMERATED{true}                         OPTIONAL, -- Need N
+    logMeasReportReq-r16             ENUMERATED {true}                        OPTIONAL, -- Need N
+    connEstFailReportReq-r16         ENUMERATED {true}                        OPTIONAL, -- Need N
+    ra-ReportReq-r16                 ENUMERATED {true}                        OPTIONAL, -- Need N
+    rlf-ReportReq-r16                ENUMERATED {true}                        OPTIONAL, -- Need N
+    mobilityHistoryReportReq-r16       ENUMERATED {true}                        OPTIONAL, -- Need N
+    lateNonCriticalExtension         OCTET STRING                             OPTIONAL,
+    nonCriticalExtension             SEQUENCE {}                              OPTIONAL
+}
+
+-- TAG-UEINFORMATIONREQUEST-STOP
+-- TAG-UEINFORMATIONRESPONSE-START
+
+UEInformationResponse-r16 ::=        SEQUENCE {
+    rrc-TransactionIdentifier            RRC-TransactionIdentifier,
+    criticalExtensions                   CHOICE {
+        ueInformationResponse-r16            UEInformationResponse-r16-IEs,
+        criticalExtensionsFuture             SEQUENCE {}
+    }
+}
+
+UEInformationResponse-r16-IEs ::=    SEQUENCE {
+    measResultIdleEUTRA-r16              MeasResultIdleEUTRA-r16             OPTIONAL,
+    measResultIdleNR-r16                 MeasResultIdleNR-r16                OPTIONAL,
+    logMeasReport-r16                    LogMeasReport-r16                   OPTIONAL,
+    connEstFailReport-r16                ConnEstFailReport-r16               OPTIONAL,
+    ra-ReportList-r16                    RA-ReportList-r16                   OPTIONAL,
+    rlf-Report-r16                       RLF-Report-r16                      OPTIONAL,
+    mobilityHistoryReport-r16            MobilityHistoryReport-r16           OPTIONAL,
+    lateNonCriticalExtension             OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                 SEQUENCE {}                         OPTIONAL
+}
+
+LogMeasReport-r16 ::=                SEQUENCE {
+    absoluteTimeStamp-r16                AbsoluteTimeInfo-r16,
+    traceReference-r16                   TraceReference-r16,
+    traceRecordingSessionRef-r16         OCTET STRING (SIZE (2)),
+    tce-Id-r16                           OCTET STRING (SIZE (1)),
+    logMeasInfoList-r16                  LogMeasInfoList-r16,
+    logMeasAvailable-r16                 ENUMERATED {true}                   OPTIONAL,
+    logMeasAvailableBT-r16               ENUMERATED {true}                   OPTIONAL,
+    logMeasAvailableWLAN-r16             ENUMERATED {true}                   OPTIONAL,
+    ...
+}
+
+LogMeasInfoList-r16 ::=              SEQUENCE (SIZE (1..maxLogMeasReport-r16)) OF LogMeasInfo-r16
+
+LogMeasInfo-r16 ::=                  SEQUENCE {
+    locationInfo-r16                     LocationInfo-r16                    OPTIONAL,
+    relativeTimeStamp-r16                INTEGER (0..7200),
+    servCellIdentity-r16                 CGI-Info-Logging-r16                OPTIONAL,
+    measResultServingCell-r16            MeasResultServingCell-r16           OPTIONAL,
+    measResultNeighCells-r16             SEQUENCE {
+        measResultNeighCellListNR            MeasResultListLogging2NR-r16        OPTIONAL,
+        measResultNeighCellListEUTRA         MeasResultList2EUTRA-r16            OPTIONAL
+    },
+    anyCellSelectionDetected-r16         ENUMERATED {true}                   OPTIONAL,
+    ...
+}
+
+ConnEstFailReport-r16 ::=            SEQUENCE {
+    measResultFailedCell-r16             MeasResultFailedCell-r16,
+    locationInfo-r16                     LocationInfo-r16                    OPTIONAL,
+    measResultNeighCells-r16             SEQUENCE {
+        measResultNeighCellListNR            MeasResultList2NR-r16               OPTIONAL,
+        measResultNeighCellListEUTRA         MeasResultList2EUTRA-r16            OPTIONAL
+    },
+    numberOfConnFail-r16                 INTEGER (1..8),
+    perRAInfoList-r16                            PerRAInfoList-r16,
+    timeSinceFailure-r16                 TimeSinceFailure-r16,
+    ...
+}
+
+MeasResultServingCell-r16 ::=        SEQUENCE {
+    resultsSSB-Cell                      MeasQuantityResults,
+    resultsSSB                           SEQUENCE{
+        best-ssb-Index                       SSB-Index,
+        best-ssb-Results                     MeasQuantityResults,
+        numberOfGoodSSB                      INTEGER (1..maxNrofSSBs-r16)
+    }                                                                        OPTIONAL
+}
+
+MeasResultFailedCell-r16 ::=         SEQUENCE {
+    cgi-Info                             CGI-Info-Logging-r16,
+    measResult-r16                       SEQUENCE {
+        cellResults-r16                      SEQUENCE{
+            resultsSSB-Cell-r16                  MeasQuantityResults
+        },
+        rsIndexResults-r16                   SEQUENCE{
+            resultsSSB-Indexes-r16               ResultsPerSSB-IndexList
+        }
+    }
+}
+
+RA-ReportList-r16 ::= SEQUENCE (SIZE (1..maxRAReport-r16)) OF RA-Report-r16
+
+RA-Report-r16 ::=                    SEQUENCE {
+    cellId-r16                           CHOICE {
+        cellGlobalId-r16                     CGI-Info-Logging-r16,
+        pci-arfcn-r16                        SEQUENCE {
+            physCellId-r16                       PhysCellId,
+            carrierFreq-r16                      ARFCN-ValueNR
+        }
+    },
+    ra-InformationCommon-r16             RA-InformationCommon-r16                         OPTIONAL,
+    raPurpose-r16                        ENUMERATED {accessRelated, beamFailureRecovery, reconfigurationWithSync, ulUnSynchronized,
+                                                    schedulingRequestFailure, noPUCCHResourceAvailable, requestForOtherSI,
+                                                    spare9, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+    ...
+}
+
+RA-InformationCommon-r16 ::=         SEQUENCE {
+    absoluteFrequencyPointA-r16          ARFCN-ValueNR,
+    locationAndBandwidth-r16             INTEGER (0..37949),
+    subcarrierSpacing-r16                SubcarrierSpacing,
+    msg1-FrequencyStart-r16              INTEGER (0..maxNrofPhysicalResourceBlocks-1)     OPTIONAL,
+    msg1-FrequencyStartCFRA-r16          INTEGER (0..maxNrofPhysicalResourceBlocks-1)     OPTIONAL,
+    msg1-SubcarrierSpacing-r16           SubcarrierSpacing                                OPTIONAL,
+    msg1-SubcarrierSpacingCFRA-r16       SubcarrierSpacing                                OPTIONAL,
+    msg1-FDM-r16                         ENUMERATED {one, two, four, eight}               OPTIONAL,
+    msg1-FDMCFRA-r16                     ENUMERATED {one, two, four, eight}               OPTIONAL,
+    perRAInfoList-r16                    PerRAInfoList-r16,
+    ...
+}
+
+PerRAInfoList-r16 ::= SEQUENCE (SIZE (1..200)) OF PerRAInfo-r16
+
+PerRAInfo-r16 ::=                    CHOICE {
+    perRASSBInfoList-r16                 PerRASSBInfo-r16,
+    perRACSI-RSInfoList-r16              PerRACSI-RSInfo-r16
+}
+
+PerRASSBInfo-r16 ::=                 SEQUENCE {
+    ssb-Index-r16                        SSB-Index,
+    numberOfPreamblesSentOnSSB-r16       INTEGER (1..200),
+    perRAAttemptInfoList-r16             PerRAAttemptInfoList-r16
+}
+
+PerRACSI-RSInfo-r16 ::=              SEQUENCE {
+    csi-RS-Index-r16                     CSI-RS-Index,
+    numberOfPreamblesSentOnCSI-RS-r16    INTEGER (1..200)
+}
+
+PerRAAttemptInfoList-r16 ::=         SEQUENCE (SIZE (1..200)) OF PerRAAttemptInfo-r16
+
+PerRAAttemptInfo-r16 ::=             SEQUENCE {
+    contentionDetected-r16               BOOLEAN                OPTIONAL,
+    dlRSRPAboveThreshold-r16             BOOLEAN                OPTIONAL,
+    ...
+}
+
+RLF-Report-r16 ::=                   CHOICE {
+    nr-RLF-Report-r16                    SEQUENCE {
+        measResultLastServCell-r16           MeasResultRLFNR-r16,
+        measResultNeighCells-r16             SEQUENCE {
+            measResultListNR-r16                 MeasResultList2NR-r16       OPTIONAL,
+            measResultListEUTRA-r16              MeasResultList2EUTRA-r16    OPTIONAL
+        }                                                OPTIONAL,
+        c-RNTI-r16                           RNTI-Value,
+        previousPCellId-r16                  CHOICE {
+            nrPreviousCell-r16                   CGI-Info-Logging-r16,
+            eutraPreviousCell-r16                CGI-InfoEUTRALogging
+        }                                                                    OPTIONAL,
+        failedPCellId-r16                    CHOICE {
+            nrFailedPCellId-r16                  CHOICE {
+                cellGlobalId-r16                     CGI-Info-Logging-r16,
+                pci-arfcn-r16                        SEQUENCE {
+                    physCellId-r16                       PhysCellId,
+                    carrierFreq-r16                      ARFCN-ValueNR
+                }
+            },
+            eutraFailedPCellId-r16           CHOICE {
+                cellGlobalId-r16                 CGI-InfoEUTRALogging,
+                pci-arfcn-r16                    SEQUENCE {
+                    physCellId-r16                   EUTRA-PhysCellId,
+                    carrierFreq-r16                  ARFCN-ValueEUTRA
+                }
+            }
+        },
+        reconnectCellId-r16                  CHOICE {
+            nrReconnectCellId-r16                CGI-Info-Logging-r16,
+            eutraReconnectCellId-r16             CGI-InfoEUTRALogging
+        }                                                                                        OPTIONAL,
+        timeUntilReconnection-16             TimeUntilReconnection-16                            OPTIONAL,
+        reestablishmentCellId-r16            CGI-Info-Logging-r16                                OPTIONAL,
+        timeConnFailure-r16                  INTEGER (0..1023)                                   OPTIONAL,
+        timeSinceFailure-r16                 TimeSinceFailure-r16,
+        connectionFailureType-r16            ENUMERATED {rlf, hof},
+        rlf-Cause-r16                        ENUMERATED {t310-Expiry, randomAccessProblem, rlc-MaxNumRetx,
+                                                         beamFailureRecoveryFailure, lbtFailure-r16,
+                                                         bh-rlfRecoveryFailure, spare2, spare1},
+        locationInfo-r16                     LocationInfo-r16                                    OPTIONAL,
+        noSuitableCellFound-r16              ENUMERATED {true}                                   OPTIONAL,
+        ra-InformationCommon-r16             RA-InformationCommon-r16                            OPTIONAL,
+        ...
+    },
+    eutra-RLF-Report-r16                 SEQUENCE {
+        failedPCellId-EUTRA                  CGI-InfoEUTRALogging,
+        measResult-RLF-Report-EUTRA-r16      OCTET STRING,
+        ...
+    }
+}
+
+MeasResultList2NR-r16 ::=            SEQUENCE(SIZE (1..maxFreq)) OF MeasResult2NR-r16
+MeasResultList2EUTRA-r16 ::=         SEQUENCE(SIZE (1..maxFreq)) OF MeasResult2EUTRA-r16
+
+MeasResult2NR-r16 ::=                SEQUENCE {
+    ssbFrequency-r16                     ARFCN-ValueNR                                           OPTIONAL,
+    refFreqCSI-RS-r16                    ARFCN-ValueNR                                           OPTIONAL,
+    measResultList-r16                   MeasResultListNR
+}
+
+MeasResultListLogging2NR-r16 ::=     SEQUENCE(SIZE (1..maxFreq)) OF MeasResultLogging2NR-r16
+
+MeasResultLogging2NR-r16 ::=         SEQUENCE {
+    carrierFreq-r16                      ARFCN-ValueNR,
+    measResultListLoggingNR-r16          MeasResultListLoggingNR-r16
+}
+
+MeasResultListLoggingNR-r16 ::=      SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultLoggingNR-r16
+
+MeasResultLoggingNR-r16 ::=          SEQUENCE {
+    physCellId-r16                       PhysCellId,
+    resultsSSB-Cell-r16                  MeasQuantityResults,
+    numberOfGoodSSB-r16                  INTEGER (1..maxNrofSSBs-r16) OPTIONAL
+}
+
+MeasResult2EUTRA-r16 ::=             SEQUENCE {
+    carrierFreq-r16                      ARFCN-ValueEUTRA,
+    measResultList-r16                   MeasResultListEUTRA
+}
+
+MeasResultRLFNR-r16 ::=              SEQUENCE {
+    measResult-r16                       SEQUENCE {
+        cellResults-r16                      SEQUENCE{
+            resultsSSB-Cell-r16                  MeasQuantityResults                             OPTIONAL,
+            resultsCSI-RS-Cell-r16               MeasQuantityResults                             OPTIONAL
+        },
+        rsIndexResults-r16                   SEQUENCE{
+            resultsSSB-Indexes-r16               ResultsPerSSB-IndexList                         OPTIONAL,
+            ssbRLMConfigBitmap-r16               BIT STRING (SIZE (64))                          OPTIONAL,
+            resultsCSI-RS-Indexes-r16            ResultsPerCSI-RS-IndexList                      OPTIONAL,
+            csi-rsRLMConfigBitmap-r16            BIT STRING (SIZE (96))                          OPTIONAL
+        }                                                                                    OPTIONAL
+    }
+}
+
+TimeSinceFailure-r16 ::= INTEGER (0..172800)
+
+MobilityHistoryReport-r16 ::= VisitedCellInfoList-r16
+
+TimeUntilReconnection-16 ::= INTEGER (0..172800)
+
+-- TAG-UEINFORMATIONRESPONSE-STOP
+-- TAG-ULDEDICATEDMESSAGESEGMENT-START
+
+ULDedicatedMessageSegment-r16 ::=       SEQUENCE {
+    criticalExtensions                      CHOICE {
+        ulDedicatedMessageSegment-r16           ULDedicatedMessageSegment-r16-IEs,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+ULDedicatedMessageSegment-r16-IEs ::=     SEQUENCE {
+    segmentNumber-r16                         INTEGER (0..15),
+    rrc-MessageSegmentContainer-r16           OCTET STRING,
+    rrc-MessageSegmentType-r16                ENUMERATED {notLastSegment, lastSegment},
+    lateNonCriticalExtension                  OCTET STRING                                  OPTIONAL,
+    nonCriticalExtension                      SEQUENCE {}                                   OPTIONAL
+}
+
+-- TAG-ULDEDICATEDMESSAGESEGMENT-STOP
+-- TAG-ULINFORMATIONTRANSFER-START
+
+ULInformationTransfer ::=           SEQUENCE {
+    criticalExtensions                  CHOICE {
+        ulInformationTransfer               ULInformationTransfer-IEs,
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+ULInformationTransfer-IEs ::=       SEQUENCE {
+    dedicatedNAS-Message                DedicatedNAS-Message                OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFER-STOP
+-- TAG-ULINFORMATIONTRANSFERIRAT-START
+
+ULInformationTransferIRAT-r16 ::=              SEQUENCE {
+    criticalExtensions                                CHOICE {
+        c1                                                   CHOICE {
+            ulInformationTransferIRAT-r16                    ULInformationTransferIRAT-r16-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture                     SEQUENCE {}
+    }
+}
+
+ULInformationTransferIRAT-r16-IEs ::=        SEQUENCE {
+    ul-DCCH-MessageEUTRA-r16                           OCTET STRING             OPTIONAL,
+    lateNonCriticalExtension                           OCTET STRING              OPTIONAL,
+    nonCriticalExtension                                 SEQUENCE {}               OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFERIRAT-STOP
+-- TAG-ULINFORMATIONTRANSFERMRDC-START
+
+ULInformationTransferMRDC ::=               SEQUENCE {
+    criticalExtensions                          CHOICE {
+        c1                                          CHOICE {
+            ulInformationTransferMRDC                   ULInformationTransferMRDC-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+ULInformationTransferMRDC-IEs::=           SEQUENCE {
+    ul-DCCH-MessageNR                           OCTET STRING                    OPTIONAL,
+    ul-DCCH-MessageEUTRA                        OCTET STRING                    OPTIONAL,
+    lateNonCriticalExtension                    OCTET STRING                    OPTIONAL,
+    nonCriticalExtension                        SEQUENCE {}                     OPTIONAL
+}
+
+-- TAG-ULINFORMATIONTRANSFERMRDC-STOP
+-- TAG-SETUPRELEASE-START
+
+SetupRelease { ElementTypeParam } ::= CHOICE {
+    release         NULL,
+    setup           ElementTypeParam
+}
+
+-- TAG-SETUPRELEASE-STOP
+-- TAG-SIB2-START
+
+SIB2 ::=                            SEQUENCE {
+    cellReselectionInfoCommon           SEQUENCE {
+        nrofSS-BlocksToAverage              INTEGER (2..maxNrofSS-BlocksToAverage)          OPTIONAL,       -- Need S
+        absThreshSS-BlocksConsolidation     ThresholdNR                                     OPTIONAL,       -- Need S
+        rangeToBestCell                     RangeToBestCell                                 OPTIONAL,       -- Need R
+        q-Hyst                              ENUMERATED {
+                                                dB0, dB1, dB2, dB3, dB4, dB5, dB6, dB8, dB10,
+                                                dB12, dB14, dB16, dB18, dB20, dB22, dB24},
+        speedStateReselectionPars           SEQUENCE {
+            mobilityStateParameters             MobilityStateParameters,
+            q-HystSF                        SEQUENCE {
+                sf-Medium                       ENUMERATED {dB-6, dB-4, dB-2, dB0},
+                sf-High                         ENUMERATED {dB-6, dB-4, dB-2, dB0}
+            }
+        }                                                                                   OPTIONAL,       -- Need R
+    ...
+    },
+    cellReselectionServingFreqInfo      SEQUENCE {
+        s-NonIntraSearchP                   ReselectionThreshold                            OPTIONAL,       -- Need S
+        s-NonIntraSearchQ                   ReselectionThresholdQ                           OPTIONAL,       -- Need S
+        threshServingLowP                   ReselectionThreshold,
+        threshServingLowQ                   ReselectionThresholdQ                           OPTIONAL,       -- Need R
+        cellReselectionPriority             CellReselectionPriority,
+        cellReselectionSubPriority          CellReselectionSubPriority                      OPTIONAL,       -- Need R
+        ...
+    },
+    intraFreqCellReselectionInfo        SEQUENCE {
+        q-RxLevMin                          Q-RxLevMin,
+        q-RxLevMinSUL                       Q-RxLevMin                                      OPTIONAL,       -- Need R
+        q-QualMin                           Q-QualMin                                       OPTIONAL,       -- Need S
+        s-IntraSearchP                      ReselectionThreshold,
+        s-IntraSearchQ                      ReselectionThresholdQ                           OPTIONAL,       -- Need S
+        t-ReselectionNR                     T-Reselection,
+        frequencyBandList                   MultiFrequencyBandListNR-SIB                    OPTIONAL,       -- Need S
+        frequencyBandListSUL                MultiFrequencyBandListNR-SIB                    OPTIONAL,       -- Need R
+        p-Max                               P-Max                                           OPTIONAL,       -- Need S
+        smtc                                SSB-MTC                                         OPTIONAL,       -- Need S
+        ss-RSSI-Measurement                 SS-RSSI-Measurement                             OPTIONAL,       -- Need R
+        ssb-ToMeasure                       SSB-ToMeasure                                   OPTIONAL,       -- Need S
+        deriveSSB-IndexFromCell             BOOLEAN,
+        ...,
+        [[
+        t-ReselectionNR-SF                  SpeedStateScaleFactors                          OPTIONAL        -- Need N
+        ]],
+        [[
+        smtc2-LP-r16                        SSB-MTC2-LP-r16                                 OPTIONAL,        -- Need R
+        ssb-PositionQCL-Common-r16          SSB-PositionQCL-Relation-r16                    OPTIONAL         -- Cond SharedSpectrum
+        ]]
+    },
+    ...,
+    [[
+    relaxedMeasurement-r16              SEQUENCE {
+        lowMobilityEvaluation-r16           SEQUENCE {
+            s-SearchDeltaP-r16                  ENUMERATED {
+                                                    dB3, dB6, dB9, dB12, dB15,
+                                                    spare3, spare2, spare1},
+            t-SearchDeltaP-r16                  ENUMERATED {
+                                                    s5, s10, s20, s30, s60, s120, s180,
+                                                    s240, s300, spare7, spare6, spare5,
+                                                    spare4, spare3, spare2, spare1}
+        }                                                                                   OPTIONAL,       -- Need R
+        cellEdgeEvaluation-r16              SEQUENCE {
+            s-SearchThresholdP-r16              ReselectionThreshold,
+            s-SearchThresholdQ-r16              ReselectionThresholdQ                       OPTIONAL        -- Need R
+        }                                                                                   OPTIONAL,       -- Need R
+        combineRelaxedMeasCondition-r16     ENUMERATED {true}                               OPTIONAL,       -- Need R
+        highPriorityMeasRelax-r16           ENUMERATED {true}                               OPTIONAL        -- Need R
+    }                                                                                       OPTIONAL        -- Need R
+    ]]
+}
+
+RangeToBestCell    ::= Q-OffsetRange
+
+-- TAG-SIB2-STOP
+-- TAG-SIB3-START
+
+SIB3 ::=                            SEQUENCE {
+    intraFreqNeighCellList              IntraFreqNeighCellList                                          OPTIONAL,   -- Need R
+    intraFreqBlackCellList              IntraFreqBlackCellList                                          OPTIONAL,   -- Need R
+    lateNonCriticalExtension            OCTET STRING                                                    OPTIONAL,
+    ...,
+    [[
+    intraFreqNeighCellList-v1610        IntraFreqNeighCellList-v1610                                    OPTIONAL,   -- Need R
+    intraFreqWhiteCellList-r16          IntraFreqWhiteCellList-r16                                      OPTIONAL,   -- Cond SharedSpectrum2
+    intraFreqCAG-CellList-r16           SEQUENCE (SIZE (1..maxPLMN)) OF IntraFreqCAG-CellListPerPLMN-r16    OPTIONAL    -- Need R
+    ]]
+}
+
+
+IntraFreqNeighCellList ::=          SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo
+
+IntraFreqNeighCellList-v1610::=     SEQUENCE (SIZE (1..maxCellIntra)) OF IntraFreqNeighCellInfo-v1610
+
+IntraFreqNeighCellInfo ::=          SEQUENCE {
+    physCellId                          PhysCellId,
+    q-OffsetCell                        Q-OffsetRange,
+    q-RxLevMinOffsetCell                INTEGER (1..8)                                  OPTIONAL,   -- Need R
+    q-RxLevMinOffsetCellSUL             INTEGER (1..8)                                  OPTIONAL,   -- Need R
+    q-QualMinOffsetCell                 INTEGER (1..8)                                  OPTIONAL,   -- Need R
+    ...
+}
+
+IntraFreqNeighCellInfo-v1610 ::=     SEQUENCE {
+    ssb-PositionQCL-r16                 SSB-PositionQCL-Relation-r16                    OPTIONAL   -- Cond SharedSpectrum2
+}
+
+IntraFreqBlackCellList ::=          SEQUENCE (SIZE (1..maxCellBlack)) OF PCI-Range
+
+IntraFreqWhiteCellList-r16 ::=      SEQUENCE (SIZE (1..maxCellWhite)) OF PCI-Range
+
+IntraFreqCAG-CellListPerPLMN-r16 ::= SEQUENCE {
+    plmn-IdentityIndex-r16               INTEGER (1..maxPLMN),
+    cag-CellList-r16                     SEQUENCE (SIZE (1..maxCAG-Cell-r16)) OF PCI-Range
+}
+
+-- TAG-SIB3-STOP
+-- TAG-SIB4-START
+
+SIB4 ::=                            SEQUENCE {
+    interFreqCarrierFreqList            InterFreqCarrierFreqList,
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...,
+    [[
+    interFreqCarrierFreqList-v1610      InterFreqCarrierFreqList-v1610              OPTIONAL   -- Need R
+    ]]
+}
+
+InterFreqCarrierFreqList ::=        SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo
+
+InterFreqCarrierFreqList-v1610 ::=  SEQUENCE (SIZE (1..maxFreq)) OF InterFreqCarrierFreqInfo-v1610
+
+InterFreqCarrierFreqInfo ::=        SEQUENCE {
+    dl-CarrierFreq                      ARFCN-ValueNR,
+    frequencyBandList                   MultiFrequencyBandListNR-SIB                                OPTIONAL,   -- Cond Mandatory
+    frequencyBandListSUL                MultiFrequencyBandListNR-SIB                                OPTIONAL,   -- Need R
+    nrofSS-BlocksToAverage              INTEGER (2..maxNrofSS-BlocksToAverage)                      OPTIONAL,   -- Need S
+    absThreshSS-BlocksConsolidation     ThresholdNR                                                 OPTIONAL,   -- Need S
+    smtc                                SSB-MTC                                                     OPTIONAL,   -- Need S
+    ssbSubcarrierSpacing                SubcarrierSpacing,
+    ssb-ToMeasure                       SSB-ToMeasure                                               OPTIONAL,   -- Need S
+    deriveSSB-IndexFromCell             BOOLEAN,
+    ss-RSSI-Measurement                 SS-RSSI-Measurement                                         OPTIONAL,
+    q-RxLevMin                          Q-RxLevMin,
+    q-RxLevMinSUL                       Q-RxLevMin                                                  OPTIONAL,   -- Need R
+    q-QualMin                           Q-QualMin                                                   OPTIONAL,   -- Need S
+    p-Max                               P-Max                                                       OPTIONAL,   -- Need S
+    t-ReselectionNR                     T-Reselection,
+    t-ReselectionNR-SF                  SpeedStateScaleFactors                                      OPTIONAL,   -- Need S
+    threshX-HighP                       ReselectionThreshold,
+    threshX-LowP                        ReselectionThreshold,
+    threshX-Q                           SEQUENCE {
+        threshX-HighQ                       ReselectionThresholdQ,
+        threshX-LowQ                        ReselectionThresholdQ
+    }                                                                                               OPTIONAL,   -- Cond RSRQ
+    cellReselectionPriority             CellReselectionPriority                                     OPTIONAL,   -- Need R
+    cellReselectionSubPriority          CellReselectionSubPriority                                  OPTIONAL,   -- Need R
+    q-OffsetFreq                        Q-OffsetRange                                               DEFAULT dB0,
+    interFreqNeighCellList              InterFreqNeighCellList                                      OPTIONAL,   -- Need R
+    interFreqBlackCellList              InterFreqBlackCellList                                      OPTIONAL,   -- Need R
+    ...
+}
+
+InterFreqCarrierFreqInfo-v1610 ::=  SEQUENCE {
+    interFreqNeighCellList-v1610        InterFreqNeighCellList-v1610                                OPTIONAL,    -- Need R
+    smtc2-LP-r16                        SSB-MTC2-LP-r16                                             OPTIONAL,    -- Need R
+    interFreqWhiteCellList-r16          InterFreqWhiteCellList-r16                                  OPTIONAL,    -- Cond SharedSpectrum2
+    ssb-PositionQCL-Common-r16          SSB-PositionQCL-Relation-r16                                OPTIONAL,    -- Cond SharedSpectrum
+    interFreqCAG-CellList-r16           SEQUENCE (SIZE (1..maxPLMN)) OF InterFreqCAG-CellListPerPLMN-r16   OPTIONAL     -- Need R
+}
+
+InterFreqNeighCellList ::=          SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo
+
+InterFreqNeighCellList-v1610 ::=    SEQUENCE (SIZE (1..maxCellInter)) OF InterFreqNeighCellInfo-v1610
+
+InterFreqNeighCellInfo ::=          SEQUENCE {
+    physCellId                          PhysCellId,
+    q-OffsetCell                        Q-OffsetRange,
+    q-RxLevMinOffsetCell                INTEGER (1..8)                                              OPTIONAL,   -- Need R
+    q-RxLevMinOffsetCellSUL             INTEGER (1..8)                                              OPTIONAL,   -- Need R
+    q-QualMinOffsetCell                 INTEGER (1..8)                                              OPTIONAL,   -- Need R
+    ...
+}
+
+InterFreqNeighCellInfo-v1610 ::=    SEQUENCE {
+    ssb-PositionQCL-r16                 SSB-PositionQCL-Relation-r16                                OPTIONAL    -- Cond SharedSpectrum2
+}
+
+InterFreqBlackCellList ::=          SEQUENCE (SIZE (1..maxCellBlack)) OF PCI-Range
+
+InterFreqWhiteCellList-r16 ::=      SEQUENCE (SIZE (1..maxCellWhite)) OF PCI-Range
+
+InterFreqCAG-CellListPerPLMN-r16 ::= SEQUENCE {
+    plmn-IdentityIndex-r16              INTEGER (1..maxPLMN),
+    cag-CellList-r16                    SEQUENCE (SIZE (1..maxCAG-Cell-r16)) OF PCI-Range
+}
+
+-- TAG-SIB4-STOP
+-- TAG-SIB5-START
+
+SIB5 ::=                            SEQUENCE {
+    carrierFreqListEUTRA                CarrierFreqListEUTRA                        OPTIONAL,       -- Need R
+    t-ReselectionEUTRA                  T-Reselection,
+    t-ReselectionEUTRA-SF               SpeedStateScaleFactors                      OPTIONAL,       -- Need S
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...,
+    [[
+    carrierFreqListEUTRA-v1610      CarrierFreqListEUTRA-v1610                      OPTIONAL        -- Need R
+    ]]
+}
+
+CarrierFreqListEUTRA ::=            SEQUENCE (SIZE (1..maxEUTRA-Carrier)) OF CarrierFreqEUTRA
+
+CarrierFreqListEUTRA-v1610 ::=      SEQUENCE (SIZE (1..maxEUTRA-Carrier)) OF CarrierFreqEUTRA-v1610
+
+CarrierFreqEUTRA ::=                SEQUENCE {
+    carrierFreq                         ARFCN-ValueEUTRA,
+    eutra-multiBandInfoList             EUTRA-MultiBandInfoList                     OPTIONAL,       -- Need R
+    eutra-FreqNeighCellList             EUTRA-FreqNeighCellList                     OPTIONAL,       -- Need R
+    eutra-BlackCellList                 EUTRA-FreqBlackCellList                     OPTIONAL,       -- Need R
+    allowedMeasBandwidth                EUTRA-AllowedMeasBandwidth,
+    presenceAntennaPort1                EUTRA-PresenceAntennaPort1,
+    cellReselectionPriority             CellReselectionPriority                     OPTIONAL,       -- Need R
+    cellReselectionSubPriority          CellReselectionSubPriority                  OPTIONAL,       -- Need R
+    threshX-High                        ReselectionThreshold,
+    threshX-Low                         ReselectionThreshold,
+    q-RxLevMin                          INTEGER (-70..-22),
+    q-QualMin                           INTEGER (-34..-3),
+    p-MaxEUTRA                          INTEGER (-30..33),
+    threshX-Q                           SEQUENCE {
+        threshX-HighQ                       ReselectionThresholdQ,
+        threshX-LowQ                        ReselectionThresholdQ
+    }                                                                               OPTIONAL        -- Cond RSRQ
+}
+
+CarrierFreqEUTRA-v1610 ::= SEQUENCE {
+    highSpeedEUTRACarrier-r16       ENUMERATED {true}                               OPTIONAL        -- Need R
+}
+
+EUTRA-FreqBlackCellList ::=         SEQUENCE (SIZE (1..maxEUTRA-CellBlack)) OF EUTRA-PhysCellIdRange
+
+EUTRA-FreqNeighCellList ::=         SEQUENCE (SIZE (1..maxCellEUTRA)) OF EUTRA-FreqNeighCellInfo
+
+EUTRA-FreqNeighCellInfo ::=         SEQUENCE {
+    physCellId                          EUTRA-PhysCellId,
+    dummy                               EUTRA-Q-OffsetRange,
+    q-RxLevMinOffsetCell                INTEGER (1..8)                              OPTIONAL,       -- Need R
+    q-QualMinOffsetCell                 INTEGER (1..8)                              OPTIONAL        -- Need R
+}
+
+-- TAG-SIB5-STOP
+-- TAG-SIB6-START
+
+SIB6 ::=                            SEQUENCE {
+    messageIdentifier                   BIT STRING (SIZE (16)),
+    serialNumber                        BIT STRING (SIZE (16)),
+    warningType                         OCTET STRING (SIZE (2)),
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...
+}
+
+-- TAG-SIB6-STOP
+-- TAG-SIB7-START
+
+SIB7 ::=                            SEQUENCE {
+    messageIdentifier                   BIT STRING (SIZE (16)),
+    serialNumber                        BIT STRING (SIZE (16)),
+    warningMessageSegmentType           ENUMERATED {notLastSegment, lastSegment},
+    warningMessageSegmentNumber         INTEGER (0..63),
+    warningMessageSegment               OCTET STRING,
+    dataCodingScheme                    OCTET STRING (SIZE (1))                     OPTIONAL,   -- Cond Segment1
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...
+}
+
+-- TAG-SIB7-STOP
+-- TAG-SIB8-START
+
+SIB8 ::=                        SEQUENCE {
+    messageIdentifier               BIT STRING (SIZE (16)),
+    serialNumber                    BIT STRING (SIZE (16)),
+    warningMessageSegmentType       ENUMERATED {notLastSegment, lastSegment},
+    warningMessageSegmentNumber     INTEGER (0..63),
+    warningMessageSegment           OCTET STRING,
+    dataCodingScheme                OCTET STRING (SIZE (1))                         OPTIONAL,   -- Cond Segment1
+    warningAreaCoordinatesSegment   OCTET STRING                                    OPTIONAL,   -- Need R
+    lateNonCriticalExtension        OCTET STRING                                    OPTIONAL,
+    ...
+}
+
+-- TAG-SIB8-STOP
+-- TAG-SIB9-START
+
+SIB9 ::=                            SEQUENCE {
+    timeInfo                            SEQUENCE {
+        timeInfoUTC                         INTEGER (0..549755813887),
+        dayLightSavingTime                  BIT STRING (SIZE (2))                   OPTIONAL,   -- Need R
+        leapSeconds                         INTEGER (-127..128)                     OPTIONAL,   -- Need R
+        localTimeOffset                     INTEGER (-63..64)                       OPTIONAL    -- Need R
+    }                                                                               OPTIONAL,   -- Need R
+    lateNonCriticalExtension            OCTET STRING                                OPTIONAL,
+    ...,
+     [[
+    referenceTimeInfo-r16           ReferenceTimeInfo-r16                           OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-SIB9-STOP
+-- TAG-SIB10-START
+
+SIB10-r16 ::=               SEQUENCE {
+    hrnn-List-r16               HRNN-List-r16                                   OPTIONAL,   -- Need R
+    lateNonCriticalExtension    OCTET STRING                                    OPTIONAL,
+    ...
+}
+
+HRNN-List-r16 ::=           SEQUENCE (SIZE (1..maxNPN-r16)) OF HRNN-r16
+
+HRNN-r16 ::=                SEQUENCE {
+    hrnn-r16                    OCTET STRING (SIZE(1.. maxHRNN-Len-r16))        OPTIONAL   -- Need R
+}
+
+-- TAG-SIB10-STOP
+-- TAG-SIB11-START
+
+SIB11-r16 ::=                    SEQUENCE {
+    measIdleConfigSIB-r16            MeasIdleConfigSIB-r16                       OPTIONAL, -- Need S
+    lateNonCriticalExtension         OCTET STRING                                OPTIONAL,
+    ...
+}
+
+-- TAG-SIB11-STOP
+-- TAG-SIB12-START
+
+SIB12-r16 ::=                 SEQUENCE {
+    segmentNumber-r16             INTEGER (0..63),
+    segmentType-r16               ENUMERATED {notLastSegment, lastSegment},
+    segmentContainer-r16          OCTET STRING
+}
+
+SIB12-IEs-r16 ::=             SEQUENCE {
+    sl-ConfigCommonNR-r16         SL-ConfigCommonNR-r16,
+    lateNonCriticalExtension      OCTET STRING                   OPTIONAL,
+    ...
+}
+
+SL-ConfigCommonNR-r16 ::=        SEQUENCE {
+    sl-FreqInfoList-r16                  SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfigCommon-r16      OPTIONAL,    -- Need R
+    sl-UE-SelectedConfig-r16             SL-UE-SelectedConfig-r16                                               OPTIONAL,    -- Need R
+    sl-NR-AnchorCarrierFreqList-r16      SL-NR-AnchorCarrierFreqList-r16                                        OPTIONAL,    -- Need R
+    sl-EUTRA-AnchorCarrierFreqList-r16   SL-EUTRA-AnchorCarrierFreqList-r16                                     OPTIONAL,    -- Need R
+    sl-RadioBearerConfigList-r16         SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16       OPTIONAL,    -- Need R
+    sl-RLC-BearerConfigList-r16          SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16         OPTIONAL,    -- Need R
+    sl-MeasConfigCommon-r16              SL-MeasConfigCommon-r16                                                OPTIONAL,    -- Need R
+    sl-CSI-Acquisition-r16               ENUMERATED {enabled}                                                   OPTIONAL,    -- Need R
+    sl-OffsetDFN-r16                     INTEGER (1..1000)                                                      OPTIONAL,    -- Need R
+    t400-r16                             ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL,    -- Need R
+    sl-MaxNumConsecutiveDTX-r16          ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32}                          OPTIONAL,    -- Need R
+    sl-SSB-PriorityNR-r16                INTEGER (1..8)                                                         OPTIONAL     -- Need R
+}
+
+SL-NR-AnchorCarrierFreqList-r16 ::=  SEQUENCE (SIZE (1..maxFreqSL-NR-r16)) OF ARFCN-ValueNR
+
+SL-EUTRA-AnchorCarrierFreqList-r16 ::= SEQUENCE (SIZE (1..maxFreqSL-EUTRA-r16)) OF ARFCN-ValueEUTRA
+
+-- TAG-SIB12-STOP
+-- TAG-SIB13-START
+
+SIB13-r16 ::=                       SEQUENCE {
+    sl-V2X-ConfigCommon-r16             OCTET STRING,
+    dummy                               OCTET STRING,
+    tdd-Config-r16                      OCTET STRING,
+    lateNonCriticalExtension            OCTET STRING                          OPTIONAL,
+    ...
+}
+
+-- TAG-SIB13-STOP
+-- TAG-SIB14-START
+
+SIB14-r16 ::=                      SEQUENCE {
+    sl-V2X-ConfigCommonExt-r16         OCTET STRING,
+    lateNonCriticalExtension           OCTET STRING                          OPTIONAL,
+    ...
+}
+
+-- TAG-SIB14-STOP
+-- TAG-POSSYSTEMINFORMATION-R16-IES-START
+
+PosSystemInformation-r16-IEs ::= SEQUENCE {
+    posSIB-TypeAndInfo-r16           SEQUENCE (SIZE (1..maxSIB)) OF CHOICE {
+        posSib1-1-r16                    SIBpos-r16,
+        posSib1-2-r16                    SIBpos-r16,
+        posSib1-3-r16                    SIBpos-r16,
+        posSib1-4-r16                    SIBpos-r16,
+        posSib1-5-r16                    SIBpos-r16,
+        posSib1-6-r16                    SIBpos-r16,
+        posSib1-7-r16                    SIBpos-r16,
+        posSib1-8-r16                    SIBpos-r16,
+        posSib2-1-r16                    SIBpos-r16,
+        posSib2-2-r16                    SIBpos-r16,
+        posSib2-3-r16                    SIBpos-r16,
+        posSib2-4-r16                    SIBpos-r16,
+        posSib2-5-r16                    SIBpos-r16,
+        posSib2-6-r16                    SIBpos-r16,
+        posSib2-7-r16                    SIBpos-r16,
+        posSib2-8-r16                    SIBpos-r16,
+        posSib2-9-r16                    SIBpos-r16,
+        posSib2-10-r16                   SIBpos-r16,
+        posSib2-11-r16                   SIBpos-r16,
+        posSib2-12-r16                   SIBpos-r16,
+        posSib2-13-r16                   SIBpos-r16,
+        posSib2-14-r16                   SIBpos-r16,
+        posSib2-15-r16                   SIBpos-r16,
+        posSib2-16-r16                   SIBpos-r16,
+        posSib2-17-r16                   SIBpos-r16,
+        posSib2-18-r16                   SIBpos-r16,
+        posSib2-19-r16                   SIBpos-r16,
+        posSib2-20-r16                   SIBpos-r16,
+        posSib2-21-r16                   SIBpos-r16,
+        posSib2-22-r16                   SIBpos-r16,
+        posSib2-23-r16                   SIBpos-r16,
+        posSib3-1-r16                    SIBpos-r16,
+        posSib4-1-r16                    SIBpos-r16,
+        posSib5-1-r16                    SIBpos-r16,
+        posSib6-1-r16                    SIBpos-r16,
+        posSib6-2-r16                    SIBpos-r16,
+        posSib6-3-r16                    SIBpos-r16,
+        ...
+    },
+    lateNonCriticalExtension             OCTET STRING                        OPTIONAL,
+    nonCriticalExtension                 SEQUENCE {}                         OPTIONAL
+}
+
+-- TAG-POSSYSTEMINFORMATION-R16-IES-STOP
+-- TAG-POSSI-SCHEDULINGINFO-START
+
+PosSI-SchedulingInfo-r16 ::=               SEQUENCE {
+    posSchedulingInfoList-r16                  SEQUENCE (SIZE (1..maxSI-Message)) OF PosSchedulingInfo-r16,
+    posSI-RequestConfig-r16                        SI-RequestConfig                                 OPTIONAL,  -- Cond MSG-1
+    posSI-RequestConfigSUL-r16                     SI-RequestConfig                                 OPTIONAL,  -- Cond SUL-MSG-1
+    ...
+}
+
+PosSchedulingInfo-r16 ::= SEQUENCE {
+    offsetToSI-Used-r16          ENUMERATED {true}                                              OPTIONAL,  -- Need R
+    posSI-Periodicity-r16        ENUMERATED {rf8, rf16, rf32, rf64, rf128, rf256, rf512},
+    posSI-BroadcastStatus-r16    ENUMERATED {broadcasting, notBroadcasting},
+    posSIB-MappingInfo-r16       PosSIB-MappingInfo-r16,
+    ...
+}
+
+PosSIB-MappingInfo-r16 ::=   SEQUENCE (SIZE (1..maxSIB)) OF PosSIB-Type-r16
+
+PosSIB-Type-r16 ::=          SEQUENCE {
+    encrypted-r16                ENUMERATED { true }                                            OPTIONAL,  -- Need R
+    gnss-id-r16                  GNSS-ID-r16                                                    OPTIONAL,  -- Need R
+    sbas-id-r16                  SBAS-ID-r16                                                    OPTIONAL,  -- Need R
+    posSibType-r16               ENUMERATED { posSibType1-1, posSibType1-2, posSibType1-3, posSibType1-4, posSibType1-5, posSibType1-6,
+                                              posSibType1-7, posSibType1-8, posSibType2-1, posSibType2-2, posSibType2-3, posSibType2-4,
+                                              posSibType2-5, posSibType2-6, posSibType2-7, posSibType2-8, posSibType2-9, posSibType2-10,
+                                              posSibType2-11, posSibType2-12, posSibType2-13, posSibType2-14, posSibType2-15,
+                                              posSibType2-16, posSibType2-17, posSibType2-18, posSibType2-19, posSibType2-20,
+                                              posSibType2-21, posSibType2-22, posSibType2-23, posSibType3-1, posSibType4-1,
+                                              posSibType5-1,posSibType6-1, posSibType6-2, posSibType6-3,... },
+    areaScope-r16                ENUMERATED {true}                                              OPTIONAL -- Need S
+}
+
+GNSS-ID-r16 ::= SEQUENCE {
+    gnss-id-r16              ENUMERATED{gps, sbas, qzss, galileo, glonass, bds, ...},
+    ...
+}
+
+SBAS-ID-r16 ::= SEQUENCE {
+    sbas-id-r16              ENUMERATED { waas, egnos, msas, gagan, ...},
+    ...
+}
+
+-- TAG-POSSI-SCHEDULINGINFO-STOP
+-- TAG-SIPOS-START
+
+SIBpos-r16 ::= SEQUENCE {
+    assistanceDataSIB-Element-r16        OCTET STRING,
+    lateNonCriticalExtension             OCTET STRING                        OPTIONAL,
+    ...
+}
+
+-- TAG-SIPOS-STOP
+-- TAG-ADDITIONALSPECTRUMEMISSION-START
+
+AdditionalSpectrumEmission ::=              INTEGER (0..7)
+
+-- TAG-ADDITIONALSPECTRUMEMISSION-STOP
+-- TAG-ALPHA-START
+
+Alpha ::=                       ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}
+
+-- TAG-ALPHA-STOP
+-- TAG-AMF-IDENTIFIER-START
+
+AMF-Identifier ::=                      BIT STRING (SIZE (24))
+
+-- TAG-AMF-IDENTIFIER-STOP
+-- TAG-ARFCN-VALUEEUTRA-START
+
+ARFCN-ValueEUTRA ::=                INTEGER (0..maxEARFCN)
+
+-- TAG-ARFCN-VALUEEUTRA-STOP
+-- TAG-ARFCN-VALUENR-START
+
+ARFCN-ValueNR ::=               INTEGER (0..maxNARFCN)
+
+-- TAG-ARFCN-VALUENR-STOP
+-- TAG-ARFCN-ValueUTRA-FDD-START
+
+ARFCN-ValueUTRA-FDD-r16 ::=                INTEGER (0..16383)
+
+-- TAG-ARFCN-ValueUTRA-FDD-STOP
+-- TAG-AVAILABILITYCOMBINATIONSPERCELL-START
+
+AvailabilityCombinationsPerCell-r16 ::=     SEQUENCE {
+    availabilityCombinationsPerCellIndex-r16     AvailabilityCombinationsPerCellIndex-r16,
+    iab-DU-CellIdentity-r16                      CellIdentity,
+    positionInDCI-AI-r16                         INTEGER(0..maxAI-DCI-PayloadSize-r16-1)                              OPTIONAL, -- Need M
+    availabilityCombinations-r16                 SEQUENCE (SIZE (1..maxNrofAvailabilityCombinationsPerSet-r16)) OF AvailabilityCombination-r16,
+    ...
+}
+
+AvailabilityCombinationsPerCellIndex-r16 ::= INTEGER(0..maxNrofDUCells-r16)
+
+AvailabilityCombination-r16 ::=         SEQUENCE {
+    availabilityCombinationId-r16           AvailabilityCombinationId-r16,
+    resourceAvailability-r16                SEQUENCE (SIZE (1..maxNrofResourceAvailabilityPerCombination-r16)) OF INTEGER (0..7)
+}
+
+AvailabilityCombinationId-r16 ::=       INTEGER (0..maxNrofAvailabilityCombinationsPerSet-r16-1)
+
+-- TAG-AVAILABILITYCOMBINATIONSPERCELL-STOP
+-- TAG-AVAILABILITYINDICATOR-START
+
+AvailabilityIndicator-r16 ::=    SEQUENCE {
+    ai-RNTI-r16                      AI-RNTI-r16,
+    dci-PayloadSizeAI-r16            INTEGER (1..maxAI-DCI-PayloadSize-r16),
+    availableCombToAddModList-r16    SEQUENCE (SIZE(1..maxNrofDUCells-r16)) OF AvailabilityCombinationsPerCell-r16          OPTIONAL, -- Need N
+    availableCombToReleaseList-r16   SEQUENCE (SIZE(1..maxNrofDUCells-r16)) OF AvailabilityCombinationsPerCellIndex-r16     OPTIONAL, -- Need N
+    ...
+}
+
+AI-RNTI-r16 ::=                      RNTI-Value
+
+-- TAG-AVAILABILITYINDICATOR-STOP
+-- TAG-BAPROUTINGID-START
+
+BAP-RoutingID-r16::=        SEQUENCE{
+    bap-Address-r16              BIT STRING (SIZE (10)),
+    bap-PathId-r16               BIT STRING (SIZE (10))
+}
+
+-- TAG-BAPROUTINGID-STOP
+-- TAG-BEAMFAILURERECOVERYCONFIG-START
+
+BeamFailureRecoveryConfig ::=       SEQUENCE {
+    rootSequenceIndex-BFR               INTEGER (0..137)                                                          OPTIONAL, -- Need M
+    rach-ConfigBFR                      RACH-ConfigGeneric                                                        OPTIONAL, -- Need M
+    rsrp-ThresholdSSB                   RSRP-Range                                                                OPTIONAL, -- Need M
+    candidateBeamRSList                 SEQUENCE (SIZE(1..maxNrofCandidateBeams)) OF PRACH-ResourceDedicatedBFR   OPTIONAL, -- Need M
+    ssb-perRACH-Occasion                ENUMERATED {oneEighth, oneFourth, oneHalf, one, two,
+                                                       four, eight, sixteen}                                      OPTIONAL, -- Need M
+    ra-ssb-OccasionMaskIndex            INTEGER (0..15)                                                           OPTIONAL, -- Need M
+    recoverySearchSpaceId               SearchSpaceId                                                             OPTIONAL, -- Need R
+    ra-Prioritization                   RA-Prioritization                                                         OPTIONAL, -- Need R
+    beamFailureRecoveryTimer            ENUMERATED {ms10, ms20, ms40, ms60, ms80, ms100, ms150, ms200}            OPTIONAL, -- Need M
+    ...,
+    [[
+    msg1-SubcarrierSpacing              SubcarrierSpacing                                                         OPTIONAL  -- Need M
+    ]],
+    [[
+    ra-PrioritizationTwoStep-r16        RA-Prioritization                                                         OPTIONAL, -- Need R
+    candidateBeamRSListExt-v1610        SetupRelease{ CandidateBeamRSListExt-r16 }                                OPTIONAL  -- Need M
+    ]],
+    [[
+    spCell-BFR-CBRA-r16                 ENUMERATED {true}                                                         OPTIONAL  -- Need R
+    ]]
+}
+
+PRACH-ResourceDedicatedBFR ::=      CHOICE {
+    ssb                                 BFR-SSB-Resource,
+    csi-RS                              BFR-CSIRS-Resource
+}
+
+BFR-SSB-Resource ::=                SEQUENCE {
+    ssb                                 SSB-Index,
+    ra-PreambleIndex                    INTEGER (0..63),
+    ...
+}
+
+BFR-CSIRS-Resource ::=              SEQUENCE {
+    csi-RS                              NZP-CSI-RS-ResourceId,
+    ra-OccasionList                     SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS)) OF INTEGER (0..maxRA-Occasions-1)   OPTIONAL,   -- Need R
+    ra-PreambleIndex                    INTEGER (0..63)                                                                 OPTIONAL,   -- Need R
+    ...
+}
+
+CandidateBeamRSListExt-r16::=       SEQUENCE (SIZE(1.. maxNrofCandidateBeamsExt-r16)) OF PRACH-ResourceDedicatedBFR
+
+-- TAG-BEAMFAILURERECOVERYCONFIG-STOP
+-- TAG-BEAMFAILURERECOVERYSCELLCONFIG-START
+
+BeamFailureRecoverySCellConfig-r16 ::= SEQUENCE {
+    rsrp-ThresholdBFR-r16                  RSRP-Range                                                               OPTIONAL, -- Need M
+    candidateBeamRSSCellList-r16           SEQUENCE (SIZE(1..maxNrofCandidateBeams-r16)) OF CandidateBeamRS-r16     OPTIONAL, -- Need M
+    ...
+}
+
+CandidateBeamRS-r16 ::=                SEQUENCE {
+    candidateBeamConfig-r16                CHOICE {
+        ssb-r16                                SSB-Index,
+        csi-RS-r16                             NZP-CSI-RS-ResourceId
+    },
+    servingCellId                          ServCellIndex                                                            OPTIONAL  -- Need R
+}
+
+-- TAG-BEAMFAILURERECOVERYSCELLCONFIG-STOP
+-- TAG-BETAOFFSETS-START
+
+BetaOffsets ::=                     SEQUENCE {
+    betaOffsetACK-Index1                INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetACK-Index2                INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetACK-Index3                INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part1-Index1          INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part1-Index2          INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part2-Index1          INTEGER(0..31)                                                          OPTIONAL, -- Need S
+    betaOffsetCSI-Part2-Index2          INTEGER(0..31)                                                          OPTIONAL  -- Need S
+}
+
+-- TAG-BETAOFFSETS-STOP
+-- TAG-BHLOGICALCHANNELIDENTITY-START
+
+BH-LogicalChannelIdentity-r16 ::=    CHOICE {
+    bh-LogicalChannelIdentity-r16        LogicalChannelIdentity,
+    bh-LogicalChannelIdentityExt-r16     BH-LogicalChannelIdentity-Ext-r16
+}
+
+-- TAG-BHLOGICALCHANNELIDENTITY-STOP
+-- TAG-BHLOGICALCHANNELIDENTITYEXT-START
+
+BH-LogicalChannelIdentity-Ext-r16 ::=   INTEGER (320.. maxLC-ID-Iab-r16)
+
+-- TAG-BHLOGICALCHANNELIDENTITYEXT-STOP
+-- TAG-BHRLCCHANNELCONFIG-START
+
+BH-RLC-ChannelConfig-r16::=      SEQUENCE {
+    bh-LogicalChannelIdentity-r16    BH-LogicalChannelIdentity-r16     OPTIONAL,   -- Cond LCH-SetupOnly
+    bh-RLC-ChannelID-r16             BH-RLC-ChannelID-r16,
+    reestablishRLC-r16               ENUMERATED {true}                 OPTIONAL,   -- Need N
+    rlc-Config-r16                   RLC-Config                        OPTIONAL,   -- Cond LCH-Setup
+    mac-LogicalChannelConfig-r16     LogicalChannelConfig              OPTIONAL,   -- Cond LCH-Setup
+    ...
+}
+
+-- TAG-BHRLCCHANNELCONFIG-STOP
+-- TAG-BHRLCCHANNELID-START
+
+BH-RLC-ChannelID-r16 ::=    BIT STRING (SIZE (16))
+
+-- TAG-BHRLCCHANNELID-STOP
+-- TAG-BSR-CONFIG-START
+
+BSR-Config ::=                      SEQUENCE {
+    periodicBSR-Timer                   ENUMERATED { sf1, sf5, sf10, sf16, sf20, sf32, sf40, sf64,
+                                                        sf80, sf128, sf160, sf320, sf640, sf1280, sf2560, infinity },
+    retxBSR-Timer                       ENUMERATED { sf10, sf20, sf40, sf80, sf160, sf320, sf640, sf1280, sf2560,
+                                                        sf5120, sf10240, spare5, spare4, spare3, spare2, spare1},
+    logicalChannelSR-DelayTimer         ENUMERATED { sf20, sf40, sf64, sf128, sf512, sf1024, sf2560, spare1}                OPTIONAL, -- Need R
+    ...
+}
+
+-- TAG-BSR-CONFIG-STOP
+-- TAG-BWP-START
+
+BWP ::=                             SEQUENCE {
+    locationAndBandwidth                INTEGER (0..37949),
+    subcarrierSpacing                   SubcarrierSpacing,
+    cyclicPrefix                        ENUMERATED { extended }                                                 OPTIONAL    -- Need R
+}
+
+-- TAG-BWP-STOP
+-- TAG-BWP-DOWNLINK-START
+
+BWP-Downlink ::=                    SEQUENCE {
+    bwp-Id                              BWP-Id,
+    bwp-Common                          BWP-DownlinkCommon                                         OPTIONAL,   -- Cond SetupOtherBWP
+    bwp-Dedicated                       BWP-DownlinkDedicated                                      OPTIONAL,   -- Cond SetupOtherBWP
+    ...
+}
+
+-- TAG-BWP-DOWNLINK-STOP
+-- TAG-BWP-DOWNLINKCOMMON-START
+
+BWP-DownlinkCommon ::=              SEQUENCE {
+    genericParameters                   BWP,
+    pdcch-ConfigCommon                  SetupRelease { PDCCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    pdsch-ConfigCommon                  SetupRelease { PDSCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-BWP-DOWNLINKCOMMON-STOP
+-- TAG-BWP-DOWNLINKDEDICATED-START
+
+BWP-DownlinkDedicated ::=           SEQUENCE {
+    pdcch-Config                        SetupRelease { PDCCH-Config }                                     OPTIONAL,   -- Need M
+    pdsch-Config                        SetupRelease { PDSCH-Config }                                     OPTIONAL,   -- Need M
+    sps-Config                          SetupRelease { SPS-Config }                                       OPTIONAL,   -- Need M
+    radioLinkMonitoringConfig           SetupRelease { RadioLinkMonitoringConfig }                        OPTIONAL,   -- Need M
+    ...,
+    [[
+    sps-ConfigToAddModList-r16          SPS-ConfigToAddModList-r16                                        OPTIONAL,   -- Need N
+    sps-ConfigToReleaseList-r16         SPS-ConfigToReleaseList-r16                                       OPTIONAL,   -- Need N
+    sps-ConfigDeactivationStateList-r16 SPS-ConfigDeactivationStateList-r16                               OPTIONAL,   -- Need R
+    beamFailureRecoverySCellConfig-r16  SetupRelease {BeamFailureRecoverySCellConfig-r16}                 OPTIONAL,   -- Cond SCellOnly
+    sl-PDCCH-Config-r16                 SetupRelease { PDCCH-Config }                                     OPTIONAL,   -- Need M
+    sl-V2X-PDCCH-Config-r16             SetupRelease { PDCCH-Config }                                     OPTIONAL    -- Need M
+    ]]
+}
+
+SPS-ConfigToAddModList-r16 ::=          SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-Config
+
+SPS-ConfigToReleaseList-r16 ::=         SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-ConfigIndex-r16
+
+SPS-ConfigDeactivationState-r16 ::=     SEQUENCE (SIZE (1..maxNrofSPS-Config-r16)) OF SPS-ConfigIndex-r16
+
+SPS-ConfigDeactivationStateList-r16 ::= SEQUENCE (SIZE (1..maxNrofSPS-DeactivationState)) OF SPS-ConfigDeactivationState-r16
+
+-- TAG-BWP-DOWNLINKDEDICATED-STOP
+-- TAG-BWP-ID-START
+
+BWP-Id ::=                          INTEGER (0..maxNrofBWPs)
+
+-- TAG-BWP-ID-STOP
+-- TAG-BWP-UPLINK-START
+
+BWP-Uplink ::=                      SEQUENCE {
+    bwp-Id                              BWP-Id,
+    bwp-Common                          BWP-UplinkCommon                                            OPTIONAL,   -- Cond SetupOtherBWP
+    bwp-Dedicated                       BWP-UplinkDedicated                                         OPTIONAL,   -- Cond SetupOtherBWP
+    ...
+}
+
+-- TAG-BWP-UPLINK-STOP
+-- TAG-BWP-UPLINKCOMMON-START
+
+BWP-UplinkCommon ::=                SEQUENCE {
+    genericParameters                   BWP,
+    rach-ConfigCommon                   SetupRelease { RACH-ConfigCommon }                                      OPTIONAL,   -- Need M
+    pusch-ConfigCommon                  SetupRelease { PUSCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    pucch-ConfigCommon                  SetupRelease { PUCCH-ConfigCommon }                                     OPTIONAL,   -- Need M
+    ...,
+    [[
+    rach-ConfigCommonIAB-r16            SetupRelease { RACH-ConfigCommon }                                      OPTIONAL,   -- Need M
+    useInterlacePUCCH-PUSCH-r16         ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    msgA-ConfigCommon-r16               SetupRelease { MsgA-ConfigCommon-r16 }                                  OPTIONAL    -- Cond SpCellOnly2
+    ]]
+}
+
+-- TAG-BWP-UPLINKCOMMON-STOP
+-- TAG-BWP-UPLINKDEDICATED-START
+
+BWP-UplinkDedicated ::=             SEQUENCE {
+    pucch-Config                        SetupRelease { PUCCH-Config }                                           OPTIONAL,   -- Need M
+    pusch-Config                        SetupRelease { PUSCH-Config }                                           OPTIONAL,   -- Need M
+    configuredGrantConfig               SetupRelease { ConfiguredGrantConfig }                                  OPTIONAL,   -- Need M
+    srs-Config                          SetupRelease { SRS-Config }                                             OPTIONAL,   -- Need M
+    beamFailureRecoveryConfig           SetupRelease { BeamFailureRecoveryConfig }                              OPTIONAL,   -- Cond SpCellOnly
+    ...,
+    [[
+    sl-PUCCH-Config-r16                 SetupRelease { PUCCH-Config }                                           OPTIONAL,   -- Need M
+    cp-ExtensionC2-r16                  INTEGER (1..28)                                                         OPTIONAL,   -- Need R
+    cp-ExtensionC3-r16                  INTEGER (1..28)                                                         OPTIONAL,   -- Need R
+    useInterlacePUCCH-PUSCH-r16         ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    pucch-ConfigurationList-r16         SetupRelease { PUCCH-ConfigurationList-r16 }                            OPTIONAL,   -- Need M
+    lbt-FailureRecoveryConfig-r16       SetupRelease { LBT-FailureRecoveryConfig-r16 }                          OPTIONAL,   -- Need M
+    configuredGrantConfigToAddModList-r16                 ConfiguredGrantConfigToAddModList-r16                 OPTIONAL,   -- Need N
+    configuredGrantConfigToReleaseList-r16                ConfiguredGrantConfigToReleaseList-r16                OPTIONAL,   -- Need N
+    configuredGrantConfigType2DeactivationStateList-r16   ConfiguredGrantConfigType2DeactivationStateList-r16   OPTIONAL    -- Need R
+    ]]
+
+}
+
+ConfiguredGrantConfigToAddModList-r16    ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfig
+
+ConfiguredGrantConfigToReleaseList-r16   ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfigIndex-r16
+
+ConfiguredGrantConfigType2DeactivationState-r16 ::= SEQUENCE (SIZE (1..maxNrofConfiguredGrantConfig-r16)) OF ConfiguredGrantConfigIndex-r16
+
+ConfiguredGrantConfigType2DeactivationStateList-r16  ::=
+                             SEQUENCE (SIZE (1..maxNrofCG-Type2DeactivationState)) OF ConfiguredGrantConfigType2DeactivationState-r16
+
+-- TAG-BWP-UPLINKDEDICATED-STOP
+-- TAG-CELLACCESSRELATEDINFO-START
+
+CellAccessRelatedInfo   ::=         SEQUENCE {
+    plmn-IdentityList                   PLMN-IdentityInfoList,
+    cellReservedForOtherUse             ENUMERATED {true}             OPTIONAL,   -- Need R
+    ...,
+    [[
+    cellReservedForFutureUse-r16        ENUMERATED {true}             OPTIONAL,   -- Need R
+    npn-IdentityInfoList-r16            NPN-IdentityInfoList-r16      OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-CELLACCESSRELATEDINFO-STOP
+-- TAG-CELLACCESSRELATEDINFOEUTRA-5GC-START
+
+CellAccessRelatedInfo-EUTRA-5GC  ::=    SEQUENCE {
+    plmn-IdentityList-eutra-5gc             PLMN-IdentityList-EUTRA-5GC,
+    trackingAreaCode-eutra-5gc              TrackingAreaCode,
+    ranac-5gc                               RAN-AreaCode                                OPTIONAL,
+    cellIdentity-eutra-5gc                  CellIdentity-EUTRA-5GC
+}
+
+PLMN-IdentityList-EUTRA-5GC::=          SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity-EUTRA-5GC
+
+PLMN-Identity-EUTRA-5GC ::=             CHOICE {
+    plmn-Identity-EUTRA-5GC                 PLMN-Identity,
+    plmn-index                              INTEGER (1..maxPLMN)
+}
+
+CellIdentity-EUTRA-5GC ::=              CHOICE {
+    cellIdentity-EUTRA                      BIT STRING (SIZE (28)),
+    cellId-index                            INTEGER (1..maxPLMN)
+}
+
+-- TAG-CELLACCESSRELATEDINFOEUTRA-5GC-STOP
+-- TAG-CELLACCESSRELATEDINFOEUTRA-EPC-START
+
+CellAccessRelatedInfo-EUTRA-EPC  ::=    SEQUENCE {
+    plmn-IdentityList-eutra-epc             PLMN-IdentityList-EUTRA-EPC,
+    trackingAreaCode-eutra-epc              BIT STRING (SIZE (16)),
+    cellIdentity-eutra-epc                  BIT STRING (SIZE (28))
+}
+
+PLMN-IdentityList-EUTRA-EPC::=          SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity
+
+-- TAG-CELLACCESSRELATEDINFOEUTRA-EPC-STOP
+-- TAG-CELLGROUPCONFIG-START
+
+-- Configuration of one Cell-Group:
+CellGroupConfig ::=                        SEQUENCE {
+    cellGroupId                                CellGroupId,
+    rlc-BearerToAddModList                     SEQUENCE (SIZE(1..maxLC-ID)) OF RLC-BearerConfig                        OPTIONAL,   -- Need N
+    rlc-BearerToReleaseList                    SEQUENCE (SIZE(1..maxLC-ID)) OF LogicalChannelIdentity                  OPTIONAL,   -- Need N
+    mac-CellGroupConfig                        MAC-CellGroupConfig                                                     OPTIONAL,   -- Need M
+    physicalCellGroupConfig                    PhysicalCellGroupConfig                                                 OPTIONAL,   -- Need M
+    spCellConfig                               SpCellConfig                                                            OPTIONAL,   -- Need M
+    sCellToAddModList                          SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellConfig                       OPTIONAL,   -- Need N
+    sCellToReleaseList                         SEQUENCE (SIZE (1..maxNrofSCells)) OF SCellIndex                        OPTIONAL,   -- Need N
+    ...,
+    [[
+    reportUplinkTxDirectCurrent                ENUMERATED {true}                                                   OPTIONAL    -- Cond BWP-Reconfig
+    ]],
+    [[
+    bap-Address-r16                            BIT STRING (SIZE (10))                                                  OPTIONAL,   -- Need M
+    bh-RLC-ChannelToAddModList-r16             SEQUENCE (SIZE(1..maxBH-RLC-ChannelID-r16)) OF BH-RLC-ChannelConfig-r16 OPTIONAL,   -- Need N
+    bh-RLC-ChannelToReleaseList-r16            SEQUENCE (SIZE(1..maxBH-RLC-ChannelID-r16)) OF BH-RLC-ChannelID-r16     OPTIONAL,   -- Need N
+    f1c-TransferPath-r16                       ENUMERATED {lte, nr, both}                                              OPTIONAL,   -- Need M
+    simultaneousTCI-UpdateList1-r16            SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    simultaneousTCI-UpdateList2-r16            SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    simultaneousSpatial-UpdatedList1-r16       SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    simultaneousSpatial-UpdatedList2-r16       SEQUENCE (SIZE (1..maxNrofServingCellsTCI-r16)) OF ServCellIndex        OPTIONAL,   -- Need R
+    uplinkTxSwitchingOption-r16                ENUMERATED {switchedUL, dualUL}                                         OPTIONAL,   -- Need R
+    uplinkTxSwitchingPowerBoosting-r16         ENUMERATED {enabled}                                                    OPTIONAL    -- Need R
+    ]],
+    [[
+    reportUplinkTxDirectCurrentTwoCarrier-r16  ENUMERATED {true}                                                       OPTIONAL    -- Need N
+    ]]
+}
+
+-- Serving cell specific MAC and PHY parameters for a SpCell:
+SpCellConfig ::=                        SEQUENCE {
+    servCellIndex                       ServCellIndex                                               OPTIONAL,   -- Cond SCG
+    reconfigurationWithSync             ReconfigurationWithSync                                     OPTIONAL,   -- Cond ReconfWithSync
+    rlf-TimersAndConstants              SetupRelease { RLF-TimersAndConstants }                     OPTIONAL,   -- Need M
+    rlmInSyncOutOfSyncThreshold         ENUMERATED {n1}                                             OPTIONAL,   -- Need S
+    spCellConfigDedicated               ServingCellConfig                                           OPTIONAL,   -- Need M
+    ...
+}
+
+ReconfigurationWithSync ::=         SEQUENCE {
+    spCellConfigCommon                  ServingCellConfigCommon                                     OPTIONAL,   -- Need M
+    newUE-Identity                      RNTI-Value,
+    t304                                ENUMERATED {ms50, ms100, ms150, ms200, ms500, ms1000, ms2000, ms10000},
+    rach-ConfigDedicated                CHOICE {
+        uplink                              RACH-ConfigDedicated,
+        supplementaryUplink                 RACH-ConfigDedicated
+    }                                                                                               OPTIONAL,   -- Need N
+    ...,
+    [[
+    smtc                                SSB-MTC                                                     OPTIONAL    -- Need S
+    ]],
+    [[
+    daps-UplinkPowerConfig-r16      DAPS-UplinkPowerConfig-r16                                      OPTIONAL    -- Need N
+    ]]
+}
+
+DAPS-UplinkPowerConfig-r16 ::=      SEQUENCE {
+    p-DAPS-Source-r16                   P-Max,
+    p-DAPS-Target-r16                   P-Max,
+    uplinkPowerSharingDAPS-Mode-r16     ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic }
+}
+
+SCellConfig ::=                     SEQUENCE {
+    sCellIndex                          SCellIndex,
+    sCellConfigCommon                   ServingCellConfigCommon                                     OPTIONAL,   -- Cond SCellAdd
+    sCellConfigDedicated                ServingCellConfig                                           OPTIONAL,   -- Cond SCellAddMod
+    ...,
+    [[
+    smtc                                SSB-MTC                                                     OPTIONAL    -- Need S
+    ]],
+    [[
+    sCellState-r16                  ENUMERATED {activated}                                          OPTIONAL,   -- Cond SCellAddSync
+    secondaryDRX-GroupConfig-r16    ENUMERATED {true}                                               OPTIONAL    -- Cond DRX-Config2
+    ]]}
+
+-- TAG-CELLGROUPCONFIG-STOP
+-- TAG-CELLGROUPID-START
+
+CellGroupId ::=                             INTEGER (0.. maxSecondaryCellGroups)
+
+-- TAG-CELLGROUPID-STOP
+-- TAG-CELLIDENTITY-START
+
+CellIdentity ::=                         BIT STRING (SIZE (36))
+
+-- TAG-CELLIDENTITY-STOP
+-- TAG-CELLRESELECTIONPRIORITY-START
+
+CellReselectionPriority ::=             INTEGER (0..7)
+
+-- TAG-CELLRESELECTIONPRIORITY-STOP
+-- TAG-CELLRESELECTIONSUBPRIORITY-START
+
+CellReselectionSubPriority ::=          ENUMERATED {oDot2, oDot4, oDot6, oDot8}
+
+-- TAG-CELLRESELECTIONSUBPRIORITY-STOP
+-- TAG-CGI-INFOEUTRA-START
+
+CGI-InfoEUTRA ::=                        SEQUENCE {
+    cgi-info-EPC                            SEQUENCE {
+            cgi-info-EPC-legacy                 CellAccessRelatedInfo-EUTRA-EPC,
+            cgi-info-EPC-list                   SEQUENCE (SIZE (1..maxPLMN)) OF CellAccessRelatedInfo-EUTRA-EPC             OPTIONAL
+    }                                                                                                                   OPTIONAL,
+    cgi-info-5GC                            SEQUENCE (SIZE (1..maxPLMN)) OF CellAccessRelatedInfo-EUTRA-5GC             OPTIONAL,
+    freqBandIndicator                       FreqBandIndicatorEUTRA,
+    multiBandInfoList                       MultiBandInfoListEUTRA                                                      OPTIONAL,
+    freqBandIndicatorPriority               ENUMERATED {true}                                                           OPTIONAL
+}
+
+-- TAG-CGI-INFOEUTRA-STOP
+-- TAG-CGI-INFOEUTRALOGGING-START
+
+CGI-InfoEUTRALogging ::=         SEQUENCE {
+    plmn-Identity-eutra-5gc          PLMN-Identity                                          OPTIONAL,
+    trackingAreaCode-eutra-5gc       TrackingAreaCode                                       OPTIONAL,
+    cellIdentity-eutra-5gc           BIT STRING (SIZE (28))                                 OPTIONAL,
+    plmn-Identity-eutra-epc          PLMN-Identity                                          OPTIONAL,
+    trackingAreaCode-eutra-epc       BIT STRING (SIZE (16))                                 OPTIONAL,
+    cellIdentity-eutra-epc           BIT STRING (SIZE (28))                                 OPTIONAL
+}
+
+-- TAG-CGI-INFOEUTRALOGGING-STOP
+-- TAG-CGI-INFO-NR-START
+
+CGI-InfoNR ::=                    SEQUENCE {
+    plmn-IdentityInfoList               PLMN-IdentityInfoList               OPTIONAL,
+    frequencyBandList                   MultiFrequencyBandListNR            OPTIONAL,
+    noSIB1                              SEQUENCE {
+        ssb-SubcarrierOffset                INTEGER (0..15),
+        pdcch-ConfigSIB1                    PDCCH-ConfigSIB1
+    }                                                                       OPTIONAL,
+    ...,
+    [[
+    npn-IdentityInfoList-r16            NPN-IdentityInfoList-r16            OPTIONAL
+    ]]
+}
+
+-- TAG-CGI-INFO-NR-STOP
+-- TAG-CGI-INFO-LOGGING-START
+
+CGI-Info-Logging-r16 ::=     SEQUENCE {
+    plmn-Identity-r16                    PLMN-Identity,
+    cellIdentity-r16                     CellIdentity,
+    trackingAreaCode-r16                 TrackingAreaCode               OPTIONAL
+}
+
+-- TAG-CGI-INFO-LOGGING-STOP
+-- TAG-CLI-RSSI-RANGE-START
+
+CLI-RSSI-Range-r16 ::=                      INTEGER(0..76)
+
+-- TAG-CLI-RSSI-RANGE-STOP
+-- TAG-CODEBOOKCONFIG-START
+
+CodebookConfig ::=                                  SEQUENCE {
+    codebookType                                        CHOICE {
+        type1                                               SEQUENCE {
+            subType                                             CHOICE {
+                typeI-SinglePanel                                   SEQUENCE {
+                    nrOfAntennaPorts                                    CHOICE {
+                        two                                                 SEQUENCE {
+                            twoTX-CodebookSubsetRestriction                     BIT STRING (SIZE (6))
+                        },
+                        moreThanTwo                                         SEQUENCE {
+                            n1-n2                                               CHOICE {
+                                two-one-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (8)),
+                                two-two-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (64)),
+                                four-one-TypeI-SinglePanel-Restriction              BIT STRING (SIZE (16)),
+                                three-two-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (96)),
+                                six-one-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (24)),
+                                four-two-TypeI-SinglePanel-Restriction              BIT STRING (SIZE (128)),
+                                eight-one-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (32)),
+                                four-three-TypeI-SinglePanel-Restriction            BIT STRING (SIZE (192)),
+                                six-two-TypeI-SinglePanel-Restriction               BIT STRING (SIZE (192)),
+                                twelve-one-TypeI-SinglePanel-Restriction            BIT STRING (SIZE (48)),
+                                four-four-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (256)),
+                                eight-two-TypeI-SinglePanel-Restriction             BIT STRING (SIZE (256)),
+                                sixteen-one-TypeI-SinglePanel-Restriction           BIT STRING (SIZE (64))
+                            },
+                            typeI-SinglePanel-codebookSubsetRestriction-i2      BIT STRING (SIZE (16))        OPTIONAL    -- Need R
+                        }
+                    },
+                    typeI-SinglePanel-ri-Restriction                    BIT STRING (SIZE (8))
+                },
+                typeI-MultiPanel                                    SEQUENCE {
+                    ng-n1-n2                                                CHOICE {
+                        two-two-one-TypeI-MultiPanel-Restriction                BIT STRING (SIZE (8)),
+                        two-four-one-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (16)),
+                        four-two-one-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (8)),
+                        two-two-two-TypeI-MultiPanel-Restriction                BIT STRING (SIZE (64)),
+                        two-eight-one-TypeI-MultiPanel-Restriction              BIT STRING (SIZE (32)),
+                        four-four-one-TypeI-MultiPanel-Restriction              BIT STRING (SIZE (16)),
+                        two-four-two-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (128)),
+                        four-two-two-TypeI-MultiPanel-Restriction               BIT STRING (SIZE (64))
+                    },
+                    ri-Restriction                          BIT STRING (SIZE (4))
+                }
+            },
+            codebookMode                                        INTEGER (1..2)
+
+        },
+        type2                                   SEQUENCE {
+            subType                                 CHOICE {
+                typeII                                  SEQUENCE {
+                    n1-n2-codebookSubsetRestriction         CHOICE {
+                        two-one                                 BIT STRING (SIZE (16)),
+                        two-two                                 BIT STRING (SIZE (43)),
+                        four-one                                BIT STRING (SIZE (32)),
+                        three-two                               BIT STRING (SIZE (59)),
+                        six-one                                 BIT STRING (SIZE (48)),
+                        four-two                                BIT STRING (SIZE (75)),
+                        eight-one                               BIT STRING (SIZE (64)),
+                        four-three                              BIT STRING (SIZE (107)),
+                        six-two                                 BIT STRING (SIZE (107)),
+                        twelve-one                              BIT STRING (SIZE (96)),
+                        four-four                               BIT STRING (SIZE (139)),
+                        eight-two                               BIT STRING (SIZE (139)),
+                        sixteen-one                             BIT STRING (SIZE (128))
+                    },
+                    typeII-RI-Restriction                   BIT STRING (SIZE (2))
+                },
+                typeII-PortSelection                    SEQUENCE {
+                    portSelectionSamplingSize               ENUMERATED {n1, n2, n3, n4}                   OPTIONAL,       -- Need R
+                    typeII-PortSelectionRI-Restriction      BIT STRING (SIZE (2))
+                }
+            },
+            phaseAlphabetSize                       ENUMERATED {n4, n8},
+            subbandAmplitude                        BOOLEAN,
+            numberOfBeams                           ENUMERATED {two, three, four}
+        }
+    }
+}
+
+CodebookConfig-r16  ::=                SEQUENCE  {
+    codebookType                           CHOICE {
+        type2                                  SEQUENCE {
+            subType                                CHOICE {
+                typeII-r16                             SEQUENCE  {
+                    n1-n2-codebookSubsetRestriction-r16    CHOICE {
+                        two-one                                BIT STRING (SIZE (16)),
+                        two-two                                BIT STRING (SIZE (43)),
+                        four-one                               BIT STRING (SIZE (32)),
+                        three-two                              BIT STRING (SIZE (59)),
+                        six-one                                BIT STRING (SIZE (48)),
+                        four-two                               BIT STRING (SIZE (75)),
+                        eight-one                              BIT STRING (SIZE (64)),
+                        four-three                             BIT STRING (SIZE (107)),
+                        six-two                                BIT STRING (SIZE (107)),
+                        twelve-one                             BIT STRING (SIZE (96)),
+                        four-four                              BIT STRING (SIZE (139)),
+                        eight-two                              BIT STRING (SIZE (139)),
+                        sixteen-one                            BIT STRING (SIZE (128))
+                    },
+                    typeII-RI-Restriction-r16              BIT STRING (SIZE(4))
+                },
+                typeII-PortSelection-r16  SEQUENCE {
+                    portSelectionSamplingSize-r16          ENUMERATED {n1, n2, n3, n4},
+                    typeII-PortSelectionRI-Restriction-r16 BIT STRING (SIZE (4))
+                }
+            },
+        numberOfPMI-SubbandsPerCQI-Subband-r16 INTEGER (1..2),
+        paramCombination-r16                   INTEGER (1..8)
+        }
+    }
+}
+
+-- TAG-CODEBOOKCONFIG-STOP
+-- TAG-COMMONLOCATIONINFO-START
+
+CommonLocationInfo-r16 ::= SEQUENCE {
+    gnss-TOD-msec-r16          OCTET STRING     OPTIONAL,
+    locationTimestamp-r16      OCTET STRING     OPTIONAL,
+    locationCoordinate-r16     OCTET STRING     OPTIONAL,
+    locationError-r16          OCTET STRING     OPTIONAL,
+    locationSource-r16         OCTET STRING     OPTIONAL,
+    velocityEstimate-r16       OCTET STRING     OPTIONAL
+}
+
+-- TAG-COMMONLOCATIONINFO-STOP
+-- TAG-CONDRECONFIGID-START
+
+CondReconfigId-r16 ::=                    INTEGER (1.. maxNrofCondCells-r16)
+
+-- TAG-CONDRECONFIGID-STOP
+-- TAG-CONDRECONFIGTOADDMODLIST-START
+
+CondReconfigToAddModList-r16 ::= SEQUENCE (SIZE (1.. maxNrofCondCells-r16)) OF CondReconfigToAddMod-r16
+
+CondReconfigToAddMod-r16 ::=     SEQUENCE {
+    condReconfigId-r16               CondReconfigId-r16,
+    condExecutionCond-r16            SEQUENCE (SIZE (1..2)) OF MeasId                      OPTIONAL,    -- Cond condReconfigAdd
+    condRRCReconfig-r16              OCTET STRING (CONTAINING RRCReconfiguration)          OPTIONAL,    -- Cond condReconfigAdd
+    ...
+}
+
+-- TAG-CONDRECONFIGTOADDMODLIST-STOP
+-- TAG-CONDITIONALRECONFIGURATION-START
+
+ConditionalReconfiguration-r16 ::=   SEQUENCE {
+    attemptCondReconfig-r16              ENUMERATED {true}              OPTIONAL,   -- Cond CHO
+    condReconfigToRemoveList-r16         CondReconfigToRemoveList-r16   OPTIONAL,   -- Need N
+    condReconfigToAddModList-r16         CondReconfigToAddModList-r16   OPTIONAL,   -- Need N
+    ...
+}
+
+CondReconfigToRemoveList-r16 ::=     SEQUENCE (SIZE (1.. maxNrofCondCells-r16)) OF CondReconfigId-r16
+
+-- TAG-CONDITIONALRECONFIGURATION-STOP
+-- TAG-CONFIGUREDGRANTCONFIG-START
+
+ConfiguredGrantConfig ::=           SEQUENCE {
+    frequencyHopping                    ENUMERATED {intraSlot, interSlot}                                       OPTIONAL,   -- Need S
+    cg-DMRS-Configuration               DMRS-UplinkConfig,
+    mcs-Table                           ENUMERATED {qam256, qam64LowSE}                                         OPTIONAL,   -- Need S
+    mcs-TableTransformPrecoder          ENUMERATED {qam256, qam64LowSE}                                         OPTIONAL,   -- Need S
+    uci-OnPUSCH                         SetupRelease { CG-UCI-OnPUSCH }                                         OPTIONAL,   -- Need M
+    resourceAllocation                  ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch },
+    rbg-Size                            ENUMERATED {config2}                                                    OPTIONAL,   -- Need S
+    powerControlLoopToUse               ENUMERATED {n0, n1},
+    p0-PUSCH-Alpha                      P0-PUSCH-AlphaSetId,
+    transformPrecoder                   ENUMERATED {enabled, disabled}                                          OPTIONAL,   -- Need S
+    nrofHARQ-Processes                  INTEGER(1..16),
+    repK                                ENUMERATED {n1, n2, n4, n8},
+    repK-RV                             ENUMERATED {s1-0231, s2-0303, s3-0000}                                  OPTIONAL,   -- Need R
+    periodicity                         ENUMERATED {
+                                                sym2, sym7, sym1x14, sym2x14, sym4x14, sym5x14, sym8x14, sym10x14, sym16x14, sym20x14,
+                                                sym32x14, sym40x14, sym64x14, sym80x14, sym128x14, sym160x14, sym256x14, sym320x14, sym512x14,
+                                                sym640x14, sym1024x14, sym1280x14, sym2560x14, sym5120x14,
+                                                sym6, sym1x12, sym2x12, sym4x12, sym5x12, sym8x12, sym10x12, sym16x12, sym20x12, sym32x12,
+                                                sym40x12, sym64x12, sym80x12, sym128x12, sym160x12, sym256x12, sym320x12, sym512x12, sym640x12,
+                                                sym1280x12, sym2560x12
+    },
+    configuredGrantTimer                INTEGER (1..64)                                                         OPTIONAL,   -- Need R
+    rrc-ConfiguredUplinkGrant           SEQUENCE {
+        timeDomainOffset                    INTEGER (0..5119),
+        timeDomainAllocation                INTEGER (0..15),
+        frequencyDomainAllocation           BIT STRING (SIZE(18)),
+        antennaPort                         INTEGER (0..31),
+        dmrs-SeqInitialization              INTEGER (0..1)                                                          OPTIONAL,   -- Need R
+        precodingAndNumberOfLayers          INTEGER (0..63),
+        srs-ResourceIndicator               INTEGER (0..15)                                                         OPTIONAL,   -- Need R
+        mcsAndTBS                           INTEGER (0..31),
+        frequencyHoppingOffset              INTEGER (1.. maxNrofPhysicalResourceBlocks-1)                           OPTIONAL,   -- Need R
+        pathlossReferenceIndex              INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1),
+        ...,
+        [[
+        pusch-RepTypeIndicator-r16          ENUMERATED {pusch-RepTypeA,pusch-RepTypeB}                              OPTIONAL,   -- Need M
+        frequencyHoppingPUSCH-RepTypeB-r16  ENUMERATED {interRepetition, interSlot}                                 OPTIONAL,   -- Cond RepTypeB
+        timeReferenceSFN-r16                ENUMERATED {sfn512}                                                     OPTIONAL    -- Need S
+        ]]
+    }                                                                                                           OPTIONAL,   -- Need R
+    ...,
+    [[
+    cg-RetransmissionTimer-r16              INTEGER (1..64)                                                     OPTIONAL,   -- Need R
+    cg-minDFI-Delay-r16                     ENUMERATED
+                                                    {sym7, sym1x14, sym2x14, sym3x14, sym4x14, sym5x14, sym6x14, sym7x14, sym8x14,
+                                                     sym9x14, sym10x14, sym11x14, sym12x14, sym13x14, sym14x14,sym15x14, sym16x14
+                                                    }                                                   OPTIONAL,   -- Need R
+    cg-nrofPUSCH-InSlot-r16                 INTEGER (1..7)                                              OPTIONAL,   -- Need R
+    cg-nrofSlots-r16                        INTEGER (1..40)                                             OPTIONAL,   -- Need R
+    cg-StartingOffsets-r16                  CG-StartingOffsets-r16                                      OPTIONAL,   -- Need R
+    cg-UCI-Multiplexing-r16                 ENUMERATED {enabled}                                        OPTIONAL,   -- Need R
+    cg-COT-SharingOffset-r16                INTEGER (1..39)                                             OPTIONAL,   -- Need R
+    betaOffsetCG-UCI-r16                    INTEGER (0..31)                                            OPTIONAL,   -- Need R
+    cg-COT-SharingList-r16                  SEQUENCE (SIZE (1..1709)) OF CG-COT-Sharing-r16             OPTIONAL,   -- Need R
+    harq-ProcID-Offset-r16                  INTEGER (0..15)                                             OPTIONAL,   -- Need M
+    harq-ProcID-Offset2-r16                 INTEGER (0..15)                                             OPTIONAL,   -- Need M
+    configuredGrantConfigIndex-r16          ConfiguredGrantConfigIndex-r16                              OPTIONAL,   -- Cond CG-List
+    configuredGrantConfigIndexMAC-r16       ConfiguredGrantConfigIndexMAC-r16                           OPTIONAL,   -- Cond CG-IndexMAC
+    periodicityExt-r16                      INTEGER (1..5120)                                           OPTIONAL,   -- Need R
+    startingFromRV0-r16                     ENUMERATED {on, off}                                        OPTIONAL,   -- Need R
+    phy-PriorityIndex-r16                   ENUMERATED {p0, p1}                                         OPTIONAL,   -- Need R
+    autonomousTx-r16                        ENUMERATED {enabled}                                        OPTIONAL    -- Cond LCH-BasedPrioritization
+    ]]
+
+}
+
+CG-UCI-OnPUSCH ::= CHOICE {
+    dynamic                                 SEQUENCE (SIZE (1..4)) OF BetaOffsets,
+    semiStatic                              BetaOffsets
+}
+
+CG-COT-Sharing-r16 ::= CHOICE {
+    noCOT-Sharing-r16                   NULL,
+    cot-Sharing-r16                     SEQUENCE {
+         duration-r16                       INTEGER (1..39),
+         offset-r16                         INTEGER (1..39),
+         channelAccessPriority-r16          INTEGER (1..4)
+    }
+}
+
+CG-StartingOffsets-r16 ::= SEQUENCE {
+    cg-StartingFullBW-InsideCOT-r16         SEQUENCE (SIZE (1..7)) OF INTEGER (0..6)             OPTIONAL,   -- Need R
+    cg-StartingFullBW-OutsideCOT-r16        SEQUENCE (SIZE (1..7)) OF INTEGER (0..6)             OPTIONAL,   -- Need R
+    cg-StartingPartialBW-InsideCOT-r16      INTEGER (0..6)                                       OPTIONAL,   -- Need R
+    cg-StartingPartialBW-OutsideCOT-r16     INTEGER (0..6)                                       OPTIONAL    -- Need R
+}
+
+-- TAG-CONFIGUREDGRANTCONFIG-STOP
+-- TAG-CONFIGUREDGRANTCONFIGINDEX-START
+
+ConfiguredGrantConfigIndex-r16 ::= INTEGER (0.. maxNrofConfiguredGrantConfig-r16-1)
+
+-- TAG-CONFIGUREDGRANTCONFIGINDEX-STOP
+-- TAG-CONFIGUREDGRANTCONFIGINDEXMAC-START
+
+ConfiguredGrantConfigIndexMAC-r16 ::= INTEGER (0.. maxNrofConfiguredGrantConfigMAC-r16-1)
+
+-- TAG-CONFIGUREDGRANTCONFIGINDEXMAC-STOP
+-- TAG-CONNESTFAILURECONTROL-START
+
+ConnEstFailureControl ::=   SEQUENCE {
+    connEstFailCount                    ENUMERATED {n1, n2, n3, n4},
+    connEstFailOffsetValidity           ENUMERATED {s30, s60, s120, s240, s300, s420, s600, s900},
+    connEstFailOffset                   INTEGER (0..15)                                                         OPTIONAL    -- Need S
+}
+
+-- TAG-CONNESTFAILURECONTROL-STOP
+-- TAG-CONTROLRESOURCESET-START
+
+ControlResourceSet ::=              SEQUENCE {
+    controlResourceSetId                ControlResourceSetId,
+
+    frequencyDomainResources            BIT STRING (SIZE (45)),
+    duration                            INTEGER (1..maxCoReSetDuration),
+    cce-REG-MappingType                 CHOICE {
+        interleaved                         SEQUENCE {
+            reg-BundleSize                      ENUMERATED {n2, n3, n6},
+            interleaverSize                     ENUMERATED {n2, n3, n6},
+            shiftIndex                          INTEGER(0..maxNrofPhysicalResourceBlocks-1)       OPTIONAL -- Need S
+        },
+        nonInterleaved                      NULL
+    },
+    precoderGranularity                 ENUMERATED {sameAsREG-bundle, allContiguousRBs},
+    tci-StatesPDCCH-ToAddList           SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL, -- Cond NotSIB1-initialBWP
+    tci-StatesPDCCH-ToReleaseList       SEQUENCE(SIZE (1..maxNrofTCI-StatesPDCCH)) OF TCI-StateId OPTIONAL, -- Cond NotSIB1-initialBWP
+    tci-PresentInDCI                        ENUMERATED {enabled}                                  OPTIONAL, -- Need S
+    pdcch-DMRS-ScramblingID                 INTEGER (0..65535)                                    OPTIONAL, -- Need S
+    ...,
+    [[
+    rb-Offset-r16                       INTEGER (0..5)                                            OPTIONAL, -- Need S
+    tci-PresentDCI-1-2-r16              INTEGER (1..3)                                            OPTIONAL, -- Need S
+    coresetPoolIndex-r16                INTEGER (0..1)                                            OPTIONAL, -- Need S
+    controlResourceSetId-v1610          ControlResourceSetId-v1610                                OPTIONAL  -- Need S
+    ]]
+}
+
+-- TAG-CONTROLRESOURCESET-STOP
+-- TAG-CONTROLRESOURCESETID-START
+
+ControlResourceSetId ::=                INTEGER (0..maxNrofControlResourceSets-1)
+
+ControlResourceSetId-r16 ::=            INTEGER (0..maxNrofControlResourceSets-1-r16)
+
+ControlResourceSetId-v1610 ::=          INTEGER (maxNrofControlResourceSets..maxNrofControlResourceSets-1-r16)
+
+-- TAG-CONTROLRESOURCESETID-STOP
+-- TAG-CONTROLRESOURCESETZERO-START
+
+ControlResourceSetZero ::=                  INTEGER (0..15)
+
+-- TAG-CONTROLRESOURCESETZERO-STOP
+-- TAG-CROSSCARRIERSCHEDULINGCONFIG-START
+
+CrossCarrierSchedulingConfig ::=        SEQUENCE {
+    schedulingCellInfo                      CHOICE {
+        own                                     SEQUENCE {                  -- Cross carrier scheduling: scheduling cell
+            cif-Presence                            BOOLEAN
+        },
+        other                                   SEQUENCE {                  -- Cross carrier scheduling: scheduled cell
+            schedulingCellId                        ServCellIndex,
+            cif-InSchedulingCell                    INTEGER (1..7)
+        }
+    },
+    ...,
+    [[
+    carrierIndicatorSize-r16            SEQUENCE {
+        carrierIndicatorSizeDCI-1-2-r16        INTEGER (0..3),
+        carrierIndicatorSizeDCI-0-2-r16        INTEGER (0..3)
+    }                                                                                       OPTIONAL,  -- Cond CIF-PRESENCE
+    enableDefaultBeamForCCS-r16         ENUMERATED {enabled}                                OPTIONAL  -- Need S
+    ]]
+}
+
+-- TAG-CROSSCARRIERSCHEDULINGCONFIG-STOP
+-- TAG-CSI-APERIODICTRIGGERSTATELIST-START
+
+CSI-AperiodicTriggerStateList ::=   SEQUENCE (SIZE (1..maxNrOfCSI-AperiodicTriggers)) OF CSI-AperiodicTriggerState
+
+CSI-AperiodicTriggerState ::=       SEQUENCE {
+    associatedReportConfigInfoList      SEQUENCE (SIZE(1..maxNrofReportConfigPerAperiodicTrigger)) OF CSI-AssociatedReportConfigInfo,
+    ...
+}
+
+CSI-AssociatedReportConfigInfo ::=  SEQUENCE {
+    reportConfigId                      CSI-ReportConfigId,
+    resourcesForChannel                 CHOICE {
+        nzp-CSI-RS                          SEQUENCE {
+            resourceSet                         INTEGER (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig),
+            qcl-info                            SEQUENCE (SIZE(1..maxNrofAP-CSI-RS-ResourcesPerSet)) OF TCI-StateId
+                                                                                                      OPTIONAL  -- Cond Aperiodic
+        },
+        csi-SSB-ResourceSet                 INTEGER (1..maxNrofCSI-SSB-ResourceSetsPerConfig)
+    },
+    csi-IM-ResourcesForInterference     INTEGER(1..maxNrofCSI-IM-ResourceSetsPerConfig)               OPTIONAL, -- Cond CSI-IM-ForInterference
+    nzp-CSI-RS-ResourcesForInterference INTEGER (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig)          OPTIONAL, -- Cond NZP-CSI-RS-ForInterference
+    ...
+}
+
+-- TAG-CSI-APERIODICTRIGGERSTATELIST-STOP
+-- TAG-CSI-FREQUENCYOCCUPATION-START
+
+CSI-FrequencyOccupation ::=         SEQUENCE {
+    startingRB                          INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+    nrofRBs                             INTEGER (24..maxNrofPhysicalResourceBlocksPlus1),
+    ...
+}
+
+-- TAG-CSI-FREQUENCYOCCUPATION-STOP
+-- TAG-CSI-IM-RESOURCE-START
+
+CSI-IM-Resource ::=                 SEQUENCE {
+    csi-IM-ResourceId                   CSI-IM-ResourceId,
+    csi-IM-ResourceElementPattern           CHOICE {
+        pattern0                                SEQUENCE {
+            subcarrierLocation-p0                   ENUMERATED { s0, s2, s4, s6, s8, s10 },
+            symbolLocation-p0                       INTEGER (0..12)
+        },
+        pattern1                                SEQUENCE {
+            subcarrierLocation-p1                   ENUMERATED { s0, s4, s8 },
+            symbolLocation-p1                       INTEGER (0..13)
+        }
+    }                                                                                   OPTIONAL,   -- Need M
+    freqBand                            CSI-FrequencyOccupation                         OPTIONAL,   -- Need M
+    periodicityAndOffset                CSI-ResourcePeriodicityAndOffset                OPTIONAL,   -- Cond PeriodicOrSemiPersistent
+    ...
+}
+
+-- TAG-CSI-IM-RESOURCE-STOP
+-- TAG-CSI-IM-RESOURCEID-START
+
+CSI-IM-ResourceId ::=               INTEGER (0..maxNrofCSI-IM-Resources-1)
+
+-- TAG-CSI-IM-RESOURCEID-STOP
+-- TAG-CSI-IM-RESOURCESET-START
+
+CSI-IM-ResourceSet ::=              SEQUENCE {
+    csi-IM-ResourceSetId                CSI-IM-ResourceSetId,
+    csi-IM-Resources                    SEQUENCE (SIZE(1..maxNrofCSI-IM-ResourcesPerSet)) OF CSI-IM-ResourceId,
+    ...
+}
+-- TAG-CSI-IM-RESOURCESET-STOP
+-- TAG-CSI-IM-RESOURCESETID-START
+
+CSI-IM-ResourceSetId ::=            INTEGER (0..maxNrofCSI-IM-ResourceSets-1)
+
+-- TAG-CSI-IM-RESOURCESETID-STOP
+-- TAG-CSI-MEASCONFIG-START
+
+CSI-MeasConfig ::=                  SEQUENCE {
+    nzp-CSI-RS-ResourceToAddModList     SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-Resources)) OF NZP-CSI-RS-Resource   OPTIONAL, -- Need N
+    nzp-CSI-RS-ResourceToReleaseList    SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-Resources)) OF NZP-CSI-RS-ResourceId OPTIONAL, -- Need N
+    nzp-CSI-RS-ResourceSetToAddModList  SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSets)) OF NZP-CSI-RS-ResourceSet
+                                                                                                                  OPTIONAL, -- Need N
+    nzp-CSI-RS-ResourceSetToReleaseList SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSets)) OF NZP-CSI-RS-ResourceSetId
+                                                                                                                  OPTIONAL, -- Need N
+    csi-IM-ResourceToAddModList         SEQUENCE (SIZE (1..maxNrofCSI-IM-Resources)) OF CSI-IM-Resource           OPTIONAL, -- Need N
+    csi-IM-ResourceToReleaseList        SEQUENCE (SIZE (1..maxNrofCSI-IM-Resources)) OF CSI-IM-ResourceId         OPTIONAL, -- Need N
+    csi-IM-ResourceSetToAddModList      SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSets)) OF CSI-IM-ResourceSet     OPTIONAL, -- Need N
+    csi-IM-ResourceSetToReleaseList     SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSets)) OF CSI-IM-ResourceSetId   OPTIONAL, -- Need N
+    csi-SSB-ResourceSetToAddModList     SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSets)) OF CSI-SSB-ResourceSet   OPTIONAL, -- Need N
+    csi-SSB-ResourceSetToReleaseList    SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSets)) OF CSI-SSB-ResourceSetId OPTIONAL, -- Need N
+    csi-ResourceConfigToAddModList      SEQUENCE (SIZE (1..maxNrofCSI-ResourceConfigurations)) OF CSI-ResourceConfig
+                                                                                                                  OPTIONAL, -- Need N
+    csi-ResourceConfigToReleaseList     SEQUENCE (SIZE (1..maxNrofCSI-ResourceConfigurations)) OF CSI-ResourceConfigId
+                                                                                                                  OPTIONAL, -- Need N
+    csi-ReportConfigToAddModList        SEQUENCE (SIZE (1..maxNrofCSI-ReportConfigurations)) OF CSI-ReportConfig  OPTIONAL, -- Need N
+    csi-ReportConfigToReleaseList       SEQUENCE (SIZE (1..maxNrofCSI-ReportConfigurations)) OF CSI-ReportConfigId
+                                                                                                                  OPTIONAL, -- Need N
+    reportTriggerSize                   INTEGER (0..6)                                                            OPTIONAL, -- Need M
+    aperiodicTriggerStateList           SetupRelease { CSI-AperiodicTriggerStateList }                            OPTIONAL, -- Need M
+    semiPersistentOnPUSCH-TriggerStateList    SetupRelease { CSI-SemiPersistentOnPUSCH-TriggerStateList }         OPTIONAL, -- Need M
+    ...,
+    [[
+    reportTriggerSizeDCI-0-2-r16        INTEGER (0..6)                                                            OPTIONAL -- Need R
+    ]]
+}
+
+-- TAG-CSI-MEASCONFIG-STOP
+-- TAG-CSI-REPORTCONFIG-START
+
+CSI-ReportConfig ::=                SEQUENCE {
+    reportConfigId                          CSI-ReportConfigId,
+    carrier                                 ServCellIndex                   OPTIONAL,   -- Need S
+    resourcesForChannelMeasurement          CSI-ResourceConfigId,
+    csi-IM-ResourcesForInterference         CSI-ResourceConfigId            OPTIONAL,   -- Need R
+    nzp-CSI-RS-ResourcesForInterference     CSI-ResourceConfigId            OPTIONAL,   -- Need R
+    reportConfigType                        CHOICE {
+        periodic                                SEQUENCE {
+            reportSlotConfig                        CSI-ReportPeriodicityAndOffset,
+            pucch-CSI-ResourceList                  SEQUENCE (SIZE (1..maxNrofBWPs)) OF PUCCH-CSI-Resource
+        },
+        semiPersistentOnPUCCH                   SEQUENCE {
+            reportSlotConfig                        CSI-ReportPeriodicityAndOffset,
+            pucch-CSI-ResourceList                  SEQUENCE (SIZE (1..maxNrofBWPs)) OF PUCCH-CSI-Resource
+        },
+        semiPersistentOnPUSCH                   SEQUENCE {
+            reportSlotConfig                        ENUMERATED {sl5, sl10, sl20, sl40, sl80, sl160, sl320},
+            reportSlotOffsetList                SEQUENCE (SIZE (1.. maxNrofUL-Allocations)) OF INTEGER(0..32),
+            p0alpha                                 P0-PUSCH-AlphaSetId
+        },
+        aperiodic                               SEQUENCE {
+            reportSlotOffsetList                SEQUENCE (SIZE (1..maxNrofUL-Allocations)) OF INTEGER(0..32)
+        }
+    },
+    reportQuantity                          CHOICE {
+        none                                    NULL,
+        cri-RI-PMI-CQI                          NULL,
+        cri-RI-i1                               NULL,
+        cri-RI-i1-CQI                           SEQUENCE {
+            pdsch-BundleSizeForCSI                  ENUMERATED {n2, n4}                                         OPTIONAL    -- Need S
+        },
+        cri-RI-CQI                              NULL,
+        cri-RSRP                                NULL,
+        ssb-Index-RSRP                          NULL,
+        cri-RI-LI-PMI-CQI                       NULL
+    },
+    reportFreqConfiguration                 SEQUENCE {
+        cqi-FormatIndicator                     ENUMERATED { widebandCQI, subbandCQI }                          OPTIONAL,   -- Need R
+        pmi-FormatIndicator                     ENUMERATED { widebandPMI, subbandPMI }                          OPTIONAL,   -- Need R
+        csi-ReportingBand                       CHOICE {
+            subbands3                               BIT STRING(SIZE(3)),
+            subbands4                               BIT STRING(SIZE(4)),
+            subbands5                               BIT STRING(SIZE(5)),
+            subbands6                               BIT STRING(SIZE(6)),
+            subbands7                               BIT STRING(SIZE(7)),
+            subbands8                               BIT STRING(SIZE(8)),
+            subbands9                               BIT STRING(SIZE(9)),
+            subbands10                              BIT STRING(SIZE(10)),
+            subbands11                              BIT STRING(SIZE(11)),
+            subbands12                              BIT STRING(SIZE(12)),
+            subbands13                              BIT STRING(SIZE(13)),
+            subbands14                              BIT STRING(SIZE(14)),
+            subbands15                              BIT STRING(SIZE(15)),
+            subbands16                              BIT STRING(SIZE(16)),
+            subbands17                              BIT STRING(SIZE(17)),
+            subbands18                              BIT STRING(SIZE(18)),
+            ...,
+            subbands19-v1530                        BIT STRING(SIZE(19))
+        }   OPTIONAL    -- Need S
+
+    }                                                                                                           OPTIONAL,   -- Need R
+    timeRestrictionForChannelMeasurements           ENUMERATED {configured, notConfigured},
+    timeRestrictionForInterferenceMeasurements      ENUMERATED {configured, notConfigured},
+    codebookConfig                                  CodebookConfig                                              OPTIONAL,   -- Need R
+    dummy                                           ENUMERATED {n1, n2}                                         OPTIONAL,   -- Need R
+    groupBasedBeamReporting                     CHOICE {
+        enabled                                     NULL,
+        disabled                                    SEQUENCE {
+            nrofReportedRS                          ENUMERATED {n1, n2, n3, n4}                                 OPTIONAL    -- Need S
+        }
+    },
+    cqi-Table                   ENUMERATED {table1, table2, table3, spare1}                                     OPTIONAL,   -- Need R
+    subbandSize                 ENUMERATED {value1, value2},
+    non-PMI-PortIndication      SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourcesPerConfig)) OF PortIndexFor8Ranks OPTIONAL,   -- Need R
+    ...,
+    [[
+    semiPersistentOnPUSCH-v1530         SEQUENCE {
+        reportSlotConfig-v1530              ENUMERATED {sl4, sl8, sl16}
+    }                                                                                                           OPTIONAL    -- Need R
+    ]],
+    [[
+    semiPersistentOnPUSCH-v1610         SEQUENCE {
+        reportSlotOffsetListDCI-0-2-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL,    -- Need R
+        reportSlotOffsetListDCI-0-1-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL     -- Need R
+    }                                                                                                           OPTIONAL,    -- Need R
+    aperiodic-v1610                     SEQUENCE {
+        reportSlotOffsetListDCI-0-2-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL,    -- Need R
+        reportSlotOffsetListDCI-0-1-r16     SEQUENCE (SIZE (1.. maxNrofUL-Allocations-r16)) OF INTEGER(0..32)   OPTIONAL     -- Need R
+    }                                                                                                           OPTIONAL,    -- Need R
+    reportQuantity-r16                  CHOICE {
+       cri-SINR-r16                         NULL,
+       ssb-Index-SINR-r16                   NULL
+    }                                                                                                           OPTIONAL,   -- Need R
+    codebookConfig-r16                          CodebookConfig-r16                                              OPTIONAL    -- Need R
+    ]]
+}
+
+CSI-ReportPeriodicityAndOffset ::=  CHOICE {
+    slots4                              INTEGER(0..3),
+    slots5                              INTEGER(0..4),
+    slots8                              INTEGER(0..7),
+    slots10                             INTEGER(0..9),
+    slots16                             INTEGER(0..15),
+    slots20                             INTEGER(0..19),
+    slots40                             INTEGER(0..39),
+    slots80                             INTEGER(0..79),
+    slots160                            INTEGER(0..159),
+    slots320                            INTEGER(0..319)
+}
+
+PUCCH-CSI-Resource ::=              SEQUENCE {
+    uplinkBandwidthPartId               BWP-Id,
+    pucch-Resource                      PUCCH-ResourceId
+}
+
+PortIndexFor8Ranks ::=              CHOICE {
+    portIndex8                          SEQUENCE{
+        rank1-8                             PortIndex8                                                      OPTIONAL,   -- Need R
+        rank2-8                             SEQUENCE(SIZE(2)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank3-8                             SEQUENCE(SIZE(3)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank4-8                             SEQUENCE(SIZE(4)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank5-8                             SEQUENCE(SIZE(5)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank6-8                             SEQUENCE(SIZE(6)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank7-8                             SEQUENCE(SIZE(7)) OF PortIndex8                                 OPTIONAL,   -- Need R
+        rank8-8                             SEQUENCE(SIZE(8)) OF PortIndex8                                 OPTIONAL    -- Need R
+    },
+    portIndex4                          SEQUENCE{
+        rank1-4                             PortIndex4                                                      OPTIONAL,   -- Need R
+        rank2-4                             SEQUENCE(SIZE(2)) OF PortIndex4                                 OPTIONAL,   -- Need R
+        rank3-4                             SEQUENCE(SIZE(3)) OF PortIndex4                                 OPTIONAL,   -- Need R
+        rank4-4                             SEQUENCE(SIZE(4)) OF PortIndex4                                 OPTIONAL    -- Need R
+    },
+    portIndex2                          SEQUENCE{
+        rank1-2                             PortIndex2                                                      OPTIONAL,   -- Need R
+        rank2-2                             SEQUENCE(SIZE(2)) OF PortIndex2                                 OPTIONAL    -- Need R
+    },
+    portIndex1                          NULL
+}
+
+PortIndex8::=                       INTEGER (0..7)
+PortIndex4::=                       INTEGER (0..3)
+PortIndex2::=                       INTEGER (0..1)
+
+-- TAG-CSI-REPORTCONFIG-STOP
+-- TAG-CSI-REPORTCONFIGID-START
+
+CSI-ReportConfigId ::=              INTEGER (0..maxNrofCSI-ReportConfigurations-1)
+
+-- TAG-CSI-REPORTCONFIGID-STOP
+-- TAG-CSI-RESOURCECONFIG-START
+
+CSI-ResourceConfig ::=      SEQUENCE {
+    csi-ResourceConfigId        CSI-ResourceConfigId,
+    csi-RS-ResourceSetList      CHOICE {
+        nzp-CSI-RS-SSB              SEQUENCE {
+            nzp-CSI-RS-ResourceSetList  SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourceSetsPerConfig)) OF NZP-CSI-RS-ResourceSetId
+                                                                                                                            OPTIONAL, -- Need R
+            csi-SSB-ResourceSetList     SEQUENCE (SIZE (1..maxNrofCSI-SSB-ResourceSetsPerConfig)) OF CSI-SSB-ResourceSetId  OPTIONAL  -- Need R
+        },
+        csi-IM-ResourceSetList      SEQUENCE (SIZE (1..maxNrofCSI-IM-ResourceSetsPerConfig)) OF CSI-IM-ResourceSetId
+    },
+
+    bwp-Id                      BWP-Id,
+    resourceType                ENUMERATED { aperiodic, semiPersistent, periodic },
+    ...
+}
+
+-- TAG-CSI-RESOURCECONFIG-STOP
+-- TAG-CSI-RESOURCECONFIGID-START
+
+CSI-ResourceConfigId ::=            INTEGER (0..maxNrofCSI-ResourceConfigurations-1)
+
+-- TAG-CSI-RESOURCECONFIGID-STOP
+-- TAG-CSI-RESOURCEPERIODICITYANDOFFSET-START
+
+CSI-ResourcePeriodicityAndOffset ::=    CHOICE {
+    slots4                                  INTEGER (0..3),
+    slots5                                  INTEGER (0..4),
+    slots8                                  INTEGER (0..7),
+    slots10                                 INTEGER (0..9),
+    slots16                                 INTEGER (0..15),
+    slots20                                 INTEGER (0..19),
+    slots32                                 INTEGER (0..31),
+    slots40                                 INTEGER (0..39),
+    slots64                                 INTEGER (0..63),
+    slots80                                 INTEGER (0..79),
+    slots160                                INTEGER (0..159),
+    slots320                                INTEGER (0..319),
+    slots640                                INTEGER (0..639)
+}
+
+-- TAG-CSI-RESOURCEPERIODICITYANDOFFSET-STOP
+-- TAG-CSI-RS-RESOURCECONFIGMOBILITY-START
+
+CSI-RS-ResourceConfigMobility ::=   SEQUENCE {
+    subcarrierSpacing                   SubcarrierSpacing,
+    csi-RS-CellList-Mobility            SEQUENCE (SIZE (1..maxNrofCSI-RS-CellsRRM)) OF CSI-RS-CellMobility,
+    ...,
+    [[
+    refServCellIndex                    ServCellIndex                                                           OPTIONAL    -- Need S
+    ]]
+
+
+}
+
+CSI-RS-CellMobility ::=             SEQUENCE {
+    cellId                              PhysCellId,
+    csi-rs-MeasurementBW                SEQUENCE {
+        nrofPRBs                            ENUMERATED { size24, size48, size96, size192, size264},
+        startPRB                            INTEGER(0..2169)
+    },
+    density                             ENUMERATED {d1,d3}                                                      OPTIONAL,   -- Need R
+    csi-rs-ResourceList-Mobility        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesRRM)) OF CSI-RS-Resource-Mobility
+}
+
+CSI-RS-Resource-Mobility ::=        SEQUENCE {
+    csi-RS-Index                        CSI-RS-Index,
+    slotConfig                          CHOICE {
+        ms4                                 INTEGER (0..31),
+        ms5                                 INTEGER (0..39),
+        ms10                                INTEGER (0..79),
+        ms20                                INTEGER (0..159),
+        ms40                                INTEGER (0..319)
+    },
+    associatedSSB                       SEQUENCE {
+        ssb-Index                           SSB-Index,
+        isQuasiColocated                    BOOLEAN
+    }                                                                                                           OPTIONAL, -- Need R
+    frequencyDomainAllocation           CHOICE {
+        row1                                BIT STRING (SIZE (4)),
+        row2                                BIT STRING (SIZE (12))
+    },
+    firstOFDMSymbolInTimeDomain         INTEGER (0..13),
+    sequenceGenerationConfig            INTEGER (0..1023),
+    ...
+}
+
+CSI-RS-Index ::=                    INTEGER (0..maxNrofCSI-RS-ResourcesRRM-1)
+
+-- TAG-CSI-RS-RESOURCECONFIGMOBILITY-STOP
+-- TAG-CSI-RS-RESOURCEMAPPING-START
+
+CSI-RS-ResourceMapping ::=          SEQUENCE {
+    frequencyDomainAllocation           CHOICE {
+        row1                                BIT STRING (SIZE (4)),
+        row2                                BIT STRING (SIZE (12)),
+        row4                                BIT STRING (SIZE (3)),
+        other                               BIT STRING (SIZE (6))
+    },
+    nrofPorts                           ENUMERATED {p1,p2,p4,p8,p12,p16,p24,p32},
+    firstOFDMSymbolInTimeDomain         INTEGER (0..13),
+    firstOFDMSymbolInTimeDomain2        INTEGER (2..12)                                                         OPTIONAL,   -- Need R
+    cdm-Type                            ENUMERATED {noCDM, fd-CDM2, cdm4-FD2-TD2, cdm8-FD2-TD4},
+    density                             CHOICE {
+        dot5                                ENUMERATED {evenPRBs, oddPRBs},
+        one                                 NULL,
+        three                               NULL,
+        spare                               NULL
+    },
+    freqBand                            CSI-FrequencyOccupation,
+    ...
+}
+
+-- TAG-CSI-RS-RESOURCEMAPPING-STOP
+-- TAG-CSI-SEMIPERSISTENTONPUSCHTRIGGERSTATELIST-START
+
+CSI-SemiPersistentOnPUSCH-TriggerStateList ::= SEQUENCE(SIZE (1..maxNrOfSemiPersistentPUSCH-Triggers)) OF CSI-SemiPersistentOnPUSCH-TriggerState
+
+CSI-SemiPersistentOnPUSCH-TriggerState ::=     SEQUENCE {
+    associatedReportConfigInfo                     CSI-ReportConfigId,
+    ...
+}
+
+-- TAG-CSI-SEMIPERSISTENTONPUSCHTRIGGERSTATELIST-STOP
+-- TAG-CSI-SSB-RESOURCESET-START
+
+CSI-SSB-ResourceSet ::=             SEQUENCE {
+    csi-SSB-ResourceSetId               CSI-SSB-ResourceSetId,
+    csi-SSB-ResourceList                SEQUENCE (SIZE(1..maxNrofCSI-SSB-ResourcePerSet)) OF SSB-Index,
+    ...
+}
+
+-- TAG-CSI-SSB-RESOURCESET-STOP
+-- TAG-CSI-SSB-RESOURCESETID-START
+
+CSI-SSB-ResourceSetId ::=           INTEGER (0..maxNrofCSI-SSB-ResourceSets-1)
+
+-- TAG-CSI-SSB-RESOURCESETID-STOP
+-- TAG-DEDICATED-NAS-MESSAGE-START
+
+DedicatedNAS-Message ::=        OCTET STRING
+
+-- TAG-DEDICATED-NAS-MESSAGE-STOP
+-- TAG-DMRS-DOWNLINKCONFIG-START
+
+DMRS-DownlinkConfig ::=             SEQUENCE {
+    dmrs-Type                           ENUMERATED {type2}                                                      OPTIONAL,   -- Need S
+    dmrs-AdditionalPosition             ENUMERATED {pos0, pos1, pos3}                                           OPTIONAL,   -- Need S
+    maxLength                           ENUMERATED {len2}                                                       OPTIONAL,   -- Need S
+    scramblingID0                       INTEGER (0..65535)                                                      OPTIONAL,   -- Need S
+    scramblingID1                       INTEGER (0..65535)                                                      OPTIONAL,   -- Need S
+    phaseTrackingRS                     SetupRelease { PTRS-DownlinkConfig  }                                   OPTIONAL,   -- Need M
+    ...,
+    [[
+    dmrs-Downlink-r16               ENUMERATED {enabled}                                                        OPTIONAL    -- Need R
+    ]]
+
+}
+
+-- TAG-DMRS-DOWNLINKCONFIG-STOP
+-- TAG-DMRS-UPLINKCONFIG-START
+
+DMRS-UplinkConfig ::=               SEQUENCE {
+    dmrs-Type                           ENUMERATED {type2}                                                  OPTIONAL,   -- Need S
+    dmrs-AdditionalPosition             ENUMERATED {pos0, pos1, pos3}                                       OPTIONAL,   -- Need S
+    phaseTrackingRS                     SetupRelease { PTRS-UplinkConfig }                                  OPTIONAL,   -- Need M
+    maxLength                           ENUMERATED {len2}                                                   OPTIONAL,   -- Need S
+    transformPrecodingDisabled          SEQUENCE {
+        scramblingID0                       INTEGER (0..65535)                                              OPTIONAL,   -- Need S
+        scramblingID1                       INTEGER (0..65535)                                              OPTIONAL,   -- Need S
+        ...,
+        [[
+        dmrs-Uplink-r16                     ENUMERATED {enabled}                                            OPTIONAL    -- Need R
+        ]]
+    }                                                                                                       OPTIONAL,   -- Need R
+    transformPrecodingEnabled           SEQUENCE {
+        nPUSCH-Identity                     INTEGER(0..1007)                                                OPTIONAL,   -- Need S
+        sequenceGroupHopping                ENUMERATED {disabled}                                           OPTIONAL,   -- Need S
+        sequenceHopping                     ENUMERATED {enabled}                                            OPTIONAL,   -- Need S
+        ...,
+        [[
+        dmrs-UplinkTransformPrecoding-r16   SetupRelease {DMRS-UplinkTransformPrecoding-r16}                OPTIONAL    -- Need M
+        ]]
+    }                                                                                                       OPTIONAL,   -- Need R
+    ...
+}
+
+DMRS-UplinkTransformPrecoding-r16  ::=  SEQUENCE {
+    pi2BPSK-ScramblingID0                   INTEGER(0..65535)                                               OPTIONAL,   -- Need S
+    pi2BPSK-ScramblingID1                   INTEGER(0..65535)                                               OPTIONAL    -- Need S
+}
+
+-- TAG-DMRS-UPLINKCONFIG-STOP
+-- TAG-DOWNLINKCONFIGCOMMON-START
+
+DownlinkConfigCommon ::=        SEQUENCE {
+    frequencyInfoDL                 FrequencyInfoDL                                 OPTIONAL,   -- Cond InterFreqHOAndServCellAdd
+    initialDownlinkBWP              BWP-DownlinkCommon                              OPTIONAL,   -- Cond ServCellAdd
+    ...
+}
+
+-- TAG-DOWNLINKCONFIGCOMMON-STOP
+-- TAG-DOWNLINKCONFIGCOMMONSIB-START
+
+DownlinkConfigCommonSIB ::=     SEQUENCE {
+    frequencyInfoDL                 FrequencyInfoDL-SIB,
+    initialDownlinkBWP              BWP-DownlinkCommon,
+    bcch-Config                         BCCH-Config,
+    pcch-Config                         PCCH-Config,
+    ...
+}
+
+
+BCCH-Config ::=                 SEQUENCE {
+    modificationPeriodCoeff         ENUMERATED {n2, n4, n8, n16},
+    ...
+}
+
+
+PCCH-Config ::=             SEQUENCE {
+    defaultPagingCycle                  PagingCycle,
+    nAndPagingFrameOffset               CHOICE {
+        oneT                                NULL,
+        halfT                               INTEGER (0..1),
+        quarterT                            INTEGER (0..3),
+        oneEighthT                          INTEGER (0..7),
+        oneSixteenthT                       INTEGER (0..15)
+    },
+    ns                                  ENUMERATED {four, two, one},
+    firstPDCCH-MonitoringOccasionOfPO   CHOICE {
+        sCS15KHZoneT                                                                SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..139),
+        sCS30KHZoneT-SCS15KHZhalfT                                                  SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..279),
+        sCS60KHZoneT-SCS30KHZhalfT-SCS15KHZquarterT                                 SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..559),
+        sCS120KHZoneT-SCS60KHZhalfT-SCS30KHZquarterT-SCS15KHZoneEighthT             SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..1119),
+        sCS120KHZhalfT-SCS60KHZquarterT-SCS30KHZoneEighthT-SCS15KHZoneSixteenthT    SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..2239),
+        sCS120KHZquarterT-SCS60KHZoneEighthT-SCS30KHZoneSixteenthT                  SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..4479),
+        sCS120KHZoneEighthT-SCS60KHZoneSixteenthT                                   SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..8959),
+        sCS120KHZoneSixteenthT                                                      SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..17919)
+    }      OPTIONAL,           -- Need R
+    ...,
+    [[
+    nrofPDCCH-MonitoringOccasionPerSSB-InPO-r16                                  INTEGER (2..4)             OPTIONAL  -- Cond SharedSpectrum2
+    ]]
+}
+
+-- TAG-DOWNLINKCONFIGCOMMONSIB-STOP
+-- TAG-DOWNLINKPREEMPTION-START
+
+DownlinkPreemption ::=              SEQUENCE {
+    int-RNTI                            RNTI-Value,
+    timeFrequencySet                    ENUMERATED {set0, set1},
+    dci-PayloadSize                     INTEGER (0..maxINT-DCI-PayloadSize),
+    int-ConfigurationPerServingCell     SEQUENCE (SIZE (1..maxNrofServingCells)) OF INT-ConfigurationPerServingCell,
+    ...
+}
+
+INT-ConfigurationPerServingCell ::= SEQUENCE {
+    servingCellId                       ServCellIndex,
+    positionInDCI                       INTEGER (0..maxINT-DCI-PayloadSize-1)
+}
+
+-- TAG-DOWNLINKPREEMPTION-STOP
+-- TAG-DRB-IDENTITY-START
+
+DRB-Identity ::=                    INTEGER (1..32)
+
+-- TAG-DRB-IDENTITY-STOP
+-- TAG-DRX-CONFIG-START
+
+DRX-Config ::=                      SEQUENCE {
+    drx-onDurationTimer                 CHOICE {
+                                            subMilliSeconds INTEGER (1..31),
+                                            milliSeconds    ENUMERATED {
+                                                ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+                                                ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+                                                ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+                                            },
+    drx-InactivityTimer                 ENUMERATED {
+                                            ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+                                            ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+                                            spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+    drx-HARQ-RTT-TimerDL                INTEGER (0..56),
+    drx-HARQ-RTT-TimerUL                INTEGER (0..56),
+    drx-RetransmissionTimerDL           ENUMERATED {
+                                            sl0, sl1, sl2, sl4, sl6, sl8, sl16, sl24, sl33, sl40, sl64, sl80, sl96, sl112, sl128,
+                                            sl160, sl320, spare15, spare14, spare13, spare12, spare11, spare10, spare9,
+                                            spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1},
+    drx-RetransmissionTimerUL           ENUMERATED {
+                                            sl0, sl1, sl2, sl4, sl6, sl8, sl16, sl24, sl33, sl40, sl64, sl80, sl96, sl112, sl128,
+                                            sl160, sl320, spare15, spare14, spare13, spare12, spare11, spare10, spare9,
+                                            spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+    drx-LongCycleStartOffset            CHOICE {
+        ms10                                INTEGER(0..9),
+        ms20                                INTEGER(0..19),
+        ms32                                INTEGER(0..31),
+        ms40                                INTEGER(0..39),
+        ms60                                INTEGER(0..59),
+        ms64                                INTEGER(0..63),
+        ms70                                INTEGER(0..69),
+        ms80                                INTEGER(0..79),
+        ms128                               INTEGER(0..127),
+        ms160                               INTEGER(0..159),
+        ms256                               INTEGER(0..255),
+        ms320                               INTEGER(0..319),
+        ms512                               INTEGER(0..511),
+        ms640                               INTEGER(0..639),
+        ms1024                              INTEGER(0..1023),
+        ms1280                              INTEGER(0..1279),
+        ms2048                              INTEGER(0..2047),
+        ms2560                              INTEGER(0..2559),
+        ms5120                              INTEGER(0..5119),
+        ms10240                             INTEGER(0..10239)
+    },
+    shortDRX                            SEQUENCE {
+        drx-ShortCycle                      ENUMERATED  {
+                                                ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+                                                ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+                                                spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+        drx-ShortCycleTimer                 INTEGER (1..16)
+    }                                                                                                           OPTIONAL,   -- Need R
+    drx-SlotOffset                      INTEGER (0..31)
+}
+
+-- TAG-DRX-CONFIG-STOP
+-- TAG-DRX-CONFIGSECONDARYGROUP-START
+
+DRX-ConfigSecondaryGroup ::=       SEQUENCE {
+    drx-onDurationTimer                CHOICE {
+                                           subMilliSeconds INTEGER (1..31),
+                                           milliSeconds    ENUMERATED {
+                                               ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+                                               ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+                                               ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+                                            },
+    drx-InactivityTimer                ENUMERATED {
+                                           ms0, ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80,
+                                           ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, spare9, spare8,
+                                           spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+}
+
+-- TAG-DRX-CONFIGSECONDARYGROUP-STOP
+-- TAG-FILTERCOEFFICIENT-START
+
+FilterCoefficient ::=       ENUMERATED { fc0, fc1, fc2, fc3, fc4, fc5, fc6, fc7, fc8, fc9, fc11, fc13, fc15, fc17, fc19, spare1, ...}
+
+-- TAG-FILTERCOEFFICIENT-STOP
+-- TAG-FREQBANDINDICATORNR-START
+
+FreqBandIndicatorNR ::=             INTEGER (1..1024)
+
+-- TAG-FREQBANDINDICATORNR-STOP
+-- TAG-FREQUENCYINFODL-START
+
+FrequencyInfoDL ::=                 SEQUENCE {
+    absoluteFrequencySSB                ARFCN-ValueNR                                                   OPTIONAL,   -- Cond SpCellAdd
+    frequencyBandList                   MultiFrequencyBandListNR,
+    absoluteFrequencyPointA             ARFCN-ValueNR,
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    ...
+}
+
+-- TAG-FREQUENCYINFODL-STOP
+-- TAG-FREQUENCYINFODL-SIB-START
+
+FrequencyInfoDL-SIB ::=             SEQUENCE {
+    frequencyBandList                   MultiFrequencyBandListNR-SIB,
+    offsetToPointA                      INTEGER (0..2199),
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier
+}
+
+-- TAG-FREQUENCYINFODL-SIB-STOP
+-- TAG-FREQUENCYINFOUL-START
+
+FrequencyInfoUL ::=                 SEQUENCE {
+    frequencyBandList                   MultiFrequencyBandListNR                                OPTIONAL,   -- Cond FDD-OrSUL
+    absoluteFrequencyPointA             ARFCN-ValueNR                                           OPTIONAL,   -- Cond FDD-OrSUL
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    additionalSpectrumEmission          AdditionalSpectrumEmission                              OPTIONAL,   -- Need S
+    p-Max                               P-Max                                                   OPTIONAL,   -- Need S
+    frequencyShift7p5khz                ENUMERATED {true}                                       OPTIONAL,   -- Cond FDD-TDD-OrSUL-Optional
+    ...
+}
+
+-- TAG-FREQUENCYINFOUL-STOP
+-- TAG-FREQUENCYINFOUL-SIB-START
+
+FrequencyInfoUL-SIB ::=                 SEQUENCE {
+    frequencyBandList                   MultiFrequencyBandListNR-SIB                            OPTIONAL,   -- Cond FDD-OrSUL
+    absoluteFrequencyPointA             ARFCN-ValueNR                                           OPTIONAL,   -- Cond FDD-OrSUL
+    scs-SpecificCarrierList             SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    p-Max                               P-Max                                                   OPTIONAL,   -- Need S
+    frequencyShift7p5khz                ENUMERATED {true}                                       OPTIONAL,   -- Cond FDD-TDD-OrSUL-Optional
+    ...
+}
+
+-- TAG-FREQUENCYINFOUL-SIB-STOP
+-- TAG-HIGHSPEEDCONFIG-START
+
+HighSpeedConfig-r16 ::=  SEQUENCE {
+    highSpeedMeasFlag-r16    ENUMERATED {true}        OPTIONAL,   -- Need R
+    highSpeedDemodFlag-r16   ENUMERATED {true}        OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-HIGHSPEEDCONFIG-STOP
+-- TAG-HYSTERESIS-START
+
+Hysteresis ::=                      INTEGER (0..30)
+
+-- TAG-HYSTERESIS-STOP
+-- TAG-INVALIDSYMBOLPATTERN-START
+
+InvalidSymbolPattern-r16 ::=     SEQUENCE {
+    symbols-r16                      CHOICE {
+        oneSlot                          BIT STRING (SIZE (14)),
+        twoSlots                         BIT STRING (SIZE (28))
+    },
+    periodicityAndPattern-r16        CHOICE {
+        n2                               BIT STRING (SIZE (2)),
+        n4                               BIT STRING (SIZE (4)),
+        n5                               BIT STRING (SIZE (5)),
+        n8                               BIT STRING (SIZE (8)),
+        n10                              BIT STRING (SIZE (10)),
+        n20                              BIT STRING (SIZE (20)),
+        n40                              BIT STRING (SIZE (40))
+    }                                                                OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-INVALIDSYMBOLPATTERN-STOP
+-- TAG-I-RNTI-VALUE-START
+
+I-RNTI-Value ::=                        BIT STRING (SIZE(40))
+
+-- TAG-I-RNTI-VALUE-STOP
+-- TAG-LBT-FAILURERECOVERYCONFIG-START
+
+LBT-FailureRecoveryConfig-r16 ::=    SEQUENCE {
+    lbt-FailureInstanceMaxCount-r16      ENUMERATED {n4, n8, n16, n32, n64, n128},
+    lbt-FailureDetectionTimer-r16        ENUMERATED {ms10, ms20, ms40, ms80, ms160, ms320},
+    ...
+}
+
+-- TAG-LBT-FAILURERECOVERYCONFIG-STOP
+-- TAG-LOCATIONINFO-START
+
+LocationInfo-r16 ::=      SEQUENCE {
+    commonLocationInfo-r16    CommonLocationInfo-r16          OPTIONAL,
+    bt-LocationInfo-r16       LogMeasResultListBT-r16         OPTIONAL,
+    wlan-LocationInfo-r16     LogMeasResultListWLAN-r16       OPTIONAL,
+    sensor-LocationInfo-r16   Sensor-LocationInfo-r16         OPTIONAL,
+    ...
+}
+
+-- TAG-LOCATIONINFO-STOP
+-- TAG-LOCATIONMEASUREMENTINFO-START
+
+LocationMeasurementInfo ::=     CHOICE {
+    eutra-RSTD                  EUTRA-RSTD-InfoList,
+    ...,
+    eutra-FineTimingDetection   NULL,
+    nr-PRS-Measurement-r16      NR-PRS-MeasurementInfoList-r16
+}
+
+EUTRA-RSTD-InfoList ::= SEQUENCE (SIZE (1..maxInterRAT-RSTD-Freq)) OF EUTRA-RSTD-Info
+
+EUTRA-RSTD-Info ::= SEQUENCE {
+    carrierFreq                 ARFCN-ValueEUTRA,
+    measPRS-Offset              INTEGER (0..39),
+    ...
+}
+
+NR-PRS-MeasurementInfoList-r16 ::= SEQUENCE (SIZE (1..maxFreqLayers)) OF NR-PRS-MeasurementInfo-r16
+
+NR-PRS-MeasurementInfo-r16 ::=      SEQUENCE {
+    dl-PRS-PointA-r16                   ARFCN-ValueNR,
+    nr-MeasPRS-RepetitionAndOffset-r16  CHOICE {
+        ms20-r16                            INTEGER (0..19),
+        ms40-r16                            INTEGER (0..39),
+        ms80-r16                            INTEGER (0..79),
+        ms160-r16                           INTEGER (0..159),
+        ...
+    },
+    nr-MeasPRS-length-r16               ENUMERATED {ms1dot5, ms3, ms3dot5, ms4, ms5dot5, ms6, ms10, ms20},
+    ...
+}
+
+-- TAG-LOCATIONMEASUREMENTINFO-STOP
+-- TAG-LOGICALCHANNELCONFIG-START
+
+LogicalChannelConfig ::=            SEQUENCE {
+    ul-SpecificParameters               SEQUENCE {
+        priority                            INTEGER (1..16),
+        prioritisedBitRate                  ENUMERATED {kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, kBps256, kBps512,
+                                            kBps1024, kBps2048, kBps4096, kBps8192, kBps16384, kBps32768, kBps65536, infinity},
+        bucketSizeDuration                  ENUMERATED {ms5, ms10, ms20, ms50, ms100, ms150, ms300, ms500, ms1000,
+                                                            spare7, spare6, spare5, spare4, spare3,spare2, spare1},
+        allowedServingCells                 SEQUENCE (SIZE (1..maxNrofServingCells-1)) OF ServCellIndex
+                                                                                                            OPTIONAL,   -- Cond PDCP-CADuplication
+        allowedSCS-List                     SEQUENCE (SIZE (1..maxSCSs)) OF SubcarrierSpacing                   OPTIONAL,   -- Need R
+        maxPUSCH-Duration                   ENUMERATED {ms0p02, ms0p04, ms0p0625, ms0p125, ms0p25, ms0p5, spare2, spare1}
+                                                                                                                OPTIONAL,   -- Need R
+        configuredGrantType1Allowed         ENUMERATED {true}                                                   OPTIONAL,   -- Need R
+        logicalChannelGroup                 INTEGER (0..maxLCG-ID)                                              OPTIONAL,   -- Need R
+        schedulingRequestID                 SchedulingRequestId                                                 OPTIONAL,   -- Need R
+        logicalChannelSR-Mask               BOOLEAN,
+        logicalChannelSR-DelayTimerApplied  BOOLEAN,
+        ...,
+        bitRateQueryProhibitTimer       ENUMERATED {s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, s30}               OPTIONAL,    -- Need R
+        [[
+        allowedCG-List-r16                  SEQUENCE (SIZE (0.. maxNrofConfiguredGrantConfigMAC-r16-1)) OF ConfiguredGrantConfigIndexMAC-r16
+                                                                                                                OPTIONAL,   -- Need S
+        allowedPHY-PriorityIndex-r16        ENUMERATED {p0, p1}                                                 OPTIONAL    -- Need S
+        ]]
+    }                                                                                                       OPTIONAL,   -- Cond UL
+    ...,
+    [[
+    channelAccessPriority-r16           INTEGER (1..4)                                                      OPTIONAL,   -- Need R
+    bitRateMultiplier-r16               ENUMERATED {x40, x70, x100, x200}                                   OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-LOGICALCHANNELCONFIG-STOP
+-- TAG-LOGICALCHANNELIDENTITY-START
+
+LogicalChannelIdentity ::=          INTEGER (1..maxLC-ID)
+
+-- TAG-LOGICALCHANNELIDENTITY-STOP
+-- TAG-MAC-CELLGROUPCONFIG-START
+
+MAC-CellGroupConfig ::=             SEQUENCE {
+    drx-Config                          SetupRelease { DRX-Config }                                     OPTIONAL,   -- Need M
+    schedulingRequestConfig             SchedulingRequestConfig                                         OPTIONAL,   -- Need M
+    bsr-Config                          BSR-Config                                                      OPTIONAL,   -- Need M
+    tag-Config                          TAG-Config                                                      OPTIONAL,   -- Need M
+    phr-Config                          SetupRelease { PHR-Config }                                     OPTIONAL,   -- Need M
+    skipUplinkTxDynamic                 BOOLEAN,
+    ...,
+    [[
+    csi-Mask                            BOOLEAN                                                         OPTIONAL,   -- Need M
+    dataInactivityTimer                 SetupRelease { DataInactivityTimer }                            OPTIONAL    -- Cond MCG-Only
+    ]],
+    [[
+    usePreBSR-r16                       ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    schedulingRequestID-LBT-SCell-r16   SchedulingRequestId                                             OPTIONAL,   -- Need R
+    lch-BasedPrioritization-r16         ENUMERATED {enabled}                                            OPTIONAL,   -- Need R
+    schedulingRequestID-BFR-SCell-r16   SchedulingRequestId                                             OPTIONAL,   -- Need R
+    drx-ConfigSecondaryGroup-r16        SetupRelease { DRX-ConfigSecondaryGroup }                       OPTIONAL    -- Need M
+    ]],
+    [[
+    enhancedSkipUplinkTxDynamic-r16     ENUMERATED {true}                                               OPTIONAL,   -- Need R
+    enhancedSkipUplinkTxConfigured-r16  ENUMERATED {true}                                               OPTIONAL    -- Need R
+    ]]
+}
+
+DataInactivityTimer ::=         ENUMERATED {s1, s2, s3, s5, s7, s10, s15, s20, s40, s50, s60, s80, s100, s120, s150, s180}
+
+-- TAG-MAC-CELLGROUPCONFIG-STOP
+-- TAG-MEASCONFIG-START
+
+MeasConfig ::=                      SEQUENCE {
+    measObjectToRemoveList              MeasObjectToRemoveList                                              OPTIONAL,   -- Need N
+    measObjectToAddModList              MeasObjectToAddModList                                              OPTIONAL,   -- Need N
+    reportConfigToRemoveList            ReportConfigToRemoveList                                            OPTIONAL,   -- Need N
+    reportConfigToAddModList            ReportConfigToAddModList                                            OPTIONAL,   -- Need N
+    measIdToRemoveList                  MeasIdToRemoveList                                                  OPTIONAL,   -- Need N
+    measIdToAddModList                  MeasIdToAddModList                                                  OPTIONAL,   -- Need N
+    s-MeasureConfig                     CHOICE {
+        ssb-RSRP                            RSRP-Range,
+        csi-RSRP                            RSRP-Range
+    }                                                                                                       OPTIONAL,   -- Need M
+    quantityConfig                      QuantityConfig                                                      OPTIONAL,   -- Need M
+    measGapConfig                       MeasGapConfig                                                       OPTIONAL,   -- Need M
+    measGapSharingConfig                MeasGapSharingConfig                                                OPTIONAL,   -- Need M
+    ...,
+    [[
+    interFrequencyConfig-NoGap-r16      ENUMERATED {true}                                                   OPTIONAL    -- Need R
+    ]]
+}
+
+MeasObjectToRemoveList ::=              SEQUENCE (SIZE (1..maxNrofObjectId)) OF MeasObjectId
+
+MeasIdToRemoveList ::=                  SEQUENCE (SIZE (1..maxNrofMeasId)) OF MeasId
+
+ReportConfigToRemoveList ::=            SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigId
+
+-- TAG-MEASCONFIG-STOP
+-- TAG-MEASGAPCONFIG-START
+
+MeasGapConfig ::=                   SEQUENCE {
+    gapFR2                              SetupRelease { GapConfig }                                              OPTIONAL,   -- Need M
+    ...,
+    [[
+    gapFR1                              SetupRelease { GapConfig }                                              OPTIONAL,   -- Need M
+    gapUE                               SetupRelease { GapConfig }                                              OPTIONAL    -- Need M
+    ]]
+
+}
+
+GapConfig ::=                       SEQUENCE {
+    gapOffset                           INTEGER (0..159),
+    mgl                                 ENUMERATED {ms1dot5, ms3, ms3dot5, ms4, ms5dot5, ms6},
+    mgrp                                ENUMERATED {ms20, ms40, ms80, ms160},
+    mgta                                ENUMERATED {ms0, ms0dot25, ms0dot5},
+    ...,
+    [[
+    refServCellIndicator                ENUMERATED {pCell, pSCell, mcg-FR2}                                 OPTIONAL   -- Cond NEDCorNRDC
+    ]],
+    [[
+    refFR2ServCellAsyncCA-r16           ServCellIndex                                                       OPTIONAL,   -- Cond AsyncCA
+    mgl-r16                             ENUMERATED {ms10, ms20}                                             OPTIONAL    -- Cond PRS
+    ]]
+}
+
+-- TAG-MEASGAPCONFIG-STOP
+-- TAG-MEASGAPSHARINGCONFIG-START
+
+MeasGapSharingConfig ::=        SEQUENCE {
+    gapSharingFR2                   SetupRelease { MeasGapSharingScheme }       OPTIONAL,   -- Need M
+    ...,
+    [[
+    gapSharingFR1                   SetupRelease { MeasGapSharingScheme }       OPTIONAL,   --Need M
+    gapSharingUE                    SetupRelease { MeasGapSharingScheme }       OPTIONAL    --Need M
+    ]]
+}
+
+MeasGapSharingScheme::=         ENUMERATED {scheme00, scheme01, scheme10, scheme11}
+
+-- TAG-MEASGAPSHARINGCONFIG-STOP
+-- TAG-MEASID-START
+
+MeasId ::=                          INTEGER (1..maxNrofMeasId)
+
+-- TAG-MEASID-STOP
+-- TAG-MEASIDLECONFIG-START
+
+MeasIdleConfigSIB-r16 ::= SEQUENCE {
+    measIdleCarrierListNR-r16       SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16          OPTIONAL,     -- Need S
+    measIdleCarrierListEUTRA-r16    SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16       OPTIONAL,     -- Need S
+    ...
+}
+
+MeasIdleConfigDedicated-r16 ::= SEQUENCE {
+    measIdleCarrierListNR-r16       SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16          OPTIONAL,     -- Need N
+    measIdleCarrierListEUTRA-r16    SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16       OPTIONAL,     -- Need N
+    measIdleDuration-r16            ENUMERATED{sec10, sec30, sec60, sec120, sec180, sec240, sec300, spare},
+    validityAreaList-r16            ValidityAreaList-r16                                                   OPTIONAL,     -- Need N
+    ...
+}
+
+ValidityAreaList-r16 ::= SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF ValidityArea-r16
+
+ValidityArea-r16 ::=             SEQUENCE {
+    carrierFreq-r16                  ARFCN-ValueNR,
+    validityCellList-r16             ValidityCellList                                                     OPTIONAL   -- Need N
+}
+
+ValidityCellList ::= SEQUENCE (SIZE (1.. maxCellMeasIdle-r16)) OF PCI-Range
+
+MeasIdleCarrierNR-r16 ::=        SEQUENCE {
+    carrierFreq-r16                  ARFCN-ValueNR,
+    ssbSubcarrierSpacing-r16         SubcarrierSpacing,
+    frequencyBandList                MultiFrequencyBandListNR                                             OPTIONAL,  -- Need R
+    measCellListNR-r16               CellListNR-r16                                                       OPTIONAL,  -- Need R
+    reportQuantities-r16             ENUMERATED {rsrp, rsrq, both},
+    qualityThreshold-r16             SEQUENCE {
+        idleRSRP-Threshold-NR-r16        RSRP-Range                                                           OPTIONAL,  -- Need R
+        idleRSRQ-Threshold-NR-r16        RSRQ-Range                                                           OPTIONAL   -- Need R
+    }                                                                                                     OPTIONAL,  -- Need R
+    ssb-MeasConfig-r16               SEQUENCE {
+        nrofSS-BlocksToAverage-r16          INTEGER (2..maxNrofSS-BlocksToAverage)                            OPTIONAL,   -- Need S
+        absThreshSS-BlocksConsolidation-r16 ThresholdNR                                                       OPTIONAL,   -- Need S
+        smtc-r16                            SSB-MTC                                                           OPTIONAL,   -- Need S
+        ssb-ToMeasure-r16                   SSB-ToMeasure                                                     OPTIONAL,   -- Need S
+        deriveSSB-IndexFromCell-r16         BOOLEAN,
+        ss-RSSI-Measurement-r16             SS-RSSI-Measurement                                               OPTIONAL    -- Need S
+    }                                                                                                     OPTIONAL,  -- Need S
+    beamMeasConfigIdle-r16           BeamMeasConfigIdle-NR-r16                                            OPTIONAL,  -- Need R
+    ...
+}
+
+MeasIdleCarrierEUTRA-r16 ::=     SEQUENCE {
+    carrierFreqEUTRA-r16             ARFCN-ValueEUTRA,
+    allowedMeasBandwidth-r16         EUTRA-AllowedMeasBandwidth,
+    measCellListEUTRA-r16            CellListEUTRA-r16                                                    OPTIONAL,  -- Need R
+    reportQuantitiesEUTRA-r16        ENUMERATED {rsrp, rsrq, both},
+    qualityThresholdEUTRA-r16        SEQUENCE {
+        idleRSRP-Threshold-EUTRA-r16     RSRP-RangeEUTRA                                                      OPTIONAL,  -- Need R
+        idleRSRQ-Threshold-EUTRA-r16     RSRQ-RangeEUTRA-r16                                                  OPTIONAL   -- Need R
+    }                                                                                                     OPTIONAL,  -- Need S
+    ...
+}
+
+CellListNR-r16  ::=       SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF PCI-Range
+
+CellListEUTRA-r16  ::=    SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF EUTRA-PhysCellIdRange
+
+BeamMeasConfigIdle-NR-r16  ::=   SEQUENCE {
+    reportQuantityRS-Indexes-r16     ENUMERATED {rsrp, rsrq, both},
+    maxNrofRS-IndexesToReport-r16    INTEGER (1.. maxNrofIndexesToReport),
+    includeBeamMeasurements-r16      BOOLEAN
+}
+
+RSRQ-RangeEUTRA-r16 ::=   INTEGER (-30..46)
+
+-- TAG-MEASIDLECONFIG-STOP
+-- TAG-MEASIDTOADDMODLIST-START
+
+MeasIdToAddModList ::=              SEQUENCE (SIZE (1..maxNrofMeasId)) OF MeasIdToAddMod
+
+MeasIdToAddMod ::=                  SEQUENCE {
+    measId                              MeasId,
+    measObjectId                        MeasObjectId,
+    reportConfigId                      ReportConfigId
+}
+
+-- TAG-MEASIDTOADDMODLIST-STOP
+-- TAG-MEASOBJECTCLI-START
+
+MeasObjectCLI-r16 ::=                  SEQUENCE {
+     cli-ResourceConfig-r16               CLI-ResourceConfig-r16,
+    ...
+}
+
+CLI-ResourceConfig-r16 ::=          SEQUENCE {
+    srs-ResourceConfig-r16              SetupRelease { SRS-ResourceListConfigCLI-r16 }                 OPTIONAL,   -- Need M
+    rssi-ResourceConfig-r16             SetupRelease { RSSI-ResourceListConfigCLI-r16 }                OPTIONAL    -- Need M
+}
+
+SRS-ResourceListConfigCLI-r16 ::=   SEQUENCE (SIZE (1.. maxNrofCLI-SRS-Resources-r16)) OF SRS-ResourceConfigCLI-r16
+
+RSSI-ResourceListConfigCLI-r16 ::=  SEQUENCE (SIZE (1.. maxNrofCLI-RSSI-Resources-r16)) OF RSSI-ResourceConfigCLI-r16
+
+SRS-ResourceConfigCLI-r16 ::=       SEQUENCE {
+    srs-Resource-r16                    SRS-Resource,
+    srs-SCS-r16                         SubcarrierSpacing,
+    refServCellIndex-r16                ServCellIndex                                                  OPTIONAL,   -- Need S
+    refBWP-r16                          BWP-Id,
+    ...
+}
+
+RSSI-ResourceConfigCLI-r16 ::=      SEQUENCE {
+    rssi-ResourceId-r16                 RSSI-ResourceId-r16,
+    rssi-SCS-r16                        SubcarrierSpacing,
+    startPRB-r16                        INTEGER (0..2169),
+    nrofPRBs-r16                        INTEGER (4..maxNrofPhysicalResourceBlocksPlus1),
+    startPosition-r16                   INTEGER (0..13),
+    nrofSymbols-r16                     INTEGER (1..14),
+    rssi-PeriodicityAndOffset-r16       RSSI-PeriodicityAndOffset-r16,
+    refServCellIndex-r16                ServCellIndex                                                  OPTIONAL,   -- Need S
+    ...
+}
+
+RSSI-ResourceId-r16 ::=             INTEGER (0.. maxNrofCLI-RSSI-Resources-r16-1)
+
+RSSI-PeriodicityAndOffset-r16 ::=   CHOICE {
+    sl10                                INTEGER(0..9),
+    sl20                                INTEGER(0..19),
+    sl40                                INTEGER(0..39),
+    sl80                                INTEGER(0..79),
+    sl160                               INTEGER(0..159),
+    sl320                               INTEGER(0..319),
+    s1640                               INTEGER(0..639),
+    ...
+}
+
+-- TAG-MEASOBJECTCLI-STOP
+-- TAG-MEASOBJECTEUTRA-START
+
+MeasObjectEUTRA::=                          SEQUENCE {
+    carrierFreq                                 ARFCN-ValueEUTRA,
+    allowedMeasBandwidth                        EUTRA-AllowedMeasBandwidth,
+    cellsToRemoveListEUTRAN                     EUTRA-CellIndexList                                         OPTIONAL,    -- Need N
+    cellsToAddModListEUTRAN                     SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-Cell         OPTIONAL,    -- Need N
+    blackCellsToRemoveListEUTRAN                EUTRA-CellIndexList                                         OPTIONAL,    -- Need N
+    blackCellsToAddModListEUTRAN                SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-BlackCell    OPTIONAL,    -- Need N
+    eutra-PresenceAntennaPort1                  EUTRA-PresenceAntennaPort1,
+    eutra-Q-OffsetRange                         EUTRA-Q-OffsetRange                                         OPTIONAL,    -- Need R
+    widebandRSRQ-Meas                           BOOLEAN,
+    ...
+}
+
+EUTRA-CellIndexList ::=                     SEQUENCE (SIZE (1..maxCellMeasEUTRA)) OF EUTRA-CellIndex
+
+EUTRA-CellIndex ::=                         INTEGER (1..maxCellMeasEUTRA)
+
+
+EUTRA-Cell ::=                              SEQUENCE {
+    cellIndexEUTRA                              EUTRA-CellIndex,
+    physCellId                                  EUTRA-PhysCellId,
+    cellIndividualOffset                        EUTRA-Q-OffsetRange
+}
+
+
+EUTRA-BlackCell ::=                         SEQUENCE {
+    cellIndexEUTRA                              EUTRA-CellIndex,
+    physCellIdRange                             EUTRA-PhysCellIdRange
+}
+
+-- TAG-MEASOBJECTEUTRA-STOP
+-- TAG-MEASOBJECTID-START
+
+MeasObjectId ::=                    INTEGER (1..maxNrofObjectId)
+
+-- TAG-MEASOBJECTID-STOP
+-- TAG-MEASOBJECTNR-START
+
+MeasObjectNR ::=                    SEQUENCE {
+    ssbFrequency                        ARFCN-ValueNR                                                   OPTIONAL,   -- Cond SSBorAssociatedSSB
+    ssbSubcarrierSpacing                SubcarrierSpacing                                               OPTIONAL,   -- Cond SSBorAssociatedSSB
+    smtc1                               SSB-MTC                                                         OPTIONAL,   -- Cond SSBorAssociatedSSB
+    smtc2                               SSB-MTC2                                                        OPTIONAL,   -- Cond IntraFreqConnected
+    refFreqCSI-RS                       ARFCN-ValueNR                                                   OPTIONAL,   -- Cond CSI-RS
+    referenceSignalConfig               ReferenceSignalConfig,
+    absThreshSS-BlocksConsolidation     ThresholdNR                                                     OPTIONAL,   -- Need R
+    absThreshCSI-RS-Consolidation       ThresholdNR                                                     OPTIONAL,   -- Need R
+    nrofSS-BlocksToAverage              INTEGER (2..maxNrofSS-BlocksToAverage)                          OPTIONAL,   -- Need R
+    nrofCSI-RS-ResourcesToAverage       INTEGER (2..maxNrofCSI-RS-ResourcesToAverage)                   OPTIONAL,   -- Need R
+    quantityConfigIndex                 INTEGER (1..maxNrofQuantityConfig),
+    offsetMO                            Q-OffsetRangeList,
+    cellsToRemoveList                   PCI-List                                                        OPTIONAL,   -- Need N
+    cellsToAddModList                   CellsToAddModList                                               OPTIONAL,   -- Need N
+    blackCellsToRemoveList              PCI-RangeIndexList                                              OPTIONAL,   -- Need N
+    blackCellsToAddModList              SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeElement      OPTIONAL,   -- Need N
+    whiteCellsToRemoveList              PCI-RangeIndexList                                              OPTIONAL,   -- Need N
+    whiteCellsToAddModList              SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeElement      OPTIONAL,   -- Need N
+    ...,
+    [[
+    freqBandIndicatorNR                 FreqBandIndicatorNR                                             OPTIONAL,   -- Need R
+    measCycleSCell                      ENUMERATED {sf160, sf256, sf320, sf512, sf640, sf1024, sf1280}  OPTIONAL    -- Need R
+    ]],
+    [[
+    smtc3list-r16                     SSB-MTC3List-r16                                                  OPTIONAL,   -- Need R
+    rmtc-Config-r16                     SetupRelease {RMTC-Config-r16}                                  OPTIONAL,   -- Need M
+    t312-r16                            SetupRelease { T312-r16 }                                       OPTIONAL    -- Need M
+    ]]
+}
+
+SSB-MTC3List-r16::=                 SEQUENCE (SIZE(1..4)) OF SSB-MTC3-r16
+
+T312-r16 ::=                        ENUMERATED { ms0, ms50, ms100, ms200, ms300, ms400, ms500, ms1000}
+
+ReferenceSignalConfig::=            SEQUENCE {
+    ssb-ConfigMobility                  SSB-ConfigMobility                                              OPTIONAL,   -- Need M
+    csi-rs-ResourceConfigMobility       SetupRelease { CSI-RS-ResourceConfigMobility }                  OPTIONAL    -- Need M
+}
+
+SSB-ConfigMobility::=               SEQUENCE {
+    ssb-ToMeasure                           SetupRelease { SSB-ToMeasure }                              OPTIONAL,   -- Need M
+    deriveSSB-IndexFromCell             BOOLEAN,
+    ss-RSSI-Measurement                         SS-RSSI-Measurement                                     OPTIONAL,   -- Need M
+    ...,
+    [[
+    ssb-PositionQCL-Common-r16              SSB-PositionQCL-Relation-r16                                OPTIONAL,   -- Cond SharedSpectrum
+    ssb-PositionQCL-CellsToAddModList-r16   SSB-PositionQCL-CellsToAddModList-r16                       OPTIONAL,   -- Need N
+    ssb-PositionQCL-CellsToRemoveList-r16   PCI-List                                                    OPTIONAL    -- Need N
+    ]]
+}
+
+Q-OffsetRangeList ::=               SEQUENCE {
+    rsrpOffsetSSB                       Q-OffsetRange               DEFAULT dB0,
+    rsrqOffsetSSB                       Q-OffsetRange               DEFAULT dB0,
+    sinrOffsetSSB                       Q-OffsetRange               DEFAULT dB0,
+    rsrpOffsetCSI-RS                    Q-OffsetRange               DEFAULT dB0,
+    rsrqOffsetCSI-RS                    Q-OffsetRange               DEFAULT dB0,
+    sinrOffsetCSI-RS                    Q-OffsetRange               DEFAULT dB0
+}
+
+
+ThresholdNR ::=                     SEQUENCE{
+    thresholdRSRP                       RSRP-Range                                                      OPTIONAL,   -- Need R
+    thresholdRSRQ                       RSRQ-Range                                                      OPTIONAL,   -- Need R
+    thresholdSINR                       SINR-Range                                                      OPTIONAL    -- Need R
+}
+
+CellsToAddModList ::=               SEQUENCE (SIZE (1..maxNrofCellMeas)) OF CellsToAddMod
+
+CellsToAddMod ::=                   SEQUENCE {
+    physCellId                          PhysCellId,
+    cellIndividualOffset                Q-OffsetRangeList
+}
+
+RMTC-Config-r16 ::=                 SEQUENCE {
+    rmtc-Periodicity-r16                ENUMERATED {ms40, ms80, ms160, ms320, ms640},
+    rmtc-SubframeOffset-r16             INTEGER(0..639)                                                 OPTIONAL,   -- Need M
+    measDurationSymbols-r16             ENUMERATED {sym1, sym14or12, sym28or24, sym42or36, sym70or60},
+    rmtc-Frequency-r16                  ARFCN-ValueNR,
+    ref-SCS-CP-r16                      ENUMERATED {kHz15, kHz30, kHz60-NCP, kHz60-ECP},
+    ...
+}
+
+SSB-PositionQCL-CellsToAddModList-r16 ::= SEQUENCE (SIZE (1..maxNrofCellMeas)) OF SSB-PositionQCL-CellsToAddMod-r16
+
+SSB-PositionQCL-CellsToAddMod-r16 ::= SEQUENCE {
+    physCellId-r16                        PhysCellId,
+    ssb-PositionQCL-r16                   SSB-PositionQCL-Relation-r16
+}
+
+-- TAG-MEASOBJECTNR-STOP
+-- TAG-MEASOBJECTNR-SL-START
+
+MeasObjectNR-SL-r16 ::=      SEQUENCE {
+    tx-PoolMeasToRemoveList-r16  Tx-PoolMeasList-r16                           OPTIONAL,       -- Need N
+    tx-PoolMeasToAddModList-r16  Tx-PoolMeasList-r16                           OPTIONAL        -- Need N
+}
+
+Tx-PoolMeasList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-PoolToMeasureNR-r16)) OF SL-ResourcePoolID-r16
+
+-- TAG-MEASOBJECTNR-SL-STOP
+-- TAG-MEASOBJECTTOADDMODLIST-START
+
+MeasObjectToAddModList ::=                  SEQUENCE (SIZE (1..maxNrofObjectId)) OF MeasObjectToAddMod
+
+MeasObjectToAddMod ::=                      SEQUENCE {
+    measObjectId                                MeasObjectId,
+    measObject                                  CHOICE {
+        measObjectNR                                MeasObjectNR,
+        ...,
+        measObjectEUTRA                             MeasObjectEUTRA,
+        measObjectUTRA-FDD-r16                      MeasObjectUTRA-FDD-r16,
+        measObjectNR-SL-r16                         MeasObjectNR-SL-r16,
+        measObjectCLI-r16                           MeasObjectCLI-r16
+    }
+}
+
+-- TAG-MEASOBJECTTOADDMODLIST-STOP
+-- TAG-MEASOBJECTUTRA-FDD-START
+
+MeasObjectUTRA-FDD-r16 ::=                  SEQUENCE {
+    carrierFreq-r16                             ARFCN-ValueUTRA-FDD-r16,
+    utra-FDD-Q-OffsetRange-r16                  UTRA-FDD-Q-OffsetRange-r16              OPTIONAL,         -- Need R
+    cellsToRemoveList-r16                       UTRA-FDD-CellIndexList-r16              OPTIONAL,         -- Need N
+    cellsToAddModList-r16                       CellsToAddModListUTRA-FDD-r16           OPTIONAL,         -- Need N
+    ...
+}
+
+CellsToAddModListUTRA-FDD-r16 ::=           SEQUENCE (SIZE (1..maxCellMeasUTRA-FDD-r16)) OF CellsToAddModUTRA-FDD-r16
+
+CellsToAddModUTRA-FDD-r16 ::=               SEQUENCE {
+    cellIndexUTRA-FDD-r16                       UTRA-FDD-CellIndex-r16,
+    physCellId-r16                              PhysCellIdUTRA-FDD-r16
+}
+
+UTRA-FDD-CellIndexList-r16 ::=              SEQUENCE (SIZE (1..maxCellMeasUTRA-FDD-r16)) OF UTRA-FDD-CellIndex-r16
+
+UTRA-FDD-CellIndex-r16 ::=                  INTEGER (1..maxCellMeasUTRA-FDD-r16)
+
+-- TAG-MEASOBJECTUTRA-FDD-STOP
+-- TAG-MEASRESULTCELLLISTSFTD-NR-START
+
+MeasResultCellListSFTD-NR ::=          SEQUENCE (SIZE (1..maxCellSFTD)) OF MeasResultCellSFTD-NR
+
+MeasResultCellSFTD-NR ::=              SEQUENCE {
+    physCellId                            PhysCellId,
+    sfn-OffsetResult                      INTEGER (0..1023),
+    frameBoundaryOffsetResult             INTEGER (-30720..30719),
+    rsrp-Result                           RSRP-Range                      OPTIONAL
+}
+
+-- TAG-MEASRESULTCELLLISTSFTD-NR-STOP
+-- TAG-MEASRESULTCELLLISTSFTD-EUTRA-START
+
+MeasResultCellListSFTD-EUTRA ::=          SEQUENCE (SIZE (1..maxCellSFTD)) OF MeasResultSFTD-EUTRA
+
+MeasResultSFTD-EUTRA ::=           SEQUENCE {
+    eutra-PhysCellId                    EUTRA-PhysCellId,
+    sfn-OffsetResult                    INTEGER (0..1023),
+    frameBoundaryOffsetResult           INTEGER (-30720..30719),
+    rsrp-Result                         RSRP-Range                      OPTIONAL
+}
+
+-- TAG-MEASRESULTCELLLISTSFTD-EUTRA-STOP
+-- TAG-MEASRESULTS-START
+
+MeasResults ::=                         SEQUENCE {
+    measId                                  MeasId,
+    measResultServingMOList                 MeasResultServMOList,
+    measResultNeighCells                    CHOICE {
+        measResultListNR                        MeasResultListNR,
+        ...,
+        measResultListEUTRA                     MeasResultListEUTRA,
+        measResultListUTRA-FDD-r16              MeasResultListUTRA-FDD-r16
+    }                                                                                                                   OPTIONAL,
+    ...,
+    [[
+    measResultServFreqListEUTRA-SCG         MeasResultServFreqListEUTRA-SCG                                             OPTIONAL,
+    measResultServFreqListNR-SCG            MeasResultServFreqListNR-SCG                                                OPTIONAL,
+    measResultSFTD-EUTRA                    MeasResultSFTD-EUTRA                                                        OPTIONAL,
+    measResultSFTD-NR                       MeasResultCellSFTD-NR                                                       OPTIONAL
+     ]],
+     [[
+    measResultCellListSFTD-NR               MeasResultCellListSFTD-NR                                                   OPTIONAL
+    ]],
+    [[
+    measResultForRSSI-r16                   MeasResultForRSSI-r16                                                       OPTIONAL,
+    locationInfo-r16                        LocationInfo-r16                                                            OPTIONAL,
+    ul-PDCP-DelayValueResultList-r16        UL-PDCP-DelayValueResultList-r16                                            OPTIONAL,
+    measResultsSL-r16                       MeasResultsSL-r16                                                           OPTIONAL,
+    measResultCLI-r16                       MeasResultCLI-r16                                                           OPTIONAL
+    ]]
+
+
+}
+
+MeasResultServMOList ::=                SEQUENCE (SIZE (1..maxNrofServingCells)) OF MeasResultServMO
+
+MeasResultServMO ::=                    SEQUENCE {
+    servCellId                              ServCellIndex,
+    measResultServingCell                   MeasResultNR,
+    measResultBestNeighCell                 MeasResultNR                                                                OPTIONAL,
+    ...
+}
+
+MeasResultListNR ::=                    SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultNR
+
+MeasResultNR ::=                        SEQUENCE {
+    physCellId                              PhysCellId                                                                  OPTIONAL,
+    measResult                              SEQUENCE {
+        cellResults                             SEQUENCE{
+            resultsSSB-Cell                         MeasQuantityResults                                                 OPTIONAL,
+            resultsCSI-RS-Cell                      MeasQuantityResults                                                 OPTIONAL
+        },
+        rsIndexResults                          SEQUENCE{
+            resultsSSB-Indexes                      ResultsPerSSB-IndexList                                             OPTIONAL,
+            resultsCSI-RS-Indexes                   ResultsPerCSI-RS-IndexList                                          OPTIONAL
+        }                                                                                                               OPTIONAL
+    },
+    ...,
+    [[
+    cgi-Info                                CGI-InfoNR                                                                    OPTIONAL
+    ]]
+}
+
+MeasResultListEUTRA ::=                 SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultEUTRA
+
+MeasResultEUTRA ::=                     SEQUENCE {
+    eutra-PhysCellId                        PhysCellId,
+    measResult                              MeasQuantityResultsEUTRA,
+
+    cgi-Info                                CGI-InfoEUTRA                                                               OPTIONAL,
+    ...
+}
+
+MultiBandInfoListEUTRA ::=              SEQUENCE (SIZE (1..maxMultiBands)) OF FreqBandIndicatorEUTRA
+
+MeasQuantityResults ::=                 SEQUENCE {
+    rsrp                                    RSRP-Range                                                                  OPTIONAL,
+    rsrq                                    RSRQ-Range                                                                  OPTIONAL,
+    sinr                                    SINR-Range                                                                  OPTIONAL
+}
+
+MeasQuantityResultsEUTRA ::=            SEQUENCE {
+    rsrp                                    RSRP-RangeEUTRA                                                             OPTIONAL,
+    rsrq                                    RSRQ-RangeEUTRA                                                             OPTIONAL,
+    sinr                                    SINR-RangeEUTRA                                                             OPTIONAL
+}
+
+ResultsPerSSB-IndexList::=              SEQUENCE (SIZE (1..maxNrofIndexesToReport2)) OF ResultsPerSSB-Index
+
+ResultsPerSSB-Index ::=                 SEQUENCE {
+    ssb-Index                               SSB-Index,
+    ssb-Results                             MeasQuantityResults                                                         OPTIONAL
+}
+
+ResultsPerCSI-RS-IndexList::=           SEQUENCE (SIZE (1..maxNrofIndexesToReport2)) OF ResultsPerCSI-RS-Index
+
+ResultsPerCSI-RS-Index ::=              SEQUENCE {
+    csi-RS-Index                            CSI-RS-Index,
+    csi-RS-Results                          MeasQuantityResults                                                         OPTIONAL
+}
+MeasResultServFreqListEUTRA-SCG ::= SEQUENCE (SIZE (1..maxNrofServingCellsEUTRA)) OF MeasResult2EUTRA
+
+MeasResultServFreqListNR-SCG ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF MeasResult2NR
+
+MeasResultListUTRA-FDD-r16 ::=          SEQUENCE (SIZE (1..maxCellReport)) OF MeasResultUTRA-FDD-r16
+
+MeasResultUTRA-FDD-r16 ::=              SEQUENCE {
+    physCellId-r16                          PhysCellIdUTRA-FDD-r16,
+    measResult-r16                          SEQUENCE {
+        utra-FDD-RSCP-r16                       INTEGER (-5..91)          OPTIONAL,
+        utra-FDD-EcN0-r16                       INTEGER (0..49)           OPTIONAL
+    }
+}
+
+MeasResultForRSSI-r16 ::=        SEQUENCE {
+    rssi-Result-r16                  RSSI-Range-r16,
+    channelOccupancy-r16             INTEGER (0..100)
+}
+
+MeasResultCLI-r16 ::=            SEQUENCE {
+    measResultListSRS-RSRP-r16       MeasResultListSRS-RSRP-r16                                                         OPTIONAL,
+    measResultListCLI-RSSI-r16       MeasResultListCLI-RSSI-r16                                                         OPTIONAL
+}
+
+MeasResultListSRS-RSRP-r16 ::=   SEQUENCE (SIZE (1.. maxCLI-Report-r16)) OF MeasResultSRS-RSRP-r16
+
+MeasResultSRS-RSRP-r16 ::=       SEQUENCE {
+    srs-ResourceId-r16               SRS-ResourceId,
+    srs-RSRP-Result-r16              SRS-RSRP-Range-r16
+}
+
+MeasResultListCLI-RSSI-r16 ::=   SEQUENCE (SIZE (1.. maxCLI-Report-r16)) OF MeasResultCLI-RSSI-r16
+
+MeasResultCLI-RSSI-r16 ::=       SEQUENCE {
+    rssi-ResourceId-r16              RSSI-ResourceId-r16,
+    cli-RSSI-Result-r16              CLI-RSSI-Range-r16
+}
+
+UL-PDCP-DelayValueResultList-r16 ::= SEQUENCE (SIZE (1..maxDRB)) OF UL-PDCP-DelayValueResult-r16
+
+UL-PDCP-DelayValueResult-r16 ::= SEQUENCE {
+    drb-Id-r16                       DRB-Identity,
+    averageDelay-r16                 INTEGER (0..10000),
+    ...
+}
+
+-- TAG-MEASRESULTS-STOP
+-- TAG-MEASRESULT2EUTRA-START
+
+MeasResult2EUTRA ::=       SEQUENCE {
+    carrierFreq                         ARFCN-ValueEUTRA,
+    measResultServingCell               MeasResultEUTRA                 OPTIONAL,
+    measResultBestNeighCell             MeasResultEUTRA                 OPTIONAL,
+    ...
+}
+
+-- TAG-MEASRESULT2EUTRA-STOP
+-- TAG-MEASRESULT2NR-START
+
+MeasResult2NR ::=                   SEQUENCE {
+    ssbFrequency                        ARFCN-ValueNR                           OPTIONAL,
+    refFreqCSI-RS                       ARFCN-ValueNR                           OPTIONAL,
+    measResultServingCell               MeasResultNR                            OPTIONAL,
+    measResultNeighCellListNR           MeasResultListNR                        OPTIONAL,
+    ...
+}
+
+-- TAG-MEASRESULT2NR-STOP
+-- TAG-MEASRESULTIDLEEUTRA-START
+
+MeasResultIdleEUTRA-r16 ::= SEQUENCE {
+    measResultsPerCarrierListIdleEUTRA-r16   SEQUENCE (SIZE (1.. maxFreqIdle-r16)) OF MeasResultsPerCarrierIdleEUTRA-r16,
+    ...
+}
+
+MeasResultsPerCarrierIdleEUTRA-r16 ::=  SEQUENCE {
+    carrierFreqEUTRA-r16                    ARFCN-ValueEUTRA,
+    measResultsPerCellListIdleEUTRA-r16     SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF MeasResultsPerCellIdleEUTRA-r16,
+    ...
+}
+
+MeasResultsPerCellIdleEUTRA-r16 ::=     SEQUENCE {
+    eutra-PhysCellId-r16                    EUTRA-PhysCellId,
+    measIdleResultEUTRA-r16                 SEQUENCE {
+       rsrp-ResultEUTRA-r16                     RSRP-RangeEUTRA                                                     OPTIONAL,
+       rsrq-ResultEUTRA-r16                     RSRQ-RangeEUTRA-r16                                                 OPTIONAL
+    },
+    ...
+}
+
+-- TAG-MEASRESULTIDLEEUTRA-STOP
+-- TAG-MEASRESULTIDLENR-START
+
+MeasResultIdleNR-r16 ::=  SEQUENCE {
+    measResultServingCell-r16 SEQUENCE {
+        rsrp-Result-r16           RSRP-Range                                                                        OPTIONAL,
+        rsrq-Result-r16           RSRQ-Range                                                                        OPTIONAL,
+        resultsSSB-Indexes-r16    ResultsPerSSB-IndexList-r16                                                       OPTIONAL
+    },
+    measResultsPerCarrierListIdleNR-r16 SEQUENCE (SIZE (1.. maxFreqIdle-r16)) OF MeasResultsPerCarrierIdleNR-r16    OPTIONAL,
+    ...
+}
+
+MeasResultsPerCarrierIdleNR-r16 ::=   SEQUENCE {
+    carrierFreq-r16                       ARFCN-ValueNR,
+    measResultsPerCellListIdleNR-r16      SEQUENCE (SIZE (1..maxCellMeasIdle-r16)) OF MeasResultsPerCellIdleNR-r16,
+    ...
+}
+
+MeasResultsPerCellIdleNR-r16 ::=  SEQUENCE {
+    physCellId-r16                    PhysCellId,
+    measIdleResultNR-r16              SEQUENCE {
+        rsrp-Result-r16                   RSRP-Range                                                              OPTIONAL,
+        rsrq-Result-r16                   RSRQ-Range                                                              OPTIONAL,
+        resultsSSB-Indexes-r16            ResultsPerSSB-IndexList-r16                                             OPTIONAL
+    },
+    ...
+}
+
+ResultsPerSSB-IndexList-r16 ::=   SEQUENCE (SIZE (1.. maxNrofIndexesToReport)) OF ResultsPerSSB-IndexIdle-r16
+
+ResultsPerSSB-IndexIdle-r16 ::=   SEQUENCE {
+    ssb-Index-r16                     SSB-Index,
+    ssb-Results-r16                   SEQUENCE {
+        ssb-RSRP-Result-r16               RSRP-Range                                                              OPTIONAL,
+        ssb-RSRQ-Result-r16               RSRQ-Range                                                              OPTIONAL
+    }                                                                                                     OPTIONAL
+}
+
+-- TAG-MEASRESULTIDLENR-STOP
+-- TAG-MEASRESULTSCG-FAILURE-START
+
+MeasResultSCG-Failure ::=           SEQUENCE {
+    measResultPerMOList                 MeasResultList2NR,
+    ...,
+    [[
+    locationInfo-r16                    LocationInfo-r16            OPTIONAL
+    ]]
+}
+
+MeasResultList2NR ::=               SEQUENCE (SIZE (1..maxFreq)) OF MeasResult2NR
+
+-- TAG-MEASRESULTSCG-FAILURE-STOP
+-- TAG-MEASRESULTSSL-START
+
+MeasResultsSL-r16 ::=         SEQUENCE {
+    measResultsListSL-r16         CHOICE {
+        measResultNR-SL-r16           MeasResultNR-SL-r16,
+        ...
+    },
+    ...
+}
+
+MeasResultNR-SL-r16 ::=       SEQUENCE {
+    measResultListCBR-NR-r16      SEQUENCE (SIZE (1.. maxNrofSL-PoolToMeasureNR-r16)) OF MeasResultCBR-NR-r16,
+    ...
+}
+
+MeasResultCBR-NR-r16 ::=      SEQUENCE {
+    sl-poolReportIdentity-r16     SL-ResourcePoolID-r16,
+    sl-CBR-ResultsNR-r16          SL-CBR-r16,
+    ...
+}
+
+-- TAG-MEASRESULTSSL-STOP
+-- TAG-MEASTRIGGERQUANTITYEUTRA-START
+
+MeasTriggerQuantityEUTRA::=                 CHOICE {
+    rsrp                                        RSRP-RangeEUTRA,
+    rsrq                                        RSRQ-RangeEUTRA,
+    sinr                                        SINR-RangeEUTRA
+}
+
+RSRP-RangeEUTRA ::=                 INTEGER (0..97)
+
+RSRQ-RangeEUTRA ::=                 INTEGER (0..34)
+
+SINR-RangeEUTRA ::=                 INTEGER (0..127)
+
+-- TAG-MEASTRIGGERQUANTITYEUTRA-STOP
+-- TAG-MOBILITYSTATEPARAMETERS-START
+
+MobilityStateParameters ::=         SEQUENCE{
+    t-Evaluation                        ENUMERATED {
+                                            s30, s60, s120, s180, s240, spare3, spare2, spare1},
+    t-HystNormal                        ENUMERATED {
+                                            s30, s60, s120, s180, s240, spare3, spare2, spare1},
+    n-CellChangeMedium                  INTEGER (1..16),
+    n-CellChangeHigh                    INTEGER (1..16)
+}
+
+-- TAG-MOBILITYSTATEPARAMETERS-STOP
+-- TAG-MSGACONFIGCOMMON-START
+
+MsgA-ConfigCommon-r16 ::=           SEQUENCE {
+    rach-ConfigCommonTwoStepRA-r16      RACH-ConfigCommonTwoStepRA-r16,
+    msgA-PUSCH-Config-r16               MsgA-PUSCH-Config-r16                                      OPTIONAL --Cond InitialBWPConfig
+}
+-- TAG-MSGACONFIGCOMMON-STOP
+-- TAG-MSGA-PUSCH-CONFIG-START
+
+MsgA-PUSCH-Config-r16 ::=                      SEQUENCE {
+    msgA-PUSCH-ResourceGroupA-r16                  MsgA-PUSCH-Resource-r16                                       OPTIONAL, -- Cond InitialBWPConfig
+    msgA-PUSCH-ResourceGroupB-r16                  MsgA-PUSCH-Resource-r16                                       OPTIONAL, -- Cond GroupBConfigured
+    msgA-TransformPrecoder-r16                    ENUMERATED {enabled, disabled}                                 OPTIONAL, -- Need R
+    msgA-DataScramblingIndex-r16                   INTEGER (0..1023)                                             OPTIONAL, -- Need S
+    msgA-DeltaPreamble-r16                         INTEGER (-1..6)                                               OPTIONAL  -- Need R
+}
+
+MsgA-PUSCH-Resource-r16 ::=                    SEQUENCE {
+    msgA-MCS-r16                                   INTEGER (0..15),
+    nrofSlotsMsgA-PUSCH-r16                        INTEGER (1..4),
+    nrofMsgA-PO-PerSlot-r16                        ENUMERATED {one, two, three, six},
+    msgA-PUSCH-TimeDomainOffset-r16                INTEGER (1..32),
+    msgA-PUSCH-TimeDomainAllocation-r16            INTEGER (1..maxNrofUL-Allocations)                            OPTIONAL, -- Need S
+    startSymbolAndLengthMsgA-PO-r16                INTEGER (0..127)                                              OPTIONAL, -- Need S
+    mappingTypeMsgA-PUSCH-r16                      ENUMERATED {typeA, typeB}                                     OPTIONAL, -- Need S
+    guardPeriodMsgA-PUSCH-r16                      INTEGER (0..3)                                                OPTIONAL, -- Need R
+    guardBandMsgA-PUSCH-r16                        INTEGER (0..1),
+    frequencyStartMsgA-PUSCH-r16                   INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+    nrofPRBs-PerMsgA-PO-r16                        INTEGER (1..32),
+    nrofMsgA-PO-FDM-r16                            ENUMERATED {one, two, four, eight},
+    msgA-IntraSlotFrequencyHopping-r16             ENUMERATED {enabled}                                          OPTIONAL, -- Need R
+    msgA-HoppingBits-r16                           BIT STRING (SIZE(2))                                          OPTIONAL, -- Cond FreqHopConfigured
+    msgA-DMRS-Config-r16                           MsgA-DMRS-Config-r16,
+    nrofDMRS-Sequences-r16                         INTEGER (1..2),
+    msgA-Alpha-r16                                 ENUMERATED {alpha0, alpha04, alpha05, alpha06,
+                                                               alpha07, alpha08, alpha09, alpha1}                OPTIONAL, -- Need S
+    interlaceIndexFirstPO-MsgA-PUSCH-r16           INTEGER (1..10)                                               OPTIONAL, -- Need R
+    nrofInterlacesPerMsgA-PO-r16                   INTEGER (1..10)                                               OPTIONAL, -- Need R
+    ...
+}
+
+MsgA-DMRS-Config-r16 ::=                       SEQUENCE {
+    msgA-DMRS-AdditionalPosition-r16               ENUMERATED {pos0, pos1, pos3}                                 OPTIONAL, -- Need S
+    msgA-MaxLength-r16                             ENUMERATED {len2}                                             OPTIONAL, -- Need S
+    msgA-PUSCH-DMRS-CDM-Group-r16                  INTEGER (0..1)                                                OPTIONAL, -- Need S
+    msgA-PUSCH-NrofPorts-r16                       INTEGER (0..1)                                                OPTIONAL, -- Need S
+    msgA-ScramblingID0-r16                         INTEGER (0..65535)                                            OPTIONAL, -- Need S
+    msgA-ScramblingID1-r16                         INTEGER (0..65535)                                            OPTIONAL  -- Need S
+}
+
+-- TAG-MSGA-PUSCH-CONFIG-STOP
+-- TAG-MULTIFREQUENCYBANDLISTNR-START
+
+MultiFrequencyBandListNR ::=        SEQUENCE (SIZE (1..maxNrofMultiBands)) OF FreqBandIndicatorNR
+
+-- TAG-MULTIFREQUENCYBANDLISTNR-STOP
+-- TAG-MULTIFREQUENCYBANDLISTNR-SIB-START
+
+MultiFrequencyBandListNR-SIB ::=            SEQUENCE (SIZE (1.. maxNrofMultiBands)) OF NR-MultiBandInfo
+
+NR-MultiBandInfo ::=                        SEQUENCE {
+    freqBandIndicatorNR                         FreqBandIndicatorNR         OPTIONAL,   -- Cond OptULNotSIB2
+    nr-NS-PmaxList                              NR-NS-PmaxList              OPTIONAL    -- Need S
+}
+
+-- TAG-MULTIFREQUENCYBANDLISTNR-SIB-STOP
+-- TAG-NeedForGapsConfigNR-START
+
+NeedForGapsConfigNR-r16 ::=        SEQUENCE {
+    requestedTargetBandFilterNR-r16       SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicatorNR               OPTIONAL          -- Need R
+}
+
+-- TAG-NeedForGapsConfigNR-STOP
+-- TAG-NeedForGapsInfoNR-START
+
+NeedForGapsInfoNR-r16 ::=        SEQUENCE {
+    intraFreq-needForGap-r16      NeedForGapsIntraFreqlist-r16,
+    interFreq-needForGap-r16      NeedForGapsBandlistNR-r16
+}
+
+NeedForGapsIntraFreqlist-r16 ::=          SEQUENCE (SIZE (1.. maxNrofServingCells)) OF NeedForGapsIntraFreq-r16
+
+NeedForGapsBandlistNR-r16 ::=             SEQUENCE (SIZE (1..maxBands)) OF NeedForGapsNR-r16
+
+NeedForGapsIntraFreq-r16  ::=                 SEQUENCE {
+    servCellId-r16                               ServCellIndex,
+    gapIndicationIntra-r16                       ENUMERATED {gap, no-gap}
+}
+
+NeedForGapsNR-r16  ::=                        SEQUENCE {
+    bandNR-r16                                   FreqBandIndicatorNR,
+    gapIndication-r16                            ENUMERATED {gap, no-gap}
+}
+
+-- TAG-NeedForGapsInfoNR-STOP
+-- TAG-NEXTHOPCHAININGCOUNT-START
+
+NextHopChainingCount ::=                    INTEGER (0..7)
+
+-- TAG-NEXTHOPCHAININGCOUNT-STOP
+-- TAG-NG-5G-S-TMSI-START
+
+NG-5G-S-TMSI ::=                         BIT STRING (SIZE (48))
+
+-- TAG-NG-5G-S-TMSI-STOP
+-- TAG-NPN-IDENTITY-START
+
+NPN-Identity-r16 ::=             CHOICE {
+    pni-npn-r16                      SEQUENCE {
+        plmn-Identity-r16                PLMN-Identity,
+        cag-IdentityList-r16             SEQUENCE (SIZE (1..maxNPN-r16)) OF CAG-IdentityInfo-r16
+    },
+    snpn-r16                         SEQUENCE {
+        plmn-Identity-r16                PLMN-Identity,
+        nid-List-r16                     SEQUENCE (SIZE (1..maxNPN-r16)) OF NID-r16
+    }
+}
+
+CAG-IdentityInfo-r16 ::=         SEQUENCE {
+    cag-Identity-r16                 BIT STRING (SIZE (32)),
+    manualCAGselectionAllowed-r16    ENUMERATED {true}                         OPTIONAL   -- Need R
+}
+
+NID-r16 ::=                      BIT STRING (SIZE (44))
+
+-- TAG-NPN-IDENTITY-STOP
+-- TAG-NPN-IDENTITYINFOLIST-START
+
+NPN-IdentityInfoList-r16 ::=     SEQUENCE (SIZE (1..maxNPN-r16)) OF NPN-IdentityInfo-r16
+
+
+NPN-IdentityInfo-r16 ::=         SEQUENCE {
+    npn-IdentityList-r16             SEQUENCE (SIZE (1..maxNPN-r16)) OF NPN-Identity-r16,
+    trackingAreaCode-r16             TrackingAreaCode,
+    ranac-r16                        RAN-AreaCode                                                OPTIONAL,       -- Need R
+    cellIdentity-r16                 CellIdentity,
+    cellReservedForOperatorUse-r16   ENUMERATED {reserved, notReserved},
+    iab-Support-r16                  ENUMERATED {true}                                           OPTIONAL,       -- Need S
+    ...
+}
+
+-- TAG-NPN-IDENTITYINFOLIST-STOP
+-- TAG-NR-NS-PMAXLIST-START
+
+NR-NS-PmaxList ::=                      SEQUENCE (SIZE (1..maxNR-NS-Pmax)) OF NR-NS-PmaxValue
+
+NR-NS-PmaxValue ::=                     SEQUENCE {
+    additionalPmax                          P-Max                               OPTIONAL,   -- Need N
+    additionalSpectrumEmission              AdditionalSpectrumEmission
+}
+
+-- TAG-NR-NS-PMAXLIST-STOP
+-- TAG-NZP-CSI-RS-RESOURCE-START
+
+NZP-CSI-RS-Resource ::=             SEQUENCE {
+    nzp-CSI-RS-ResourceId               NZP-CSI-RS-ResourceId,
+    resourceMapping                     CSI-RS-ResourceMapping,
+    powerControlOffset                  INTEGER (-8..15),
+    powerControlOffsetSS                ENUMERATED{db-3, db0, db3, db6}                 OPTIONAL,   -- Need R
+    scramblingID                        ScramblingId,
+    periodicityAndOffset                CSI-ResourcePeriodicityAndOffset                OPTIONAL,   -- Cond PeriodicOrSemiPersistent
+    qcl-InfoPeriodicCSI-RS              TCI-StateId                                     OPTIONAL,   -- Cond Periodic
+    ...
+}
+
+-- TAG-NZP-CSI-RS-RESOURCE-STOP
+-- TAG-NZP-CSI-RS-RESOURCEID-START
+
+NZP-CSI-RS-ResourceId ::=           INTEGER (0..maxNrofNZP-CSI-RS-Resources-1)
+
+-- TAG-NZP-CSI-RS-RESOURCEID-STOP
+-- TAG-NZP-CSI-RS-RESOURCESET-START
+NZP-CSI-RS-ResourceSet ::=          SEQUENCE {
+    nzp-CSI-ResourceSetId               NZP-CSI-RS-ResourceSetId,
+    nzp-CSI-RS-Resources                SEQUENCE (SIZE (1..maxNrofNZP-CSI-RS-ResourcesPerSet)) OF NZP-CSI-RS-ResourceId,
+    repetition                          ENUMERATED { on, off }                                                  OPTIONAL,   -- Need S
+    aperiodicTriggeringOffset           INTEGER(0..6)                                                           OPTIONAL,   -- Need S
+    trs-Info                            ENUMERATED {true}                                                       OPTIONAL,   -- Need R
+    ...,
+    [[
+    aperiodicTriggeringOffset-r16       INTEGER(0..31)                                                          OPTIONAL   -- Need S
+    ]]
+}
+
+-- TAG-NZP-CSI-RS-RESOURCESET-STOP
+-- TAG-NZP-CSI-RS-RESOURCESETID-START
+
+NZP-CSI-RS-ResourceSetId ::=        INTEGER (0..maxNrofNZP-CSI-RS-ResourceSets-1)
+
+-- TAG-NZP-CSI-RS-RESOURCESETID-STOP
+-- TAG-P-MAX-START
+
+P-Max ::=                           INTEGER (-30..33)
+
+-- TAG-P-MAX-STOP
+-- TAG-PCI-LIST-START
+
+PCI-List ::=                        SEQUENCE (SIZE (1..maxNrofCellMeas)) OF PhysCellId
+
+-- TAG-PCI-LIST-STOP
+-- TAG-PCI-RANGE-START
+
+PCI-Range ::=                       SEQUENCE {
+    start                               PhysCellId,
+    range                               ENUMERATED {n4, n8, n12, n16, n24, n32, n48, n64, n84,
+                                                    n96, n128, n168, n252, n504, n1008,spare1}                  OPTIONAL    -- Need S
+}
+
+-- TAG-PCI-RANGE-STOP
+-- TAG-PCI-RANGEELEMENT-START
+
+PCI-RangeElement ::=                SEQUENCE {
+    pci-RangeIndex                      PCI-RangeIndex,
+    pci-Range                           PCI-Range
+}
+
+-- TAG-PCI-RANGEELEMENT-STOP
+-- TAG-PCI-RANGEINDEX-START
+
+PCI-RangeIndex ::=                  INTEGER (1..maxNrofPCI-Ranges)
+
+-- TAG-PCI-RANGEINDEX-STOP
+-- TAG-PCI-RANGEINDEXLIST-START
+
+PCI-RangeIndexList ::=              SEQUENCE (SIZE (1..maxNrofPCI-Ranges)) OF PCI-RangeIndex
+
+-- TAG-PCI-RANGEINDEXLIST-STOP
+-- TAG-PDCCH-CONFIG-START
+
+PDCCH-Config ::=                    SEQUENCE {
+    controlResourceSetToAddModList      SEQUENCE(SIZE (1..3)) OF ControlResourceSet                      OPTIONAL,   -- Need N
+    controlResourceSetToReleaseList     SEQUENCE(SIZE (1..3)) OF ControlResourceSetId                    OPTIONAL,   -- Need N
+    searchSpacesToAddModList            SEQUENCE(SIZE (1..10)) OF SearchSpace                            OPTIONAL,   -- Need N
+    searchSpacesToReleaseList           SEQUENCE(SIZE (1..10)) OF SearchSpaceId                          OPTIONAL,   -- Need N
+    downlinkPreemption                  SetupRelease { DownlinkPreemption }                              OPTIONAL,   -- Need M
+    tpc-PUSCH                           SetupRelease { PUSCH-TPC-CommandConfig }                         OPTIONAL,   -- Need M
+    tpc-PUCCH                           SetupRelease { PUCCH-TPC-CommandConfig }                         OPTIONAL,   -- Need M
+    tpc-SRS                             SetupRelease { SRS-TPC-CommandConfig}                            OPTIONAL,   -- Need M
+    ...,
+    [[
+    controlResourceSetToAddModListSizeExt-v1610 SEQUENCE (SIZE (1..2)) OF ControlResourceSet             OPTIONAL,   -- Need N
+    controlResourceSetToReleaseListSizeExt-r16 SEQUENCE (SIZE (1..5)) OF ControlResourceSetId-r16        OPTIONAL,   -- Need N
+    searchSpacesToAddModListExt-r16     SEQUENCE(SIZE (1..10)) OF SearchSpaceExt-r16                     OPTIONAL,   -- Need N
+    uplinkCancellation-r16              SetupRelease { UplinkCancellation-r16 }                          OPTIONAL,   -- Need M
+    monitoringCapabilityConfig-r16      ENUMERATED { r15monitoringcapability,r16monitoringcapability }   OPTIONAL,   -- Need M
+    searchSpaceSwitchConfig-r16         SearchSpaceSwitchConfig-r16                                      OPTIONAL    -- Need R
+    ]]
+}
+
+SearchSpaceSwitchConfig-r16 ::=     SEQUENCE {
+    cellGroupsForSwitchList-r16         SEQUENCE(SIZE (1..4)) OF CellGroupForSwitch-r16                  OPTIONAL,   -- Need R
+    searchSpaceSwitchDelay-r16          INTEGER (10..52)                                                 OPTIONAL    -- Need R
+}
+
+CellGroupForSwitch-r16 ::=          SEQUENCE(SIZE (1..16)) OF ServCellIndex
+
+-- TAG-PDCCH-CONFIG-STOP
+-- TAG-PDCCH-CONFIGCOMMON-START
+
+PDCCH-ConfigCommon ::=              SEQUENCE {
+    controlResourceSetZero              ControlResourceSetZero                                  OPTIONAL,   -- Cond InitialBWP-Only
+    commonControlResourceSet            ControlResourceSet                                      OPTIONAL,   -- Need R
+    searchSpaceZero                     SearchSpaceZero                                         OPTIONAL,   -- Cond InitialBWP-Only
+    commonSearchSpaceList               SEQUENCE (SIZE(1..4)) OF SearchSpace                    OPTIONAL,   -- Need R
+    searchSpaceSIB1                     SearchSpaceId                                           OPTIONAL,   -- Need S
+    searchSpaceOtherSystemInformation   SearchSpaceId                                           OPTIONAL,   -- Need S
+    pagingSearchSpace                   SearchSpaceId                                           OPTIONAL,   -- Need S
+    ra-SearchSpace                      SearchSpaceId                                           OPTIONAL,   -- Need S
+    ...,
+    [[
+    firstPDCCH-MonitoringOccasionOfPO   CHOICE {
+        sCS15KHZoneT                                                             SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..139),
+        sCS30KHZoneT-SCS15KHZhalfT                                               SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..279),
+        sCS60KHZoneT-SCS30KHZhalfT-SCS15KHZquarterT                              SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..559),
+        sCS120KHZoneT-SCS60KHZhalfT-SCS30KHZquarterT-SCS15KHZoneEighthT          SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..1119),
+        sCS120KHZhalfT-SCS60KHZquarterT-SCS30KHZoneEighthT-SCS15KHZoneSixteenthT SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..2239),
+        sCS120KHZquarterT-SCS60KHZoneEighthT-SCS30KHZoneSixteenthT               SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..4479),
+        sCS120KHZoneEighthT-SCS60KHZoneSixteenthT                                SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..8959),
+        sCS120KHZoneSixteenthT                                                   SEQUENCE (SIZE (1..maxPO-perPF)) OF INTEGER (0..17919)
+    }                                                                                           OPTIONAL    -- Cond OtherBWP
+    ]],
+    [[
+    commonSearchSpaceListExt-r16                                             SEQUENCE (SIZE(1..4)) OF SearchSpaceExt-r16     OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-PDCCH-CONFIGCOMMON-STOP
+-- TAG-PDCCH-CONFIGSIB1-START
+
+PDCCH-ConfigSIB1 ::=                SEQUENCE {
+    controlResourceSetZero              ControlResourceSetZero,
+    searchSpaceZero                     SearchSpaceZero
+}
+
+-- TAG-PDCCH-CONFIGSIB1-STOP
+-- TAG-PDCCH-SERVINGCELLCONFIG-START
+
+PDCCH-ServingCellConfig ::=         SEQUENCE {
+    slotFormatIndicator                 SetupRelease { SlotFormatIndicator }                                OPTIONAL,   -- Need M
+    ...,
+    [[
+    availabilityIndicator-r16           SetupRelease {AvailabilityIndicator-r16}                            OPTIONAL,   -- Need M
+    searchSpaceSwitchTimer-r16          INTEGER (1..80)                                                     OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-PDCCH-SERVINGCELLCONFIG-STOP
+-- TAG-PDCP-CONFIG-START
+
+PDCP-Config ::=         SEQUENCE {
+    drb                     SEQUENCE {
+        discardTimer            ENUMERATED {ms10, ms20, ms30, ms40, ms50, ms60, ms75, ms100, ms150, ms200,
+                                            ms250, ms300, ms500, ms750, ms1500, infinity}       OPTIONAL, -- Cond Setup
+        pdcp-SN-SizeUL          ENUMERATED {len12bits, len18bits}                               OPTIONAL, -- Cond Setup2
+        pdcp-SN-SizeDL          ENUMERATED {len12bits, len18bits}                               OPTIONAL, -- Cond Setup2
+        headerCompression       CHOICE {
+            notUsed                 NULL,
+            rohc                    SEQUENCE {
+                maxCID                  INTEGER (1..16383)                                      DEFAULT 15,
+                profiles                SEQUENCE {
+                    profile0x0001           BOOLEAN,
+                    profile0x0002           BOOLEAN,
+                    profile0x0003           BOOLEAN,
+                    profile0x0004           BOOLEAN,
+                    profile0x0006           BOOLEAN,
+                    profile0x0101           BOOLEAN,
+                    profile0x0102           BOOLEAN,
+                    profile0x0103           BOOLEAN,
+                    profile0x0104           BOOLEAN
+                },
+                drb-ContinueROHC            ENUMERATED { true }                                 OPTIONAL    -- Need N
+            },
+            uplinkOnlyROHC          SEQUENCE {
+                maxCID                  INTEGER (1..16383)                                      DEFAULT 15,
+                profiles                SEQUENCE {
+                    profile0x0006           BOOLEAN
+                },
+                drb-ContinueROHC            ENUMERATED { true }                                 OPTIONAL    -- Need N
+            },
+            ...
+        },
+        integrityProtection     ENUMERATED { enabled }                                          OPTIONAL,   -- Cond ConnectedTo5GC1
+        statusReportRequired    ENUMERATED { true }                                             OPTIONAL,   -- Cond Rlc-AM-UM
+        outOfOrderDelivery      ENUMERATED { true }                                             OPTIONAL    -- Need R
+    }                                                                                           OPTIONAL,   -- Cond DRB
+    moreThanOneRLC          SEQUENCE {
+        primaryPath             SEQUENCE {
+            cellGroup               CellGroupId                                                 OPTIONAL,   -- Need R
+            logicalChannel          LogicalChannelIdentity                                      OPTIONAL    -- Need R
+        },
+        ul-DataSplitThreshold   UL-DataSplitThreshold                                           OPTIONAL,   -- Cond SplitBearer
+        pdcp-Duplication            BOOLEAN                                                     OPTIONAL    -- Need R
+    }                                                                                           OPTIONAL,   -- Cond MoreThanOneRLC
+
+    t-Reordering                ENUMERATED {
+                                    ms0, ms1, ms2, ms4, ms5, ms8, ms10, ms15, ms20, ms30, ms40,
+                                    ms50, ms60, ms80, ms100, ms120, ms140, ms160, ms180, ms200, ms220,
+                                    ms240, ms260, ms280, ms300, ms500, ms750, ms1000, ms1250,
+                                    ms1500, ms1750, ms2000, ms2250, ms2500, ms2750,
+                                    ms3000, spare28, spare27, spare26, spare25, spare24,
+                                    spare23, spare22, spare21, spare20,
+                                    spare19, spare18, spare17, spare16, spare15, spare14,
+                                    spare13, spare12, spare11, spare10, spare09,
+                                    spare08, spare07, spare06, spare05, spare04, spare03,
+                                    spare02, spare01 }                                          OPTIONAL, -- Need S
+    ...,
+    [[
+    cipheringDisabled       ENUMERATED {true}                                                   OPTIONAL    -- Cond ConnectedTo5GC
+    ]],
+    [[
+    discardTimerExt-r16     SetupRelease { DiscardTimerExt-r16 }                                OPTIONAL,    -- Cond DRB2
+    moreThanTwoRLC-DRB-r16  SEQUENCE {
+        splitSecondaryPath-r16  LogicalChannelIdentity                                          OPTIONAL,   -- Cond SplitBearer2
+        duplicationState-r16    SEQUENCE (SIZE (3)) OF BOOLEAN                                  OPTIONAL    -- Need S
+    }                                                                                           OPTIONAL,   -- Cond MoreThanTwoRLC-DRB
+    ethernetHeaderCompression-r16  SetupRelease { EthernetHeaderCompression-r16 }               OPTIONAL    -- Need M
+    ]]
+}
+
+EthernetHeaderCompression-r16 ::=  SEQUENCE {
+    ehc-Common-r16                     SEQUENCE {
+        ehc-CID-Length-r16                 ENUMERATED { bits7, bits15 },
+         ...
+    },
+    ehc-Downlink-r16               SEQUENCE {
+        drb-ContinueEHC-DL-r16         ENUMERATED { true }                                      OPTIONAL,   -- Need R
+        ...
+    }                                                                                           OPTIONAL,   -- Need M
+    ehc-Uplink-r16                 SEQUENCE {
+        maxCID-EHC-UL-r16              INTEGER (1..32767),
+        drb-ContinueEHC-UL-r16         ENUMERATED { true }                                      OPTIONAL,   -- Need R
+        ...
+    }                                                                                           OPTIONAL    -- Need M
+}
+
+UL-DataSplitThreshold ::= ENUMERATED {
+                                            b0, b100, b200, b400, b800, b1600, b3200, b6400, b12800, b25600, b51200, b102400, b204800,
+                                            b409600, b819200, b1228800, b1638400, b2457600, b3276800, b4096000, b4915200, b5734400,
+                                            b6553600, infinity, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+
+DiscardTimerExt-r16 ::= ENUMERATED {ms0dot5, ms1, ms2, ms4, ms6, ms8, spare2, spare1}
+
+-- TAG-PDCP-CONFIG-STOP
+-- TAG-PDSCH-CONFIG-START
+
+PDSCH-Config ::=                        SEQUENCE {
+    dataScramblingIdentityPDSCH             INTEGER (0..1023)                                                   OPTIONAL,   -- Need S
+    dmrs-DownlinkForPDSCH-MappingTypeA      SetupRelease { DMRS-DownlinkConfig }                                OPTIONAL,   -- Need M
+    dmrs-DownlinkForPDSCH-MappingTypeB      SetupRelease { DMRS-DownlinkConfig }                                OPTIONAL,   -- Need M
+
+    tci-StatesToAddModList                  SEQUENCE (SIZE(1..maxNrofTCI-States)) OF TCI-State                  OPTIONAL,   -- Need N
+    tci-StatesToReleaseList                 SEQUENCE (SIZE(1..maxNrofTCI-States)) OF TCI-StateId                OPTIONAL,   -- Need N
+    vrb-ToPRB-Interleaver                   ENUMERATED {n2, n4}                                                 OPTIONAL,   -- Need S
+    resourceAllocation                      ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch},
+    pdsch-TimeDomainAllocationList          SetupRelease { PDSCH-TimeDomainResourceAllocationList }             OPTIONAL,   -- Need M
+    pdsch-AggregationFactor                 ENUMERATED { n2, n4, n8 }                                           OPTIONAL,   -- Need S
+    rateMatchPatternToAddModList            SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern   OPTIONAL,   -- Need N
+    rateMatchPatternToReleaseList           SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL,   -- Need N
+    rateMatchPatternGroup1                  RateMatchPatternGroup                                               OPTIONAL,   -- Need R
+    rateMatchPatternGroup2                  RateMatchPatternGroup                                               OPTIONAL,   -- Need R
+
+    rbg-Size                                ENUMERATED {config1, config2},
+    mcs-Table                               ENUMERATED {qam256, qam64LowSE}                                     OPTIONAL,   -- Need S
+    maxNrofCodeWordsScheduledByDCI          ENUMERATED {n1, n2}                                                 OPTIONAL,   -- Need R
+
+    prb-BundlingType                        CHOICE {
+        staticBundling                          SEQUENCE {
+            bundleSize                              ENUMERATED { n4, wideband }                                 OPTIONAL    -- Need S
+        },
+        dynamicBundling                     SEQUENCE {
+            bundleSizeSet1                      ENUMERATED { n4, wideband, n2-wideband, n4-wideband }           OPTIONAL,   -- Need S
+            bundleSizeSet2                      ENUMERATED { n4, wideband }                                     OPTIONAL    -- Need S
+        }
+    },
+    zp-CSI-RS-ResourceToAddModList                  SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-Resources)) OF ZP-CSI-RS-Resource
+                                                                                                                OPTIONAL,   -- Need N
+    zp-CSI-RS-ResourceToReleaseList                 SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-Resources)) OF ZP-CSI-RS-ResourceId
+                                                                                                                OPTIONAL,   -- Need N
+    aperiodic-ZP-CSI-RS-ResourceSetsToAddModList    SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+                                                                                                                OPTIONAL,   -- Need N
+    aperiodic-ZP-CSI-RS-ResourceSetsToReleaseList SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+                                                                                                                OPTIONAL,   -- Need N
+    sp-ZP-CSI-RS-ResourceSetsToAddModList   SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet
+                                                                                                                OPTIONAL,   -- Need N
+    sp-ZP-CSI-RS-ResourceSetsToReleaseList  SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId
+                                                                                                                OPTIONAL,   -- Need N
+    p-ZP-CSI-RS-ResourceSet                 SetupRelease { ZP-CSI-RS-ResourceSet }
+                                                                                                                OPTIONAL,   -- Need M
+    ...,
+    [[
+    maxMIMO-Layers-r16                      SetupRelease { MaxMIMO-LayersDL-r16 }                               OPTIONAL,   -- Need M
+    minimumSchedulingOffsetK0-r16           SetupRelease { MinSchedulingOffsetK0-Values-r16 }                   OPTIONAL,   -- Need M
+
+    -- Start of the parameters for DCI format 1_2 introduced in V16.1.0
+    antennaPortsFieldPresenceDCI-1-2-r16            ENUMERATED {enabled}                                        OPTIONAL,   -- Need S
+    aperiodicZP-CSI-RS-ResourceSetsToAddModListDCI-1-2-r16  SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSet                                                                                          
+                                                                                                                OPTIONAL,   -- Need N
+    aperiodicZP-CSI-RS-ResourceSetsToReleaseListDCI-1-2-r16 SEQUENCE (SIZE (1..maxNrofZP-CSI-RS-ResourceSets)) OF ZP-CSI-RS-ResourceSetId                                                                                              
+                                                                                                                OPTIONAL,   -- Need N
+    dmrs-DownlinkForPDSCH-MappingTypeA-DCI-1-2-r16  SetupRelease { DMRS-DownlinkConfig }                        OPTIONAL,   -- Need M
+    dmrs-DownlinkForPDSCH-MappingTypeB-DCI-1-2-r16  SetupRelease { DMRS-DownlinkConfig }                        OPTIONAL,   -- Need M
+    dmrs-SequenceInitializationDCI-1-2-r16          ENUMERATED {enabled}                                        OPTIONAL,   -- Need S
+    harq-ProcessNumberSizeDCI-1-2-r16               INTEGER (0..4)                                              OPTIONAL,   -- Need R
+    mcs-TableDCI-1-2-r16                            ENUMERATED {qam256, qam64LowSE}                             OPTIONAL,   -- Need S
+    numberOfBitsForRV-DCI-1-2-r16                   INTEGER (0..2)                                              OPTIONAL,   -- Need R
+    pdsch-TimeDomainAllocationListDCI-1-2-r16       SetupRelease { PDSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                                OPTIONAL,   -- Need M
+    prb-BundlingTypeDCI-1-2-r16             CHOICE {
+        staticBundling-r16                      SEQUENCE {
+            bundleSize-r16                          ENUMERATED { n4, wideband }                                 OPTIONAL    -- Need S
+        },
+        dynamicBundling-r16                     SEQUENCE {
+            bundleSizeSet1-r16                      ENUMERATED { n4, wideband, n2-wideband, n4-wideband }       OPTIONAL,   -- Need S
+            bundleSizeSet2-r16                      ENUMERATED { n4, wideband }                                 OPTIONAL    -- Need S
+        }
+    }                                                                                                           OPTIONAL,   -- Need R
+    priorityIndicatorDCI-1-2-r16                ENUMERATED {enabled}                                            OPTIONAL,   -- Need S
+    rateMatchPatternGroup1DCI-1-2-r16           RateMatchPatternGroup                                           OPTIONAL,   -- Need R
+    rateMatchPatternGroup2DCI-1-2-r16           RateMatchPatternGroup                                           OPTIONAL,   -- Need R
+    resourceAllocationType1GranularityDCI-1-2-r16  ENUMERATED {n2,n4,n8,n16}                                    OPTIONAL,   -- Need S
+    vrb-ToPRB-InterleaverDCI-1-2-r16            ENUMERATED {n2, n4}                                             OPTIONAL,   -- Need S
+    referenceOfSLIVDCI-1-2-r16                  ENUMERATED {enabled}                                            OPTIONAL,   -- Need S
+    resourceAllocationDCI-1-2-r16               ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}
+                                                                                                                OPTIONAL,   -- Need M
+    -- End of the parameters for DCI format 1_2 introduced in V16.1.0
+
+    priorityIndicatorDCI-1-1-r16             ENUMERATED {enabled}                                               OPTIONAL,   -- Need S
+    dataScramblingIdentityPDSCH2-r16         INTEGER (0..1023)                                                  OPTIONAL,   -- Need R
+    pdsch-TimeDomainAllocationList-r16       SetupRelease { PDSCH-TimeDomainResourceAllocationList-r16 }        OPTIONAL,   -- Need M
+    repetitionSchemeConfig-r16               SetupRelease { RepetitionSchemeConfig-r16}                         OPTIONAL    -- Need M
+    ]],
+    [[
+    repetitionSchemeConfig-v1630             SetupRelease { RepetitionSchemeConfig-v1630}                       OPTIONAL    -- Need M
+    ]]
+}
+
+RateMatchPatternGroup ::=               SEQUENCE (SIZE (1..maxNrofRateMatchPatternsPerGroup)) OF CHOICE {
+    cellLevel                               RateMatchPatternId,
+    bwpLevel                                RateMatchPatternId
+}
+
+MinSchedulingOffsetK0-Values-r16 ::=    SEQUENCE (SIZE (1..maxNrOfMinSchedulingOffsetValues-r16)) OF INTEGER (0..maxK0-SchedulingOffset-r16)
+
+MaxMIMO-LayersDL-r16 ::=                INTEGER (1..8)
+
+-- TAG-PDSCH-CONFIG-STOP
+-- TAG-PDSCH-CONFIGCOMMON-START
+
+PDSCH-ConfigCommon ::=                  SEQUENCE {
+    pdsch-TimeDomainAllocationList                  PDSCH-TimeDomainResourceAllocationList          OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PDSCH-CONFIGCOMMON-STOP
+-- TAG-PDSCH-SERVINGCELLCONFIG-START
+
+PDSCH-ServingCellConfig ::=             SEQUENCE {
+    codeBlockGroupTransmission              SetupRelease { PDSCH-CodeBlockGroupTransmission }              OPTIONAL,   -- Need M
+    xOverhead                               ENUMERATED { xOh6, xOh12, xOh18 }                              OPTIONAL,   -- Need S
+    nrofHARQ-ProcessesForPDSCH              ENUMERATED {n2, n4, n6, n10, n12, n16}                         OPTIONAL,   -- Need S
+    pucch-Cell                              ServCellIndex                                                  OPTIONAL,   -- Cond SCellAddOnly
+    ...,
+    [[
+    maxMIMO-Layers                          INTEGER (1..8)                                                 OPTIONAL,   -- Need M
+    processingType2Enabled                  BOOLEAN                                                        OPTIONAL    -- Need M
+    ]],
+    [[
+    pdsch-CodeBlockGroupTransmissionList-r16 SetupRelease { PDSCH-CodeBlockGroupTransmissionList-r16 }     OPTIONAL    -- Need M
+    ]]
+}
+
+PDSCH-CodeBlockGroupTransmission ::=    SEQUENCE {
+    maxCodeBlockGroupsPerTransportBlock     ENUMERATED {n2, n4, n6, n8},
+    codeBlockGroupFlushIndicator            BOOLEAN,
+    ...
+}
+
+PDSCH-CodeBlockGroupTransmissionList-r16 ::=    SEQUENCE (SIZE (1..2)) OF PDSCH-CodeBlockGroupTransmission
+
+-- TAG-PDSCH-SERVINGCELLCONFIG-STOP
+-- TAG-PDSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-START
+
+
+PDSCH-TimeDomainResourceAllocationList ::=  SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation
+
+PDSCH-TimeDomainResourceAllocation ::=   SEQUENCE {
+    k0                                      INTEGER(0..32)                                                  OPTIONAL,   -- Need S
+    mappingType                             ENUMERATED {typeA, typeB},
+    startSymbolAndLength                    INTEGER (0..127)
+}
+
+PDSCH-TimeDomainResourceAllocationList-r16 ::=  SEQUENCE (SIZE(1..maxNrofDL-Allocations)) OF PDSCH-TimeDomainResourceAllocation-r16
+
+PDSCH-TimeDomainResourceAllocation-r16 ::=  SEQUENCE {
+    k0-r16                                     INTEGER(0..32)                                              OPTIONAL,   -- Need S
+    mappingType-r16                            ENUMERATED {typeA, typeB},
+    startSymbolAndLength-r16                   INTEGER (0..127),
+    repetitionNumber-r16                       ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16}                OPTIONAL,   -- Cond Formats1-0and1-1
+    ...
+}
+
+-- TAG-PDSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-STOP
+-- TAG-PHR-CONFIG-START
+
+PHR-Config ::=                      SEQUENCE {
+    phr-PeriodicTimer                   ENUMERATED {sf10, sf20, sf50, sf100, sf200,sf500, sf1000, infinity},
+    phr-ProhibitTimer                   ENUMERATED {sf0, sf10, sf20, sf50, sf100,sf200, sf500, sf1000},
+    phr-Tx-PowerFactorChange            ENUMERATED {dB1, dB3, dB6, infinity},
+    multiplePHR                         BOOLEAN,
+    dummy                               BOOLEAN,
+    phr-Type2OtherCell                  BOOLEAN,
+    phr-ModeOtherCG                     ENUMERATED {real, virtual},
+    ...,
+    [[
+    mpe-Reporting-FR2-r16               SetupRelease { MPE-Config-FR2-r16 }                     OPTIONAL     -- Need M
+    ]]
+}
+
+MPE-Config-FR2-r16 ::=              SEQUENCE {
+    mpe-ProhibitTimer-r16               ENUMERATED {sf0, sf10, sf20, sf50, sf100, sf200, sf500, sf1000},
+    mpe-Threshold-r16                   ENUMERATED {dB3, dB6, dB9, dB12}
+}
+
+-- TAG-PHR-CONFIG-STOP
+-- TAG-PHYSCELLID-START
+
+PhysCellId ::=                      INTEGER (0..1007)
+
+-- TAG-PHYSCELLID-STOP
+-- TAG-PHYSICALCELLGROUPCONFIG-START
+
+PhysicalCellGroupConfig ::=         SEQUENCE {
+    harq-ACK-SpatialBundlingPUCCH       ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    harq-ACK-SpatialBundlingPUSCH       ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    p-NR-FR1                            P-Max                                                           OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-Codebook             ENUMERATED {semiStatic, dynamic},
+    tpc-SRS-RNTI                        RNTI-Value                                                      OPTIONAL,   -- Need R
+    tpc-PUCCH-RNTI                      RNTI-Value                                                      OPTIONAL,   -- Need R
+    tpc-PUSCH-RNTI                      RNTI-Value                                                      OPTIONAL,   -- Need R
+    sp-CSI-RNTI                         RNTI-Value                                                      OPTIONAL,   -- Need R
+    cs-RNTI                             SetupRelease { RNTI-Value }                                     OPTIONAL,   -- Need M
+    ...,
+    [[
+    mcs-C-RNTI                          RNTI-Value                                                      OPTIONAL,   -- Need R
+    p-UE-FR1                            P-Max                                                           OPTIONAL    -- Cond MCG-Only
+    ]],
+    [[
+    xScale                              ENUMERATED {dB0, dB6, spare2, spare1}                           OPTIONAL    -- Cond SCG-Only
+    ]],
+    [[
+    pdcch-BlindDetection                SetupRelease { PDCCH-BlindDetection }                           OPTIONAL    -- Need M
+    ]],
+    [[
+    dcp-Config-r16                      SetupRelease { DCP-Config-r16 }                                 OPTIONAL,   -- Need M
+    harq-ACK-SpatialBundlingPUCCH-secondaryPUCCHgroup-r16    ENUMERATED {enabled, disabled}             OPTIONAL,   -- Cond twoPUCCHgroup
+    harq-ACK-SpatialBundlingPUSCH-secondaryPUCCHgroup-r16    ENUMERATED {enabled, disabled}             OPTIONAL,   -- Cond twoPUCCHgroup
+    pdsch-HARQ-ACK-Codebook-secondaryPUCCHgroup-r16          ENUMERATED {semiStatic, dynamic}           OPTIONAL,   -- Cond twoPUCCHgroup
+    p-NR-FR2-r16                                              P-Max                                     OPTIONAL,   -- Need R
+    p-UE-FR2-r16                                              P-Max                                     OPTIONAL,   -- Cond MCG-Only
+    nrdc-PCmode-FR1-r16                ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}       OPTIONAL,   -- Cond MCG-Only
+    nrdc-PCmode-FR2-r16                ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}       OPTIONAL,   -- Cond MCG-Only
+    pdsch-HARQ-ACK-Codebook-r16            ENUMERATED {enhancedDynamic}                                 OPTIONAL,   -- Need R
+    nfi-TotalDAI-Included-r16              ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    ul-TotalDAI-Included-r16               ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-OneShotFeedback-r16     ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-OneShotFeedbackNDI-r16  ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    pdsch-HARQ-ACK-OneShotFeedbackCBG-r16  ENUMERATED {true}                                            OPTIONAL,   -- Need R
+    downlinkAssignmentIndexDCI-0-2-r16     ENUMERATED { enabled }                                       OPTIONAL,   -- Need S
+    downlinkAssignmentIndexDCI-1-2-r16     ENUMERATED {n1, n2, n4}                                      OPTIONAL,   -- Need S
+    pdsch-HARQ-ACK-CodebookList-r16        SetupRelease {PDSCH-HARQ-ACK-CodebookList-r16}               OPTIONAL,   -- Need M
+    ackNackFeedbackMode-r16                ENUMERATED {joint, separate}                                 OPTIONAL,   -- Need R
+    pdcch-BlindDetectionCA-CombIndicator-r16 SetupRelease { PDCCH-BlindDetectionCA-CombIndicator-r16 }  OPTIONAL,   -- Need M
+    pdcch-BlindDetection2-r16                SetupRelease { PDCCH-BlindDetection2-r16 }                 OPTIONAL,   -- Need M
+    pdcch-BlindDetection3-r16                SetupRelease { PDCCH-BlindDetection3-r16 }                 OPTIONAL,   -- Need M
+    bdFactorR-r16                          ENUMERATED {n1}                                              OPTIONAL    -- Need R
+    ]]
+}
+
+PDCCH-BlindDetection ::=                INTEGER (1..15)
+
+DCP-Config-r16 ::=                  SEQUENCE {
+    ps-RNTI-r16                         RNTI-Value,
+    ps-Offset-r16                       INTEGER (1..120),
+    sizeDCI-2-6-r16                     INTEGER (1..maxDCI-2-6-Size-r16),
+    ps-PositionDCI-2-6-r16              INTEGER (0..maxDCI-2-6-Size-1-r16),
+    ps-WakeUp-r16                       ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    ps-TransmitPeriodicL1-RSRP-r16      ENUMERATED {true}                                               OPTIONAL,   -- Need S
+    ps-TransmitOtherPeriodicCSI-r16     ENUMERATED {true}                                               OPTIONAL    -- Need S
+}
+
+PDSCH-HARQ-ACK-CodebookList-r16 ::=     SEQUENCE (SIZE (1..2)) OF ENUMERATED {semiStatic, dynamic}
+
+PDCCH-BlindDetectionCA-CombIndicator-r16 ::= SEQUENCE {
+    pdcch-BlindDetectionCA1-r16                  INTEGER (1..15),
+    pdcch-BlindDetectionCA2-r16                  INTEGER (1..15)
+}
+
+PDCCH-BlindDetection2-r16 ::=                INTEGER (1..15)
+
+PDCCH-BlindDetection3-r16 ::=                INTEGER (1..15)
+
+-- TAG-PHYSICALCELLGROUPCONFIG-STOP
+-- TAG-PLMN-IDENTITY-START
+
+PLMN-Identity ::=                   SEQUENCE {
+    mcc                                 MCC                 OPTIONAL,                   -- Cond MCC
+    mnc                                 MNC
+}
+
+MCC ::=                             SEQUENCE (SIZE (3)) OF MCC-MNC-Digit
+
+MNC ::=                             SEQUENCE (SIZE (2..3)) OF MCC-MNC-Digit
+
+MCC-MNC-Digit ::=                   INTEGER (0..9)
+
+-- TAG-PLMN-IDENTITY-STOP
+-- TAG-PLMN-IDENTITYINFOLIST-START
+
+PLMN-IdentityInfoList ::=               SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-IdentityInfo
+
+PLMN-IdentityInfo ::=                   SEQUENCE {
+    plmn-IdentityList                       SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity,
+    trackingAreaCode                        TrackingAreaCode                                            OPTIONAL,       -- Need R
+    ranac                                   RAN-AreaCode                                                OPTIONAL,       -- Need R
+    cellIdentity                            CellIdentity,
+    cellReservedForOperatorUse              ENUMERATED {reserved, notReserved},
+    ...,
+    [[
+    iab-Support-r16                     ENUMERATED {true}                                               OPTIONAL       -- Need S
+    ]]
+}
+-- TAG-PLMN-IDENTITYINFOLIST-STOP
+-- TAG-PLMNIDENTITYLIST2-START
+
+PLMN-IdentityList2-r16 ::= SEQUENCE (SIZE (1..16)) OF PLMN-Identity
+
+-- TAG-PLMNIDENTITYLIST2-STOP
+-- TAG-PRB-ID-START
+
+PRB-Id ::=                          INTEGER (0..maxNrofPhysicalResourceBlocks-1)
+
+-- TAG-PRB-ID-STOP
+-- TAG-PTRS-DOWNLINKCONFIG-START
+
+PTRS-DownlinkConfig ::=             SEQUENCE {
+    frequencyDensity                    SEQUENCE (SIZE (2)) OF INTEGER (1..276)                                 OPTIONAL,   -- Need S
+    timeDensity                         SEQUENCE (SIZE (3)) OF INTEGER (0..29)                                  OPTIONAL,   -- Need S
+    epre-Ratio                          INTEGER (0..3)                                                          OPTIONAL,   -- Need S
+    resourceElementOffset               ENUMERATED { offset01, offset10, offset11 }                             OPTIONAL,   -- Need S
+    ...,
+    [[
+    maxNrofPorts-r16                    ENUMERATED {n1, n2}                                                     OPTIONAL    -- Need R
+    ]]
+
+}
+
+-- TAG-PTRS-DOWNLINKCONFIG-STOP
+-- TAG-PTRS-UPLINKCONFIG-START
+
+PTRS-UplinkConfig ::=                   SEQUENCE {
+    transformPrecoderDisabled               SEQUENCE {
+        frequencyDensity                    SEQUENCE (SIZE (2)) OF INTEGER (1..276)                 OPTIONAL,   -- Need S
+        timeDensity                         SEQUENCE (SIZE (3)) OF INTEGER (0..29)                  OPTIONAL,   -- Need S
+        maxNrofPorts                        ENUMERATED {n1, n2},
+        resourceElementOffset               ENUMERATED {offset01, offset10, offset11 }              OPTIONAL,   -- Need S
+        ptrs-Power                          ENUMERATED {p00, p01, p10, p11}
+    }                                                                                               OPTIONAL,   -- Need R
+    transformPrecoderEnabled                SEQUENCE {
+        sampleDensity                           SEQUENCE (SIZE (5)) OF INTEGER (1..276),
+        timeDensityTransformPrecoding           ENUMERATED {d2}                                     OPTIONAL    -- Need S
+    }                                                                                               OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PTRS-UPLINKCONFIG-STOP
+-- TAG-PUCCH-CONFIG-START
+
+PUCCH-Config ::=                        SEQUENCE {
+    resourceSetToAddModList                 SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceSets)) OF PUCCH-ResourceSet   OPTIONAL, -- Need N
+    resourceSetToReleaseList                SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceSets)) OF PUCCH-ResourceSetId OPTIONAL, -- Need N
+    resourceToAddModList                    SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-Resource         OPTIONAL, -- Need N
+    resourceToReleaseList                   SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-ResourceId       OPTIONAL, -- Need N
+    format1                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    format2                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    format3                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    format4                                 SetupRelease { PUCCH-FormatConfig }                                   OPTIONAL, -- Need M
+    schedulingRequestResourceToAddModList   SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceConfig
+                                                                                                                  OPTIONAL, -- Need N
+    schedulingRequestResourceToReleaseList  SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceId
+                                                                                                                  OPTIONAL, -- Need N
+    multi-CSI-PUCCH-ResourceList            SEQUENCE (SIZE (1..2)) OF PUCCH-ResourceId                            OPTIONAL, -- Need M
+    dl-DataToUL-ACK                         SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)                             OPTIONAL, -- Need M
+    spatialRelationInfoToAddModList         SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos)) OF PUCCH-SpatialRelationInfo
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToReleaseList        SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos)) OF PUCCH-SpatialRelationInfoId
+                                                                                                                  OPTIONAL, -- Need N
+    pucch-PowerControl                      PUCCH-PowerControl                                                    OPTIONAL, -- Need M
+    ...,
+    [[
+    resourceToAddModListExt-r16             SEQUENCE (SIZE (1..maxNrofPUCCH-Resources)) OF PUCCH-ResourceExt-r16  OPTIONAL, -- Need N
+    dl-DataToUL-ACK-r16                     SetupRelease { DL-DataToUL-ACK-r16 }                                  OPTIONAL, -- Need M
+    ul-AccessConfigListDCI-1-1-r16          SetupRelease { UL-AccessConfigListDCI-1-1-r16 }                       OPTIONAL, -- Need M
+    subslotLengthForPUCCH-r16               CHOICE {
+            normalCP-r16                        ENUMERATED {n2,n7},
+            extendedCP-r16                      ENUMERATED {n2,n6}
+    }                                                                                                             OPTIONAL, -- Need R
+    dl-DataToUL-ACK-DCI-1-2-r16             SetupRelease { DL-DataToUL-ACK-DCI-1-2-r16}                           OPTIONAL, -- Need M
+    numberOfBitsForPUCCH-ResourceIndicatorDCI-1-2-r16  INTEGER (0..3)                                             OPTIONAL, -- Need R
+    dmrs-UplinkTransformPrecodingPUCCH-r16  ENUMERATED {enabled}                                                  OPTIONAL,  -- Cond PI2-BPSK
+    spatialRelationInfoToAddModListSizeExt-v1610    SEQUENCE (SIZE (1..maxNrofSpatialRelationInfosDiff-r16)) OF PUCCH-SpatialRelationInfo
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToReleaseListSizeExt-v1610   SEQUENCE (SIZE (1..maxNrofSpatialRelationInfosDiff-r16)) OF PUCCH-SpatialRelationInfoId
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToAddModListExt-v1610  SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos-r16)) OF PUCCH-SpatialRelationInfoExt-r16
+                                                                                                                  OPTIONAL, -- Need N
+    spatialRelationInfoToReleaseListExt-v1610    SEQUENCE (SIZE (1..maxNrofSpatialRelationInfos-r16)) OF
+                                                                            PUCCH-SpatialRelationInfoId-r16       OPTIONAL, -- Need N
+    resourceGroupToAddModList-r16           SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceGroups-r16)) OF PUCCH-ResourceGroup-r16
+                                                                                                                  OPTIONAL, -- Need N
+    resourceGroupToReleaseList-r16          SEQUENCE (SIZE (1..maxNrofPUCCH-ResourceGroups-r16)) OF PUCCH-ResourceGroupId-r16
+                                                                                                                  OPTIONAL, -- Need N
+    sps-PUCCH-AN-List-r16                   SetupRelease { SPS-PUCCH-AN-List-r16 }                                OPTIONAL,  -- Need M
+    schedulingRequestResourceToAddModListExt-v1610   SEQUENCE (SIZE (1..maxNrofSR-Resources)) OF SchedulingRequestResourceConfigExt-v1610
+                                                                                                                  OPTIONAL -- Need N
+    ]]
+}
+
+PUCCH-FormatConfig ::=                  SEQUENCE {
+    interslotFrequencyHopping               ENUMERATED {enabled}                                                  OPTIONAL, -- Need R
+    additionalDMRS                          ENUMERATED {true}                                                     OPTIONAL, -- Need R
+    maxCodeRate                             PUCCH-MaxCodeRate                                                     OPTIONAL, -- Need R
+    nrofSlots                               ENUMERATED {n2,n4,n8}                                                 OPTIONAL, -- Need S
+    pi2BPSK                                 ENUMERATED {enabled}                                                  OPTIONAL, -- Need R
+    simultaneousHARQ-ACK-CSI                ENUMERATED {true}                                                     OPTIONAL  -- Need R
+}
+
+PUCCH-MaxCodeRate ::=                   ENUMERATED {zeroDot08, zeroDot15, zeroDot25, zeroDot35, zeroDot45, zeroDot60, zeroDot80}
+
+-- A set with one or more PUCCH resources
+PUCCH-ResourceSet ::=                   SEQUENCE {
+    pucch-ResourceSetId                     PUCCH-ResourceSetId,
+    resourceList                            SEQUENCE (SIZE (1..maxNrofPUCCH-ResourcesPerSet)) OF PUCCH-ResourceId,
+    maxPayloadSize                          INTEGER (4..256)                                                      OPTIONAL  -- Need R
+}
+
+PUCCH-ResourceSetId ::=                 INTEGER (0..maxNrofPUCCH-ResourceSets-1)
+
+PUCCH-Resource ::=                      SEQUENCE {
+    pucch-ResourceId                        PUCCH-ResourceId,
+    startingPRB                             PRB-Id,
+    intraSlotFrequencyHopping               ENUMERATED { enabled }                                                OPTIONAL, -- Need R
+    secondHopPRB                            PRB-Id                                                                OPTIONAL, -- Need R
+    format                                  CHOICE {
+        format0                                 PUCCH-format0,
+        format1                                 PUCCH-format1,
+        format2                                 PUCCH-format2,
+        format3                                 PUCCH-format3,
+        format4                                 PUCCH-format4
+    }
+}
+
+PUCCH-ResourceExt-r16 ::=               SEQUENCE {
+    interlaceAllocation-r16                 SEQUENCE {
+        rb-SetIndex                             INTEGER (0..4),
+        interlace0                              CHOICE {
+            scs15                                   INTEGER (0..9),
+            scs30                                   INTEGER (0..4)
+        }
+    }                                                                                                             OPTIONAL,  --Need R
+    formatExt-v1610                         CHOICE {
+        interlace1-v1610                            INTEGER (0..9),
+        occ-v1610                                   SEQUENCE {
+            occ-Length-v1610                                ENUMERATED {n2,n4}                                       OPTIONAL, -- Need M
+            occ-Index-v1610                                 ENUMERATED {n0,n1,n2,n3}                                 OPTIONAL  -- Need M
+        }
+    }                                                                                                            OPTIONAL,  -- Need R
+    ...
+}
+
+PUCCH-ResourceId ::=                    INTEGER (0..maxNrofPUCCH-Resources-1)
+
+
+PUCCH-format0 ::=                               SEQUENCE {
+    initialCyclicShift                              INTEGER(0..11),
+    nrofSymbols                                     INTEGER (1..2),
+    startingSymbolIndex                             INTEGER(0..13)
+}
+
+PUCCH-format1 ::=                               SEQUENCE {
+    initialCyclicShift                              INTEGER(0..11),
+    nrofSymbols                                     INTEGER (4..14),
+    startingSymbolIndex                             INTEGER(0..10),
+    timeDomainOCC                                   INTEGER(0..6)
+}
+
+PUCCH-format2 ::=                               SEQUENCE {
+    nrofPRBs                                        INTEGER (1..16),
+    nrofSymbols                                     INTEGER (1..2),
+    startingSymbolIndex                             INTEGER(0..13)
+}
+
+PUCCH-format3 ::=                               SEQUENCE {
+    nrofPRBs                                        INTEGER (1..16),
+    nrofSymbols                                     INTEGER (4..14),
+    startingSymbolIndex                             INTEGER(0..10)
+}
+
+PUCCH-format4 ::=                               SEQUENCE {
+    nrofSymbols                                     INTEGER (4..14),
+    occ-Length                                      ENUMERATED {n2,n4},
+    occ-Index                                       ENUMERATED {n0,n1,n2,n3},
+    startingSymbolIndex                             INTEGER(0..10)
+}
+
+PUCCH-ResourceGroup-r16 ::=                SEQUENCE {
+    pucch-ResourceGroupId-r16                  PUCCH-ResourceGroupId-r16,
+    resourcePerGroupList-r16                   SEQUENCE (SIZE (1..maxNrofPUCCH-ResourcesPerGroup-r16)) OF PUCCH-ResourceId
+}
+
+PUCCH-ResourceGroupId-r16 ::=              INTEGER (0..maxNrofPUCCH-ResourceGroups-1-r16)
+
+DL-DataToUL-ACK-r16 ::=                    SEQUENCE (SIZE (1..8)) OF INTEGER (-1..15)
+
+DL-DataToUL-ACK-DCI-1-2-r16 ::=            SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)
+
+UL-AccessConfigListDCI-1-1-r16 ::=         SEQUENCE (SIZE (1..16)) OF INTEGER (0..15)
+
+-- TAG-PUCCH-CONFIG-STOP
+-- TAG-PUCCH-CONFIGCOMMON-START
+
+PUCCH-ConfigCommon ::=              SEQUENCE {
+    pucch-ResourceCommon                INTEGER (0..15)                                      OPTIONAL,   -- Cond InitialBWP-Only
+    pucch-GroupHopping                  ENUMERATED { neither, enable, disable },
+    hoppingId                           INTEGER (0..1023)                                    OPTIONAL,   -- Need R
+    p0-nominal                          INTEGER (-202..24)                                   OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PUCCH-CONFIGCOMMON-STOP
+-- TAG-PUCCH-CONFIGURATIONLIST-START
+
+PUCCH-ConfigurationList-r16  ::=     SEQUENCE (SIZE (1..2)) OF PUCCH-Config
+
+-- TAG-PUCCH-CONFIGURATIONLIST-STOP
+-- TAG-PUCCH-PATHLOSSREFERENCERS-ID-START
+
+PUCCH-PathlossReferenceRS-Id ::=            INTEGER (0..maxNrofPUCCH-PathlossReferenceRSs-1)
+
+PUCCH-PathlossReferenceRS-Id-v1610 ::=      INTEGER (maxNrofPUCCH-PathlossReferenceRSs..maxNrofPUCCH-PathlossReferenceRSs-1-r16)
+
+-- TAG-PUCCH-PATHLOSSREFERENCERS-ID-STOP
+-- TAG-PUCCH-POWERCONTROL-START
+PUCCH-PowerControl ::=              SEQUENCE {
+    deltaF-PUCCH-f0                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f1                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f2                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f3                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    deltaF-PUCCH-f4                     INTEGER (-16..15)                                                       OPTIONAL, -- Need R
+    p0-Set                              SEQUENCE (SIZE (1..maxNrofPUCCH-P0-PerSet)) OF P0-PUCCH                 OPTIONAL, -- Need M
+    pathlossReferenceRSs                SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSs)) OF PUCCH-PathlossReferenceRS
+                                                                                                                OPTIONAL, -- Need M
+    twoPUCCH-PC-AdjustmentStates        ENUMERATED {twoStates}                                                  OPTIONAL, -- Need S
+    ...,
+    [[
+    pathlossReferenceRSs-v1610          SetupRelease { PathlossReferenceRSs-v1610 }                             OPTIONAL -- Need M
+    ]]
+}
+
+P0-PUCCH ::=                            SEQUENCE {
+    p0-PUCCH-Id                             P0-PUCCH-Id,
+    p0-PUCCH-Value                          INTEGER (-16..15)
+}
+
+P0-PUCCH-Id ::=                         INTEGER (1..8)
+
+PathlossReferenceRSs-v1610 ::=          SEQUENCE (SIZE (1..maxNrofPUCCH-PathlossReferenceRSsDiff-r16)) OF PUCCH-PathlossReferenceRS-r16
+
+PUCCH-PathlossReferenceRS ::=                   SEQUENCE {
+    pucch-PathlossReferenceRS-Id                PUCCH-PathlossReferenceRS-Id,
+    referenceSignal                             CHOICE {
+        ssb-Index                                   SSB-Index,
+        csi-RS-Index                                NZP-CSI-RS-ResourceId
+    }
+}
+
+PUCCH-PathlossReferenceRS-r16 ::=                   SEQUENCE {
+    pucch-PathlossReferenceRS-Id-r16                    PUCCH-PathlossReferenceRS-Id-v1610,
+    referenceSignal-r16                                 CHOICE {
+        ssb-Index-r16                                       SSB-Index,
+        csi-RS-Index-r16                                    NZP-CSI-RS-ResourceId
+    }
+}
+
+-- TAG-PUCCH-POWERCONTROL-STOP
+-- TAG-PUCCH-SPATIALRELATIONINFO-START
+
+PUCCH-SpatialRelationInfo ::=           SEQUENCE {
+    pucch-SpatialRelationInfoId         PUCCH-SpatialRelationInfoId,
+    servingCellId                           ServCellIndex                                                    OPTIONAL,   -- Need S
+    referenceSignal                         CHOICE {
+        ssb-Index                               SSB-Index,
+        csi-RS-Index                            NZP-CSI-RS-ResourceId,
+        srs                                     PUCCH-SRS
+    },
+    pucch-PathlossReferenceRS-Id            PUCCH-PathlossReferenceRS-Id,
+    p0-PUCCH-Id                             P0-PUCCH-Id,
+    closedLoopIndex                         ENUMERATED { i0, i1 }
+}
+
+PUCCH-SpatialRelationInfoExt-r16 ::=       SEQUENCE {
+    pucch-SpatialRelationInfoId-v1610         PUCCH-SpatialRelationInfoId-v1610                              OPTIONAL,   -- Cond SetupOnly
+    pucch-PathlossReferenceRS-Id-v1610        PUCCH-PathlossReferenceRS-Id-v1610                             OPTIONAL,    --Need R
+    ...
+}
+
+PUCCH-SRS ::=                       SEQUENCE {
+    resource                            SRS-ResourceId,
+    uplinkBWP                           BWP-Id
+}
+-- TAG-PUCCH-SPATIALRELATIONINFO-STOP
+-- TAG-PUCCH-SPATIALRELATIONINFO-START
+
+PUCCH-SpatialRelationInfoId ::=         INTEGER (1..maxNrofSpatialRelationInfos)
+
+PUCCH-SpatialRelationInfoId-r16 ::=     INTEGER (1..maxNrofSpatialRelationInfos-r16)
+
+PUCCH-SpatialRelationInfoId-v1610::=    INTEGER (maxNrofSpatialRelationInfos-plus-1..maxNrofSpatialRelationInfos-r16)
+
+-- TAG-PUCCH-SPATIALRELATIONINFO-STOP
+-- TAG-PUCCH-TPC-COMMANDCONFIG-START
+
+PUCCH-TPC-CommandConfig ::=             SEQUENCE {
+    tpc-IndexPCell                          INTEGER (1..15)                         OPTIONAL,   -- Cond PDCCH-OfSpcell
+    tpc-IndexPUCCH-SCell                    INTEGER (1..15)                         OPTIONAL,   -- Cond PDCCH-ofSpCellOrPUCCH-SCell
+    ...
+}
+
+-- TAG-PUCCH-TPC-COMMANDCONFIG-STOP
+-- TAG-PUSCH-CONFIG-START
+
+PUSCH-Config ::=                        SEQUENCE {
+    dataScramblingIdentityPUSCH             INTEGER (0..1023)                                                   OPTIONAL,   -- Need S
+    txConfig                                ENUMERATED {codebook, nonCodebook}                                  OPTIONAL,   -- Need S
+    dmrs-UplinkForPUSCH-MappingTypeA        SetupRelease { DMRS-UplinkConfig }                                  OPTIONAL,   -- Need M
+    dmrs-UplinkForPUSCH-MappingTypeB        SetupRelease { DMRS-UplinkConfig }                                  OPTIONAL,   -- Need M
+    pusch-PowerControl                      PUSCH-PowerControl                                                  OPTIONAL,   -- Need M
+    frequencyHopping                        ENUMERATED {intraSlot, interSlot}                                   OPTIONAL,   -- Need S
+    frequencyHoppingOffsetLists             SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1)
+                                                                                                                OPTIONAL,   -- Need M
+    resourceAllocation                      ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch},
+    pusch-TimeDomainAllocationList          SetupRelease { PUSCH-TimeDomainResourceAllocationList }             OPTIONAL,   -- Need M
+    pusch-AggregationFactor                 ENUMERATED { n2, n4, n8 }                                           OPTIONAL,   -- Need S
+    mcs-Table                               ENUMERATED {qam256, qam64LowSE}                                     OPTIONAL,   -- Need S
+    mcs-TableTransformPrecoder              ENUMERATED {qam256, qam64LowSE}                                     OPTIONAL,   -- Need S
+    transformPrecoder                       ENUMERATED {enabled, disabled}                                      OPTIONAL,   -- Need S
+    codebookSubset                          ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent}
+                                                                                                          OPTIONAL, -- Cond codebookBased
+    maxRank                                 INTEGER (1..4)                                                OPTIONAL, -- Cond codebookBased
+    rbg-Size                                ENUMERATED { config2}                                         OPTIONAL, -- Need S
+    uci-OnPUSCH                             SetupRelease { UCI-OnPUSCH}                                   OPTIONAL, -- Need M
+    tp-pi2BPSK                              ENUMERATED {enabled}                                          OPTIONAL, -- Need S
+    ...,
+    [[
+    minimumSchedulingOffsetK2-r16           SetupRelease { MinSchedulingOffsetK2-Values-r16 }             OPTIONAL,  -- Need M
+    ul-AccessConfigListDCI-0-1-r16          SetupRelease { UL-AccessConfigListDCI-0-1-r16 }               OPTIONAL,  -- Need M
+    -- Start of the parameters for DCI format 0_2 introduced in V16.1.0
+    harq-ProcessNumberSizeDCI-0-2-r16                       INTEGER (0..4)                                OPTIONAL,   -- Need R
+    dmrs-SequenceInitializationDCI-0-2-r16                  ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    numberOfBitsForRV-DCI-0-2-r16                           INTEGER (0..2)                                OPTIONAL,   -- Need R
+    antennaPortsFieldPresenceDCI-0-2-r16                    ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    dmrs-UplinkForPUSCH-MappingTypeA-DCI-0-2-r16            SetupRelease { DMRS-UplinkConfig }            OPTIONAL,   -- Need M
+    dmrs-UplinkForPUSCH-MappingTypeB-DCI-0-2-r16            SetupRelease { DMRS-UplinkConfig }            OPTIONAL,   -- Need M
+    frequencyHoppingDCI-0-2-r16                             CHOICE {
+        pusch-RepTypeA                                          ENUMERATED {intraSlot, interSlot},
+        pusch-RepTypeB                                          ENUMERATED {interRepetition, interSlot}
+    }                                                                                                     OPTIONAL,   -- Need S
+    frequencyHoppingOffsetListsDCI-0-2-r16  SetupRelease { FrequencyHoppingOffsetListsDCI-0-2-r16}        OPTIONAL,  -- Need M
+    codebookSubsetDCI-0-2-r16               ENUMERATED {fullyAndPartialAndNonCoherent, partialAndNonCoherent,nonCoherent}
+                                                                                                          OPTIONAL,   -- Cond codebookBased
+    invalidSymbolPatternIndicatorDCI-0-2-r16                ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    maxRankDCI-0-2-r16                                      INTEGER (1..4)                                OPTIONAL,   -- Cond codebookBased
+    mcs-TableDCI-0-2-r16                                    ENUMERATED {qam256, qam64LowSE}               OPTIONAL,   -- Need S
+    mcs-TableTransformPrecoderDCI-0-2-r16                   ENUMERATED {qam256, qam64LowSE}               OPTIONAL,   -- Need S
+    priorityIndicatorDCI-0-2-r16                            ENUMERATED {enabled}                          OPTIONAL,   -- Need S
+    pusch-RepTypeIndicatorDCI-0-2-r16                       ENUMERATED { pusch-RepTypeA, pusch-RepTypeB}  OPTIONAL,  -- Need R
+    resourceAllocationDCI-0-2-r16                           ENUMERATED { resourceAllocationType0, resourceAllocationType1, dynamicSwitch}
+                                                                                                          OPTIONAL,   -- Need M
+    resourceAllocationType1GranularityDCI-0-2-r16           ENUMERATED { n2,n4,n8,n16 }                   OPTIONAL,   -- Need S
+    uci-OnPUSCH-ListDCI-0-2-r16                             SetupRelease { UCI-OnPUSCH-ListDCI-0-2-r16}   OPTIONAL,   -- Need M
+    pusch-TimeDomainAllocationListDCI-0-2-r16               SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                          OPTIONAL,   -- Need M
+    -- End of the parameters for DCI format 0_2 introduced in V16.1.0
+    -- Start of the parameters for DCI format 0_1 introduced in V16.1.0
+    pusch-TimeDomainAllocationListDCI-0-1-r16               SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                          OPTIONAL,   -- Need M
+    invalidSymbolPatternIndicatorDCI-0-1-r16          ENUMERATED {enabled}                                OPTIONAL,   -- Need S
+    priorityIndicatorDCI-0-1-r16                      ENUMERATED {enabled}                                OPTIONAL,   -- Need S
+    pusch-RepTypeIndicatorDCI-0-1-r16                 ENUMERATED { pusch-RepTypeA, pusch-RepTypeB}        OPTIONAL,   -- Need R
+    frequencyHoppingDCI-0-1-r16                 ENUMERATED {interRepetition, interSlot}                   OPTIONAL,   -- Cond RepTypeB
+    uci-OnPUSCH-ListDCI-0-1-r16                 SetupRelease { UCI-OnPUSCH-ListDCI-0-1-r16  }             OPTIONAL,  -- Need M
+    -- End of the parameters for DCI format 0_1 introduced in V16.1.0
+    invalidSymbolPattern-r16                    InvalidSymbolPattern-r16                                  OPTIONAL,   -- Need S
+    pusch-PowerControl-v1610                SetupRelease {PUSCH-PowerControl-v1610}                       OPTIONAL,   -- Need M
+    ul-FullPowerTransmission-r16            ENUMERATED {fullpower, fullpowerMode1, fullpowerMode2}         OPTIONAL,   -- Need R
+    pusch-TimeDomainAllocationListForMultiPUSCH-r16  SetupRelease { PUSCH-TimeDomainResourceAllocationList-r16 }
+                                                                                                          OPTIONAL,  --  Need M
+    numberOfInvalidSymbolsForDL-UL-Switching-r16        INTEGER (1..4)                                    OPTIONAL    -- Cond RepTypeB2
+    ]]
+}
+
+UCI-OnPUSCH ::=                         SEQUENCE {
+    betaOffsets                             CHOICE {
+        dynamic                             SEQUENCE (SIZE (4)) OF BetaOffsets,
+        semiStatic                          BetaOffsets
+    }                                                                                                 OPTIONAL, -- Need M
+    scaling                                 ENUMERATED { f0p5, f0p65, f0p8, f1 }
+}
+
+MinSchedulingOffsetK2-Values-r16 ::=    SEQUENCE (SIZE (1..maxNrOfMinSchedulingOffsetValues-r16)) OF INTEGER (0..maxK2-SchedulingOffset-r16)
+
+UCI-OnPUSCH-DCI-0-2-r16 ::=             SEQUENCE {
+    betaOffsetsDCI-0-2-r16                  CHOICE {
+        dynamicDCI-0-2-r16                      CHOICE {
+            oneBit-r16                              SEQUENCE (SIZE (2)) OF BetaOffsets,
+            twoBits-r16                             SEQUENCE (SIZE (4)) OF BetaOffsets
+        },
+        semiStaticDCI-0-2-r16          BetaOffsets
+    }                                                                                                 OPTIONAL,   -- Need M
+    scalingDCI-0-2-r16                 ENUMERATED { f0p5, f0p65, f0p8, f1 }
+}
+
+FrequencyHoppingOffsetListsDCI-0-2-r16 ::=  SEQUENCE (SIZE (1..4)) OF INTEGER (1.. maxNrofPhysicalResourceBlocks-1)
+
+UCI-OnPUSCH-ListDCI-0-2-r16 ::=  SEQUENCE (SIZE (1..2)) OF UCI-OnPUSCH-DCI-0-2-r16
+
+UCI-OnPUSCH-ListDCI-0-1-r16 ::=  SEQUENCE (SIZE (1..2)) OF UCI-OnPUSCH
+
+UL-AccessConfigListDCI-0-1-r16 ::= SEQUENCE (SIZE (1..64)) OF INTEGER (0..63)
+
+-- TAG-PUSCH-CONFIG-STOP
+-- TAG-PUSCH-CONFIGCOMMON-START
+
+PUSCH-ConfigCommon ::=                  SEQUENCE {
+    groupHoppingEnabledTransformPrecoding   ENUMERATED {enabled}                                                OPTIONAL,   -- Need R
+    pusch-TimeDomainAllocationList          PUSCH-TimeDomainResourceAllocationList                              OPTIONAL,   -- Need R
+    msg3-DeltaPreamble                      INTEGER (-1..6)                                                     OPTIONAL,   -- Need R
+    p0-NominalWithGrant                     INTEGER (-202..24)                                                  OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-PUSCH-CONFIGCOMMON-STOP
+-- TAG-PUSCH-POWERCONTROL-START
+
+PUSCH-PowerControl ::=              SEQUENCE {
+    tpc-Accumulation                    ENUMERATED { disabled }                                                 OPTIONAL, -- Need S
+    msg3-Alpha                          Alpha                                                                   OPTIONAL, -- Need S
+    p0-NominalWithoutGrant              INTEGER (-202..24)                                                      OPTIONAL, -- Need M
+    p0-AlphaSets                        SEQUENCE (SIZE (1..maxNrofP0-PUSCH-AlphaSets)) OF P0-PUSCH-AlphaSet     OPTIONAL, -- Need M
+    pathlossReferenceRSToAddModList     SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSs)) OF PUSCH-PathlossReferenceRS
+                                                                                                                OPTIONAL, -- Need N
+    pathlossReferenceRSToReleaseList    SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSs)) OF PUSCH-PathlossReferenceRS-Id
+                                                                                                                OPTIONAL,  -- Need N
+    twoPUSCH-PC-AdjustmentStates        ENUMERATED {twoStates}                                                  OPTIONAL, -- Need S
+    deltaMCS                            ENUMERATED {enabled}                                                    OPTIONAL, -- Need S
+    sri-PUSCH-MappingToAddModList       SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF SRI-PUSCH-PowerControl
+                                                                                                                OPTIONAL, -- Need N
+    sri-PUSCH-MappingToReleaseList      SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF SRI-PUSCH-PowerControlId
+                                                                                                                OPTIONAL  -- Need N
+}
+
+P0-PUSCH-AlphaSet ::=               SEQUENCE {
+    p0-PUSCH-AlphaSetId                 P0-PUSCH-AlphaSetId,
+    p0                                  INTEGER (-16..15)                                                       OPTIONAL, -- Need S
+    alpha                               Alpha                                                                   OPTIONAL  -- Need S
+}
+
+P0-PUSCH-AlphaSetId ::=             INTEGER (0..maxNrofP0-PUSCH-AlphaSets-1)
+
+PUSCH-PathlossReferenceRS ::=       SEQUENCE {
+    pusch-PathlossReferenceRS-Id        PUSCH-PathlossReferenceRS-Id,
+    referenceSignal                     CHOICE {
+        ssb-Index                           SSB-Index,
+        csi-RS-Index                        NZP-CSI-RS-ResourceId
+    }
+}
+
+PUSCH-PathlossReferenceRS-r16 ::=   SEQUENCE {
+    pusch-PathlossReferenceRS-Id-r16    PUSCH-PathlossReferenceRS-Id-v1610,
+    referenceSignal-r16                 CHOICE {
+        ssb-Index-r16                       SSB-Index,
+        csi-RS-Index-r16                    NZP-CSI-RS-ResourceId
+    }
+}
+
+PUSCH-PathlossReferenceRS-Id ::=    INTEGER (0..maxNrofPUSCH-PathlossReferenceRSs-1)
+
+PUSCH-PathlossReferenceRS-Id-v1610 ::= INTEGER (maxNrofPUSCH-PathlossReferenceRSs..maxNrofPUSCH-PathlossReferenceRSs-1-r16)
+
+SRI-PUSCH-PowerControl ::=          SEQUENCE {
+    sri-PUSCH-PowerControlId            SRI-PUSCH-PowerControlId,
+    sri-PUSCH-PathlossReferenceRS-Id    PUSCH-PathlossReferenceRS-Id,
+    sri-P0-PUSCH-AlphaSetId             P0-PUSCH-AlphaSetId,
+    sri-PUSCH-ClosedLoopIndex           ENUMERATED { i0, i1 }
+}
+
+SRI-PUSCH-PowerControlId ::=        INTEGER (0..maxNrofSRI-PUSCH-Mappings-1)
+
+PUSCH-PowerControl-v1610 ::=        SEQUENCE {
+    pathlossReferenceRSToAddModListSizeExt-v1610   SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSsDiff-r16)) OF PUSCH-PathlossReferenceRS-r16
+                                                                                                                OPTIONAL, -- Need N
+    pathlossReferenceRSToReleaseListSizeExt-v1610  SEQUENCE (SIZE (1..maxNrofPUSCH-PathlossReferenceRSsDiff-r16)) OF PUSCH-PathlossReferenceRS-Id-v1610
+                                                                                                                OPTIONAL, -- Need N
+    p0-PUSCH-SetList-r16                SEQUENCE (SIZE (1..maxNrofSRI-PUSCH-Mappings)) OF P0-PUSCH-Set-r16      OPTIONAL, -- Need R
+    olpc-ParameterSet                   SEQUENCE {
+        olpc-ParameterSetDCI-0-1-r16        INTEGER (1..2)                                                      OPTIONAL, -- Need R
+        olpc-ParameterSetDCI-0-2-r16        INTEGER (1..2)                                                      OPTIONAL  -- Need R
+    }                                                                                                           OPTIONAL, -- Need M
+    ...
+}
+
+P0-PUSCH-Set-r16 ::=                SEQUENCE {
+    p0-PUSCH-SetId-r16                  P0-PUSCH-SetId-r16,
+    p0-List-r16                         SEQUENCE (SIZE (1..maxNrofP0-PUSCH-Set-r16)) OF P0-PUSCH-r16            OPTIONAL, -- Need R
+    ...
+}
+
+P0-PUSCH-SetId-r16 ::=              INTEGER (0..maxNrofSRI-PUSCH-Mappings-1)
+
+P0-PUSCH-r16 ::=                    INTEGER (-16..15)
+
+-- TAG-PUSCH-POWERCONTROL-STOP
+-- TAG-PUSCH-SERVINGCELLCONFIG-START
+
+PUSCH-ServingCellConfig ::=             SEQUENCE {
+    codeBlockGroupTransmission              SetupRelease { PUSCH-CodeBlockGroupTransmission }       OPTIONAL,   -- Need M
+    rateMatching                            ENUMERATED {limitedBufferRM}                            OPTIONAL,   -- Need S
+    xOverhead                               ENUMERATED {xoh6, xoh12, xoh18}                         OPTIONAL,   -- Need S
+    ...,
+    [[
+    maxMIMO-Layers                          INTEGER (1..4)                                          OPTIONAL,   -- Need M
+    processingType2Enabled                  BOOLEAN                                                 OPTIONAL    -- Need M
+    ]],
+    [[
+    maxMIMO-LayersDCI-0-2-r16               SetupRelease { MaxMIMO-LayersDCI-0-2-r16}               OPTIONAL    -- Need M
+    ]]
+}
+
+PUSCH-CodeBlockGroupTransmission ::=    SEQUENCE {
+    maxCodeBlockGroupsPerTransportBlock     ENUMERATED {n2, n4, n6, n8},
+    ...
+}
+
+MaxMIMO-LayersDCI-0-2-r16 ::=           INTEGER (1..4)
+
+-- TAG-PUSCH-SERVINGCELLCONFIG-STOP
+-- TAG-PUSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-START
+
+PUSCH-TimeDomainResourceAllocationList ::=  SEQUENCE (SIZE(1..maxNrofUL-Allocations)) OF PUSCH-TimeDomainResourceAllocation
+
+PUSCH-TimeDomainResourceAllocation ::=  SEQUENCE {
+    k2                                      INTEGER(0..32)                                  OPTIONAL,   -- Need S
+    mappingType                             ENUMERATED {typeA, typeB},
+    startSymbolAndLength                    INTEGER (0..127)
+}
+
+PUSCH-TimeDomainResourceAllocationList-r16 ::=  SEQUENCE (SIZE(1..maxNrofUL-Allocations-r16)) OF PUSCH-TimeDomainResourceAllocation-r16
+
+PUSCH-TimeDomainResourceAllocation-r16 ::=  SEQUENCE {
+    k2-r16                                     INTEGER(0..32)          OPTIONAL,   -- Need S
+    puschAllocationList-r16                    SEQUENCE (SIZE(1..maxNrofMultiplePUSCHs-r16)) OF PUSCH-Allocation-r16,
+...
+}
+
+PUSCH-Allocation-r16 ::=  SEQUENCE {
+    mappingType-r16                           ENUMERATED {typeA, typeB}                     OPTIONAL,   -- Cond NotFormat01-02-Or-TypeA
+    startSymbolAndLength-r16                  INTEGER (0..127)                              OPTIONAL,   -- Cond NotFormat01-02-Or-TypeA
+    startSymbol-r16                           INTEGER (0..13)                               OPTIONAL,   -- Cond RepTypeB
+    length-r16                                INTEGER (1..14)                               OPTIONAL,   -- Cond RepTypeB
+    numberOfRepetitions-r16                   ENUMERATED {n1, n2, n3, n4, n7, n8, n12, n16} OPTIONAL,   -- Cond Format01-02
+    ...
+}
+
+-- TAG-PUSCH-TIMEDOMAINRESOURCEALLOCATIONLIST-STOP
+-- TAG-PUSCH-TPC-COMMANDCONFIG-START
+
+PUSCH-TPC-CommandConfig ::=         SEQUENCE {
+    tpc-Index                           INTEGER (1..15)                                                 OPTIONAL,   -- Cond SUL
+    tpc-IndexSUL                        INTEGER (1..15)                                                 OPTIONAL,   -- Cond SUL-Only
+    targetCell                          ServCellIndex                                                   OPTIONAL,   -- Need S
+    ...
+}
+
+-- TAG-PUSCH-TPC-COMMANDCONFIG-STOP
+-- TAG-Q-OFFSETRANGE-START
+
+Q-OffsetRange ::=                   ENUMERATED {
+                                                dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+                                                dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+                                                dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+                                                dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+                                                dB20, dB22, dB24}
+
+-- TAG-Q-OFFSETRANGE-STOP
+-- TAG-Q-QUALMIN-START
+
+Q-QualMin ::=                       INTEGER (-43..-12)
+
+-- TAG-Q-QUALMIN-STOP
+-- TAG-Q-RXLEVMIN-START
+
+Q-RxLevMin ::=                      INTEGER (-70..-22)
+
+-- TAG-Q-RXLEVMIN-STOP
+-- TAG-QUANTITYCONFIG-START
+
+
+QuantityConfig ::=                  SEQUENCE {
+    quantityConfigNR-List               SEQUENCE (SIZE (1..maxNrofQuantityConfig)) OF QuantityConfigNR          OPTIONAL,   -- Need M
+    ...,
+    [[
+    quantityConfigEUTRA                 FilterConfig                                                            OPTIONAL    -- Need M
+    ]],
+    [[
+    quantityConfigUTRA-FDD-r16          QuantityConfigUTRA-FDD-r16                                              OPTIONAL,   -- Need M
+    quantityConfigCLI-r16               FilterConfigCLI-r16                                                     OPTIONAL    -- Need M
+    ]]
+}
+
+QuantityConfigNR::=                 SEQUENCE {
+    quantityConfigCell                  QuantityConfigRS,
+    quantityConfigRS-Index              QuantityConfigRS                                                        OPTIONAL    -- Need M
+}
+
+QuantityConfigRS ::=                SEQUENCE {
+    ssb-FilterConfig                    FilterConfig,
+    csi-RS-FilterConfig                 FilterConfig
+}
+
+FilterConfig ::=                    SEQUENCE {
+    filterCoefficientRSRP               FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientRSRQ               FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientRS-SINR            FilterCoefficient                                       DEFAULT fc4
+}
+
+FilterConfigCLI-r16 ::=             SEQUENCE {
+    filterCoefficientSRS-RSRP-r16       FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientCLI-RSSI-r16       FilterCoefficient                                       DEFAULT fc4
+}
+
+QuantityConfigUTRA-FDD-r16 ::=      SEQUENCE {
+    filterCoefficientRSCP-r16           FilterCoefficient                                       DEFAULT fc4,
+    filterCoefficientEcNO-r16           FilterCoefficient                                       DEFAULT fc4
+}
+
+-- TAG-QUANTITYCONFIG-STOP
+-- TAG-RACH-CONFIGCOMMON-START
+
+RACH-ConfigCommon ::=               SEQUENCE {
+    rach-ConfigGeneric                  RACH-ConfigGeneric,
+    totalNumberOfRA-Preambles           INTEGER (1..63)                                                     OPTIONAL,   -- Need S
+    ssb-perRACH-OccasionAndCB-PreamblesPerSSB   CHOICE {
+        oneEighth                                   ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneFourth                                   ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneHalf                                     ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        one                                         ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        two                                         ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
+        four                                        INTEGER (1..16),
+        eight                                       INTEGER (1..8),
+        sixteen                                     INTEGER (1..4)
+    }                                                                                                       OPTIONAL,   -- Need M
+
+    groupBconfigured                    SEQUENCE {
+        ra-Msg3SizeGroupA                   ENUMERATED {b56, b144, b208, b256, b282, b480, b640,
+                                                        b800, b1000, b72, spare6, spare5,spare4, spare3, spare2, spare1},
+        messagePowerOffsetGroupB            ENUMERATED { minusinfinity, dB0, dB5, dB8, dB10, dB12, dB15, dB18},
+        numberOfRA-PreamblesGroupA          INTEGER (1..64)
+    }                                                                                                       OPTIONAL,   -- Need R
+    ra-ContentionResolutionTimer            ENUMERATED { sf8, sf16, sf24, sf32, sf40, sf48, sf56, sf64},
+    rsrp-ThresholdSSB                       RSRP-Range                                                      OPTIONAL,   -- Need R
+    rsrp-ThresholdSSB-SUL                   RSRP-Range                                                      OPTIONAL,   -- Cond SUL
+    prach-RootSequenceIndex                 CHOICE {
+        l839                                    INTEGER (0..837),
+        l139                                    INTEGER (0..137)
+    },
+    msg1-SubcarrierSpacing                  SubcarrierSpacing                                               OPTIONAL,   -- Cond L139
+    restrictedSetConfig                     ENUMERATED {unrestrictedSet, restrictedSetTypeA, restrictedSetTypeB},
+    msg3-transformPrecoder                  ENUMERATED {enabled}                                            OPTIONAL,   -- Need R
+    ...,
+    [[
+    ra-PrioritizationForAccessIdentity-r16  SEQUENCE {
+        ra-Prioritization-r16                   RA-Prioritization,
+        ra-PrioritizationForAI-r16              BIT STRING (SIZE (2))
+    }                                                                                                       OPTIONAL,   -- Cond InitialBWP-Only
+    prach-RootSequenceIndex-r16             CHOICE {
+        l571                                    INTEGER (0..569),
+        l1151                                   INTEGER (0..1149)
+    }   OPTIONAL   -- Need R
+    ]]
+}
+
+-- TAG-RACH-CONFIGCOMMON-STOP
+-- TAG-RACH-CONFIGCOMMONTWOSTEPRA-START
+
+RACH-ConfigCommonTwoStepRA-r16 ::=                   SEQUENCE {
+    rach-ConfigGenericTwoStepRA-r16                      RACH-ConfigGenericTwoStepRA-r16,
+    msgA-TotalNumberOfRA-Preambles-r16                   INTEGER (1..63)                                    OPTIONAL, -- Need S
+    msgA-SSB-PerRACH-OccasionAndCB-PreamblesPerSSB-r16   CHOICE {
+        oneEighth                                            ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneFourth                                            ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        oneHalf                                              ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        one                                                  ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
+        two                                                  ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
+        four                                                 INTEGER (1..16),
+        eight                                                INTEGER (1..8),
+        sixteen                                              INTEGER (1..4)
+    }                                                                                                                   OPTIONAL, -- Cond 2StepOnly
+    msgA-CB-PreamblesPerSSB-PerSharedRO-r16              INTEGER (1..60)                                                OPTIONAL, -- Cond SharedRO
+    msgA-SSB-SharedRO-MaskIndex-r16                      INTEGER (1..15)                                                OPTIONAL, -- Need S
+    groupB-ConfiguredTwoStepRA-r16                       GroupB-ConfiguredTwoStepRA-r16                                 OPTIONAL, -- Need S
+    msgA-PRACH-RootSequenceIndex-r16                     CHOICE {
+        l839                                                 INTEGER (0..837),
+        l139                                                 INTEGER (0..137),
+        l571                                                 INTEGER (0..569),
+        l1151                                                INTEGER (0..1149)
+    }                                                                                                                   OPTIONAL, -- Cond 2StepOnly
+    msgA-TransMax-r16                                    ENUMERATED {n1, n2, n4, n6, n8, n10, n20, n50, n100, n200}     OPTIONAL, -- Need R
+    msgA-RSRP-Threshold-r16                              RSRP-Range                                                     OPTIONAL, -- Cond 2Step4Step
+    msgA-RSRP-ThresholdSSB-r16                           RSRP-Range                                                     OPTIONAL, -- Need R
+    msgA-SubcarrierSpacing-r16                           SubcarrierSpacing                                              OPTIONAL, -- Cond 2StepOnlyL139
+    msgA-RestrictedSetConfig-r16                         ENUMERATED {unrestrictedSet, restrictedSetTypeA,
+                                                                     restrictedSetTypeB}                                OPTIONAL, -- Cond 2StepOnly
+    ra-PrioritizationForAccessIdentityTwoStep-r16        SEQUENCE {
+        ra-Prioritization-r16                                RA-Prioritization,
+        ra-PrioritizationForAI-r16                           BIT STRING (SIZE (2))
+    }                                                                                                                   OPTIONAL, -- Cond InitialBWP-Only
+    ra-ContentionResolutionTimer-r16                     ENUMERATED {sf8, sf16, sf24, sf32, sf40, sf48, sf56, sf64}     OPTIONAL, -- Cond 2StepOnly
+    ...
+}
+
+GroupB-ConfiguredTwoStepRA-r16 ::=                       SEQUENCE {
+    ra-MsgA-SizeGroupA                                   ENUMERATED {b56, b144, b208, b256, b282, b480, b640, b800,
+                                                                     b1000, b72, spare6, spare5, spare4, spare3, spare2, spare1},
+    messagePowerOffsetGroupB                             ENUMERATED {minusinfinity, dB0, dB5, dB8, dB10, dB12, dB15, dB18},
+    numberOfRA-PreamblesGroupA                           INTEGER (1..64)
+}
+
+-- TAG-RACH-CONFIGCOMMONTWOSTEPRA-STOP
+-- TAG-RACH-CONFIGDEDICATED-START
+
+
+RACH-ConfigDedicated ::=        SEQUENCE {
+    cfra                            CFRA                                                                    OPTIONAL, -- Need S
+    ra-Prioritization               RA-Prioritization                                                       OPTIONAL, -- Need N
+    ...,
+    [[
+    ra-PrioritizationTwoStep-r16    RA-Prioritization                                                       OPTIONAL, -- Need N
+    cfra-TwoStep-r16                CFRA-TwoStep-r16                                                        OPTIONAL  -- Need S
+    ]]
+}
+
+CFRA ::=                    SEQUENCE {
+    occasions                       SEQUENCE {
+        rach-ConfigGeneric              RACH-ConfigGeneric,
+        ssb-perRACH-Occasion            ENUMERATED {oneEighth, oneFourth, oneHalf, one, two, four, eight, sixteen}
+                                                                                                            OPTIONAL  -- Cond Mandatory
+    }                                                                                                       OPTIONAL, -- Need S
+    resources                       CHOICE {
+        ssb                             SEQUENCE {
+            ssb-ResourceList                SEQUENCE (SIZE(1..maxRA-SSB-Resources)) OF CFRA-SSB-Resource,
+            ra-ssb-OccasionMaskIndex        INTEGER (0..15)
+        },
+        csirs                           SEQUENCE {
+            csirs-ResourceList              SEQUENCE (SIZE(1..maxRA-CSIRS-Resources)) OF CFRA-CSIRS-Resource,
+            rsrp-ThresholdCSI-RS            RSRP-Range
+        }
+    },
+    ...,
+    [[
+    totalNumberOfRA-Preambles INTEGER (1..63)                                                             OPTIONAL -- Cond Occasions
+    ]]
+}
+
+CFRA-TwoStep-r16 ::=                    SEQUENCE {
+    occasionsTwoStepRA-r16                  SEQUENCE {
+        rach-ConfigGenericTwoStepRA-r16         RACH-ConfigGenericTwoStepRA-r16,
+        ssb-PerRACH-OccasionTwoStepRA-r16       ENUMERATED {oneEighth, oneFourth, oneHalf, one,
+                                                            two, four, eight, sixteen}
+    }                                                                                                     OPTIONAL, -- Need S
+    msgA-CFRA-PUSCH-r16                     MsgA-PUSCH-Resource-r16,
+    msgA-TransMax-r16                       ENUMERATED {n1, n2, n4, n6, n8, n10, n20, n50, n100, n200}    OPTIONAL, -- Need S
+    resourcesTwoStep-r16                    SEQUENCE {
+        ssb-ResourceList                        SEQUENCE (SIZE(1..maxRA-SSB-Resources)) OF CFRA-SSB-Resource,
+        ra-ssb-OccasionMaskIndex                INTEGER (0..15)
+    },
+    ...
+}
+
+CFRA-SSB-Resource ::=           SEQUENCE {
+    ssb                             SSB-Index,
+    ra-PreambleIndex                INTEGER (0..63),
+    ...,
+    [[
+    msgA-PUSCH-Resource-Index-r16   INTEGER (0..3071)     OPTIONAL  -- Cond 2StepCFRA
+    ]]
+
+}
+
+CFRA-CSIRS-Resource ::=         SEQUENCE {
+    csi-RS                          CSI-RS-Index,
+    ra-OccasionList                 SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS)) OF INTEGER (0..maxRA-Occasions-1),
+    ra-PreambleIndex                INTEGER (0..63),
+    ...
+}
+
+-- TAG-RACH-CONFIGDEDICATED-STOP
+-- TAG-RACH-CONFIGGENERIC-START
+
+RACH-ConfigGeneric ::=              SEQUENCE {
+    prach-ConfigurationIndex            INTEGER (0..255),
+    msg1-FDM                            ENUMERATED {one, two, four, eight},
+    msg1-FrequencyStart                 INTEGER (0..maxNrofPhysicalResourceBlocks-1),
+    zeroCorrelationZoneConfig           INTEGER(0..15),
+    preambleReceivedTargetPower         INTEGER (-202..-60),
+    preambleTransMax                    ENUMERATED {n3, n4, n5, n6, n7, n8, n10, n20, n50, n100, n200},
+    powerRampingStep                    ENUMERATED {dB0, dB2, dB4, dB6},
+    ra-ResponseWindow                   ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80},
+    ...,
+    [[
+    prach-ConfigurationPeriodScaling-IAB-r16    ENUMERATED {scf1,scf2,scf4,scf8,scf16,scf32,scf64}                    OPTIONAL,   -- Need R
+    prach-ConfigurationFrameOffset-IAB-r16      INTEGER (0..63)                                                       OPTIONAL,   -- Need R
+    prach-ConfigurationSOffset-IAB-r16          INTEGER (0..39)                                                       OPTIONAL,   -- Need R
+    ra-ResponseWindow-v1610                     ENUMERATED { sl60, sl160}                                             OPTIONAL, -- Need R
+    prach-ConfigurationIndex-v1610              INTEGER (256..262)                                                    OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-RACH-CONFIGGENERIC-STOP
+-- TAG-RACH-CONFIGGENERICTWOSTEPRA-START
+
+RACH-ConfigGenericTwoStepRA-r16 ::=     SEQUENCE {
+    msgA-PRACH-ConfigurationIndex-r16       INTEGER (0..262)                                                OPTIONAL, -- Cond 2StepOnly
+    msgA-RO-FDM-r16                         ENUMERATED {one, two, four, eight}                              OPTIONAL, -- Cond 2StepOnly
+    msgA-RO-FrequencyStart-r16              INTEGER (0..maxNrofPhysicalResourceBlocks-1)                    OPTIONAL, -- Cond 2StepOnly
+    msgA-ZeroCorrelationZoneConfig-r16      INTEGER (0..15)                                                 OPTIONAL, -- Cond 2StepOnly
+    msgA-PreamblePowerRampingStep-r16       ENUMERATED {dB0, dB2, dB4, dB6}                                 OPTIONAL, -- Cond 2StepOnlyNoCFRA
+    msgA-PreambleReceivedTargetPower-r16    INTEGER (-202..-60)                                             OPTIONAL, -- Cond 2StepOnlyNoCFRA
+    msgB-ResponseWindow-r16                 ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80, sl160, sl320}
+                                                                                                            OPTIONAL, -- Cond NoCFRA
+    preambleTransMax-r16                    ENUMERATED {n3, n4, n5, n6, n7, n8, n10, n20, n50, n100, n200}  OPTIONAL, -- Cond 2StepOnlyNoCFRA
+    ...
+}
+
+-- TAG-RACH-CONFIGGENERICTWOSTEPRA-STOP
+-- TAG-RA-PRIORITIZATION-START
+
+RA-Prioritization ::=           SEQUENCE {
+    powerRampingStepHighPriority    ENUMERATED {dB0, dB2, dB4, dB6},
+    scalingFactorBI                 ENUMERATED {zero, dot25, dot5, dot75}                               OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-RA-PRIORITIZATION-STOP
+-- TAG-RADIOBEARERCONFIG-START
+
+RadioBearerConfig ::=                   SEQUENCE {
+    srb-ToAddModList                        SRB-ToAddModList                                        OPTIONAL,   -- Cond HO-Conn
+    srb3-ToRelease                          ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    drb-ToAddModList                        DRB-ToAddModList                                        OPTIONAL,   -- Cond HO-toNR
+    drb-ToReleaseList                       DRB-ToReleaseList                                       OPTIONAL,   -- Need N
+    securityConfig                          SecurityConfig                                          OPTIONAL,   -- Need M
+    ...
+}
+
+SRB-ToAddModList ::=                    SEQUENCE (SIZE (1..2)) OF SRB-ToAddMod
+SRB-ToAddMod ::=                        SEQUENCE {
+    srb-Identity                            SRB-Identity,
+    reestablishPDCP                         ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    discardOnPDCP                           ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    pdcp-Config                             PDCP-Config                                             OPTIONAL,   -- Cond PDCP
+    ...
+}
+
+DRB-ToAddModList ::=                    SEQUENCE (SIZE (1..maxDRB)) OF DRB-ToAddMod
+
+DRB-ToAddMod ::=                        SEQUENCE {
+    cnAssociation                           CHOICE {
+        eps-BearerIdentity                      INTEGER (0..15),
+        sdap-Config                             SDAP-Config
+    }                                                                                               OPTIONAL,   -- Cond DRBSetup
+    drb-Identity                            DRB-Identity,
+    reestablishPDCP                         ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    recoverPDCP                             ENUMERATED{true}                                        OPTIONAL,   -- Need N
+    pdcp-Config                             PDCP-Config                                             OPTIONAL,   -- Cond PDCP
+    ...,
+    [[
+    daps-Config-r16                         ENUMERATED{true}                                        OPTIONAL    -- Cond DAPS
+    ]]
+}
+DRB-ToReleaseList ::=                   SEQUENCE (SIZE (1..maxDRB)) OF DRB-Identity
+
+SecurityConfig ::=                      SEQUENCE {
+    securityAlgorithmConfig                 SecurityAlgorithmConfig                                 OPTIONAL,   -- Cond RBTermChange1
+    keyToUse                                ENUMERATED{master, secondary}                           OPTIONAL,   -- Cond RBTermChange
+    ...
+}
+
+-- TAG-RADIOBEARERCONFIG-STOP
+-- TAG-RADIOLINKMONITORINGCONFIG-START
+
+RadioLinkMonitoringConfig ::=       SEQUENCE {
+    failureDetectionResourcesToAddModList   SEQUENCE (SIZE(1..maxNrofFailureDetectionResources)) OF RadioLinkMonitoringRS
+                                                                                                                  OPTIONAL, -- Need N
+    failureDetectionResourcesToReleaseList  SEQUENCE (SIZE(1..maxNrofFailureDetectionResources)) OF RadioLinkMonitoringRS-Id
+                                                                                                                  OPTIONAL, -- Need N
+    beamFailureInstanceMaxCount             ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10}                          OPTIONAL, -- Need R
+    beamFailureDetectionTimer               ENUMERATED {pbfd1, pbfd2, pbfd3, pbfd4, pbfd5, pbfd6, pbfd8, pbfd10}  OPTIONAL, -- Need R
+    ...
+}
+
+RadioLinkMonitoringRS ::=           SEQUENCE {
+    radioLinkMonitoringRS-Id            RadioLinkMonitoringRS-Id,
+    purpose                             ENUMERATED {beamFailure, rlf, both},
+    detectionResource                   CHOICE {
+        ssb-Index                           SSB-Index,
+        csi-RS-Index                        NZP-CSI-RS-ResourceId
+    },
+    ...
+}
+
+-- TAG-RADIOLINKMONITORINGCONFIG-STOP
+-- TAG-RADIOLINKMONITORINGRS-ID-START
+
+RadioLinkMonitoringRS-Id ::=            INTEGER (0..maxNrofFailureDetectionResources-1)
+
+-- TAG-RADIOLINKMONITORINGRS-ID-STOP
+-- TAG-RAN-AREACODE-START
+
+RAN-AreaCode ::=                INTEGER (0..255)
+
+-- TAG-RAN-AREACODE-STOP
+-- TAG-RATEMATCHPATTERN-START
+
+RateMatchPattern ::=                SEQUENCE {
+    rateMatchPatternId                  RateMatchPatternId,
+
+    patternType                         CHOICE {
+        bitmaps                             SEQUENCE {
+            resourceBlocks                      BIT STRING (SIZE (275)),
+            symbolsInResourceBlock              CHOICE {
+                oneSlot                             BIT STRING (SIZE (14)),
+                twoSlots                            BIT STRING (SIZE (28))
+            },
+            periodicityAndPattern               CHOICE {
+                n2                                  BIT STRING (SIZE (2)),
+                n4                                  BIT STRING (SIZE (4)),
+                n5                                  BIT STRING (SIZE (5)),
+                n8                                  BIT STRING (SIZE (8)),
+                n10                                 BIT STRING (SIZE (10)),
+                n20                                 BIT STRING (SIZE (20)),
+                n40                                 BIT STRING (SIZE (40))
+            }                                                                                           OPTIONAL,   -- Need S
+            ...
+        },
+        controlResourceSet                  ControlResourceSetId
+    },
+    subcarrierSpacing                   SubcarrierSpacing                                               OPTIONAL,   -- Cond CellLevel
+    dummy                               ENUMERATED { dynamic, semiStatic },
+    ...,
+    [[
+    controlResourceSet-r16              ControlResourceSetId-r16                                        OPTIONAL    -- Need R
+    ]]
+
+}
+
+-- TAG-RATEMATCHPATTERN-STOP
+-- TAG-RATEMATCHPATTERNID-START
+
+RateMatchPatternId ::=              INTEGER (0..maxNrofRateMatchPatterns-1)
+
+-- TAG-RATEMATCHPATTERNID-STOP
+-- TAG-RATEMATCHPATTERNLTE-CRS-START
+
+RateMatchPatternLTE-CRS ::=         SEQUENCE {
+    carrierFreqDL                       INTEGER (0..16383),
+    carrierBandwidthDL                  ENUMERATED {n6, n15, n25, n50, n75, n100, spare2, spare1},
+    mbsfn-SubframeConfigList            EUTRA-MBSFN-SubframeConfigList                                          OPTIONAL,   -- Need M
+    nrofCRS-Ports                       ENUMERATED {n1, n2, n4},
+    v-Shift                             ENUMERATED {n0, n1, n2, n3, n4, n5}
+}
+
+LTE-CRS-PatternList-r16 ::=         SEQUENCE (SIZE (1..maxLTE-CRS-Patterns-r16)) OF RateMatchPatternLTE-CRS
+
+-- TAG-RATEMATCHPATTERNLTE-CRS-STOP
+-- TAG-REFERENCETIMEINFO-START
+
+ReferenceTimeInfo-r16 ::= SEQUENCE {
+    time-r16                            ReferenceTime-r16,
+    uncertainty-r16                     INTEGER (0..32767)          OPTIONAL,   -- Need S
+    timeInfoType-r16                    ENUMERATED {localClock}     OPTIONAL,   -- Need S
+    referenceSFN-r16                    INTEGER (0..1023)           OPTIONAL    -- Cond RefTime
+}
+
+ReferenceTime-r16 ::=           SEQUENCE {
+    refDays-r16                         INTEGER (0..72999),
+    refSeconds-r16                      INTEGER (0..86399),
+    refMilliSeconds-r16                 INTEGER (0..999),
+    refTenNanoSeconds-r16               INTEGER (0..99999)
+}
+
+-- TAG-REFERENCETIMEINFO-STOP
+-- TAG-REJECTWAITTIME-START
+
+RejectWaitTime ::=                  INTEGER (1..16)
+
+-- TAG-REJECTWAITTIME-STOP
+-- TAG-REPETITIONSCHEMECONFIG-START
+
+RepetitionSchemeConfig-r16 ::= CHOICE {
+    fdm-TDM-r16                        SetupRelease { FDM-TDM-r16 },
+    slotBased-r16                      SetupRelease { SlotBased-r16 }
+}
+
+RepetitionSchemeConfig-v1630 ::=   SEQUENCE {
+    slotBased-v1630                    SetupRelease { SlotBased-v1630 }
+}
+
+FDM-TDM-r16 ::=                SEQUENCE {
+    repetitionScheme-r16           ENUMERATED {fdmSchemeA, fdmSchemeB,tdmSchemeA },
+    startingSymbolOffsetK-r16      INTEGER (0..7)                                    OPTIONAL  -- Need R
+}
+
+SlotBased-r16 ::=              SEQUENCE {
+    tciMapping-r16                 ENUMERATED {cyclicMapping, sequentialMapping},
+    sequenceOffsetForRV-r16        INTEGER (1..3)
+}
+
+SlotBased-v1630 ::=            SEQUENCE {
+    tciMapping-r16                 ENUMERATED {cyclicMapping, sequentialMapping},
+    sequenceOffsetForRV-r16        INTEGER (0)
+}
+
+-- TAG-REPETITIONSCHEMECONFIG-STOP
+-- TAG-REPORTCONFIGID-START
+
+ReportConfigId ::=                          INTEGER (1..maxReportConfigId)
+
+-- TAG-REPORTCONFIGID-STOP
+-- TAG-REPORTCONFIGINTERRAT-START
+
+ReportConfigInterRAT ::=                    SEQUENCE {
+    reportType                                  CHOICE {
+        periodical                                  PeriodicalReportConfigInterRAT,
+        eventTriggered                              EventTriggerConfigInterRAT,
+        reportCGI                                   ReportCGI-EUTRA,
+        ...,
+        reportSFTD                                  ReportSFTD-EUTRA
+    }
+}
+
+ReportCGI-EUTRA ::=                         SEQUENCE {
+    cellForWhichToReportCGI         EUTRA-PhysCellId,
+    ...,
+    [[
+    useAutonomousGaps-r16           ENUMERATED {setup}                OPTIONAL     -- Need R
+    ]]
+}
+
+ReportSFTD-EUTRA ::=                     SEQUENCE {
+    reportSFTD-Meas                            BOOLEAN,
+    reportRSRP                                 BOOLEAN,
+    ...
+}
+
+EventTriggerConfigInterRAT ::=              SEQUENCE {
+    eventId                                     CHOICE {
+        eventB1                                     SEQUENCE {
+            b1-ThresholdEUTRA                           MeasTriggerQuantityEUTRA,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            ...
+        },
+        eventB2                                     SEQUENCE {
+            b2-Threshold1                               MeasTriggerQuantity,
+            b2-Threshold2EUTRA                          MeasTriggerQuantityEUTRA,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            ...
+        },
+        ...,
+        [[
+        eventB1-UTRA-FDD-r16                         SEQUENCE {
+            b1-ThresholdUTRA-FDD-r16                    MeasTriggerQuantityUTRA-FDD-r16,
+            reportOnLeave-r16                           BOOLEAN,
+            hysteresis-r16                              Hysteresis,
+            timeToTrigger-r16                           TimeToTrigger,
+            ...
+        },
+        eventB2-UTRA-FDD-r16                         SEQUENCE {
+            b2-Threshold1-r16                           MeasTriggerQuantity,
+            b2-Threshold2UTRA-FDD-r16                   MeasTriggerQuantityUTRA-FDD-r16,
+            reportOnLeave-r16                           BOOLEAN,
+            hysteresis-r16                              Hysteresis,
+            timeToTrigger-r16                           TimeToTrigger,
+            ...
+        }
+        ]]
+    },
+    rsType                              NR-RS-Type,
+
+    reportInterval                      ReportInterval,
+    reportAmount                        ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity                      MeasReportQuantity,
+    maxReportCells                      INTEGER (1..maxCellReport),
+    ...,
+    [[
+    reportQuantityUTRA-FDD-r16          MeasReportQuantityUTRA-FDD-r16         OPTIONAL   -- Need R
+    ]]
+
+
+}
+
+PeriodicalReportConfigInterRAT ::=              SEQUENCE {
+    reportInterval                                  ReportInterval,
+    reportAmount                                    ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity                                  MeasReportQuantity,
+    maxReportCells                                  INTEGER (1..maxCellReport),
+    ...,
+    [[
+    reportQuantityUTRA-FDD-r16                      MeasReportQuantityUTRA-FDD-r16         OPTIONAL   -- Need R
+    ]]
+}
+
+MeasTriggerQuantityUTRA-FDD-r16 ::=          CHOICE{
+    utra-FDD-RSCP-r16                            INTEGER (-5..91),
+    utra-FDD-EcN0-r16                            INTEGER (0..49)
+}
+
+MeasReportQuantityUTRA-FDD-r16 ::=        SEQUENCE {
+    cpich-RSCP                                BOOLEAN,
+    cpich-EcN0                                BOOLEAN
+}
+
+-- TAG-REPORTCONFIGINTERRAT-STOP
+-- TAG-REPORTCONFIGNR-START
+
+ReportConfigNR ::=                          SEQUENCE {
+    reportType                                  CHOICE {
+        periodical                                  PeriodicalReportConfig,
+        eventTriggered                              EventTriggerConfig,
+        ...,
+        reportCGI                                   ReportCGI,
+        reportSFTD                                  ReportSFTD-NR,
+        condTriggerConfig-r16                       CondTriggerConfig-r16,
+        cli-Periodical-r16                          CLI-PeriodicalReportConfig-r16,
+        cli-EventTriggered-r16                      CLI-EventTriggerConfig-r16
+    }
+}
+
+ReportCGI ::=                     SEQUENCE {
+    cellForWhichToReportCGI          PhysCellId,
+        ...,
+    [[
+    useAutonomousGaps-r16            ENUMERATED {setup}                OPTIONAL   -- Need R
+    ]]
+
+}
+
+ReportSFTD-NR ::=                 SEQUENCE {
+    reportSFTD-Meas                  BOOLEAN,
+    reportRSRP                       BOOLEAN,
+    ...,
+    [[
+    reportSFTD-NeighMeas             ENUMERATED {true}                                OPTIONAL,   -- Need R
+    drx-SFTD-NeighMeas               ENUMERATED {true}                                OPTIONAL,   -- Need R
+    cellsForWhichToReportSFTD        SEQUENCE (SIZE (1..maxCellSFTD)) OF PhysCellId   OPTIONAL    -- Need R
+    ]]
+}
+
+CondTriggerConfig-r16 ::=        SEQUENCE {
+    condEventId                      CHOICE {
+        condEventA3                      SEQUENCE {
+            a3-Offset                        MeasTriggerQuantityOffset,
+            hysteresis                       Hysteresis,
+            timeToTrigger                    TimeToTrigger
+        },
+        condEventA5                      SEQUENCE {
+            a5-Threshold1                    MeasTriggerQuantity,
+            a5-Threshold2                    MeasTriggerQuantity,
+            hysteresis                       Hysteresis,
+            timeToTrigger                    TimeToTrigger
+        },
+        ...
+    },
+    rsType-r16                       NR-RS-Type,
+    ...
+}
+
+EventTriggerConfig::=                       SEQUENCE {
+    eventId                                     CHOICE {
+        eventA1                                     SEQUENCE {
+            a1-Threshold                                MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger
+        },
+        eventA2                                     SEQUENCE {
+            a2-Threshold                                MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger
+        },
+        eventA3                                     SEQUENCE {
+            a3-Offset                                   MeasTriggerQuantityOffset,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        eventA4                                     SEQUENCE {
+            a4-Threshold                                MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        eventA5                                     SEQUENCE {
+            a5-Threshold1                               MeasTriggerQuantity,
+            a5-Threshold2                               MeasTriggerQuantity,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        eventA6                                     SEQUENCE {
+            a6-Offset                                   MeasTriggerQuantityOffset,
+            reportOnLeave                               BOOLEAN,
+            hysteresis                                  Hysteresis,
+            timeToTrigger                               TimeToTrigger,
+            useWhiteCellList                            BOOLEAN
+        },
+        ...
+    },
+    rsType                                      NR-RS-Type,
+    reportInterval                              ReportInterval,
+    reportAmount                                ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantityCell                          MeasReportQuantity,
+    maxReportCells                              INTEGER (1..maxCellReport),
+    reportQuantityRS-Indexes                     MeasReportQuantity                                            OPTIONAL,   -- Need R
+    maxNrofRS-IndexesToReport                   INTEGER (1..maxNrofIndexesToReport)                            OPTIONAL,   -- Need R
+    includeBeamMeasurements                     BOOLEAN,
+    reportAddNeighMeas                          ENUMERATED {setup}                                             OPTIONAL,   -- Need R
+    ...,
+    [[
+    measRSSI-ReportConfig-r16                   MeasRSSI-ReportConfig-r16                                      OPTIONAL,   -- Need R
+    useT312-r16                                 BOOLEAN                                                        OPTIONAL,   -- Need M
+    includeCommonLocationInfo-r16               ENUMERATED {true}                                              OPTIONAL,   -- Need R
+    includeBT-Meas-r16                          SetupRelease {BT-NameList-r16}                                 OPTIONAL,   -- Need M
+    includeWLAN-Meas-r16                        SetupRelease {WLAN-NameList-r16}                               OPTIONAL,   -- Need M
+    includeSensor-Meas-r16                      SetupRelease {Sensor-NameList-r16}                             OPTIONAL    -- Need M
+    ]]
+}
+
+PeriodicalReportConfig ::=                  SEQUENCE {
+    rsType                                      NR-RS-Type,
+    reportInterval                              ReportInterval,
+    reportAmount                                ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantityCell                          MeasReportQuantity,
+    maxReportCells                              INTEGER (1..maxCellReport),
+    reportQuantityRS-Indexes                    MeasReportQuantity                                             OPTIONAL,   -- Need R
+    maxNrofRS-IndexesToReport                   INTEGER (1..maxNrofIndexesToReport)                            OPTIONAL,   -- Need R
+    includeBeamMeasurements                     BOOLEAN,
+    useWhiteCellList                            BOOLEAN,
+    ...,
+    [[
+    measRSSI-ReportConfig-r16                   MeasRSSI-ReportConfig-r16                                      OPTIONAL,   -- Need R
+    includeCommonLocationInfo-r16               ENUMERATED {true}                                              OPTIONAL,   -- Need R
+    includeBT-Meas-r16                          SetupRelease {BT-NameList-r16}                                 OPTIONAL,   -- Need M
+    includeWLAN-Meas-r16                        SetupRelease {WLAN-NameList-r16}                               OPTIONAL,   -- Need M
+    includeSensor-Meas-r16                      SetupRelease {Sensor-NameList-r16}                             OPTIONAL,   -- Need M
+    ul-DelayValueConfig-r16                     SetupRelease { UL-DelayValueConfig-r16 }                       OPTIONAL,   -- Need M
+    reportAddNeighMeas-r16                      ENUMERATED {setup}                                             OPTIONAL    -- Need R
+    ]]
+}
+
+NR-RS-Type ::=                              ENUMERATED {ssb, csi-rs}
+
+MeasTriggerQuantity ::=                     CHOICE {
+    rsrp                                        RSRP-Range,
+    rsrq                                        RSRQ-Range,
+    sinr                                        SINR-Range
+}
+
+MeasTriggerQuantityOffset ::=               CHOICE {
+    rsrp                                        INTEGER (-30..30),
+    rsrq                                        INTEGER (-30..30),
+    sinr                                        INTEGER (-30..30)
+}
+
+
+MeasReportQuantity ::=                      SEQUENCE {
+    rsrp                                        BOOLEAN,
+    rsrq                                        BOOLEAN,
+    sinr                                        BOOLEAN
+}
+
+MeasRSSI-ReportConfig-r16 ::=               SEQUENCE {
+    channelOccupancyThreshold-r16               RSSI-Range-r16         OPTIONAL   -- Need R
+}
+
+CLI-EventTriggerConfig-r16 ::=              SEQUENCE {
+    eventId-r16                                 CHOICE {
+        eventI1-r16                                 SEQUENCE {
+            i1-Threshold-r16                            MeasTriggerQuantityCLI-r16,
+            reportOnLeave-r16                           BOOLEAN,
+            hysteresis-r16                              Hysteresis,
+            timeToTrigger-r16                           TimeToTrigger
+        },
+    ...
+    },
+    reportInterval-r16                          ReportInterval,
+    reportAmount-r16                            ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    maxReportCLI-r16                            INTEGER (1..maxCLI-Report-r16),
+    ...
+}
+
+CLI-PeriodicalReportConfig-r16 ::=          SEQUENCE {
+    reportInterval-r16                          ReportInterval,
+    reportAmount-r16                            ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantityCLI-r16                       MeasReportQuantityCLI-r16,
+    maxReportCLI-r16                            INTEGER (1..maxCLI-Report-r16),
+    ...
+}
+
+MeasTriggerQuantityCLI-r16 ::=              CHOICE {
+    srs-RSRP-r16                                SRS-RSRP-Range-r16,
+    cli-RSSI-r16                                CLI-RSSI-Range-r16
+}
+
+MeasReportQuantityCLI-r16 ::=               ENUMERATED {srs-rsrp, cli-rssi}
+
+-- TAG-REPORTCONFIGNR-STOP
+-- TAG-REPORTCONFIGNR-SL-START
+
+ReportConfigNR-SL-r16 ::=            SEQUENCE {
+    reportType-r16                       CHOICE {
+        periodical-r16                       PeriodicalReportConfigNR-SL-r16,
+        eventTriggered-r16                   EventTriggerConfigNR-SL-r16
+    }
+}
+
+EventTriggerConfigNR-SL-r16::=       SEQUENCE {
+    eventId-r16                          CHOICE {
+        eventC1                              SEQUENCE {
+            c1-Threshold-r16                     SL-CBR-r16,
+            hysteresis-r16                       Hysteresis,
+            timeToTrigger-r16                    TimeToTrigger
+        },
+        eventC2-r16                  SEQUENCE {
+            c2-Threshold-r16             SL-CBR-r16,
+            hysteresis-r16               Hysteresis,
+            timeToTrigger-r16            TimeToTrigger
+        },
+        ...
+    },
+    reportInterval-r16               ReportInterval,
+    reportAmount-r16                 ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity-r16               MeasReportQuantity-r16,
+    ...
+}
+
+PeriodicalReportConfigNR-SL-r16 ::=  SEQUENCE {
+    reportInterval-r16                   ReportInterval,
+    reportAmount-r16                     ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    reportQuantity-r16                   MeasReportQuantity-r16,
+    ...
+}
+
+MeasReportQuantity-r16 ::=           SEQUENCE {
+    cbr-r16                              BOOLEAN,
+    ...
+}
+
+-- TAG-REPORTCONFIGNR-SL-STOP
+-- TAG-REPORTCONFIGTOADDMODLIST-START
+
+ReportConfigToAddModList ::=        SEQUENCE (SIZE (1..maxReportConfigId)) OF ReportConfigToAddMod
+
+ReportConfigToAddMod ::=            SEQUENCE {
+    reportConfigId                      ReportConfigId,
+    reportConfig                        CHOICE {
+        reportConfigNR                      ReportConfigNR,
+        ...,
+        reportConfigInterRAT                ReportConfigInterRAT,
+        reportConfigNR-SL-r16               ReportConfigNR-SL-r16
+    }
+}
+
+-- TAG-REPORTCONFIGTOADDMODLIST-STOP
+-- TAG-REPORTINTERVAL-START
+
+ReportInterval ::=                  ENUMERATED {ms120, ms240, ms480, ms640, ms1024, ms2048, ms5120, ms10240, ms20480, ms40960,
+                                                    min1,min6, min12, min30 }
+
+-- TAG-REPORTINTERVAL-STOP
+-- TAG-RESELECTIONTHRESHOLD-START
+
+ReselectionThreshold ::=                INTEGER (0..31)
+
+-- TAG-RESELECTIONTHRESHOLD-STOP
+-- TAG-RESELECTIONTHRESHOLDQ-START
+
+ReselectionThresholdQ ::=           INTEGER (0..31)
+
+-- TAG-RESELECTIONTHRESHOLDQ-STOP
+-- TAG-RESUMECAUSE-START
+
+ResumeCause ::=             ENUMERATED {emergency, highPriorityAccess, mt-Access, mo-Signalling,
+                                        mo-Data, mo-VoiceCall, mo-VideoCall, mo-SMS, rna-Update, mps-PriorityAccess,
+                                        mcs-PriorityAccess, spare1, spare2, spare3, spare4, spare5 }
+
+-- TAG-RESUMECAUSE-STOP
+-- TAG-RLC-BEARERCONFIG-START
+
+RLC-BearerConfig ::=                        SEQUENCE {
+    logicalChannelIdentity                      LogicalChannelIdentity,
+    servedRadioBearer                           CHOICE {
+        srb-Identity                                SRB-Identity,
+        drb-Identity                                DRB-Identity
+    }                                                                                               OPTIONAL,   -- Cond LCH-SetupOnly
+    reestablishRLC                              ENUMERATED {true}                                   OPTIONAL,   -- Need N
+    rlc-Config                                  RLC-Config                                          OPTIONAL,   -- Cond LCH-Setup
+    mac-LogicalChannelConfig                    LogicalChannelConfig                                OPTIONAL,   -- Cond LCH-Setup
+    ...,
+    [[
+    rlc-Config-v1610                            RLC-Config-v1610                                    OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-RLC-BEARERCONFIG-STOP
+-- TAG-RLC-CONFIG-START
+
+RLC-Config ::=                      CHOICE {
+    am                                  SEQUENCE {
+        ul-AM-RLC                           UL-AM-RLC,
+        dl-AM-RLC                           DL-AM-RLC
+    },
+    um-Bi-Directional                   SEQUENCE {
+        ul-UM-RLC                           UL-UM-RLC,
+        dl-UM-RLC                           DL-UM-RLC
+    },
+    um-Uni-Directional-UL               SEQUENCE {
+        ul-UM-RLC                           UL-UM-RLC
+    },
+    um-Uni-Directional-DL               SEQUENCE {
+        dl-UM-RLC                           DL-UM-RLC
+    },
+    ...
+}
+
+UL-AM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthAM                                    OPTIONAL,   -- Cond Reestab
+    t-PollRetransmit                    T-PollRetransmit,
+    pollPDU                             PollPDU,
+    pollByte                            PollByte,
+    maxRetxThreshold                    ENUMERATED { t1, t2, t3, t4, t6, t8, t16, t32 }
+}
+
+DL-AM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthAM                                    OPTIONAL,   -- Cond Reestab
+    t-Reassembly                        T-Reassembly,
+    t-StatusProhibit                    T-StatusProhibit
+}
+
+UL-UM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthUM                                    OPTIONAL    -- Cond Reestab
+}
+
+DL-UM-RLC ::=                       SEQUENCE {
+    sn-FieldLength                      SN-FieldLengthUM                                    OPTIONAL,   -- Cond Reestab
+    t-Reassembly                        T-Reassembly
+}
+
+T-PollRetransmit ::=                ENUMERATED {
+                                        ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+                                        ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+                                        ms75, ms80, ms85, ms90, ms95, ms100, ms105,
+                                        ms110, ms115, ms120, ms125, ms130, ms135,
+                                        ms140, ms145, ms150, ms155, ms160, ms165,
+                                        ms170, ms175, ms180, ms185, ms190, ms195,
+                                        ms200, ms205, ms210, ms215, ms220, ms225,
+                                        ms230, ms235, ms240, ms245, ms250, ms300,
+                                        ms350, ms400, ms450, ms500, ms800, ms1000,
+                                        ms2000, ms4000, ms1-v1610, ms2-v1610, ms3-v1610,
+                                        ms4-v1610, spare1}
+
+
+PollPDU ::=                         ENUMERATED {
+                                        p4, p8, p16, p32, p64, p128, p256, p512, p1024, p2048, p4096, p6144, p8192, p12288, p16384,p20480,
+                                        p24576, p28672, p32768, p40960, p49152, p57344, p65536, infinity, spare8, spare7, spare6, spare5, spare4,
+                                        spare3, spare2, spare1}
+
+PollByte ::=                        ENUMERATED {
+                                        kB1, kB2, kB5, kB8, kB10, kB15, kB25, kB50, kB75,
+                                        kB100, kB125, kB250, kB375, kB500, kB750, kB1000,
+                                        kB1250, kB1500, kB2000, kB3000, kB4000, kB4500,
+                                        kB5000, kB5500, kB6000, kB6500, kB7000, kB7500,
+                                        mB8, mB9, mB10, mB11, mB12, mB13, mB14, mB15,
+                                        mB16, mB17, mB18, mB20, mB25, mB30, mB40, infinity,
+                                        spare20, spare19, spare18, spare17, spare16,
+                                        spare15, spare14, spare13, spare12, spare11,
+                                        spare10, spare9, spare8, spare7, spare6, spare5,
+                                        spare4, spare3, spare2, spare1}
+
+T-Reassembly ::=                    ENUMERATED {
+                                        ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+                                        ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+                                        ms75, ms80, ms85, ms90, ms95, ms100, ms110,
+                                        ms120, ms130, ms140, ms150, ms160, ms170,
+                                        ms180, ms190, ms200, spare1}
+
+T-StatusProhibit ::=                ENUMERATED {
+                                        ms0, ms5, ms10, ms15, ms20, ms25, ms30, ms35,
+                                        ms40, ms45, ms50, ms55, ms60, ms65, ms70,
+                                        ms75, ms80, ms85, ms90, ms95, ms100, ms105,
+                                        ms110, ms115, ms120, ms125, ms130, ms135,
+                                        ms140, ms145, ms150, ms155, ms160, ms165,
+                                        ms170, ms175, ms180, ms185, ms190, ms195,
+                                        ms200, ms205, ms210, ms215, ms220, ms225,
+                                        ms230, ms235, ms240, ms245, ms250, ms300,
+                                        ms350, ms400, ms450, ms500, ms800, ms1000,
+                                        ms1200, ms1600, ms2000, ms2400, spare2, spare1}
+
+SN-FieldLengthUM ::=                ENUMERATED {size6, size12}
+SN-FieldLengthAM ::=                ENUMERATED {size12, size18}
+
+RLC-Config-v1610 ::=                SEQUENCE {
+    dl-AM-RLC-v1610                     DL-AM-RLC-v1610
+}
+
+DL-AM-RLC-v1610 ::=                 SEQUENCE {
+    t-StatusProhibit-v1610              T-StatusProhibit-v1610                               OPTIONAL,   -- Need N
+    ...
+}
+
+T-StatusProhibit-v1610 ::=          ENUMERATED { ms1, ms2, ms3, ms4, spare4, spare3, spare2, spare1}
+
+-- TAG-RLC-CONFIG-STOP
+-- TAG-RLF-TIMERSANDCONSTANTS-START
+
+RLF-TimersAndConstants ::=          SEQUENCE {
+    t310                                ENUMERATED {ms0, ms50, ms100, ms200, ms500, ms1000, ms2000, ms4000, ms6000},
+    n310                                ENUMERATED {n1, n2, n3, n4, n6, n8, n10, n20},
+    n311                                ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10},
+    ...,
+    [[
+    t311                                ENUMERATED {ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000}
+    ]]
+}
+
+-- TAG-RLF-TIMERSANDCONSTANTS-STOP
+-- TAG-RNTI-VALUE-START
+
+RNTI-Value ::=                      INTEGER (0..65535)
+
+-- TAG-RNTI-VALUE-STOP
+-- TAG-RSRP-RANGE-START
+
+RSRP-Range ::=                      INTEGER(0..127)
+
+-- TAG-RSRP-RANGE-STOP
+-- TAG-RSRQ-RANGE-START
+
+RSRQ-Range ::=                      INTEGER(0..127)
+
+-- TAG-RSRQ-RANGE-STOP
+-- TAG-RSSI-RANGE-START
+
+RSSI-Range-r16 ::=                  INTEGER(0..76)
+
+-- TAG-RSSI-RANGE-STOP
+-- TAG-SCELLINDEX-START
+
+SCellIndex ::=                      INTEGER (1..31)
+
+-- TAG-SCELLINDEX-STOP
+-- TAG-SCHEDULINGREQUESTCONFIG-START
+
+SchedulingRequestConfig ::=         SEQUENCE {
+    schedulingRequestToAddModList       SEQUENCE (SIZE (1..maxNrofSR-ConfigPerCellGroup)) OF SchedulingRequestToAddMod
+                                                                                                          OPTIONAL, -- Need N
+    schedulingRequestToReleaseList      SEQUENCE (SIZE (1..maxNrofSR-ConfigPerCellGroup)) OF SchedulingRequestId
+                                                                                                          OPTIONAL  -- Need N
+}
+
+SchedulingRequestToAddMod ::=       SEQUENCE {
+    schedulingRequestId                 SchedulingRequestId,
+    sr-ProhibitTimer                    ENUMERATED {ms1, ms2, ms4, ms8, ms16, ms32, ms64, ms128}          OPTIONAL, -- Need S
+    sr-TransMax                         ENUMERATED { n4, n8, n16, n32, n64, spare3, spare2, spare1}
+}
+
+
+
+-- TAG-SCHEDULINGREQUESTCONFIG-STOP
+-- TAG-SCHEDULINGREQUESTID-START
+
+SchedulingRequestId ::=             INTEGER (0..7)
+
+-- TAG-SCHEDULINGREQUESTID-STOP
+-- TAG-SCHEDULINGREQUESTRESOURCECONFIG-START
+
+SchedulingRequestResourceConfig ::=     SEQUENCE {
+    schedulingRequestResourceId             SchedulingRequestResourceId,
+    schedulingRequestID                     SchedulingRequestId,
+    periodicityAndOffset                    CHOICE {
+        sym2                                    NULL,
+        sym6or7                                 NULL,
+        sl1                                     NULL,                       -- Recurs in every slot
+        sl2                                     INTEGER (0..1),
+        sl4                                     INTEGER (0..3),
+        sl5                                     INTEGER (0..4),
+        sl8                                     INTEGER (0..7),
+        sl10                                    INTEGER (0..9),
+        sl16                                    INTEGER (0..15),
+        sl20                                    INTEGER (0..19),
+        sl40                                    INTEGER (0..39),
+        sl80                                    INTEGER (0..79),
+        sl160                                   INTEGER (0..159),
+        sl320                                   INTEGER (0..319),
+        sl640                                   INTEGER (0..639)
+    }                                                                                                       OPTIONAL,   -- Need M
+    resource                                PUCCH-ResourceId                                                OPTIONAL    -- Need M
+}
+
+SchedulingRequestResourceConfigExt-v1610 ::=   SEQUENCE {
+    phy-PriorityIndex-r16                       ENUMERATED {p0, p1}                                         OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-SCHEDULINGREQUESTRESOURCECONFIG-STOP
+-- TAG-SCHEDULINGREQUESTRESOURCEID-START
+
+SchedulingRequestResourceId ::=     INTEGER (1..maxNrofSR-Resources)
+
+-- TAG-SCHEDULINGREQUESTRESOURCEID-STOP
+-- TAG-SCRAMBLINGID-START
+
+ScramblingId ::=                    INTEGER(0..1023)
+
+-- TAG-SCRAMBLINGID-STOP
+-- TAG-SCS-SPECIFICCARRIER-START
+
+SCS-SpecificCarrier ::=             SEQUENCE {
+    offsetToCarrier                     INTEGER (0..2199),
+    subcarrierSpacing                   SubcarrierSpacing,
+    carrierBandwidth                    INTEGER (1..maxNrofPhysicalResourceBlocks),
+    ...,
+    [[
+    txDirectCurrentLocation         INTEGER (0..4095)                                       OPTIONAL            -- Need S
+    ]]
+}
+
+-- TAG-SCS-SPECIFICCARRIER-STOP
+-- TAG-SDAP-CONFIG-START
+
+SDAP-Config ::=                     SEQUENCE {
+    pdu-Session                         PDU-SessionID,
+    sdap-HeaderDL                       ENUMERATED {present, absent},
+    sdap-HeaderUL                       ENUMERATED {present, absent},
+    defaultDRB                          BOOLEAN,
+    mappedQoS-FlowsToAdd                SEQUENCE (SIZE (1..maxNrofQFIs)) OF QFI                                 OPTIONAL, -- Need N
+    mappedQoS-FlowsToRelease            SEQUENCE (SIZE (1..maxNrofQFIs)) OF QFI                                 OPTIONAL, -- Need N
+    ...
+}
+
+QFI ::=                             INTEGER (0..maxQFI)
+
+PDU-SessionID ::=                   INTEGER (0..255)
+
+-- TAG-SDAP-CONFIG-STOP
+-- TAG-SEARCHSPACE-START
+
+SearchSpace ::=                         SEQUENCE {
+    searchSpaceId                           SearchSpaceId,
+    controlResourceSetId                    ControlResourceSetId                                        OPTIONAL,   -- Cond SetupOnly
+    monitoringSlotPeriodicityAndOffset      CHOICE {
+        sl1                                     NULL,
+        sl2                                     INTEGER (0..1),
+        sl4                                     INTEGER (0..3),
+        sl5                                     INTEGER (0..4),
+        sl8                                     INTEGER (0..7),
+        sl10                                    INTEGER (0..9),
+        sl16                                    INTEGER (0..15),
+        sl20                                    INTEGER (0..19),
+        sl40                                    INTEGER (0..39),
+        sl80                                    INTEGER (0..79),
+        sl160                                   INTEGER (0..159),
+        sl320                                   INTEGER (0..319),
+        sl640                                   INTEGER (0..639),
+        sl1280                                  INTEGER (0..1279),
+        sl2560                                  INTEGER (0..2559)
+    }                                                                                                   OPTIONAL,   -- Cond Setup
+    duration                                INTEGER (2..2559)                                           OPTIONAL,   -- Need R
+    monitoringSymbolsWithinSlot             BIT STRING (SIZE (14))                                      OPTIONAL,   -- Cond Setup
+    nrofCandidates                          SEQUENCE {
+        aggregationLevel1                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel2                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel4                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel8                       ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8},
+        aggregationLevel16                      ENUMERATED {n0, n1, n2, n3, n4, n5, n6, n8}
+    }                                                                                                   OPTIONAL,   -- Cond Setup
+    searchSpaceType                         CHOICE {
+        common                                  SEQUENCE {
+            dci-Format0-0-AndFormat1-0              SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-0                           SEQUENCE {
+                nrofCandidates-SFI                      SEQUENCE {
+                    aggregationLevel1                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel2                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel4                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel8                       ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel16                      ENUMERATED {n1, n2}                         OPTIONAL    -- Need R
+                },
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-1                           SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-2                           SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-3                           SEQUENCE {
+                dummy1                                  ENUMERATED {sl1, sl2, sl4, sl5, sl8, sl10, sl16, sl20}  OPTIONAL,   -- Cond Setup
+                dummy2                                  ENUMERATED {n1, n2},
+                ...
+            }                                                                                           OPTIONAL    -- Need R
+        },
+        ue-Specific                                 SEQUENCE {
+            dci-Formats                                 ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1},
+            ...,
+            [[
+            dci-Formats-MT-r16                   ENUMERATED {formats2-5}                                OPTIONAL,    -- Need R
+            dci-FormatsSL-r16                    ENUMERATED {formats0-0-And-1-0, formats0-1-And-1-1, formats3-0, formats3-1,
+                                                             formats3-0-And-3-1}                        OPTIONAL,    -- Need R
+            dci-FormatsExt-r16                   ENUMERATED {formats0-2-And-1-2, formats0-1-And-1-1And-0-2-And-1-2}
+                                                                                                        OPTIONAL     -- Need R
+            ]]
+        }
+    }                                                                                                   OPTIONAL    -- Cond Setup2
+}
+
+SearchSpaceExt-r16 ::=                   SEQUENCE {
+    controlResourceSetId-r16                ControlResourceSetId-r16                                    OPTIONAL,   -- Cond SetupOnly2
+    searchSpaceType-r16                     SEQUENCE {
+        common-r16                              SEQUENCE {
+            dci-Format2-4-r16                       SEQUENCE {
+                nrofCandidates-CI-r16                   SEQUENCE {
+                    aggregationLevel1-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel2-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel4-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel8-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel16-r16                  ENUMERATED {n1, n2}                         OPTIONAL    -- Need R
+                },
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-5-r16                      SEQUENCE {
+                nrofCandidates-IAB-r16                  SEQUENCE {
+                    aggregationLevel1-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel2-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel4-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel8-r16                   ENUMERATED {n1, n2}                         OPTIONAL,   -- Need R
+                    aggregationLevel16-r16                  ENUMERATED {n1, n2}                         OPTIONAL    -- Need R
+                },
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            dci-Format2-6-r16                       SEQUENCE {
+                ...
+            }                                                                                           OPTIONAL,   -- Need R
+            ...
+        }
+    }                                                                                                   OPTIONAL,    -- Cond Setup3
+    searchSpaceGroupIdList-r16                      SEQUENCE (SIZE (1.. 2)) OF INTEGER (0..1)           OPTIONAL,    -- Need R
+    freqMonitorLocations-r16                        BIT STRING (SIZE (5))                               OPTIONAL     -- Need R
+}
+
+-- TAG-SEARCHSPACE-STOP
+-- TAG-SEARCHSPACEID-START
+
+SearchSpaceId ::=                   INTEGER (0..maxNrofSearchSpaces-1)
+
+-- TAG-SEARCHSPACEID-STOP
+-- TAG-SEARCHSPACEZERO-START
+
+SearchSpaceZero ::=                 INTEGER (0..15)
+
+-- TAG-SEARCHSPACEZERO-STOP
+-- TAG-SECURITYALGORITHMCONFIG-START
+
+SecurityAlgorithmConfig ::=         SEQUENCE {
+    cipheringAlgorithm                  CipheringAlgorithm,
+    integrityProtAlgorithm              IntegrityProtAlgorithm          OPTIONAL,   -- Need R
+    ...
+}
+
+IntegrityProtAlgorithm ::=          ENUMERATED {
+                                        nia0, nia1, nia2, nia3, spare4, spare3,
+                                        spare2, spare1, ...}
+
+CipheringAlgorithm ::=              ENUMERATED {
+                                        nea0, nea1, nea2, nea3, spare4, spare3,
+                                        spare2, spare1, ...}
+
+-- TAG-SECURITYALGORITHMCONFIG-STOP
+-- TAG-SEMISTATICCHANNELACCESSCONFIG-START
+
+SemiStaticChannelAccessConfig-r16 ::=    SEQUENCE {
+    period                                   ENUMERATED {ms1, ms2, ms2dot5, ms4, ms5, ms10}
+}
+
+-- TAG-SEMISTATICCHANNELACCESSCONFIG-STOP
+-- TAG-SENSORLOCATIONINFO-START
+
+Sensor-LocationInfo-r16 ::= SEQUENCE {
+    sensor-MeasurementInformation-r16    OCTET STRING    OPTIONAL,
+    sensor-MotionInformation-r16         OCTET STRING    OPTIONAL,
+    ...
+}
+
+-- TAG-SENSORLOCATIONINFO-STOP
+-- TAG-SERVCELLINDEX-START
+
+ServCellIndex ::=                   INTEGER (0..maxNrofServingCells-1)
+
+-- TAG-SERVCELLINDEX-STOP
+-- TAG-SERVINGCELLCONFIG-START
+
+ServingCellConfig ::=               SEQUENCE {
+    tdd-UL-DL-ConfigurationDedicated    TDD-UL-DL-ConfigDedicated                                                OPTIONAL,   -- Cond TDD
+    initialDownlinkBWP                  BWP-DownlinkDedicated                                                    OPTIONAL,   -- Need M
+    downlinkBWP-ToReleaseList           SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Id                               OPTIONAL,   -- Need N
+    downlinkBWP-ToAddModList            SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Downlink                         OPTIONAL,   -- Need N
+    firstActiveDownlinkBWP-Id           BWP-Id                                                                   OPTIONAL,   -- Cond SyncAndCellAdd
+    bwp-InactivityTimer                 ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30,
+                                                    ms40,ms50, ms60, ms80,ms100, ms200,ms300, ms500,
+                                                    ms750, ms1280, ms1920, ms2560, spare10, spare9, spare8,
+                                                    spare7, spare6, spare5, spare4, spare3, spare2, spare1 }    OPTIONAL,   --Need R
+    defaultDownlinkBWP-Id               BWP-Id                                                                  OPTIONAL,   -- Need S
+    uplinkConfig                        UplinkConfig                                                            OPTIONAL,   -- Need M
+    supplementaryUplink                 UplinkConfig                                                            OPTIONAL,   -- Need M
+    pdcch-ServingCellConfig             SetupRelease { PDCCH-ServingCellConfig }                                OPTIONAL,   -- Need M
+    pdsch-ServingCellConfig             SetupRelease { PDSCH-ServingCellConfig }                                OPTIONAL,   -- Need M
+    csi-MeasConfig                      SetupRelease { CSI-MeasConfig }                                         OPTIONAL,   -- Need M
+    sCellDeactivationTimer              ENUMERATED {ms20, ms40, ms80, ms160, ms200, ms240,
+                                                    ms320, ms400, ms480, ms520, ms640, ms720,
+                                                    ms840, ms1280, spare2,spare1}       OPTIONAL,   -- Cond ServingCellWithoutPUCCH
+    crossCarrierSchedulingConfig        CrossCarrierSchedulingConfig                                            OPTIONAL,   -- Need M
+    tag-Id                              TAG-Id,
+    dummy1                              ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    pathlossReferenceLinking            ENUMERATED {spCell, sCell}                                              OPTIONAL,   -- Cond SCellOnly
+    servingCellMO                       MeasObjectId                                                            OPTIONAL,   -- Cond MeasObject
+    ...,
+    [[
+    lte-CRS-ToMatchAround               SetupRelease { RateMatchPatternLTE-CRS }                                OPTIONAL,   -- Need M
+    rateMatchPatternToAddModList        SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern       OPTIONAL,   -- Need N
+    rateMatchPatternToReleaseList       SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId     OPTIONAL,   -- Need N
+    downlinkChannelBW-PerSCS-List       SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier                     OPTIONAL    -- Need S
+    ]],
+    [[
+    supplementaryUplinkRelease-r16      ENUMERATED {true}                                                       OPTIONAL,   -- Need N
+    tdd-UL-DL-ConfigurationDedicated-IAB-MT-r16    TDD-UL-DL-ConfigDedicated-IAB-MT-r16                         OPTIONAL,   -- Cond TDD_IAB
+    dormantBWP-Config-r16               SetupRelease { DormantBWP-Config-r16 }                                  OPTIONAL,   -- Need M
+    ca-SlotOffset-r16                   CHOICE {
+        refSCS15kHz                         INTEGER (-2..2),
+        refSCS30KHz                         INTEGER (-5..5),
+        refSCS60KHz                         INTEGER (-10..10),
+        refSCS120KHz                        INTEGER (-20..20)
+    }                                                                                                           OPTIONAL,   -- Cond AsyncCA
+    dummy2                              SetupRelease { DummyJ }                                                 OPTIONAL,   -- Need M
+    intraCellGuardBandsDL-List-r16      SEQUENCE (SIZE (1..maxSCSs)) OF IntraCellGuardBandsPerSCS-r16           OPTIONAL,   -- Need S
+    intraCellGuardBandsUL-List-r16      SEQUENCE (SIZE (1..maxSCSs)) OF IntraCellGuardBandsPerSCS-r16           OPTIONAL,   -- Need S
+    csi-RS-ValidationWithDCI-r16       ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    lte-CRS-PatternList1-r16            SetupRelease { LTE-CRS-PatternList-r16 }                                OPTIONAL,   -- Need M
+    lte-CRS-PatternList2-r16            SetupRelease { LTE-CRS-PatternList-r16 }                                OPTIONAL,   -- Need M
+    crs-RateMatch-PerCORESETPoolIndex-r16  ENUMERATED {enabled}                                                 OPTIONAL,   -- Need R
+    enableTwoDefaultTCI-States-r16      ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultTCI-StatePerCoresetPoolIndex-r16 ENUMERATED {enabled}                                          OPTIONAL,   -- Need R
+    enableBeamSwitchTiming-r16          ENUMERATED {true}                                                       OPTIONAL,   -- Need R
+    cbg-TxDiffTBsProcessingType1-r16    ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    cbg-TxDiffTBsProcessingType2-r16    ENUMERATED {enabled}                                                    OPTIONAL    -- Need R
+    ]],
+    [[
+    directionalCollisionHandling-r16    ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    channelAccessConfig-r16             SetupRelease { ChannelAccessConfig-r16 }                                OPTIONAL    -- Need M
+    ]]
+}
+
+UplinkConfig ::=                    SEQUENCE {
+    initialUplinkBWP                    BWP-UplinkDedicated                                                     OPTIONAL,   -- Need M
+    uplinkBWP-ToReleaseList             SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Id                              OPTIONAL,   -- Need N
+    uplinkBWP-ToAddModList              SEQUENCE (SIZE (1..maxNrofBWPs)) OF BWP-Uplink                          OPTIONAL,   -- Need N
+    firstActiveUplinkBWP-Id             BWP-Id                                                                  OPTIONAL,   -- Cond SyncAndCellAdd
+    pusch-ServingCellConfig             SetupRelease { PUSCH-ServingCellConfig }                                OPTIONAL,   -- Need M
+    carrierSwitching                    SetupRelease { SRS-CarrierSwitching }                                   OPTIONAL,   -- Need M
+    ...,
+    [[
+    powerBoostPi2BPSK                   BOOLEAN                                                                 OPTIONAL,   -- Need M
+    uplinkChannelBW-PerSCS-List         SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier                     OPTIONAL    -- Need S
+    ]],
+    [[
+    enablePL-RS-UpdateForPUSCH-SRS-r16  ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultBeamPL-ForPUSCH0-0-r16 ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultBeamPL-ForPUCCH-r16    ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    enableDefaultBeamPL-ForSRS-r16      ENUMERATED {enabled}                                                    OPTIONAL,   -- Need R
+    uplinkTxSwitching-r16               SetupRelease { UplinkTxSwitching-r16 }                                  OPTIONAL,   -- Need M
+    mpr-PowerBoost-FR2-r16              ENUMERATED {true}                                                       OPTIONAL    -- Need R
+    ]]
+}
+
+DummyJ ::=                          SEQUENCE {
+    maxEnergyDetectionThreshold-r16         INTEGER(-85..-52),
+    energyDetectionThresholdOffset-r16      INTEGER (-20..-13),
+    ul-toDL-COT-SharingED-Threshold-r16     INTEGER (-85..-52)                                                  OPTIONAL,   -- Need R
+    absenceOfAnyOtherTechnology-r16         ENUMERATED {true}                                                   OPTIONAL    -- Need R
+}
+
+ChannelAccessConfig-r16 ::=         SEQUENCE {
+    energyDetectionConfig-r16           CHOICE {
+        maxEnergyDetectionThreshold-r16         INTEGER (-85..-52),
+        energyDetectionThresholdOffset-r16      INTEGER (-13..20)
+    }                                                                                                           OPTIONAL,   -- Need R
+    ul-toDL-COT-SharingED-Threshold-r16         INTEGER (-85..-52)                                              OPTIONAL,   -- Need R
+    absenceOfAnyOtherTechnology-r16             ENUMERATED {true}                                               OPTIONAL    -- Need R
+}
+
+IntraCellGuardBandsPerSCS-r16 ::=      SEQUENCE {
+    guardBandSCS-r16                       SubcarrierSpacing,
+    intraCellGuardBands-r16                SEQUENCE (SIZE (1..4)) OF GuardBand-r16
+}
+
+GuardBand-r16 ::=                      SEQUENCE {
+     startCRB-r16                          INTEGER (0..274),
+     nrofCRBs-r16                          INTEGER (0..15)
+}
+
+DormancyGroupID-r16 ::=         INTEGER (0..4)
+
+DormantBWP-Config-r16::=               SEQUENCE {
+    dormantBWP-Id-r16                      BWP-Id                                                           OPTIONAL,   -- Need M
+    withinActiveTimeConfig-r16             SetupRelease { WithinActiveTimeConfig-r16 }                      OPTIONAL,   -- Need M
+    outsideActiveTimeConfig-r16            SetupRelease { OutsideActiveTimeConfig-r16 }                     OPTIONAL    -- Need M
+}
+
+WithinActiveTimeConfig-r16 ::=         SEQUENCE {
+   firstWithinActiveTimeBWP-Id-r16         BWP-Id                                                           OPTIONAL,   -- Need M
+   dormancyGroupWithinActiveTime-r16       DormancyGroupID-r16                                              OPTIONAL    -- Need R
+}
+
+OutsideActiveTimeConfig-r16 ::=        SEQUENCE {
+   firstOutsideActiveTimeBWP-Id-r16        BWP-Id                                                           OPTIONAL,   -- Need M
+   dormancyGroupOutsideActiveTime-r16      DormancyGroupID-r16                                              OPTIONAL    -- Need R
+}
+
+UplinkTxSwitching-r16 ::=              SEQUENCE {
+    uplinkTxSwitchingPeriodLocation-r16    BOOLEAN,
+    uplinkTxSwitchingCarrier-r16           ENUMERATED {carrier1, carrier2}
+}
+
+-- TAG-SERVINGCELLCONFIG-STOP
+-- TAG-SERVINGCELLCONFIGCOMMON-START
+
+ServingCellConfigCommon ::=         SEQUENCE {
+    physCellId                          PhysCellId                                                          OPTIONAL,   -- Cond HOAndServCellAdd,
+    downlinkConfigCommon                DownlinkConfigCommon                                                OPTIONAL,   -- Cond HOAndServCellAdd
+    uplinkConfigCommon                  UplinkConfigCommon                                                  OPTIONAL,   -- Need M
+    supplementaryUplinkConfig           UplinkConfigCommon                                                  OPTIONAL,   -- Need S
+    n-TimingAdvanceOffset               ENUMERATED { n0, n25600, n39936 }                                   OPTIONAL,   -- Need S
+    ssb-PositionsInBurst                CHOICE {
+        shortBitmap                         BIT STRING (SIZE (4)),
+        mediumBitmap                        BIT STRING (SIZE (8)),
+        longBitmap                          BIT STRING (SIZE (64))
+    }                                                                                                       OPTIONAL, -- Cond AbsFreqSSB
+    ssb-periodicityServingCell          ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, spare2, spare1 }   OPTIONAL, -- Need S
+    dmrs-TypeA-Position                 ENUMERATED {pos2, pos3},
+    lte-CRS-ToMatchAround               SetupRelease { RateMatchPatternLTE-CRS }                            OPTIONAL, -- Need M
+    rateMatchPatternToAddModList        SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPattern   OPTIONAL, -- Need N
+    rateMatchPatternToReleaseList       SEQUENCE (SIZE (1..maxNrofRateMatchPatterns)) OF RateMatchPatternId OPTIONAL, -- Need N
+    ssbSubcarrierSpacing                SubcarrierSpacing                                                   OPTIONAL, -- Cond HOAndServCellWithSSB
+    tdd-UL-DL-ConfigurationCommon       TDD-UL-DL-ConfigCommon                                              OPTIONAL, -- Cond TDD
+    ss-PBCH-BlockPower                  INTEGER (-60..50),
+    ...,
+    [[
+    channelAccessMode-r16               CHOICE {
+        dynamic                             NULL,
+        semiStatic                          SemiStaticChannelAccessConfig-r16
+    }                                                                                                       OPTIONAL, -- Cond SharedSpectrum
+    discoveryBurstWindowLength-r16          ENUMERATED {ms0dot5, ms1, ms2, ms3, ms4, ms5}                   OPTIONAL, -- Need R
+    ssb-PositionQCL-r16                     SSB-PositionQCL-Relation-r16                                    OPTIONAL, -- Cond SharedSpectrum
+    highSpeedConfig-r16                     HighSpeedConfig-r16                                             OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-SERVINGCELLCONFIGCOMMON-STOP
+-- TAG-SERVINGCELLCONFIGCOMMONSIB-START
+
+ServingCellConfigCommonSIB ::=      SEQUENCE {
+    downlinkConfigCommon                DownlinkConfigCommonSIB,
+    uplinkConfigCommon                  UplinkConfigCommonSIB                                       OPTIONAL, -- Need R
+    supplementaryUplink                 UplinkConfigCommonSIB                                       OPTIONAL, -- Need R
+    n-TimingAdvanceOffset               ENUMERATED { n0, n25600, n39936 }                           OPTIONAL, -- Need S
+    ssb-PositionsInBurst                SEQUENCE {
+        inOneGroup                          BIT STRING (SIZE (8)),
+        groupPresence                       BIT STRING (SIZE (8))                                   OPTIONAL  -- Cond FR2-Only
+    },
+    ssb-PeriodicityServingCell          ENUMERATED {ms5, ms10, ms20, ms40, ms80, ms160},
+    tdd-UL-DL-ConfigurationCommon       TDD-UL-DL-ConfigCommon                                      OPTIONAL, -- Cond TDD
+    ss-PBCH-BlockPower                  INTEGER (-60..50),
+    ...,
+    [[
+    channelAccessMode-r16               CHOICE {
+        dynamic                             NULL,
+        semiStatic                          SemiStaticChannelAccessConfig-r16
+    }                                                                                               OPTIONAL, -- Cond SharedSpectrum
+    discoveryBurstWindowLength-r16      ENUMERATED {ms0dot5, ms1, ms2, ms3, ms4, ms5}               OPTIONAL, -- Need R
+    highSpeedConfig-r16                 HighSpeedConfig-r16                                         OPTIONAL  -- Need R
+    ]]
+}
+
+-- TAG-SERVINGCELLCONFIGCOMMONSIB-STOP
+-- TAG-SHORTI-RNTI-VALUE-START
+
+ShortI-RNTI-Value ::=   BIT STRING (SIZE(24))
+
+-- TAG-SHORTI-RNTI-VALUE-STOP
+-- TAG-SHORTMAC-I-START
+
+ShortMAC-I ::=                      BIT STRING (SIZE (16))
+
+-- TAG-SHORTMAC-I-STOP
+-- TAG-SINR-RANGE-START
+
+SINR-Range ::=                      INTEGER(0..127)
+
+-- TAG-SINR-RANGE-STOP
+-- TAG-SI-REQUESTCONFIG-START
+
+SI-RequestConfig::=                 SEQUENCE {
+    rach-OccasionsSI                    SEQUENCE {
+        rach-ConfigSI                       RACH-ConfigGeneric,
+        ssb-perRACH-Occasion                ENUMERATED {oneEighth, oneFourth, oneHalf, one, two, four, eight, sixteen}
+    }                                                                                                       OPTIONAL,   -- Need R
+    si-RequestPeriod                    ENUMERATED {one, two, four, six, eight, ten, twelve, sixteen}       OPTIONAL,   -- Need R
+    si-RequestResources                 SEQUENCE (SIZE (1..maxSI-Message)) OF SI-RequestResources
+}
+
+SI-RequestResources ::=             SEQUENCE {
+    ra-PreambleStartIndex               INTEGER (0..63),
+    ra-AssociationPeriodIndex           INTEGER (0..15)                                                     OPTIONAL,   -- Need R
+    ra-ssb-OccasionMaskIndex            INTEGER (0..15)                                                     OPTIONAL    -- Need R
+}
+
+-- TAG-SI-SCHEDULINGINFO-START
+
+SI-SchedulingInfo ::=               SEQUENCE {
+    schedulingInfoList                  SEQUENCE (SIZE (1..maxSI-Message)) OF SchedulingInfo,
+    si-WindowLength                     ENUMERATED {s5, s10, s20, s40, s80, s160, s320, s640, s1280},
+    si-RequestConfig                    SI-RequestConfig                                                OPTIONAL,  -- Cond MSG-1
+    si-RequestConfigSUL                 SI-RequestConfig                                                OPTIONAL,  -- Cond SUL-MSG-1
+    systemInformationAreaID             BIT STRING (SIZE (24))                                          OPTIONAL,   -- Need R
+    ...
+}
+
+SchedulingInfo ::=                  SEQUENCE {
+    si-BroadcastStatus                  ENUMERATED {broadcasting, notBroadcasting},
+    si-Periodicity                      ENUMERATED {rf8, rf16, rf32, rf64, rf128, rf256, rf512},
+    sib-MappingInfo                     SIB-Mapping
+}
+
+SIB-Mapping ::=                     SEQUENCE (SIZE (1..maxSIB)) OF SIB-TypeInfo
+
+SIB-TypeInfo ::=                    SEQUENCE {
+    type                                ENUMERATED {sibType2, sibType3, sibType4, sibType5, sibType6, sibType7, sibType8, sibType9,
+                                                     sibType10-v1610, sibType11-v1610, sibType12-v1610, sibType13-v1610, sibType14-v1610,
+                                                    spare3, spare2, spare1,... },
+    valueTag                            INTEGER (0..31)                                                  OPTIONAL, -- Cond SIB-TYPE
+    areaScope                           ENUMERATED {true}                                                OPTIONAL -- Need S
+}
+
+-- TAG-SI-SCHEDULINGINFO-STOP
+-- TAG-SKCOUNTER-START
+
+SK-Counter ::=  INTEGER (0..65535)
+
+-- TAG-SKCOUNTER-STOP
+-- TAG-SLOTFORMATCOMBINATIONSPERCELL-START
+
+SlotFormatCombinationsPerCell ::=   SEQUENCE {
+    servingCellId                       ServCellIndex,
+    subcarrierSpacing                   SubcarrierSpacing,
+    subcarrierSpacing2                  SubcarrierSpacing                                                         OPTIONAL, -- Need R
+    slotFormatCombinations              SEQUENCE (SIZE (1..maxNrofSlotFormatCombinationsPerSet)) OF SlotFormatCombination
+                                                                                                                  OPTIONAL, -- Need M
+    positionInDCI                       INTEGER(0..maxSFI-DCI-PayloadSize-1)                                      OPTIONAL, -- Need M
+    ...,
+    [[
+    enableConfiguredUL-r16              ENUMERATED {enabled}                                                      OPTIONAL  -- Need R
+    ]]
+
+}
+
+SlotFormatCombination ::=           SEQUENCE {
+    slotFormatCombinationId             SlotFormatCombinationId,
+    slotFormats                         SEQUENCE (SIZE (1..maxNrofSlotFormatsPerCombination)) OF INTEGER (0..255)
+}
+
+SlotFormatCombinationId ::=         INTEGER (0..maxNrofSlotFormatCombinationsPerSet-1)
+
+-- TAG-SLOTFORMATCOMBINATIONSPERCELL-STOP
+-- TAG-SLOTFORMATINDICATOR-START
+
+SlotFormatIndicator ::=     SEQUENCE {
+    sfi-RNTI                    RNTI-Value,
+    dci-PayloadSize             INTEGER (1..maxSFI-DCI-PayloadSize),
+    slotFormatCombToAddModList  SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF SlotFormatCombinationsPerCell
+                                                                                                                              OPTIONAL, -- Need N
+    slotFormatCombToReleaseList SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex                       OPTIONAL, -- Need N
+    ...,
+    [[
+    availableRB-SetsToAddModList-r16  SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF AvailableRB-SetsPerCell-r16   OPTIONAL, -- Need N
+    availableRB-SetsToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex                 OPTIONAL, -- Need N
+    switchTriggerToAddModList-r16     SEQUENCE (SIZE(1..4)) OF SearchSpaceSwitchTrigger-r16                                   OPTIONAL, -- Need N
+    switchTriggerToReleaseList-r16    SEQUENCE (SIZE(1..4)) OF ServCellIndex                                                  OPTIONAL, -- Need N
+    co-DurationsPerCellToAddModList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF CO-DurationsPerCell-r16     OPTIONAL, -- Need N
+    co-DurationsPerCellToReleaseList-r16 SEQUENCE (SIZE(1..maxNrofAggregatedCellsPerCellGroup)) OF ServCellIndex              OPTIONAL  -- Need N
+    ]]
+}
+
+CO-DurationsPerCell-r16 ::=   SEQUENCE {
+    servingCellId-r16            ServCellIndex,
+    positionInDCI-r16            INTEGER(0..maxSFI-DCI-PayloadSize-1),
+    subcarrierSpacing-r16        SubcarrierSpacing,
+    co-DurationList-r16          SEQUENCE (SIZE(1..64)) OF CO-Duration-r16
+}
+
+CO-Duration-r16 ::=    INTEGER (0..1120)
+
+AvailableRB-SetsPerCell-r16 ::=   SEQUENCE {
+    servingCellId-r16                 ServCellIndex,
+    positionInDCI-r16                 INTEGER(0..maxSFI-DCI-PayloadSize-1)
+}
+
+SearchSpaceSwitchTrigger-r16 ::=   SEQUENCE {
+    servingCellId-r16                  ServCellIndex,
+    positionInDCI-r16                  INTEGER(0..maxSFI-DCI-PayloadSize-1)
+}
+
+-- TAG-SLOTFORMATINDICATOR-STOP
+-- TAG-S-NSSAI-START
+
+S-NSSAI  ::=                        CHOICE{
+    sst                                 BIT STRING (SIZE (8)),
+    sst-SD                              BIT STRING (SIZE (32))
+}
+
+-- TAG-S-NSSAI-STOP
+-- TAG-SPEEDSTATESCALEFACTORS-START
+
+SpeedStateScaleFactors ::=          SEQUENCE {
+    sf-Medium                           ENUMERATED {oDot25, oDot5, oDot75, lDot0},
+    sf-High                             ENUMERATED {oDot25, oDot5, oDot75, lDot0}
+}
+-- TAG-SPEEDSTATESCALEFACTORS-STOP
+-- TAG-SPS-CONFIG-START
+
+SPS-Config ::=                  SEQUENCE {
+    periodicity                     ENUMERATED {ms10, ms20, ms32, ms40, ms64, ms80, ms128, ms160, ms320, ms640,
+                                                        spare6, spare5, spare4, spare3, spare2, spare1},
+    nrofHARQ-Processes              INTEGER (1..8),
+    n1PUCCH-AN                      PUCCH-ResourceId                                                                OPTIONAL,   -- Need M
+    mcs-Table                       ENUMERATED {qam64LowSE}                                                         OPTIONAL,   -- Need S
+    ...,
+    [[
+    sps-ConfigIndex-r16             SPS-ConfigIndex-r16                                                             OPTIONAL,   -- Cond SPS-List
+    harq-ProcID-Offset-r16          INTEGER (0..15)                                                                 OPTIONAL,   -- Need R
+    periodicityExt-r16              INTEGER (1..5120)                                                               OPTIONAL,   -- Need R
+    harq-CodebookID-r16             INTEGER (1..2)                                                                  OPTIONAL,   -- Need R
+    pdsch-AggregationFactor-r16     ENUMERATED {n1, n2, n4, n8 }                                                    OPTIONAL    -- Need S
+    ]]
+}
+
+-- TAG-SPS-CONFIG-STOP
+-- TAG-SPS-CONFIGINDEX-START
+
+SPS-ConfigIndex-r16             ::= INTEGER (0.. maxNrofSPS-Config-r16-1)
+
+-- TAG-SPS-CONFIGINDEX-STOP
+-- TAG-SPS-PUCCH-AN-START
+
+SPS-PUCCH-AN-r16  ::=           SEQUENCE {
+    sps-PUCCH-AN-ResourceID-r16     PUCCH-ResourceId,
+    maxPayloadSize-r16              INTEGER (4..256)                     OPTIONAL    -- Need R
+}
+
+-- TAG-SPS-PUCCH-AN-STOP
+-- TAG-SPS-PUCCH-AN-LIST-START
+
+SPS-PUCCH-AN-List-r16 ::=      SEQUENCE (SIZE(1..4)) OF SPS-PUCCH-AN-r16
+
+-- TAG-SPS-PUCCH-AN-LIST-STOP
+-- TAG-SRB-IDENTITY-START
+
+SRB-Identity ::=                    INTEGER (1..3)
+
+-- TAG-SRB-IDENTITY-STOP
+-- TAG-SRS-CARRIERSWITCHING-START
+
+SRS-CarrierSwitching ::=            SEQUENCE {
+    srs-SwitchFromServCellIndex         INTEGER (0..31)                                                         OPTIONAL,   -- Need M
+    srs-SwitchFromCarrier               ENUMERATED {sUL, nUL},
+    srs-TPC-PDCCH-Group                 CHOICE {
+        typeA                               SEQUENCE (SIZE (1..32)) OF SRS-TPC-PDCCH-Config,
+        typeB                               SRS-TPC-PDCCH-Config
+    }                                                                                                           OPTIONAL,   -- Need M
+    monitoringCells                     SEQUENCE (SIZE (1..maxNrofServingCells)) OF ServCellIndex               OPTIONAL,   -- Need M
+    ...
+}
+
+SRS-TPC-PDCCH-Config ::=            SEQUENCE {
+    srs-CC-SetIndexlist                 SEQUENCE (SIZE(1..4)) OF SRS-CC-SetIndex                                OPTIONAL    -- Need M
+}
+
+SRS-CC-SetIndex ::=                 SEQUENCE {
+    cc-SetIndex                         INTEGER (0..3)                                                          OPTIONAL,   -- Need M
+    cc-IndexInOneCC-Set                 INTEGER (0..7)                                                          OPTIONAL    -- Need M
+}
+
+-- TAG-SRS-CARRIERSWITCHING-STOP
+-- TAG-SRS-CONFIG-START
+
+SRS-Config ::=                          SEQUENCE {
+    srs-ResourceSetToReleaseList            SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId                OPTIONAL,   -- Need N
+    srs-ResourceSetToAddModList             SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet                  OPTIONAL,   -- Need N
+    srs-ResourceToReleaseList               SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-ResourceId                      OPTIONAL,   -- Need N
+    srs-ResourceToAddModList                SEQUENCE (SIZE(1..maxNrofSRS-Resources)) OF SRS-Resource                        OPTIONAL,   -- Need N
+    tpc-Accumulation                        ENUMERATED {disabled}                                                           OPTIONAL,   -- Need S
+    ...,
+    [[
+    srs-RequestDCI-1-2-r16                  INTEGER (1..2)                                                          OPTIONAL, -- Need S
+    srs-RequestDCI-0-2-r16                  INTEGER (1..2)                                                          OPTIONAL, -- Need S
+    srs-ResourceSetToAddModListDCI-0-2-r16  SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSet          OPTIONAL, -- Need N
+    srs-ResourceSetToReleaseListDCI-0-2-r16 SEQUENCE (SIZE(1..maxNrofSRS-ResourceSets)) OF SRS-ResourceSetId        OPTIONAL, -- Need N
+    srs-PosResourceSetToReleaseList-r16     SEQUENCE (SIZE(1..maxNrofSRS-PosResourceSets-r16)) OF SRS-PosResourceSetId-r16
+                                                                                                                    OPTIONAL, -- Need N
+    srs-PosResourceSetToAddModList-r16      SEQUENCE (SIZE(1..maxNrofSRS-PosResourceSets-r16)) OF SRS-PosResourceSet-r16        OPTIONAL,-- Need N
+    srs-PosResourceToReleaseList-r16        SEQUENCE (SIZE(1..maxNrofSRS-PosResources-r16)) OF SRS-PosResourceId-r16            OPTIONAL,-- Need N
+    srs-PosResourceToAddModList-r16         SEQUENCE (SIZE(1..maxNrofSRS-PosResources-r16)) OF SRS-PosResource-r16              OPTIONAL -- Need N
+    ]]
+}
+
+SRS-ResourceSet ::=                     SEQUENCE {
+    srs-ResourceSetId                       SRS-ResourceSetId,
+    srs-ResourceIdList                      SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-ResourceId    OPTIONAL, -- Cond Setup
+    resourceType                            CHOICE {
+        aperiodic                               SEQUENCE {
+            aperiodicSRS-ResourceTrigger            INTEGER (1..maxNrofSRS-TriggerStates-1),
+            csi-RS                                  NZP-CSI-RS-ResourceId                                  OPTIONAL, -- Cond NonCodebook
+            slotOffset                              INTEGER (1..32)                                        OPTIONAL, -- Need S
+            ...,
+            [[
+            aperiodicSRS-ResourceTriggerList            SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-2))
+                                                            OF INTEGER (1..maxNrofSRS-TriggerStates-1)     OPTIONAL  -- Need M
+            ]]
+        },
+        semi-persistent                         SEQUENCE {
+            associatedCSI-RS                        NZP-CSI-RS-ResourceId                                  OPTIONAL, -- Cond NonCodebook
+            ...
+        },
+        periodic                                SEQUENCE {
+            associatedCSI-RS                        NZP-CSI-RS-ResourceId                                  OPTIONAL, -- Cond NonCodebook
+            ...
+        }
+    },
+    usage                                   ENUMERATED {beamManagement, codebook, nonCodebook, antennaSwitching},
+    alpha                                   Alpha                                                          OPTIONAL, -- Need S
+    p0                                      INTEGER (-202..24)                                             OPTIONAL, -- Cond Setup
+    pathlossReferenceRS                     PathlossReferenceRS-Config                                     OPTIONAL, -- Need M
+    srs-PowerControlAdjustmentStates        ENUMERATED { sameAsFci2, separateClosedLoop}                   OPTIONAL, -- Need S
+    ...,
+    [[
+    pathlossReferenceRSList-r16             SetupRelease { PathlossReferenceRSList-r16}                    OPTIONAL  -- Need M
+    ]]
+}
+
+PathlossReferenceRS-Config ::=              CHOICE {
+    ssb-Index                                   SSB-Index,
+    csi-RS-Index                                NZP-CSI-RS-ResourceId
+}
+
+PathlossReferenceRSList-r16 ::=             SEQUENCE (SIZE (1..maxNrofSRS-PathlossReferenceRS-r16)) OF PathlossReferenceRS-r16
+
+PathlossReferenceRS-r16 ::=                 SEQUENCE {
+    srs-PathlossReferenceRS-Id-r16              SRS-PathlossReferenceRS-Id-r16,
+    pathlossReferenceRS-r16                     PathlossReferenceRS-Config
+}
+
+SRS-PathlossReferenceRS-Id-r16 ::=          INTEGER (0..maxNrofSRS-PathlossReferenceRS-1-r16)
+
+SRS-PosResourceSet-r16 ::=                  SEQUENCE {
+    srs-PosResourceSetId-r16                    SRS-PosResourceSetId-r16,
+    srs-PosResourceIdList-r16                   SEQUENCE (SIZE(1..maxNrofSRS-ResourcesPerSet)) OF SRS-PosResourceId-r16
+                                                                                                           OPTIONAL, -- Cond Setup
+    resourceType-r16                            CHOICE {
+        aperiodic-r16                               SEQUENCE {
+            aperiodicSRS-ResourceTriggerList-r16        SEQUENCE (SIZE(1..maxNrofSRS-TriggerStates-1))
+                                                            OF INTEGER (1..maxNrofSRS-TriggerStates-1)     OPTIONAL, -- Need M
+            ...
+        },
+        semi-persistent-r16                         SEQUENCE {
+            ...
+        },
+        periodic-r16                                SEQUENCE {
+            ...
+        }
+    },
+    alpha-r16                                   Alpha                                                      OPTIONAL, -- Need S
+    p0-r16                                      INTEGER (-202..24)                                         OPTIONAL, -- Cond Setup
+    pathlossReferenceRS-Pos-r16                 CHOICE {
+        ssb-IndexServing-r16                        SSB-Index,
+        ssb-Ncell-r16                               SSB-InfoNcell-r16,
+        dl-PRS-r16                                  DL-PRS-Info-r16
+    }                                                                                                      OPTIONAL, -- Need M
+    ...
+}
+
+SRS-ResourceSetId ::=                   INTEGER (0..maxNrofSRS-ResourceSets-1)
+
+SRS-PosResourceSetId-r16 ::=            INTEGER (0..maxNrofSRS-PosResourceSets-1-r16)
+
+SRS-Resource ::=                        SEQUENCE {
+    srs-ResourceId                          SRS-ResourceId,
+    nrofSRS-Ports                           ENUMERATED {port1, ports2, ports4},
+    ptrs-PortIndex                          ENUMERATED {n0, n1 }                                           OPTIONAL,   -- Need R
+    transmissionComb                        CHOICE {
+        n2                                      SEQUENCE {
+            combOffset-n2                           INTEGER (0..1),
+            cyclicShift-n2                          INTEGER (0..7)
+        },
+        n4                                      SEQUENCE {
+            combOffset-n4                           INTEGER (0..3),
+            cyclicShift-n4                          INTEGER (0..11)
+        }
+    },
+    resourceMapping                         SEQUENCE {
+        startPosition                           INTEGER (0..5),
+        nrofSymbols                             ENUMERATED {n1, n2, n4},
+        repetitionFactor                        ENUMERATED {n1, n2, n4}
+    },
+    freqDomainPosition                      INTEGER (0..67),
+    freqDomainShift                         INTEGER (0..268),
+    freqHopping                             SEQUENCE {
+        c-SRS                                   INTEGER (0..63),
+        b-SRS                                   INTEGER (0..3),
+        b-hop                                   INTEGER (0..3)
+    },
+    groupOrSequenceHopping                  ENUMERATED { neither, groupHopping, sequenceHopping },
+    resourceType                            CHOICE {
+        aperiodic                               SEQUENCE {
+            ...
+        },
+        semi-persistent                         SEQUENCE {
+            periodicityAndOffset-sp                     SRS-PeriodicityAndOffset,
+            ...
+        },
+        periodic                                SEQUENCE {
+            periodicityAndOffset-p                      SRS-PeriodicityAndOffset,
+            ...
+        }
+    },
+    sequenceId                              INTEGER (0..1023),
+    spatialRelationInfo                     SRS-SpatialRelationInfo                                        OPTIONAL,   -- Need R
+    ...,
+    [[
+    resourceMapping-r16                     SEQUENCE {
+        startPosition-r16                       INTEGER (0..13),
+        nrofSymbols-r16                         ENUMERATED {n1, n2, n4},
+        repetitionFactor-r16                    ENUMERATED {n1, n2, n4}
+    }                                                                                                      OPTIONAL    -- Need R
+    ]]
+
+}
+
+SRS-PosResource-r16::=                  SEQUENCE {
+    srs-PosResourceId-r16                   SRS-PosResourceId-r16,
+    transmissionComb-r16                    CHOICE {
+        n2-r16                                  SEQUENCE {
+            combOffset-n2-r16                       INTEGER (0..1),
+            cyclicShift-n2-r16                      INTEGER (0..7)
+        },
+        n4-r16                                  SEQUENCE {
+            combOffset-n4-16                        INTEGER (0..3),
+            cyclicShift-n4-r16                      INTEGER (0..11)
+        },
+        n8-r16                                  SEQUENCE {
+            combOffset-n8-r16                       INTEGER (0..7),
+            cyclicShift-n8-r16                      INTEGER (0..5)
+        },
+    ...
+    },
+    resourceMapping-r16                       SEQUENCE {
+        startPosition-r16                           INTEGER (0..13),
+        nrofSymbols-r16                             ENUMERATED {n1, n2, n4, n8, n12}
+    },
+    freqDomainShift-r16                       INTEGER (0..268),
+    freqHopping-r16                           SEQUENCE {
+        c-SRS-r16                                 INTEGER (0..63),
+        ...
+    },
+    groupOrSequenceHopping-r16                ENUMERATED { neither, groupHopping, sequenceHopping },
+    resourceType-r16                          CHOICE {
+        aperiodic-r16                             SEQUENCE {
+            slotOffset-r16                            INTEGER (1..32)                                      OPTIONAL,   -- Need S
+            ...
+        },
+        semi-persistent-r16                       SEQUENCE {
+            periodicityAndOffset-sp-r16               SRS-PeriodicityAndOffset-r16,
+            ...
+        },
+        periodic-r16                              SEQUENCE {
+            periodicityAndOffset-p-r16                SRS-PeriodicityAndOffset-r16,
+            ...
+        }
+    },
+    sequenceId-r16                            INTEGER (0..65535),
+    spatialRelationInfoPos-r16                SRS-SpatialRelationInfoPos-r16                               OPTIONAL,   -- Need R
+    ...
+}
+
+SRS-SpatialRelationInfo ::=     SEQUENCE {
+    servingCellId                       ServCellIndex                                                      OPTIONAL,   -- Need S
+    referenceSignal                     CHOICE {
+        ssb-Index                           SSB-Index,
+        csi-RS-Index                        NZP-CSI-RS-ResourceId,
+        srs                                 SEQUENCE {
+            resourceId                          SRS-ResourceId,
+            uplinkBWP                           BWP-Id
+        }
+    }
+}
+
+SRS-SpatialRelationInfoPos-r16 ::=      CHOICE {
+    servingRS-r16                           SEQUENCE {
+        servingCellId                           ServCellIndex                                              OPTIONAL,   -- Need S
+        referenceSignal-r16                     CHOICE {
+            ssb-IndexServing-r16                    SSB-Index,
+            csi-RS-IndexServing-r16                 NZP-CSI-RS-ResourceId,
+            srs-SpatialRelation-r16                 SEQUENCE {
+                resourceSelection-r16                   CHOICE {
+                    srs-ResourceId-r16                      SRS-ResourceId,
+                    srs-PosResourceId-r16                   SRS-PosResourceId-r16
+                },
+                uplinkBWP-r16                           BWP-Id
+            }
+        }
+    },
+    ssb-Ncell-r16                           SSB-InfoNcell-r16,
+    dl-PRS-r16                              DL-PRS-Info-r16
+}
+
+SSB-Configuration-r16  ::=          SEQUENCE {
+    ssb-Freq-r16                     ARFCN-ValueNR,
+    halfFrameIndex-r16                  ENUMERATED {zero, one},
+    ssbSubcarrierSpacing-r16            SubcarrierSpacing,
+    ssb-Periodicity-r16                 ENUMERATED { ms5, ms10, ms20, ms40, ms80, ms160, spare2,spare1 }   OPTIONAL, -- Need S
+    sfn0-Offset-r16                     SEQUENCE {
+        sfn-Offset-r16                      INTEGER (0..1023),
+        integerSubframeOffset-r16           INTEGER (0..9)                                                 OPTIONAL  -- Need R
+    }                                                                                                      OPTIONAL, -- Need R
+    sfn-SSB-Offset-r16                  INTEGER (0..15),
+    ss-PBCH-BlockPower-r16              INTEGER (-60..50)                                                  OPTIONAL  -- Cond Pathloss
+}
+
+SSB-InfoNcell-r16  ::=              SEQUENCE {
+    physicalCellId-r16                  PhysCellId,
+    ssb-IndexNcell-r16                  SSB-Index                                                          OPTIONAL, -- Need S
+    ssb-Configuration-r16               SSB-Configuration-r16                                              OPTIONAL  -- Need S
+}
+
+DL-PRS-Info-r16  ::=                SEQUENCE {
+    dl-PRS-ID-r16                      INTEGER (0..255),
+    dl-PRS-ResourceSetId-r16           INTEGER (0..7),
+    dl-PRS-ResourceId-r16              INTEGER (0..63)                                                     OPTIONAL  -- Need S
+}
+
+SRS-ResourceId ::=                      INTEGER (0..maxNrofSRS-Resources-1)
+SRS-PosResourceId-r16 ::=               INTEGER (0..maxNrofSRS-PosResources-1-r16)
+
+SRS-PeriodicityAndOffset ::=            CHOICE {
+    sl1                                     NULL,
+    sl2                                     INTEGER(0..1),
+    sl4                                     INTEGER(0..3),
+    sl5                                     INTEGER(0..4),
+    sl8                                     INTEGER(0..7),
+    sl10                                    INTEGER(0..9),
+    sl16                                    INTEGER(0..15),
+    sl20                                    INTEGER(0..19),
+    sl32                                    INTEGER(0..31),
+    sl40                                    INTEGER(0..39),
+    sl64                                    INTEGER(0..63),
+    sl80                                    INTEGER(0..79),
+    sl160                                   INTEGER(0..159),
+    sl320                                   INTEGER(0..319),
+    sl640                                   INTEGER(0..639),
+    sl1280                                  INTEGER(0..1279),
+    sl2560                                  INTEGER(0..2559)
+}
+
+SRS-PeriodicityAndOffset-r16 ::=        CHOICE {
+    sl1                                     NULL,
+    sl2                                     INTEGER(0..1),
+    sl4                                     INTEGER(0..3),
+    sl5                                     INTEGER(0..4),
+    sl8                                     INTEGER(0..7),
+    sl10                                    INTEGER(0..9),
+    sl16                                    INTEGER(0..15),
+    sl20                                    INTEGER(0..19),
+    sl32                                    INTEGER(0..31),
+    sl40                                    INTEGER(0..39),
+    sl64                                    INTEGER(0..63),
+    sl80                                    INTEGER(0..79),
+    sl160                                   INTEGER(0..159),
+    sl320                                   INTEGER(0..319),
+    sl640                                   INTEGER(0..639),
+    sl1280                                  INTEGER(0..1279),
+    sl2560                                  INTEGER(0..2559),
+    sl5120                                  INTEGER(0..5119),
+    sl10240                                 INTEGER(0..10239),
+    sl40960                                 INTEGER(0..40959),
+    sl81920                                 INTEGER(0..81919),
+    ...
+}
+
+-- TAG-SRS-CONFIG-STOP
+-- TAG-SRS-RSRP-RANGE-START
+
+SRS-RSRP-Range-r16 ::=                      INTEGER(0..98)
+
+-- TAG-SRS-RSRP-RANGE-STOP
+-- TAG-SRS-TPC-COMMANDCONFIG-START
+
+SRS-TPC-CommandConfig ::=               SEQUENCE {
+    startingBitOfFormat2-3                  INTEGER (1..31)                                                     OPTIONAL,   -- Need R
+    fieldTypeFormat2-3                      INTEGER (0..1)                                                      OPTIONAL,   -- Need R
+    ...,
+    [[
+    startingBitOfFormat2-3SUL               INTEGER (1..31)                                                     OPTIONAL    -- Need R
+    ]]
+}
+
+-- TAG-SRS-TPC-COMMANDCONFIG-STOP
+-- TAG-SSB-INDEX-START
+
+SSB-Index ::=                       INTEGER (0..maxNrofSSBs-1)
+
+-- TAG-SSB-INDEX-STOP
+-- TAG-SSB-MTC-START
+
+SSB-MTC ::=                             SEQUENCE {
+    periodicityAndOffset                    CHOICE {
+        sf5                                 INTEGER (0..4),
+        sf10                                    INTEGER (0..9),
+        sf20                                    INTEGER (0..19),
+        sf40                                    INTEGER (0..39),
+        sf80                                    INTEGER (0..79),
+        sf160                                   INTEGER (0..159)
+    },
+    duration                                ENUMERATED { sf1, sf2, sf3, sf4, sf5 }
+}
+
+SSB-MTC2 ::=                        SEQUENCE {
+    pci-List                            SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId                   OPTIONAL,   -- Need M
+    periodicity                         ENUMERATED {sf5, sf10, sf20, sf40, sf80, spare3, spare2, spare1}
+}
+
+SSB-MTC2-LP-r16 ::=                 SEQUENCE {
+    pci-List                            SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId                   OPTIONAL,   -- Need R
+    periodicity                         ENUMERATED {sf10, sf20, sf40, sf80, sf160, spare3, spare2, spare1}
+}
+
+SSB-MTC3-r16 ::=                    SEQUENCE {
+    periodicityAndOffset-r16            CHOICE {
+        sf5-r16                                     INTEGER (0..4),
+        sf10-r16                                    INTEGER (0..9),
+        sf20-r16                                    INTEGER (0..19),
+        sf40-r16                                    INTEGER (0..39),
+        sf80-r16                                    INTEGER (0..79),
+        sf160-r16                                   INTEGER (0..159),
+        sf320-r16                                   INTEGER (0..319),
+        sf640-r16                                   INTEGER (0..639),
+        sf1280-r16                                  INTEGER (0..1279)
+    },
+    duration-r16                        ENUMERATED {sf1, sf2, sf3, sf4, sf5},
+    pci-List-r16                        SEQUENCE (SIZE (1..maxNrofPCIsPerSMTC)) OF PhysCellId                   OPTIONAL,  -- Need M
+    ssb-ToMeasure-r16                   SetupRelease { SSB-ToMeasure }                                          OPTIONAL   -- Need M
+}
+
+
+-- TAG-SSB-MTC-STOP
+-- TAG-SSB-POSITIONQCL-RELATION-START
+
+SSB-PositionQCL-Relation-r16 ::=  ENUMERATED {n1,n2,n4,n8}
+
+-- TAG-SSB-POSITIONQCL-RELATION-STOP
+-- TAG-SSB-TOMEASURE-START
+
+SSB-ToMeasure ::=                   CHOICE {
+    shortBitmap                         BIT STRING (SIZE (4)),
+    mediumBitmap                        BIT STRING (SIZE (8)),
+    longBitmap                          BIT STRING (SIZE (64))
+}
+
+-- TAG-SSB-TOMEASURE-STOP
+-- TAG-SS-RSSI-MEASUREMENT-START
+
+SS-RSSI-Measurement ::=             SEQUENCE {
+    measurementSlots                    BIT STRING (SIZE (1..80)),
+    endSymbol                           INTEGER(0..3)
+}
+
+-- TAG-SS-RSSI-MEASUREMENT-STOP
+-- TAG-SUBCARRIERSPACING-START
+
+SubcarrierSpacing ::=               ENUMERATED {kHz15, kHz30, kHz60, kHz120, kHz240, spare3, spare2, spare1}
+
+-- TAG-SUBCARRIERSPACING-STOP
+-- TAG-TAG-CONFIG-START
+
+TAG-Config ::=                      SEQUENCE {
+    tag-ToReleaseList                   SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG-Id                          OPTIONAL,   -- Need N
+    tag-ToAddModList                    SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG                             OPTIONAL    -- Need N
+}
+
+TAG ::=                             SEQUENCE {
+    tag-Id                              TAG-Id,
+    timeAlignmentTimer                  TimeAlignmentTimer,
+    ...
+}
+
+TAG-Id ::=                          INTEGER (0..maxNrofTAGs-1)
+
+TimeAlignmentTimer ::=              ENUMERATED {ms500, ms750, ms1280, ms1920, ms2560, ms5120, ms10240, infinity}
+
+-- TAG-TAG-CONFIG-STOP
+-- TAG-TCI-STATE-START
+
+TCI-State ::=                       SEQUENCE {
+    tci-StateId                         TCI-StateId,
+    qcl-Type1                           QCL-Info,
+    qcl-Type2                           QCL-Info                                                    OPTIONAL,   -- Need R
+    ...
+}
+
+QCL-Info ::=                        SEQUENCE {
+    cell                                ServCellIndex                                               OPTIONAL,   -- Need R
+    bwp-Id                              BWP-Id                                                      OPTIONAL, -- Cond CSI-RS-Indicated
+    referenceSignal                     CHOICE {
+        csi-rs                              NZP-CSI-RS-ResourceId,
+        ssb                                 SSB-Index
+    },
+    qcl-Type                            ENUMERATED {typeA, typeB, typeC, typeD},
+    ...
+}
+
+-- TAG-TCI-STATE-STOP
+-- TAG-TCI-STATEID-START
+
+TCI-StateId ::=                     INTEGER (0..maxNrofTCI-States-1)
+
+-- TAG-TCI-STATEID-STOP
+-- TAG-TDD-UL-DL-CONFIGCOMMON-START
+
+TDD-UL-DL-ConfigCommon ::=          SEQUENCE {
+    referenceSubcarrierSpacing          SubcarrierSpacing,
+    pattern1                            TDD-UL-DL-Pattern,
+    pattern2                            TDD-UL-DL-Pattern                                                       OPTIONAL, -- Need R
+    ...
+}
+
+TDD-UL-DL-Pattern ::=               SEQUENCE {
+    dl-UL-TransmissionPeriodicity       ENUMERATED {ms0p5, ms0p625, ms1, ms1p25, ms2, ms2p5, ms5, ms10},
+    nrofDownlinkSlots                   INTEGER (0..maxNrofSlots),
+    nrofDownlinkSymbols                 INTEGER (0..maxNrofSymbols-1),
+    nrofUplinkSlots                     INTEGER (0..maxNrofSlots),
+    nrofUplinkSymbols                   INTEGER (0..maxNrofSymbols-1),
+    ...,
+    [[
+    dl-UL-TransmissionPeriodicity-v1530     ENUMERATED {ms3, ms4}                                               OPTIONAL -- Need R
+    ]]
+}
+
+-- TAG-TDD-UL-DL-CONFIGCOMMON-STOP
+-- TAG-TDD-UL-DL-CONFIGDEDICATED-START
+
+TDD-UL-DL-ConfigDedicated ::=       SEQUENCE {
+    slotSpecificConfigurationsToAddModList      SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotConfig       OPTIONAL, -- Need N
+    slotSpecificConfigurationsToReleaseList     SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotIndex        OPTIONAL, -- Need N
+    ...
+}
+
+TDD-UL-DL-ConfigDedicated-IAB-MT-r16::=         SEQUENCE {
+    slotSpecificConfigurationsToAddModList-IAB-MT-r16  SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotConfig-IAB-MT-r16      OPTIONAL, -- Need N
+    slotSpecificConfigurationsToReleaseList-IAB-MT-r16 SEQUENCE (SIZE (1..maxNrofSlots)) OF TDD-UL-DL-SlotIndex                  OPTIONAL, -- Need N
+    ...
+}
+
+TDD-UL-DL-SlotConfig ::=            SEQUENCE {
+    slotIndex                           TDD-UL-DL-SlotIndex,
+    symbols                             CHOICE {
+        allDownlink                         NULL,
+        allUplink                           NULL,
+        explicit                            SEQUENCE {
+            nrofDownlinkSymbols                 INTEGER (1..maxNrofSymbols-1)                                   OPTIONAL, -- Need S
+            nrofUplinkSymbols                   INTEGER (1..maxNrofSymbols-1)                                   OPTIONAL  -- Need S
+        }
+    }
+}
+
+TDD-UL-DL-SlotConfig-IAB-MT-r16::=    SEQUENCE {
+    slotIndex-r16                           TDD-UL-DL-SlotIndex,
+    symbols-IAB-MT-r16                      CHOICE {
+        allDownlink-r16                         NULL,
+        allUplink-r16                           NULL,
+        explicit-r16                            SEQUENCE {
+            nrofDownlinkSymbols-r16                 INTEGER (1..maxNrofSymbols-1)                               OPTIONAL, -- Need S
+            nrofUplinkSymbols-r16                   INTEGER (1..maxNrofSymbols-1)                               OPTIONAL  -- Need S
+        },
+        explicit-IAB-MT-r16                     SEQUENCE {
+            nrofDownlinkSymbols-r16                 INTEGER (1..maxNrofSymbols-1)                               OPTIONAL, -- Need S
+            nrofUplinkSymbols-r16                   INTEGER (1..maxNrofSymbols-1)                               OPTIONAL  -- Need S
+        }
+    }
+}
+
+TDD-UL-DL-SlotIndex ::=             INTEGER (0..maxNrofSlots-1)
+
+-- TAG-TDD-UL-DL-CONFIGDEDICATED-STOP
+-- TAG-TRACKINGAREACODE-START
+
+TrackingAreaCode ::= BIT STRING (SIZE (24))
+
+-- TAG-TRACKINGAREACODE-STOP
+-- TAG-TRESELECTION-START
+
+T-Reselection ::=                   INTEGER (0..7)
+
+-- TAG-TRESELECTION-STOP
+-- TAG-TIMETOTRIGGER-START
+
+TimeToTrigger ::=                   ENUMERATED {
+                                        ms0, ms40, ms64, ms80, ms100, ms128, ms160, ms256,
+                                        ms320, ms480, ms512, ms640, ms1024, ms1280, ms2560,
+                                        ms5120}
+
+-- TAG-TIMETOTRIGGER-STOP
+-- TAG-UAC-BARRINGINFOSETINDEX-START
+
+UAC-BarringInfoSetIndex ::=                INTEGER (1..maxBarringInfoSet)
+
+-- TAG-UAC-BARRINGINFOSETINDEX-STOP
+-- TAG-UAC-BARRINGINFOSETLIST-START
+
+UAC-BarringInfoSetList ::=          SEQUENCE (SIZE(1..maxBarringInfoSet)) OF UAC-BarringInfoSet
+
+UAC-BarringInfoSet ::=              SEQUENCE {
+    uac-BarringFactor                   ENUMERATED {p00, p05, p10, p15, p20, p25, p30, p40,
+                                                    p50, p60, p70, p75, p80, p85, p90, p95},
+    uac-BarringTime                     ENUMERATED {s4, s8, s16, s32, s64, s128, s256, s512},
+    uac-BarringForAccessIdentity        BIT STRING (SIZE(7))
+}
+
+-- TAG-UAC-BARRINGINFOSETLIST-STOP
+-- TAG-UAC-BARRINGPERCATLIST-START
+
+UAC-BarringPerCatList ::=           SEQUENCE (SIZE (1..maxAccessCat-1)) OF UAC-BarringPerCat
+
+UAC-BarringPerCat ::=               SEQUENCE {
+   accessCategory                       INTEGER (1..maxAccessCat-1),
+   uac-barringInfoSetIndex              UAC-BarringInfoSetIndex
+}
+
+-- TAG-UAC-BARRINGPERCATLIST-STOP
+-- TAG-UAC-BARRINGPERPLMN-LIST-START
+
+UAC-BarringPerPLMN-List ::=         SEQUENCE (SIZE (1.. maxPLMN)) OF UAC-BarringPerPLMN
+
+UAC-BarringPerPLMN ::=              SEQUENCE {
+    plmn-IdentityIndex                  INTEGER (1..maxPLMN),
+    uac-ACBarringListType               CHOICE{
+        uac-ImplicitACBarringList           SEQUENCE (SIZE(maxAccessCat-1)) OF UAC-BarringInfoSetIndex,
+        uac-ExplicitACBarringList           UAC-BarringPerCatList
+    }                                                                                                     OPTIONAL     -- Need S
+}
+
+-- TAG-UAC-BARRINGPERPLMN-LIST-STOP
+-- TAG-UE-TIMERSANDCONSTANTS-START
+
+UE-TimersAndConstants ::=           SEQUENCE {
+    t300                                ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+    t301                                ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+    t310                                ENUMERATED {ms0, ms50, ms100, ms200, ms500, ms1000, ms2000},
+    n310                                ENUMERATED {n1, n2, n3, n4, n6, n8, n10, n20},
+    t311                                ENUMERATED {ms1000, ms3000, ms5000, ms10000, ms15000, ms20000, ms30000},
+    n311                                ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10},
+    t319                                ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000},
+    ...
+}
+
+-- TAG-UE-TIMERSANDCONSTANTS-STOP
+-- TAG-ULDELAYVALUECONFIG-START
+
+UL-DelayValueConfig-r16 ::=  SEQUENCE {
+    delay-DRBlist                SEQUENCE (SIZE(1..maxDRB)) OF DRB-Identity
+}
+
+-- TAG-ULDELAYVALUECONFIG-STOP
+-- TAG-UPLINKCANCELLATION-START
+
+UplinkCancellation-r16 ::=           SEQUENCE {
+    ci-RNTI-r16                          RNTI-Value,
+    dci-PayloadSizeForCI-r16             INTEGER (0..maxCI-DCI-PayloadSize-r16),
+    ci-ConfigurationPerServingCell-r16   SEQUENCE (SIZE (1..maxNrofServingCells)) OF CI-ConfigurationPerServingCell-r16,
+    ...
+}
+
+CI-ConfigurationPerServingCell-r16 ::=   SEQUENCE {
+    servingCellId                            ServCellIndex,
+    positionInDCI-r16                        INTEGER (0..maxCI-DCI-PayloadSize-r16-1),
+    positionInDCI-ForSUL-r16                 INTEGER (0..maxCI-DCI-PayloadSize-r16-1)                             OPTIONAL,   -- Cond SUL-Only
+    ci-PayloadSize-r16                       ENUMERATED {n1, n2, n4, n5, n7, n8, n10, n14, n16, n20, n28, n32, n35, n42, n56, n112},
+    timeFrequencyRegion-r16                  SEQUENCE {
+        timeDurationForCI-r16                    ENUMERATED {n2, n4, n7, n14}                                      OPTIONAL,   -- Cond SymbolPeriodicity
+        timeGranularityForCI-r16                 ENUMERATED {n1, n2, n4, n7, n14, n28},
+        frequencyRegionForCI-r16                 INTEGER (0..37949),
+        deltaOffset-r16                          INTEGER (0..2),
+        ...
+    },
+    uplinkCancellationPriority-v1610         ENUMERATED {enabled}                                                  OPTIONAL    -- Need S
+}
+
+-- TAG-UPLINKCANCELLATION-STOP
+-- TAG-UPLINKCONFIGCOMMON-START
+
+UplinkConfigCommon ::=              SEQUENCE {
+    frequencyInfoUL                     FrequencyInfoUL                                 OPTIONAL,   -- Cond InterFreqHOAndServCellAdd
+    initialUplinkBWP                    BWP-UplinkCommon                                OPTIONAL,   -- Cond ServCellAdd
+    dummy                               TimeAlignmentTimer
+}
+
+-- TAG-UPLINKCONFIGCOMMON-STOP
+-- TAG-UPLINKCONFIGCOMMONSIB-START
+
+UplinkConfigCommonSIB ::=               SEQUENCE {
+    frequencyInfoUL                         FrequencyInfoUL-SIB,
+    initialUplinkBWP                        BWP-UplinkCommon,
+    timeAlignmentTimerCommon                TimeAlignmentTimer
+}
+
+-- TAG-UPLINKCONFIGCOMMONSIB-STOP
+-- TAG-UPLINKTXDIRECTCURRENTLIST-START
+
+UplinkTxDirectCurrentList ::=           SEQUENCE (SIZE (1..maxNrofServingCells)) OF UplinkTxDirectCurrentCell
+
+UplinkTxDirectCurrentCell ::=           SEQUENCE {
+    servCellIndex                           ServCellIndex,
+    uplinkDirectCurrentBWP                  SEQUENCE (SIZE (1..maxNrofBWPs)) OF UplinkTxDirectCurrentBWP,
+    ...,
+    [[
+    uplinkDirectCurrentBWP-SUL              SEQUENCE (SIZE (1..maxNrofBWPs)) OF UplinkTxDirectCurrentBWP               OPTIONAL
+    ]]
+}
+
+UplinkTxDirectCurrentBWP ::=            SEQUENCE {
+    bwp-Id                                  BWP-Id,
+    shift7dot5kHz                           BOOLEAN,
+    txDirectCurrentLocation                 INTEGER (0..3301)
+}
+
+-- TAG-UPLINKTXDIRECTCURRENTLIST-STOP
+-- TAG-UPLINKTXDIRECTCURRENTTWOCARRIERLIST-START
+
+UplinkTxDirectCurrentTwoCarrierList-r16 ::=   SEQUENCE (SIZE (1..maxNrofTxDC-TwoCarrier-r16)) OF UplinkTxDirectCurrentTwoCarrier-r16
+
+UplinkTxDirectCurrentTwoCarrier-r16 ::=       SEQUENCE {
+    carrierOneInfo-r16                            UplinkTxDirectCurrentCarrierInfo-r16,
+    carrierTwoInfo-r16                            UplinkTxDirectCurrentCarrierInfo-r16,
+    singlePA-TxDirectCurrent-r16                  UplinkTxDirectCurrentTwoCarrierInfo-r16,
+    secondPA-TxDirectCurrent-r16                  UplinkTxDirectCurrentTwoCarrierInfo-r16            OPTIONAL
+}
+
+UplinkTxDirectCurrentCarrierInfo-r16 ::=      SEQUENCE {
+    servCellIndex-r16                             ServCellIndex,
+    servCellInfo-r16                              CHOICE {
+        bwp-Id-r16                                    BWP-Id,
+        deactivatedCarrier-r16                        ENUMERATED {deactivated}
+    }
+}
+
+UplinkTxDirectCurrentTwoCarrierInfo-r16 ::=   SEQUENCE {
+    referenceCarrierIndex-r16                     ServCellIndex,
+    shift7dot5kHz-r16                             BOOLEAN,
+    txDirectCurrentLocation-r16                   INTEGER (0..3301)
+}
+
+-- TAG-UPLINKTXDIRECTCURRENTTWOCARRIERLIST-STOP
+-- TAG-ZP-CSI-RS-RESOURCE-START
+
+ZP-CSI-RS-Resource ::=              SEQUENCE {
+    zp-CSI-RS-ResourceId                ZP-CSI-RS-ResourceId,
+    resourceMapping                     CSI-RS-ResourceMapping,
+    periodicityAndOffset                CSI-ResourcePeriodicityAndOffset                OPTIONAL, --Cond PeriodicOrSemiPersistent
+    ...
+}
+
+ZP-CSI-RS-ResourceId ::=            INTEGER (0..maxNrofZP-CSI-RS-Resources-1)
+
+-- TAG-ZP-CSI-RS-RESOURCE-STOP
+-- TAG-ZP-CSI-RS-RESOURCESET-START
+
+ZP-CSI-RS-ResourceSet ::=           SEQUENCE {
+    zp-CSI-RS-ResourceSetId             ZP-CSI-RS-ResourceSetId,
+    zp-CSI-RS-ResourceIdList            SEQUENCE (SIZE(1..maxNrofZP-CSI-RS-ResourcesPerSet)) OF ZP-CSI-RS-ResourceId,
+    ...
+}
+
+-- TAG-ZP-CSI-RS-RESOURCESET-STOP
+-- TAG-ZP-CSI-RS-RESOURCESETID-START
+
+ZP-CSI-RS-ResourceSetId ::=                     INTEGER (0..maxNrofZP-CSI-RS-ResourceSets-1)
+
+-- TAG-ZP-CSI-RS-RESOURCESETID-STOP
+-- TAG-ACCESSSTRATUMRELEASE-START
+
+AccessStratumRelease ::= ENUMERATED {
+                            rel15, rel16, spare6, spare5, spare4, spare3, spare2, spare1, ... }
+
+-- TAG-ACCESSSTRATUMRELEASE-STOP
+-- TAG-BANDCOMBINATIONLIST-START
+
+BandCombinationList ::=             SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination
+
+BandCombinationList-v1540 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1540
+
+BandCombinationList-v1550 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1550
+
+BandCombinationList-v1560 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1560
+
+BandCombinationList-v1570 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1570
+
+BandCombinationList-v1580 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1580
+
+BandCombinationList-v1590 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1590
+
+BandCombinationList-v1610 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1610
+
+BandCombinationList-v1630 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1630
+
+BandCombinationList-v1640 ::=       SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-v1640
+
+BandCombinationList-UplinkTxSwitch-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-r16
+
+BandCombinationList-UplinkTxSwitch-v1630 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-v1630
+
+BandCombinationList-UplinkTxSwitch-v1640 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombination-UplinkTxSwitch-v1640
+
+BandCombination ::=                 SEQUENCE {
+    bandList                            SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters,
+    featureSetCombination               FeatureSetCombinationId,
+    ca-ParametersEUTRA                  CA-ParametersEUTRA                          OPTIONAL,
+    ca-ParametersNR                     CA-ParametersNR                             OPTIONAL,
+    mrdc-Parameters                     MRDC-Parameters                             OPTIONAL,
+    supportedBandwidthCombinationSet    BIT STRING (SIZE (1..32))                   OPTIONAL,
+    powerClass-v1530                    ENUMERATED {pc2}                            OPTIONAL
+}
+
+BandCombination-v1540::=            SEQUENCE {
+    bandList-v1540                      SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters-v1540,
+    ca-ParametersNR-v1540               CA-ParametersNR-v1540                       OPTIONAL
+}
+
+BandCombination-v1550 ::=           SEQUENCE {
+    ca-ParametersNR-v1550               CA-ParametersNR-v1550
+}
+BandCombination-v1560::=            SEQUENCE {
+    ne-DC-BC                                ENUMERATED {supported}                 OPTIONAL,
+    ca-ParametersNRDC                       CA-ParametersNRDC                      OPTIONAL,
+    ca-ParametersEUTRA-v1560                CA-ParametersEUTRA-v1560               OPTIONAL,
+    ca-ParametersNR-v1560                   CA-ParametersNR-v1560                  OPTIONAL
+}
+
+BandCombination-v1570 ::=           SEQUENCE {
+    ca-ParametersEUTRA-v1570            CA-ParametersEUTRA-v1570
+}
+
+BandCombination-v1580 ::=           SEQUENCE {
+    mrdc-Parameters-v1580               MRDC-Parameters-v1580
+}
+
+BandCombination-v1590::=            SEQUENCE {
+    supportedBandwidthCombinationSetIntraENDC  BIT STRING (SIZE (1..32))           OPTIONAL,
+    mrdc-Parameters-v1590                      MRDC-Parameters-v1590
+}
+
+BandCombination-v1610 ::=          SEQUENCE {
+    bandList-v1610                      SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParameters-v1610  OPTIONAL,
+        ca-ParametersNR-v1610               CA-ParametersNR-v1610                  OPTIONAL,
+        ca-ParametersNRDC-v1610             CA-ParametersNRDC-v1610                OPTIONAL,
+        powerClass-v1610                    ENUMERATED {pc1dot5}                   OPTIONAL,
+        powerClassNRPart-r16                ENUMERATED {pc1, pc2, pc3, pc5}        OPTIONAL,
+        featureSetCombinationDAPS-r16       FeatureSetCombinationId                OPTIONAL,
+        mrdc-Parameters-v1620               MRDC-Parameters-v1620                  OPTIONAL
+}
+
+BandCombination-v1630 ::=                   SEQUENCE {
+    ca-ParametersNR-v1630                       CA-ParametersNR-v1630                                             OPTIONAL,
+    ca-ParametersNRDC-v1630                     CA-ParametersNRDC-v1630                                           OPTIONAL,
+    mrdc-Parameters-v1630                       MRDC-Parameters-v1630                                             OPTIONAL,
+    supportedTxBandCombListPerBC-Sidelink-r16   BIT STRING (SIZE (1..maxBandComb))                                OPTIONAL,
+    supportedRxBandCombListPerBC-Sidelink-r16   BIT STRING (SIZE (1..maxBandComb))                                OPTIONAL,
+    scalingFactorTxSidelink-r16                 SEQUENCE (SIZE (1..maxBandComb)) OF ScalingFactorSidelink-r16     OPTIONAL,
+    scalingFactorRxSidelink-r16                 SEQUENCE (SIZE (1..maxBandComb)) OF ScalingFactorSidelink-r16     OPTIONAL
+}
+
+BandCombination-v1640 ::=                   SEQUENCE {
+    ca-ParametersNR-v1640                       CA-ParametersNR-v1640                                             OPTIONAL,
+    ca-ParametersNRDC-v1640                     CA-ParametersNRDC-v1640                                           OPTIONAL
+}
+
+BandCombination-UplinkTxSwitch-r16 ::= SEQUENCE {
+    bandCombination-r16                 BandCombination,
+    bandCombination-v1540               BandCombination-v1540                      OPTIONAL,
+    bandCombination-v1560               BandCombination-v1560                      OPTIONAL,
+    bandCombination-v1570               BandCombination-v1570                      OPTIONAL,
+    bandCombination-v1580               BandCombination-v1580                      OPTIONAL,
+    bandCombination-v1590               BandCombination-v1590                      OPTIONAL,
+    bandCombination-v1610               BandCombination-v1610                      OPTIONAL,
+    supportedBandPairListNR-r16         SEQUENCE (SIZE (1..maxULTxSwitchingBandPairs)) OF ULTxSwitchingBandPair-r16,
+    uplinkTxSwitching-OptionSupport-r16 ENUMERATED {switchedUL, dualUL, both}      OPTIONAL,
+    uplinkTxSwitching-PowerBoosting-r16 ENUMERATED {supported}                     OPTIONAL,
+    ...
+}
+
+BandCombination-UplinkTxSwitch-v1630 ::=    SEQUENCE {
+    bandCombination-v1630                       BandCombination-v1630              OPTIONAL
+}
+
+BandCombination-UplinkTxSwitch-v1640 ::=    SEQUENCE {
+    bandCombination-v1640                       BandCombination-v1640              OPTIONAL
+}
+
+ULTxSwitchingBandPair-r16 ::=       SEQUENCE {
+    bandIndexUL1-r16                    INTEGER(1..maxSimultaneousBands),
+    bandIndexUL2-r16                    INTEGER(1..maxSimultaneousBands),
+    uplinkTxSwitchingPeriod-r16         ENUMERATED {n35us, n140us, n210us},
+    uplinkTxSwitching-DL-Interruption-r16 BIT STRING (SIZE(1..maxSimultaneousBands)) OPTIONAL
+}
+
+BandParameters ::=                      CHOICE {
+    eutra                               SEQUENCE {
+        bandEUTRA                           FreqBandIndicatorEUTRA,
+        ca-BandwidthClassDL-EUTRA           CA-BandwidthClassEUTRA                 OPTIONAL,
+        ca-BandwidthClassUL-EUTRA           CA-BandwidthClassEUTRA                 OPTIONAL
+    },
+    nr                                  SEQUENCE {
+        bandNR                              FreqBandIndicatorNR,
+        ca-BandwidthClassDL-NR              CA-BandwidthClassNR                    OPTIONAL,
+        ca-BandwidthClassUL-NR              CA-BandwidthClassNR                    OPTIONAL
+    }
+}
+
+BandParameters-v1540 ::=            SEQUENCE {
+    srs-CarrierSwitch                   CHOICE {
+        nr                                  SEQUENCE {
+            srs-SwitchingTimesListNR            SEQUENCE (SIZE (1..maxSimultaneousBands)) OF SRS-SwitchingTimeNR
+        },
+        eutra                               SEQUENCE {
+            srs-SwitchingTimesListEUTRA         SEQUENCE (SIZE (1..maxSimultaneousBands)) OF SRS-SwitchingTimeEUTRA
+        }
+    }                                                                              OPTIONAL,
+    srs-TxSwitch                    SEQUENCE {
+        supportedSRS-TxPortSwitch       ENUMERATED {t1r2, t1r4, t2r4, t1r4-t2r4, t1r1, t2r2, t4r4, notSupported},
+        txSwitchImpactToRx              INTEGER (1..32)                            OPTIONAL,
+        txSwitchWithAnotherBand         INTEGER (1..32)                            OPTIONAL
+    }                                                                              OPTIONAL
+}
+
+BandParameters-v1610 ::=         SEQUENCE {
+    srs-TxSwitch-v1610               SEQUENCE {
+        supportedSRS-TxPortSwitch-v1610  ENUMERATED {t1r1-t1r2, t1r1-t1r2-t1r4, t1r1-t1r2-t2r2-t2r4, t1r1-t1r2-t2r2-t1r4-t2r4,
+                                                         t1r1-t2r2, t1r1-t2r2-t4r4}
+    }                                                                              OPTIONAL
+}
+
+ScalingFactorSidelink-r16 ::=       ENUMERATED {f0p4, f0p75, f0p8, f1}
+
+-- TAG-BANDCOMBINATIONLIST-STOP
+-- TAG-BANDCOMBINATIONLISTSIDELINKEUTRANR-START
+
+BandCombinationListSidelinkEUTRA-NR-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkEUTRA-NR-r16
+
+BandCombinationListSidelinkEUTRA-NR-v1630 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkEUTRA-NR-v1630
+
+BandCombinationParametersSidelinkEUTRA-NR-r16 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelinkEUTRA-NR-r16
+
+BandCombinationParametersSidelinkEUTRA-NR-v1630 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelinkEUTRA-NR-v1630
+
+BandParametersSidelinkEUTRA-NR-r16 ::= CHOICE {
+    eutra                                  SEQUENCE {
+        bandParametersSidelinkEUTRA1-r16       OCTET STRING                         OPTIONAL,
+        bandParametersSidelinkEUTRA2-r16       OCTET STRING                         OPTIONAL
+    },
+    nr                                     SEQUENCE {
+        bandParametersSidelinkNR-r16           BandParametersSidelink-r16
+    }
+}
+
+BandParametersSidelinkEUTRA-NR-v1630 ::= CHOICE {
+    eutra                                    NULL,
+    nr                                       SEQUENCE {
+        tx-Sidelink-r16                          ENUMERATED {supported}                          OPTIONAL,
+        rx-Sidelink-r16                          ENUMERATED {supported}                          OPTIONAL,
+        sl-CrossCarrierScheduling-r16            ENUMERATED {supported}                          OPTIONAL
+    }
+}
+
+BandParametersSidelink-r16 ::= SEQUENCE {
+    freqBandSidelink-r16           FreqBandIndicatorNR
+}
+
+-- TAG-BANDCOMBINATIONLISTSIDELINKEUTRANR-STOP
+-- TAG-CA-BANDWIDTHCLASSEUTRA-START
+
+CA-BandwidthClassEUTRA ::=          ENUMERATED {a, b, c, d, e, f, ...}
+
+-- TAG-CA-BANDWIDTHCLASSEUTRA-STOP
+-- TAG-CA-BANDWIDTHCLASSNR-START
+
+CA-BandwidthClassNR ::=             ENUMERATED {a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, ...}
+
+-- TAG-CA-BANDWIDTHCLASSNR-STOP
+-- TAG-CA-PARAMETERSEUTRA-START
+
+CA-ParametersEUTRA ::=                          SEQUENCE {
+    multipleTimingAdvance                           ENUMERATED {supported}                          OPTIONAL,
+    simultaneousRx-Tx                               ENUMERATED {supported}                          OPTIONAL,
+    supportedNAICS-2CRS-AP                          BIT STRING (SIZE (1..8))                        OPTIONAL,
+    additionalRx-Tx-PerformanceReq                  ENUMERATED {supported}                          OPTIONAL,
+    ue-CA-PowerClass-N                              ENUMERATED {class2}                             OPTIONAL,
+    supportedBandwidthCombinationSetEUTRA-v1530     BIT STRING (SIZE (1..32))                       OPTIONAL,
+    ...
+}
+
+CA-ParametersEUTRA-v1560 ::=                    SEQUENCE {
+    fd-MIMO-TotalWeightedLayers                     INTEGER (2..128)                                OPTIONAL
+}
+
+CA-ParametersEUTRA-v1570 ::=                    SEQUENCE {
+    dl-1024QAM-TotalWeightedLayers                  INTEGER (0..10)                                 OPTIONAL
+}
+
+-- TAG-CA-PARAMETERSEUTRA-STOP
+-- TAG-CA-PARAMETERSNR-START
+
+CA-ParametersNR ::=                 SEQUENCE {
+    dummy                                         ENUMERATED {supported}      OPTIONAL,
+    parallelTxSRS-PUCCH-PUSCH                     ENUMERATED {supported}      OPTIONAL,
+    parallelTxPRACH-SRS-PUCCH-PUSCH               ENUMERATED {supported}      OPTIONAL,
+    simultaneousRxTxInterBandCA                   ENUMERATED {supported}      OPTIONAL,
+    simultaneousRxTxSUL                           ENUMERATED {supported}      OPTIONAL,
+    diffNumerologyAcrossPUCCH-Group               ENUMERATED {supported}      OPTIONAL,
+    diffNumerologyWithinPUCCH-GroupSmallerSCS     ENUMERATED {supported}      OPTIONAL,
+    supportedNumberTAG                            ENUMERATED {n2, n3, n4}     OPTIONAL,
+    ...
+}
+
+CA-ParametersNR-v1540 ::=           SEQUENCE {
+    simultaneousSRS-AssocCSI-RS-AllCC                       INTEGER (5..32)         OPTIONAL,
+    csi-RS-IM-ReceptionForFeedbackPerBandComb               SEQUENCE {
+        maxNumberSimultaneousNZP-CSI-RS-ActBWP-AllCC            INTEGER (1..64)     OPTIONAL,
+        totalNumberPortsSimultaneousNZP-CSI-RS-ActBWP-AllCC     INTEGER (2..256)    OPTIONAL
+    }                                                                               OPTIONAL,
+    simultaneousCSI-ReportsAllCC                            INTEGER (5..32)         OPTIONAL,
+    dualPA-Architecture                                     ENUMERATED {supported}  OPTIONAL
+}
+
+CA-ParametersNR-v1550 ::=           SEQUENCE {
+    dummy                               ENUMERATED {supported}                      OPTIONAL
+}
+
+CA-ParametersNR-v1560 ::=           SEQUENCE {
+    diffNumerologyWithinPUCCH-GroupLargerSCS      ENUMERATED {supported}            OPTIONAL
+}
+
+CA-ParametersNR-v1610 ::=           SEQUENCE {
+     -- R1 9-3: Parallel MsgA and SRS/PUCCH/PUSCH transmissions across CCs in inter-band CA
+    parallelTxMsgA-SRS-PUCCH-PUSCH-r16                ENUMERATED {supported}        OPTIONAL,
+     -- R1 9-4: MsgA operation in a band combination including SUL
+    msgA-SUL-r16                                      ENUMERATED {supported}        OPTIONAL,
+    -- R1 10-9c: Joint search space group switching across multiple cells
+    jointSearchSpaceGroupSwitchingAcrossCells-r16     ENUMERATED {supported}        OPTIONAL,
+    -- R1 14-5: Half-duplex UE behaviour in TDD CA for same SCS
+    half-DuplexTDD-CA-SameSCS-r16                     ENUMERATED {supported}        OPTIONAL,
+    -- R1 18-4: SCell dormancy within active time
+    scellDormancyWithinActiveTime-r16                 ENUMERATED {supported}        OPTIONAL,
+    -- R1 18-4a: SCell dormancy outside active time
+    scellDormancyOutsideActiveTime-r16                ENUMERATED {supported}        OPTIONAL,
+    -- R1 18-6: Cross-carrier A-CSI RS triggering with different SCS
+    crossCarrierA-CSI-trigDiffSCS-r16                 ENUMERATED {higherA-CSI-SCS,lowerA-CSI-SCS,both}   OPTIONAL,
+    -- R1 18-6a: Default QCL assumption for cross-carrier A-CSI-RS triggering
+    defaultQCL-CrossCarrierA-CSI-Trig-r16             ENUMERATED {diffOnly, both}   OPTIONAL,
+    -- R1 18-7: CA with non-aligned frame boundaries for inter-band CA
+    interCA-NonAlignedFrame-r16                       ENUMERATED {supported}        OPTIONAL,
+    simul-SRS-Trans-BC-r16                            ENUMERATED {n2}               OPTIONAL,
+    interFreqDAPS-r16                                 SEQUENCE {
+        interFreqAsyncDAPS-r16                            ENUMERATED {supported}    OPTIONAL,
+        interFreqDiffSCS-DAPS-r16                         ENUMERATED {supported}    OPTIONAL,
+        interFreqMultiUL-TransmissionDAPS-r16             ENUMERATED {supported}    OPTIONAL,
+        interFreqSemiStaticPowerSharingDAPS-Mode1-r16     ENUMERATED {supported}    OPTIONAL,
+        interFreqSemiStaticPowerSharingDAPS-Mode2-r16     ENUMERATED {supported}    OPTIONAL,
+        interFreqDynamicPowerSharingDAPS-r16              ENUMERATED {short, long}  OPTIONAL,
+        interFreqUL-TransCancellationDAPS-r16             ENUMERATED {supported}    OPTIONAL
+    }                                                                               OPTIONAL,
+    codebookParametersPerBC-r16                       CodebookParameters-v1610      OPTIONAL,
+    -- R1 16-2a-10 Value of R for BD/CCE
+    blindDetectFactor-r16                             INTEGER (1..2)                OPTIONAL,
+    -- R1 11-2a: Capability on the number of CCs for monitoring a maximum number of BDs and non-overlapped CCEs per span when configured
+    -- with DL CA with Rel-16 PDCCH monitoring capability on all the serving cells
+    pdcch-MonitoringCA-r16                            SEQUENCE {
+        maxNumberOfMonitoringCC-r16                       INTEGER (2..16),
+        supportedSpanArrangement-r16                      ENUMERATED {alignedOnly, alignedAndNonAligned}
+    }                                                                               OPTIONAL,
+    -- R1 11-2c: Number of carriers for CCE/BD scaling with DL CA with mix of Rel. 16 and Rel. 15 PDCCH monitoring capabilities on
+    -- different carriers
+    pdcch-BlindDetectionCA-Mixed-r16                  SEQUENCE {
+        pdcch-BlindDetectionCA1-r16                       INTEGER (1..15),
+        pdcch-BlindDetectionCA2-r16                       INTEGER (1..15),
+        supportedSpanArrangement-r16                      ENUMERATED {alignedOnly, alignedAndNonAligned}
+    }                                                                               OPTIONAL,
+    -- R1 11-2d: Capability on the number of CCs for monitoring a maximum number of BDs and non-overlapped CCEs per span for MCG and for
+    -- SCG when configured for NR-DC operation with Rel-16 PDCCH monitoring capability on all the serving cells
+    pdcch-BlindDetectionMCG-UE-r16                    INTEGER (1..14)               OPTIONAL,
+    pdcch-BlindDetectionSCG-UE-r16                    INTEGER (1..14)               OPTIONAL,
+    -- R1 11-2e: Number of carriers for CCE/BD scaling for MCG and for SCG when configured for NR-DC operation with mix of Rel. 16 and
+    -- Rel. 15 PDCCH monitoring capabilities on different carriers
+    pdcch-BlindDetectionMCG-UE-Mixed-r16              SEQUENCE {
+        pdcch-BlindDetectionMCG-UE1-r16                   INTEGER (0..15),
+        pdcch-BlindDetectionMCG-UE2-r16                   INTEGER (0..15)
+    }                                                                               OPTIONAL,
+    pdcch-BlindDetectionSCG-UE-Mixed-r16              SEQUENCE {
+        pdcch-BlindDetectionSCG-UE1-r16                   INTEGER (0..15),
+        pdcch-BlindDetectionSCG-UE2-r16                   INTEGER (0..15)
+    }                                                                               OPTIONAL,
+     -- R1 18-5 cross-carrier scheduling with different SCS in DL CA
+    crossCarrierSchedulingDL-DiffSCS-r16              ENUMERATED {low-to-high, high-to-low, both} OPTIONAL,
+    -- R1 18-5a Default QCL assumption for cross-carrier scheduling
+    crossCarrierSchedulingDefaultQCL-r16              ENUMERATED {diff-only, both}  OPTIONAL,
+    -- R1 18-5b cross-carrier scheduling with different SCS in UL CA
+    crossCarrierSchedulingUL-DiffSCS-r16              ENUMERATED {low-to-high, high-to-low, both} OPTIONAL,
+    -- R1 13.19a Simultaneous positioning SRS and MIMO SRS transmission for a given BC
+    simul-SRS-MIMO-Trans-BC-r16                       ENUMERATED {n2}               OPTIONAL,
+    -- R1 16-3a, 16-3a-1, 16-3b, 16-3b-1: New Individual Codebook
+    codebookParametersAdditionPerBC-r16               CodebookParametersAdditionPerBC-r16         OPTIONAL,
+    -- R1 16-8: Mixed codebook
+    codebookComboParametersAdditionPerBC-r16          CodebookComboParametersAdditionPerBC-r16    OPTIONAL
+}
+
+CA-ParametersNR-v1630 ::= SEQUENCE {
+    -- R1 22-5b: Simultaneous transmission of SRS for antenna switching and SRS for CB/NCB /BM for inter-band UL CA
+    -- R1 22-5d: Simultaneous transmission of SRS for antenna switching for inter-band UL CA	
+    simulTX-SRS-AntSwitchingInterBandUL-CA-r16        SimulSRS-ForAntennaSwitching-r16            OPTIONAL,
+    -- R4 8-5: supported beam management type for inter-band CA	
+    beamManagementType-r16                            ENUMERATED {ibm, cbm}                       OPTIONAL,
+    -- R4 7-3a: UL frequency separation class with aggregate BW and Gap BW
+    intraBandFreqSeparationUL-AggBW-GapBW-r16         ENUMERATED {classI, classII, classIII}      OPTIONAL,
+    -- RAN 89: Case B in case of Inter-band CA with non-aligned frame boundaries
+    interCA-NonAlignedFrame-B-r16                     ENUMERATED {supported}                      OPTIONAL
+}
+
+CA-ParametersNR-v1640 ::= SEQUENCE {
+    -- R4 7-5: Support of reporting UL Tx DC locations for uplink intra-band CA.
+    uplinkTxDC-TwoCarrierReport-r16                               ENUMERATED {supported}          OPTIONAL,
+    -- RAN 22-6: Support of up to 3 different numerologies in the same NR PUCCH group for NR part of EN-DC, NGEN-DC, NE-DC and NR-CA 
+    -- where UE is not configured with two NR PUCCH groups
+    maxUpTo3Diff-NumerologiesConfigSinglePUCCH-grp-r16            PUCCH-Grp-CarrierTypes-r16      OPTIONAL,
+    -- RAN 22-6a: Support of up to 4 different numerologies in the same NR PUCCH group for NR part of EN-DC, NGEN-DC, NE-DC and NR-CA 
+    -- where UE is not configured with two NR PUCCH groups
+    maxUpTo4Diff-NumerologiesConfigSinglePUCCH-grp-r16            PUCCH-Grp-CarrierTypes-r16      OPTIONAL,
+    -- RAN 22-7: Support two PUCCH groups for NR-CA with 3 or more bands with at least two carrier types 
+    twoPUCCH-Grp-ConfigurationsList-r16 SEQUENCE (SIZE (1..maxTwoPUCCH-Grp-ConfigList-r16)) OF TwoPUCCH-Grp-Configurations-r16 OPTIONAL,
+    -- R1 22-7a: Different numerology across NR PUCCH groups
+    diffNumerologyAcrossPUCCH-Group-CarrierTypes-r16              ENUMERATED {supported}          OPTIONAL,
+    -- R1 22-7b: Different numerologies across NR carriers within the same NR PUCCH group, with PUCCH on a carrier of smaller SCS
+    diffNumerologyWithinPUCCH-GroupSmallerSCS-CarrierTypes-r16    ENUMERATED {supported}          OPTIONAL,
+    -- R1 22-7c: Different numerologies across NR carriers within the same NR PUCCH group, with PUCCH on a carrier of larger SCS
+    diffNumerologyWithinPUCCH-GroupLargerSCS-CarrierTypes-r16     ENUMERATED {supported}          OPTIONAL,
+    -- R1 11-2f: add the replicated FGs of 11-2a/c with restriction for non-aligned span case
+    -- with DL CA with Rel-16 PDCCH monitoring capability on all the serving cells
+    pdcch-MonitoringCA-NonAlignedSpan-r16                         INTEGER (2..16)                 OPTIONAL,
+    -- R1 11-2g: add the replicated FGs of 11-2a/c with restriction for non-aligned span case
+    pdcch-BlindDetectionCA-Mixed-NonAlignedSpan-r16               SEQUENCE {
+        pdcch-BlindDetectionCA1-r16                                   INTEGER (1..15),
+        pdcch-BlindDetectionCA2-r16                                   INTEGER (1..15)
+    }                                                                                             OPTIONAL
+}
+
+SimulSRS-ForAntennaSwitching-r16 ::= SEQUENCE {
+    supportSRS-xTyR-xLessThanY-r16       ENUMERATED {supported}                     OPTIONAL,
+    supportSRS-xTyR-xEqualToY-r16        ENUMERATED {supported}                     OPTIONAL,
+    supportSRS-AntennaSwitching-r16      ENUMERATED {supported}                     OPTIONAL
+}
+
+TwoPUCCH-Grp-Configurations-r16 ::=  SEQUENCE {
+    pucch-PrimaryGroupMapping-r16        TwoPUCCH-Grp-ConfigParams-r16,
+    pucch-SecondaryGroupMapping-r16      TwoPUCCH-Grp-ConfigParams-r16
+}
+
+TwoPUCCH-Grp-ConfigParams-r16 ::=    SEQUENCE {
+    pucch-GroupMapping-r16               PUCCH-Grp-CarrierTypes-r16,
+    pucch-TX-r16                         PUCCH-Grp-CarrierTypes-r16
+}
+
+PUCCH-Grp-CarrierTypes-r16 ::=       SEQUENCE {
+    fr1-NonSharedTDD-r16                 ENUMERATED {supported}                     OPTIONAL,
+    fr1-SharedTDD-r16                    ENUMERATED {supported}                     OPTIONAL,
+    fr1-NonSharedFDD-r16                 ENUMERATED {supported}                     OPTIONAL,
+    fr2-r16                              ENUMERATED {supported}                     OPTIONAL
+}
+
+-- TAG-CA-PARAMETERSNR-STOP
+-- TAG-CA-PARAMETERS-NRDC-START
+
+CA-ParametersNRDC ::=                         SEQUENCE {
+     ca-ParametersNR-ForDC                       CA-ParametersNR                              OPTIONAL,
+     ca-ParametersNR-ForDC-v1540                 CA-ParametersNR-v1540                        OPTIONAL,
+     ca-ParametersNR-ForDC-v1550                 CA-ParametersNR-v1550                        OPTIONAL,
+     ca-ParametersNR-ForDC-v1560                 CA-ParametersNR-v1560                        OPTIONAL,
+     featureSetCombinationDC                     FeatureSetCombinationId                      OPTIONAL
+}
+
+CA-ParametersNRDC-v1610 ::= SEQUENCE {
+    -- R1 18-1: Semi-static power sharing mode1 between MCG and SCG cells of same FR for NR dual connectivity
+    intraFR-NR-DC-PwrSharingMode1-r16        ENUMERATED {supported}         OPTIONAL,
+    -- R1 18-1a: Semi-static power sharing mode 2 between MCG and SCG cells of same FR for NR dual connectivity
+    intraFR-NR-DC-PwrSharingMode2-r16        ENUMERATED {supported}         OPTIONAL,
+    -- R1 18-1b: Dynamic power sharing between MCG and SCG cells of same FR for NR dual connectivity
+    intraFR-NR-DC-DynamicPwrSharing-r16      ENUMERATED {short, long}       OPTIONAL,
+    asyncNRDC-r16                            ENUMERATED {supported}         OPTIONAL
+}
+
+CA-ParametersNRDC-v1630 ::=                         SEQUENCE {
+     ca-ParametersNR-ForDC-v1610                 CA-ParametersNR-v1610                        OPTIONAL,
+     ca-ParametersNR-ForDC-v1630                 CA-ParametersNR-v1630                        OPTIONAL
+}
+
+CA-ParametersNRDC-v1640 ::=                  SEQUENCE {
+    ca-ParametersNR-ForDC-v1640                  CA-ParametersNR-v1640                        OPTIONAL
+}
+
+-- TAG-CA-PARAMETERS-NRDC-STOP
+-- TAG-CARRIERAGGREGATIONVARIANT-START
+
+CarrierAggregationVariant ::=          SEQUENCE {
+    fr1fdd-FR1TDD-CA-SpCellOnFR1FDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-CA-SpCellOnFR1TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR2TDD-CA-SpCellOnFR1FDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR2TDD-CA-SpCellOnFR2TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1tdd-FR2TDD-CA-SpCellOnFR1TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1tdd-FR2TDD-CA-SpCellOnFR2TDD         ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR1FDD  ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR1TDD  ENUMERATED {supported}                      OPTIONAL,
+    fr1fdd-FR1TDD-FR2TDD-CA-SpCellOnFR2TDD  ENUMERATED {supported}                      OPTIONAL
+}
+
+-- TAG-CARRIERAGGREGATIONVARIANT-STOP
+-- TAG-CODEBOOKPARAMETERS-START
+
+CodebookParameters ::=             SEQUENCE {
+    type1                                  SEQUENCE {
+        singlePanel                           SEQUENCE {
+            supportedCSI-RS-ResourceList      SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+            modes                                  ENUMERATED {mode1, mode1andMode2},
+            maxNumberCSI-RS-PerResourceSet    INTEGER (1..8)
+        },
+        multiPanel                            SEQUENCE {
+            supportedCSI-RS-ResourceList      SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+            modes                                  ENUMERATED {mode1, mode2, both},
+            nrofPanels                            ENUMERATED {n2, n4},
+            maxNumberCSI-RS-PerResourceSet    INTEGER (1..8)
+        }                                                                                                               OPTIONAL
+    },
+    type2                                  SEQUENCE {
+        supportedCSI-RS-ResourceList        SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+        parameterLx                           INTEGER (2..4),
+        amplitudeScalingType                 ENUMERATED {wideband, widebandAndSubband},
+        amplitudeSubsetRestriction          ENUMERATED {supported}              OPTIONAL
+    }                                                                                                                   OPTIONAL,
+    type2-PortSelection                  SEQUENCE {
+        supportedCSI-RS-ResourceList        SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource,
+        parameterLx                           INTEGER (2..4),
+        amplitudeScalingType                 ENUMERATED {wideband, widebandAndSubband}
+    }                                                                                                                   OPTIONAL
+}
+
+CodebookParameters-v1610 ::=        SEQUENCE {
+    supportedCSI-RS-ResourceListAlt-r16  SEQUENCE {
+        type1-SinglePanel-r16                SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL,
+        type1-MultiPanel-r16                 SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL,
+        type2-r16                            SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL,
+        type2-PortSelection-r16              SEQUENCE (SIZE (1..maxNrofCSI-RS-Resources)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)  OPTIONAL
+    }                                                                                                                                       OPTIONAL
+}
+
+CodebookParametersAddition-r16 ::=      SEQUENCE {
+    etype2-r16                             SEQUENCE {
+        -- R1 16-3a Regular eType 2 R=1
+        etype2R1-r16                           SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        },
+        -- R1 16-3a-1 Regular eType 2 R=2
+        etype2R2-r16                           SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        }                                                                  OPTIONAL,
+        -- R1 16-3a-2: Support of parameter combinations 7-8
+        paramComb7-8-r16                       ENUMERATED {supported}      OPTIONAL,
+        -- R1 16-3a-3: Support of rank 3,4
+        rank3-4-r16                            ENUMERATED {supported}      OPTIONAL,
+        -- R1 16-3a-4: CBSR with soft amplitude restriction
+        amplitudeSubsetRestriction-r16         ENUMERATED {supported}      OPTIONAL
+    }                                                                      OPTIONAL,
+    etype2-PS-r16                          SEQUENCE {
+        -- R1 16-3b Regular eType 2 R=1 PortSelection
+        etype2R1-PortSelection-r16             SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        },
+        -- R1 16-3b-1 Regular eType 2 R=2 PortSelection
+        etype2R2-PortSelection-r16             SEQUENCE {
+            supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF
+                                                                                              INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+        }                                                                  OPTIONAL,
+        -- R1 16-3b-2: Support of rank 3,4
+        rank3-4-r16                            ENUMERATED {supported}      OPTIONAL
+    }                                                                      OPTIONAL
+}
+
+CodebookComboParametersAddition-r16 ::= SEQUENCE {
+    -- R1 16-8 Mixed codebook types
+    type1SP-Type2-null-r16                 SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-Type2PS-null-r16               SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R1-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R2-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R1PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-eType2R2PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1SP-Type2-Type2PS-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-Type2-null-r16                 SEQUENCE {
+    supportedCSI-RS-ResourceListAdd-r16        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-Type2PS-null-r16               SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R1-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R2-null-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R1PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-eType2R2PS-null-r16            SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL,
+    type1MP-Type2-Type2PS-r16              SEQUENCE {
+        supportedCSI-RS-ResourceListAdd-r16    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+    }                                                          OPTIONAL
+}
+
+CodebookParametersAdditionPerBC-r16::=  SEQUENCE {
+    -- R1 16-3a Regular eType 2 R=1
+    etype2R1-r16                    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    -- R1 16-3a-1 Regular eType 2 R=2
+    etype2R2-r16                    SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                                      OPTIONAL,
+    -- R1 16-3b Regular eType 2 R=1 PortSelection
+    etype2R1-PortSelection-r16      SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    -- R1 16-3b-1 Regular eType 2 R=2 PortSelection
+    etype2R2-PortSelection-r16      SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL
+}
+
+CodebookComboParametersAdditionPerBC-r16::= SEQUENCE {
+    -- R1 16-8 Mixed codebook types
+    type1SP-Type2-null-r16          SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-Type2PS-null-r16        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-eType2R1-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                              OPTIONAL,
+    type1SP-eType2R2-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-eType2R1PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-eType2R2PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1SP-Type2-Type2PS-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-Type2-null-r16          SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-Type2PS-null-r16        SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R1-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R2-null-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R1PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-eType2R2PS-null-r16     SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL,
+    type1MP-Type2-Type2PS-r16       SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesExt-r16)) OF INTEGER (0..maxNrofCSI-RS-ResourcesAlt-1-r16)
+                                                               OPTIONAL
+}
+
+CodebookVariantsList-r16 ::= SEQUENCE (SIZE (1..maxNrofCSI-RS-ResourcesAlt-r16)) OF SupportedCSI-RS-Resource
+
+SupportedCSI-RS-Resource ::=     SEQUENCE {
+    maxNumberTxPortsPerResource      ENUMERATED {p2, p4, p8, p12, p16, p24, p32},
+    maxNumberResourcesPerBand        INTEGER (1..64),
+    totalNumberTxPortsPerBand        INTEGER (2..256)
+}
+
+-- TAG-CODEBOOKPARAMETERS-STOP
+-- TAG-FEATURESETCOMBINATION-START
+
+FeatureSetCombination ::=       SEQUENCE (SIZE (1..maxSimultaneousBands)) OF FeatureSetsPerBand
+
+FeatureSetsPerBand ::=          SEQUENCE (SIZE (1..maxFeatureSetsPerBand)) OF FeatureSet
+
+FeatureSet ::=                  CHOICE {
+    eutra                           SEQUENCE {
+        downlinkSetEUTRA                FeatureSetEUTRA-DownlinkId,
+        uplinkSetEUTRA                  FeatureSetEUTRA-UplinkId
+    },
+    nr                              SEQUENCE {
+        downlinkSetNR                   FeatureSetDownlinkId,
+        uplinkSetNR                     FeatureSetUplinkId
+    }
+}
+
+-- TAG-FEATURESETCOMBINATION-STOP
+-- TAG-FEATURESETCOMBINATIONID-START
+
+FeatureSetCombinationId ::=         INTEGER (0.. maxFeatureSetCombinations)
+
+-- TAG-FEATURESETCOMBINATIONID-STOP
+-- TAG-FEATURESETDOWNLINK-START
+
+FeatureSetDownlink ::=                  SEQUENCE {
+    featureSetListPerDownlinkCC             SEQUENCE (SIZE (1..maxNrofServingCells)) OF FeatureSetDownlinkPerCC-Id,
+
+    intraBandFreqSeparationDL               FreqSeparationClass                                                     OPTIONAL,
+    scalingFactor                           ENUMERATED {f0p4, f0p75, f0p8}                                          OPTIONAL,
+    dummy8                                  ENUMERATED {supported}                                                  OPTIONAL,
+    scellWithoutSSB                         ENUMERATED {supported}                                                  OPTIONAL,
+    csi-RS-MeasSCellWithoutSSB              ENUMERATED {supported}                                                  OPTIONAL,
+    dummy1                                  ENUMERATED {supported}                                                  OPTIONAL,
+    type1-3-CSS                             ENUMERATED {supported}                                                  OPTIONAL,
+    pdcch-MonitoringAnyOccasions            ENUMERATED {withoutDCI-Gap, withDCI-Gap}                                OPTIONAL,
+    dummy2                                  ENUMERATED {supported}                                                  OPTIONAL,
+    ue-SpecificUL-DL-Assignment             ENUMERATED {supported}                                                  OPTIONAL,
+    searchSpaceSharingCA-DL                 ENUMERATED {supported}                                                  OPTIONAL,
+    timeDurationForQCL                      SEQUENCE {
+        scs-60kHz                           ENUMERATED {s7, s14, s28}                                               OPTIONAL,
+        scs-120kHz                          ENUMERATED {s14, s28}                                                   OPTIONAL
+    }                                                                                                           OPTIONAL,
+    pdsch-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+        scs-15kHz                               ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL,
+        scs-30kHz                               ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL,
+        scs-60kHz                               ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL,
+        scs-120kHz                              ENUMERATED {upto2, upto4, upto7}                                    OPTIONAL
+    }                                                                                                           OPTIONAL,
+    dummy3                                  DummyA                                                                  OPTIONAL,
+    dummy4                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyB                        OPTIONAL,
+    dummy5                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyC                        OPTIONAL,
+    dummy6                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyD                        OPTIONAL,
+    dummy7                                  SEQUENCE (SIZE (1.. maxNrofCodebooks)) OF DummyE                        OPTIONAL
+}
+
+FeatureSetDownlink-v1540 ::= SEQUENCE {
+    oneFL-DMRS-TwoAdditionalDMRS-DL         ENUMERATED {supported}                       OPTIONAL,
+    additionalDMRS-DL-Alt                   ENUMERATED {supported}                       OPTIONAL,
+    twoFL-DMRS-TwoAdditionalDMRS-DL         ENUMERATED {supported}                       OPTIONAL,
+    oneFL-DMRS-ThreeAdditionalDMRS-DL       ENUMERATED {supported}                       OPTIONAL,
+    pdcch-MonitoringAnyOccasionsWithSpanGap SEQUENCE {
+        scs-15kHz                               ENUMERATED {set1, set2, set3}                OPTIONAL,
+        scs-30kHz                               ENUMERATED {set1, set2, set3}                OPTIONAL,
+        scs-60kHz                               ENUMERATED {set1, set2, set3}                OPTIONAL,
+        scs-120kHz                              ENUMERATED {set1, set2, set3}                OPTIONAL
+    }                                                                                    OPTIONAL,
+    pdsch-SeparationWithGap                 ENUMERATED {supported}                       OPTIONAL,
+    pdsch-ProcessingType2                   SEQUENCE {
+        scs-15kHz                               ProcessingParameters                         OPTIONAL,
+        scs-30kHz                               ProcessingParameters                         OPTIONAL,
+        scs-60kHz                               ProcessingParameters                         OPTIONAL
+    } OPTIONAL,
+    pdsch-ProcessingType2-Limited           SEQUENCE {
+        differentTB-PerSlot-SCS-30kHz           ENUMERATED {upto1, upto2, upto4, upto7}
+    } OPTIONAL,
+    dl-MCS-TableAlt-DynamicIndication       ENUMERATED {supported}                       OPTIONAL
+}
+
+FeatureSetDownlink-v15a0 ::= SEQUENCE {
+    supportedSRS-Resources              SRS-Resources                                    OPTIONAL
+}
+
+FeatureSetDownlink-v1610 ::=   SEQUENCE {
+    -- R1 22-4e/4f/4g/4h: CBG based reception for DL with unicast PDSCH(s) per slot per CC with UE processing time Capability 1
+    cbgPDSCH-ProcessingType1-DifferentTB-PerSlot-r16   SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one, upto2, upto4, upto7} OPTIONAL
+    } OPTIONAL,
+
+    -- R1 22-3e/3f/3g/3h: CBG based reception for DL with unicast PDSCH(s) per slot per CC with UE processing time Capability 2
+    cbgPDSCH-ProcessingType2-DifferentTB-PerSlot-r16   SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one, upto2, upto4, upto7} OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one, upto2, upto4, upto7} OPTIONAL
+    } OPTIONAL,
+    intraFreqDAPS-r16                  SEQUENCE {
+        intraFreqDiffSCS-DAPS-r16          ENUMERATED {supported}            OPTIONAL,
+        intraFreqAsyncDAPS-r16             ENUMERATED {supported}            OPTIONAL
+    }                                                                        OPTIONAL,
+    intraBandFreqSeparationDL-v1620    FreqSeparationClassDL-v1620           OPTIONAL,
+    intraBandFreqSeparationDL-Only-r16 FreqSeparationClassDL-Only-r16        OPTIONAL,
+
+    -- R1 11-2: Rel-16 PDCCH monitoring capability
+    pdcch-Monitoring-r16               SEQUENCE {
+        pdsch-ProcessingType1-r16          SEQUENCE {
+            scs-15kHz-r16                      PDCCH-MonitoringOccasions-r16 OPTIONAL,
+            scs-30kHz-r16                      PDCCH-MonitoringOccasions-r16 OPTIONAL
+        }                                                                    OPTIONAL,
+        pdsch-ProcessingType2-r16      SEQUENCE {
+            scs-15kHz-r16                  PDCCH-MonitoringOccasions-r16     OPTIONAL,
+            scs-30kHz-r16                  PDCCH-MonitoringOccasions-r16     OPTIONAL
+        }                                                                    OPTIONAL
+    }                                                                        OPTIONAL,
+
+    -- R1 11-2b: Mix of Rel. 16 PDCCH monitoring capability and Rel. 15 PDCCH monitoring capability on different carriers
+    pdcch-MonitoringMixed-r16          ENUMERATED {supported}                OPTIONAL,
+
+    -- R1 18-5c: Processing up to X unicast DCI scheduling for DL per scheduled CC
+    crossCarrierSchedulingProcessing-DiffSCS-r16  SEQUENCE {
+        scs-15kHz-120kHz-r16               ENUMERATED {n1,n2,n4}             OPTIONAL,
+        scs-15kHz-60kHz-r16                ENUMERATED {n1,n2,n4}             OPTIONAL,
+        scs-30kHz-120kHz-r16               ENUMERATED {n1,n2,n4}             OPTIONAL,
+        scs-15kHz-30kHz-r16                ENUMERATED {n2}                   OPTIONAL,
+        scs-30kHz-60kHz-r16                ENUMERATED {n2}                   OPTIONAL,
+        scs-60kHz-120kHz-r16               ENUMERATED {n2}                   OPTIONAL
+    }                                                                        OPTIONAL,
+
+    -- R1 16-2b-1: Support of single-DCI based SDM scheme
+    singleDCI-SDM-scheme-r16           ENUMERATED {supported}                OPTIONAL
+}
+
+PDCCH-MonitoringOccasions-r16 ::= SEQUENCE {
+    period7span3-r16                  ENUMERATED {supported}                 OPTIONAL,
+    period4span3-r16                  ENUMERATED {supported}                 OPTIONAL,
+    period2span2-r16                  ENUMERATED {supported}                 OPTIONAL
+}
+
+DummyA ::=      SEQUENCE {
+    maxNumberNZP-CSI-RS-PerCC                   INTEGER (1..32),
+    maxNumberPortsAcrossNZP-CSI-RS-PerCC        ENUMERATED {p2, p4, p8, p12, p16, p24, p32, p40, p48, p56, p64, p72, p80,
+                                                            p88, p96, p104, p112, p120, p128, p136, p144, p152, p160, p168,
+                                                            p176, p184, p192, p200, p208, p216, p224, p232, p240, p248, p256},
+    maxNumberCS-IM-PerCC                        ENUMERATED {n1, n2, n4, n8, n16, n32},
+    maxNumberSimultaneousCSI-RS-ActBWP-AllCC    ENUMERATED {n5, n6, n7, n8, n9, n10, n12, n14, n16, n18, n20, n22, n24, n26,
+                                                                n28, n30, n32, n34, n36, n38, n40, n42, n44, n46, n48, n50, n52,
+                                                                n54, n56, n58, n60, n62, n64},
+    totalNumberPortsSimultaneousCSI-RS-ActBWP-AllCC ENUMERATED {p8, p12, p16, p24, p32, p40, p48, p56, p64, p72, p80,
+                                                                p88, p96, p104, p112, p120, p128, p136, p144, p152, p160, p168,
+                                                                p176, p184, p192, p200, p208, p216, p224, p232, p240, p248, p256}
+}
+
+DummyB ::=       SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p2, p4, p8, p12, p16, p24, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    supportedCodebookMode               ENUMERATED {mode1, mode1AndMode2},
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+DummyC ::=        SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p8, p16, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    supportedCodebookMode               ENUMERATED {mode1, mode2, both},
+    supportedNumberPanels               ENUMERATED {n2, n4},
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+DummyD ::=                 SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p4, p8, p12, p16, p24, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    parameterLx                         INTEGER (2..4),
+    amplitudeScalingType                ENUMERATED {wideband, widebandAndSubband},
+    amplitudeSubsetRestriction          ENUMERATED {supported}                          OPTIONAL,
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+DummyE ::=    SEQUENCE {
+    maxNumberTxPortsPerResource         ENUMERATED {p4, p8, p12, p16, p24, p32},
+    maxNumberResources                  INTEGER (1..64),
+    totalNumberTxPorts                  INTEGER (2..256),
+    parameterLx                         INTEGER (2..4),
+    amplitudeScalingType                ENUMERATED {wideband, widebandAndSubband},
+    maxNumberCSI-RS-PerResourceSet      INTEGER (1..8)
+}
+
+-- TAG-FEATURESETDOWNLINK-STOP
+-- TAG-FEATURESETDOWNLINKID-START
+
+FeatureSetDownlinkId ::=            INTEGER (0..maxDownlinkFeatureSets)
+
+-- TAG-FEATURESETDOWNLINKID-STOP
+-- TAG-FEATURESETDOWNLINKPERCC-START
+
+FeatureSetDownlinkPerCC ::=         SEQUENCE {
+    supportedSubcarrierSpacingDL        SubcarrierSpacing,
+    supportedBandwidthDL                SupportedBandwidth,
+    channelBW-90mhz                     ENUMERATED {supported}                                                  OPTIONAL,
+    maxNumberMIMO-LayersPDSCH           MIMO-LayersDL                                                           OPTIONAL,
+    supportedModulationOrderDL          ModulationOrder                                                         OPTIONAL
+}
+
+FeatureSetDownlinkPerCC-v1620 ::=   SEQUENCE {
+    -- R1 16-2a: Mulit-DCI based multi-TRP
+    multiDCI-MultiTRP-r16               MultiDCI-MultiTRP-r16                                                   OPTIONAL,
+    -- R1 16-2b-3: Support of single-DCI based FDMSchemeB
+    supportFDM-SchemeB-r16              ENUMERATED {supported}                                                  OPTIONAL
+}
+
+MultiDCI-MultiTRP-r16 ::=           SEQUENCE {
+    maxNumberCORESET-r16                ENUMERATED {n2, n3, n4, n5},
+    maxNumberCORESETPerPoolIndex-r16    INTEGER (1..3),
+    maxNumberUnicastPDSCH-PerPool-r16   ENUMERATED {n1, n2, n3, n4, n7}
+}
+
+-- TAG-FEATURESETDOWNLINKPERCC-STOP
+-- TAG-FEATURESETDOWNLINKPERCC-ID-START
+
+FeatureSetDownlinkPerCC-Id ::=      INTEGER (1..maxPerCC-FeatureSets)
+
+-- TAG-FEATURESETDOWNLINKPERCC-ID-STOP
+-- TAG-FEATURESETEUTRADOWNLINKID-START
+
+FeatureSetEUTRA-DownlinkId ::=      INTEGER (0..maxEUTRA-DL-FeatureSets)
+
+-- TAG-FEATURESETEUTRADOWNLINKID-STOP
+-- TAG-FEATURESETEUTRAUPLINKID-START
+
+FeatureSetEUTRA-UplinkId ::=                    INTEGER (0..maxEUTRA-UL-FeatureSets)
+
+-- TAG-FEATURESETEUTRAUPLINKID-STOP
+-- TAG-FEATURESETS-START
+
+FeatureSets ::=    SEQUENCE {
+    featureSetsDownlink                 SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink               OPTIONAL,
+    featureSetsDownlinkPerCC            SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetDownlinkPerCC            OPTIONAL,
+    featureSetsUplink                   SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink                   OPTIONAL,
+    featureSetsUplinkPerCC              SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetUplinkPerCC              OPTIONAL,
+    ...,
+    [[
+    featureSetsDownlink-v1540           SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v1540         OPTIONAL,
+    featureSetsUplink-v1540             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1540             OPTIONAL,
+    featureSetsUplinkPerCC-v1540        SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetUplinkPerCC-v1540        OPTIONAL
+    ]],
+    [[
+    featureSetsDownlink-v15a0           SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v15a0         OPTIONAL
+    ]],
+    [[
+    featureSetsDownlink-v1610           SEQUENCE (SIZE (1..maxDownlinkFeatureSets)) OF FeatureSetDownlink-v1610         OPTIONAL,
+    featureSetsUplink-v1610             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1610             OPTIONAL,
+    featureSetDownlinkPerCC-v1620       SEQUENCE (SIZE (1..maxPerCC-FeatureSets)) OF FeatureSetDownlinkPerCC-v1620      OPTIONAL
+    ]],
+    [[
+    featureSetsUplink-v1630             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1630             OPTIONAL
+    ]],
+    [[
+    featureSetsUplink-v1640             SEQUENCE (SIZE (1..maxUplinkFeatureSets)) OF FeatureSetUplink-v1640             OPTIONAL
+    ]]
+}
+
+-- TAG-FEATURESETS-STOP
+-- TAG-FEATURESETUPLINK-START
+
+FeatureSetUplink ::=                SEQUENCE {
+    featureSetListPerUplinkCC           SEQUENCE (SIZE (1.. maxNrofServingCells)) OF FeatureSetUplinkPerCC-Id,
+    scalingFactor                       ENUMERATED {f0p4, f0p75, f0p8}                                          OPTIONAL,
+    dummy3                              ENUMERATED {supported}                                                  OPTIONAL,
+    intraBandFreqSeparationUL           FreqSeparationClass                                                     OPTIONAL,
+    searchSpaceSharingCA-UL             ENUMERATED {supported}                                                  OPTIONAL,
+    dummy1                              DummyI                                                                  OPTIONAL,
+    supportedSRS-Resources              SRS-Resources                                                           OPTIONAL,
+    twoPUCCH-Group                      ENUMERATED {supported}                                                  OPTIONAL,
+    dynamicSwitchSUL                    ENUMERATED {supported}                                                  OPTIONAL,
+    simultaneousTxSUL-NonSUL            ENUMERATED {supported}                                                  OPTIONAL,
+    pusch-ProcessingType1-DifferentTB-PerSlot SEQUENCE {
+        scs-15kHz                                 ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL,
+        scs-30kHz                                 ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL,
+        scs-60kHz                                 ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL,
+        scs-120kHz                                ENUMERATED {upto2, upto4, upto7}                                  OPTIONAL
+    }                                                                                                           OPTIONAL,
+    dummy2                               DummyF                                                                 OPTIONAL
+}
+
+FeatureSetUplink-v1540 ::=           SEQUENCE {
+    zeroSlotOffsetAperiodicSRS           ENUMERATED {supported}                     OPTIONAL,
+    pa-PhaseDiscontinuityImpacts         ENUMERATED {supported}                     OPTIONAL,
+    pusch-SeparationWithGap              ENUMERATED {supported}                     OPTIONAL,
+    pusch-ProcessingType2                SEQUENCE {
+        scs-15kHz                            ProcessingParameters                       OPTIONAL,
+        scs-30kHz                            ProcessingParameters                       OPTIONAL,
+        scs-60kHz                            ProcessingParameters                       OPTIONAL
+    }                                                                               OPTIONAL,
+    ul-MCS-TableAlt-DynamicIndication    ENUMERATED {supported}                     OPTIONAL
+}
+
+FeatureSetUplink-v1610 ::=       SEQUENCE {
+    -- R1 11-5: PUsCH repetition Type B
+    pusch-RepetitionTypeB-r16        SEQUENCE {
+        maxNumberPUSCH-Tx-r16            ENUMERATED {n2, n3, n4, n7, n8, n12},
+        hoppingScheme-r16                ENUMERATED {interSlotHopping, interRepetitionHopping, both}
+    }                                                                              OPTIONAL,
+    -- R1 11-7: UL cancelation scheme for self-carrier
+    ul-CancellationSelfCarrier-r16       ENUMERATED {supported}                    OPTIONAL,
+    -- R1 11-7a: UL cancelation scheme for cross-carrier
+    ul-CancellationCrossCarrier-r16      ENUMERATED {supported}                    OPTIONAL,
+    -- R1 16-5c: The maximum number of SRS resources in one SRS resource set with usage set to 'codebook' for Mode 2
+    ul-FullPwrMode2-MaxSRS-ResInSet-r16  ENUMERATED {n1, n2, n4}                   OPTIONAL,
+
+    -- R1 22-4a/4b/4c/4d: CBG based transmission for UL with unicast PUSCH(s) per slot per CC with UE processing time Capability 1
+    cbgPUSCH-ProcessingType1-DifferentTB-PerSlot-r16    SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL
+     } OPTIONAL,
+
+    -- R1 22-3a/3b/3c/3d: CBG based transmission for UL with unicast PUSCH(s) per slot per CC with UE processing time Capability 2
+    cbgPUSCH-ProcessingType2-DifferentTB-PerSlot-r16    SEQUENCE {
+        scs-15kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-30kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-60kHz-r16        ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL,
+        scs-120kHz-r16       ENUMERATED {one-pusch, upto2, upto4, upto7}               OPTIONAL
+     } OPTIONAL,
+    supportedSRS-PosResources-r16              SRS-AllPosResources-r16             OPTIONAL,
+    intraFreqDAPS-UL-r16                             SEQUENCE {
+        dummy                                            ENUMERATED {supported}    OPTIONAL,
+        intraFreqTwoTAGs-DAPS-r16                        ENUMERATED {supported}    OPTIONAL,
+        dummy1                                           ENUMERATED {supported}    OPTIONAL,
+        dummy2                                           ENUMERATED {supported}    OPTIONAL,
+        dummy3                                           ENUMERATED {short, long}  OPTIONAL
+    }                                                                              OPTIONAL,
+    intraBandFreqSeparationUL-v1620                  FreqSeparationClassUL-v1620   OPTIONAL,
+
+    -- R1 11-3: More than one PUCCH for HARQ-ACK transmission within a slot
+    multiPUCCH-r16                        SEQUENCE {
+        sub-SlotConfig-NCP-r16                ENUMERATED {set1, set2}              OPTIONAL,
+        sub-SlotConfig-ECP-r16                ENUMERATED {set1, set2}              OPTIONAL
+    }                                                                              OPTIONAL,
+    -- R1 11-3c: 2 PUCCH of format 0 or 2 for a single 7*2-symbol subslot based HARQ-ACK codebook
+    twoPUCCH-Type1-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3d: 2 PUCCH of format 0 or 2 for a single 2*7-symbol subslot based HARQ-ACK codebook
+    twoPUCCH-Type2-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3e: 1 PUCCH format 0 or 2 and 1 PUCCH format 1, 3 or 4 in the same subslot for a single 2*7-symbol HARQ-ACK codebooks
+    twoPUCCH-Type3-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3f: 2 PUCCH transmissions in the same subslot for a single 2*7-symbol HARQ-ACK codebooks which are not covered by 11-3d and
+    -- 11-3e
+    twoPUCCH-Type4-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-3g: SR/HARQ-ACK multiplexing once per subslot using a PUCCH (or HARQ-ACK piggybacked on a PUSCH) when SR/HARQ-ACK
+    -- are supposed to be sent with different starting symbols in a subslot
+    mux-SR-HARQ-ACK-r16                   ENUMERATED {supported}                   OPTIONAL,
+    dummy1                                ENUMERATED {supported}                   OPTIONAL,
+    dummy2                                ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4c: 2 PUCCH of format 0 or 2 for two HARQ-ACK codebooks with one 7*2-symbol sub-slot based HARQ-ACK codebook
+    twoPUCCH-Type5-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4d: 2 PUCCH of format 0 or 2 in consecutive symbols for two HARQ-ACK codebooks with one 2*7-symbol sub-slot based HARQ-ACK
+    -- codebook
+    twoPUCCH-Type6-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4e: 2 PUCCH of format 0 or 2 for two subslot based HARQ-ACK codebooks
+    twoPUCCH-Type7-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4f: 1 PUCCH format 0 or 2 and 1 PUCCH format 1, 3 or 4 in the same subslot for HARQ-ACK codebooks with one 2*7-symbol
+    -- subslot based HARQ-ACK codebook
+    twoPUCCH-Type8-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4g: 1 PUCCH format 0 or 2 and 1 PUCCH format 1, 3 or 4 in the same subslot for two subslot based HARQ-ACK codebooks
+    twoPUCCH-Type9-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4h: 2 PUCCH transmissions in the same subslot for two HARQ-ACK codebooks with one 2*7-symbol subslot which are not covered
+    -- by 11-4c and 11-4e
+    twoPUCCH-Type10-r16                   ENUMERATED {supported}                   OPTIONAL,
+    -- R1 11-4i: 2 PUCCH transmissions in the same subslot for two subslot based HARQ-ACK codebooks which are not covered by 11-4d and
+    -- 11-4f
+    twoPUCCH-Type11-r16                   ENUMERATED {supported}                   OPTIONAL,
+    -- R1 12-1: UL intra-UE multiplexing/prioritization of overlapping channel/signals with two priority levels in physical layer
+    ul-IntraUE-Mux-r16                    SEQUENCE {
+        pusch-PreparationLowPriority-r16      ENUMERATED {sym0, sym1, sym2},
+        pusch-PreparationHighPriority-r16     ENUMERATED {sym0, sym1, sym2}
+    }                                                                              OPTIONAL,
+    -- R1 16-5a: Supported UL full power transmission mode of fullpower
+    ul-FullPwrMode-r16                    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 18-5d: Processing up to X unicast DCI scheduling for UL per scheduled CC
+    crossCarrierSchedulingProcessing-DiffSCS-r16    SEQUENCE {
+        scs-15kHz-120kHz-r16                  ENUMERATED {n1,n2,n4}                OPTIONAL,
+        scs-15kHz-60kHz-r16                   ENUMERATED {n1,n2,n4}                OPTIONAL,
+        scs-30kHz-120kHz-r16                  ENUMERATED {n1,n2,n4}                OPTIONAL,
+        scs-15kHz-30kHz-r16                   ENUMERATED {n2}                      OPTIONAL,
+        scs-30kHz-60kHz-r16                   ENUMERATED {n2}                      OPTIONAL,
+        scs-60kHz-120kHz-r16                  ENUMERATED {n2}                      OPTIONAL
+    }                                                                              OPTIONAL,
+    -- R1 16-5b: Supported UL full power transmission mode of fullpowerMode1
+    ul-FullPwrMode1-r16                   ENUMERATED {supported}                   OPTIONAL,
+    -- R1 16-5c-2: Ports configuration for Mode 2
+    ul-FullPwrMode2-SRSConfig-diffNumSRSPorts-r16  ENUMERATED {p1-2, p1-4, p1-2-4} OPTIONAL,
+    -- R1 16-5c-3: TPMI group for Mode 2
+    ul-FullPwrMode2-TPMIGroup-r16         SEQUENCE {
+        twoPorts-r16                          BIT STRING(SIZE(2))                      OPTIONAL,
+        fourPortsNonCoherent-r16              ENUMERATED{g0, g1, g2, g3}               OPTIONAL,
+        fourPortsPartialCoherent-r16          ENUMERATED{g0, g1, g2, g3, g4, g5, g6}   OPTIONAL
+    }                                                                                  OPTIONAL
+}
+
+FeatureSetUplink-v1630 ::=       SEQUENCE {
+    -- R1 22-8: For SRS for CB PUSCH and antenna switching on FR1 with symbol level offset for aperiodic SRS transmission
+    offsetSRS-CB-PUSCH-Ant-Switch-fr1-r16                       ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-8a: PDCCH monitoring on any span of up to 3 consecutive OFDM symbols of a slot and constrained timeline for SRS for CB
+    -- PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorSingleOcc-fr1-r16           ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-8b: For type 1 CSS with dedicated RRC configuration, type 3 CSS, and UE-SS, monitoring occasion can be any OFDM symbol(s)
+    -- of a slot for Case 2 and constrained timeline for SRS for CB PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorAnyOccWithoutGap-fr1-r16    ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-8c: For type 1 CSS with dedicated RRC configuration, type 3 CSS, and UE-SS, monitoring occasion can be any OFDM symbol(s)
+    -- of a slot for Case 2 with a DCI gap and constrained timeline for SRS for CB PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorAnyOccWithGap-fr1-r16       ENUMERATED {supported}                   OPTIONAL,
+    dummy                                                       ENUMERATED {supported}                   OPTIONAL,
+    -- R1 22-9: Cancellation of PUCCH, PUSCH or PRACH with a DCI scheduling a PDSCH or CSI-RS or a DCI format 2_0 for SFI
+    partialCancellationPUCCH-PUSCH-PRACH-TX-r16                 ENUMERATED {supported}                   OPTIONAL
+}
+
+FeatureSetUplink-v1640 ::=              SEQUENCE {
+   -- R1 11-4: Two HARQ-ACK codebooks with up to one sub-slot based HARQ-ACK codebook (i.e. slot-based + slot-based, or slot-based +
+    -- sub-slot based) simultaneously constructed for supporting HARQ-ACK codebooks with different priorities at a UE
+    twoHARQ-ACK-Codebook-type1-r16          SubSlot-Config-r16      OPTIONAL,
+    -- R1 11-4a: Two sub-slot based HARQ-ACK codebooks simultaneously constructed for supporting HARQ-ACK codebooks with different
+    -- priorities at a UE
+    twoHARQ-ACK-Codebook-type2-r16          SubSlot-Config-r16      OPTIONAL,
+    -- R1 22-8d: All PDCCH monitoring occasion can be any OFDM symbol(s) of a slot for Case 2 with a span gap and constrained timeline
+    -- for SRS for CB PUSCH and antenna switching on FR1
+    offsetSRS-CB-PUSCH-PDCCH-MonitorAnyOccWithSpanGap-fr1-r16 SEQUENCE {
+        scs-15kHz-r16                                 ENUMERATED {set1, set2, set3}                             OPTIONAL,
+        scs-30kHz-r16                                 ENUMERATED {set1, set2, set3}                             OPTIONAL,
+        scs-60kHz-r16                                 ENUMERATED {set1, set2, set3}                             OPTIONAL
+    }                                                                                                           OPTIONAL
+}
+
+SubSlot-Config-r16 ::=                  SEQUENCE {
+    sub-SlotConfig-NCP-r16                  ENUMERATED {n4,n5,n6,n7}              OPTIONAL,
+    sub-SlotConfig-ECP-r16                  ENUMERATED {n4,n5,n6}                 OPTIONAL
+}
+
+SRS-AllPosResources-r16 ::=               SEQUENCE {
+    srs-PosResources-r16                      SRS-PosResources-r16,
+    srs-PosResourceAP-r16                     SRS-PosResourceAP-r16                OPTIONAL,
+    srs-PosResourceSP-r16                     SRS-PosResourceSP-r16                OPTIONAL
+}
+
+SRS-PosResources-r16 ::=                       SEQUENCE {
+    maxNumberSRS-PosResourceSetPerBWP-r16                ENUMERATED {n1, n2, n4, n8, n12, n16},
+    maxNumberSRS-PosResourcesPerBWP-r16                  ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberSRS-ResourcesPerBWP-PerSlot-r16             ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14},
+    maxNumberPeriodicSRS-PosResourcesPerBWP-r16          ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberPeriodicSRS-PosResourcesPerBWP-PerSlot-r16  ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-PosResourceAP-r16 ::=                SEQUENCE {
+    maxNumberAP-SRS-PosResourcesPerBWP-r16         ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberAP-SRS-PosResourcesPerBWP-PerSlot-r16 ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-PosResourceSP-r16 ::=                       SEQUENCE {
+    maxNumberSP-SRS-PosResourcesPerBWP-r16               ENUMERATED {n1, n2, n4, n8, n16, n32, n64},
+    maxNumberSP-SRS-PosResourcesPerBWP-PerSlot-r16       ENUMERATED {n1, n2, n3, n4, n5, n6, n8, n10, n12, n14}
+}
+
+SRS-Resources ::=                           SEQUENCE {
+    maxNumberAperiodicSRS-PerBWP                ENUMERATED {n1, n2, n4, n8, n16},
+    maxNumberAperiodicSRS-PerBWP-PerSlot        INTEGER (1..6),
+    maxNumberPeriodicSRS-PerBWP                 ENUMERATED {n1, n2, n4, n8, n16},
+    maxNumberPeriodicSRS-PerBWP-PerSlot         INTEGER (1..6),
+    maxNumberSemiPersistentSRS-PerBWP           ENUMERATED {n1, n2, n4, n8, n16},
+    maxNumberSemiPersistentSRS-PerBWP-PerSlot   INTEGER (1..6),
+    maxNumberSRS-Ports-PerResource              ENUMERATED {n1, n2, n4}
+}
+
+DummyF ::=                                  SEQUENCE {
+    maxNumberPeriodicCSI-ReportPerBWP           INTEGER (1..4),
+    maxNumberAperiodicCSI-ReportPerBWP          INTEGER (1..4),
+    maxNumberSemiPersistentCSI-ReportPerBWP     INTEGER (0..4),
+    simultaneousCSI-ReportsAllCC                INTEGER (5..32)
+}
+
+-- TAG-FEATURESETUPLINK-STOP
+-- TAG-FEATURESETUPLINKID-START
+
+FeatureSetUplinkId ::=                  INTEGER (0..maxUplinkFeatureSets)
+
+-- TAG-FEATURESETUPLINKID-STOP
+-- TAG-FEATURESETUPLINKPERCC-START
+
+FeatureSetUplinkPerCC ::=               SEQUENCE {
+    supportedSubcarrierSpacingUL            SubcarrierSpacing,
+    supportedBandwidthUL                    SupportedBandwidth,
+    channelBW-90mhz                         ENUMERATED {supported}                      OPTIONAL,
+    mimo-CB-PUSCH                           SEQUENCE {
+        maxNumberMIMO-LayersCB-PUSCH            MIMO-LayersUL                               OPTIONAL,
+        maxNumberSRS-ResourcePerSet             INTEGER (1..2)
+    }                                                                                   OPTIONAL,
+    maxNumberMIMO-LayersNonCB-PUSCH         MIMO-LayersUL                               OPTIONAL,
+    supportedModulationOrderUL              ModulationOrder                             OPTIONAL
+}
+FeatureSetUplinkPerCC-v1540 ::=       SEQUENCE {
+    mimo-NonCB-PUSCH                      SEQUENCE {
+        maxNumberSRS-ResourcePerSet           INTEGER (1..4),
+        maxNumberSimultaneousSRS-ResourceTx   INTEGER (1..4)
+    } OPTIONAL
+}
+
+-- TAG-FEATURESETUPLINKPERCC-STOP
+-- TAG-FEATURESETUPLINKPERCC-ID-START
+
+FeatureSetUplinkPerCC-Id ::=            INTEGER (1..maxPerCC-FeatureSets)
+
+-- TAG-FEATURESETUPLINKPERCC-ID-STOP
+-- TAG-FREQBANDINDICATOREUTRA-START
+
+FreqBandIndicatorEUTRA ::=  INTEGER (1..maxBandsEUTRA)
+
+-- TAG-FREQBANDINDICATOREUTRA-STOP
+-- TAG-FREQBANDLIST-START
+
+FreqBandList ::=                SEQUENCE (SIZE (1..maxBandsMRDC)) OF FreqBandInformation
+
+FreqBandInformation ::=         CHOICE {
+    bandInformationEUTRA            FreqBandInformationEUTRA,
+    bandInformationNR               FreqBandInformationNR
+}
+
+FreqBandInformationEUTRA ::=    SEQUENCE {
+    bandEUTRA                       FreqBandIndicatorEUTRA,
+    ca-BandwidthClassDL-EUTRA       CA-BandwidthClassEUTRA                  OPTIONAL,   -- Need N
+    ca-BandwidthClassUL-EUTRA       CA-BandwidthClassEUTRA                  OPTIONAL    -- Need N
+}
+
+FreqBandInformationNR ::=       SEQUENCE {
+    bandNR                          FreqBandIndicatorNR,
+    maxBandwidthRequestedDL         AggregatedBandwidth                     OPTIONAL,   -- Need N
+    maxBandwidthRequestedUL         AggregatedBandwidth                     OPTIONAL,   -- Need N
+    maxCarriersRequestedDL          INTEGER (1..maxNrofServingCells)        OPTIONAL,   -- Need N
+    maxCarriersRequestedUL          INTEGER (1..maxNrofServingCells)        OPTIONAL    -- Need N
+}
+
+AggregatedBandwidth ::=         ENUMERATED {mhz50, mhz100, mhz150, mhz200, mhz250, mhz300, mhz350,
+                                            mhz400, mhz450, mhz500, mhz550, mhz600, mhz650, mhz700, mhz750, mhz800}
+
+-- TAG-FREQBANDLIST-STOP
+-- TAG-FREQSEPARATIONCLASS-START
+
+FreqSeparationClass ::= ENUMERATED { mhz800, mhz1200, mhz1400, ...}
+
+FreqSeparationClassDL-v1620 ::= ENUMERATED {mhz1000, mhz1600, mhz1800, mhz2000, mhz2200, mhz2400}
+
+FreqSeparationClassUL-v1620 ::= ENUMERATED {mhz1000}
+
+-- TAG-FREQSEPARATIONCLASS-STOP
+-- TAG-FREQSEPARATIONCLASSDL-Only-START
+
+FreqSeparationClassDL-Only-r16 ::= ENUMERATED {mhz200, mhz400, mhz600, mhz800, mhz1000, mhz1200}
+
+-- TAG-FREQSEPARATIONCLASSDL-Only-STOP
+-- TAG-HIGHSPEEDPARAMETERS-START
+
+HighSpeedParameters-r16 ::= SEQUENCE {
+    measurementEnhancement-r16       ENUMERATED {supported}   OPTIONAL,
+    demodulationEnhancement-r16      ENUMERATED {supported}   OPTIONAL
+}
+
+-- TAG-HIGHSPEEDPARAMETERS-STOP
+-- TAG-IMS-PARAMETERS-START
+
+IMS-Parameters ::=         SEQUENCE {
+    ims-ParametersCommon       IMS-ParametersCommon                  OPTIONAL,
+    ims-ParametersFRX-Diff     IMS-ParametersFRX-Diff                OPTIONAL,
+    ...
+}
+
+IMS-ParametersCommon ::=   SEQUENCE {
+    voiceOverEUTRA-5GC                  ENUMERATED {supported}                OPTIONAL,
+    ...,
+    [[
+    voiceOverSCG-BearerEUTRA-5GC        ENUMERATED {supported}                OPTIONAL
+    ]],
+    [[
+    voiceFallbackIndicationEPS-r16         ENUMERATED {supported}                    OPTIONAL
+    ]]
+}
+
+IMS-ParametersFRX-Diff ::= SEQUENCE {
+    voiceOverNR                ENUMERATED {supported}                OPTIONAL,
+    ...
+}
+
+-- TAG-IMS-PARAMETERS-STOP
+-- TAG-INTERRAT-PARAMETERS-START
+
+InterRAT-Parameters ::=             SEQUENCE {
+    eutra                               EUTRA-Parameters                OPTIONAL,
+    ...,
+    [[
+    utra-FDD-r16                        UTRA-FDD-Parameters-r16         OPTIONAL
+    ]]
+
+}
+
+EUTRA-Parameters ::=                SEQUENCE {
+    supportedBandListEUTRA          SEQUENCE (SIZE (1..maxBandsEUTRA)) OF FreqBandIndicatorEUTRA,
+    eutra-ParametersCommon              EUTRA-ParametersCommon                                      OPTIONAL,
+    eutra-ParametersXDD-Diff            EUTRA-ParametersXDD-Diff                                    OPTIONAL,
+    ...
+}
+
+EUTRA-ParametersCommon ::=      SEQUENCE {
+    mfbi-EUTRA                          ENUMERATED {supported}          OPTIONAL,
+    modifiedMPR-BehaviorEUTRA           BIT STRING (SIZE (32))          OPTIONAL,
+    multiNS-Pmax-EUTRA                  ENUMERATED {supported}          OPTIONAL,
+    rs-SINR-MeasEUTRA                   ENUMERATED {supported}          OPTIONAL,
+    ...,
+    [[
+    ne-DC                               ENUMERATED {supported}          OPTIONAL
+    ]],
+    [[
+    nr-HO-ToEN-DC-r16                   ENUMERATED {supported}          OPTIONAL
+    ]]
+}
+
+EUTRA-ParametersXDD-Diff ::=        SEQUENCE {
+    rsrqMeasWidebandEUTRA               ENUMERATED {supported}          OPTIONAL,
+    ...
+}
+
+UTRA-FDD-Parameters-r16 ::=                SEQUENCE {
+    supportedBandListUTRA-FDD-r16              SEQUENCE (SIZE (1..maxBandsUTRA-FDD-r16)) OF SupportedBandUTRA-FDD-r16,
+    ...
+}
+
+SupportedBandUTRA-FDD-r16 ::=           ENUMERATED {
+                                            bandI, bandII, bandIII, bandIV, bandV, bandVI,
+                                            bandVII, bandVIII, bandIX, bandX, bandXI,
+                                            bandXII, bandXIII, bandXIV, bandXV, bandXVI,
+                                            bandXVII, bandXVIII, bandXIX, bandXX,
+                                            bandXXI, bandXXII, bandXXIII, bandXXIV,
+                                            bandXXV, bandXXVI, bandXXVII, bandXXVIII,
+                                            bandXXIX, bandXXX, bandXXXI, bandXXXII}
+
+-- TAG-INTERRAT-PARAMETERS-STOP
+-- TAG-MAC-PARAMETERS-START
+
+MAC-Parameters ::= SEQUENCE {
+    mac-ParametersCommon            MAC-ParametersCommon        OPTIONAL,
+    mac-ParametersXDD-Diff          MAC-ParametersXDD-Diff      OPTIONAL
+}
+
+MAC-Parameters-v1610 ::= SEQUENCE {
+    mac-ParametersFRX-Diff-r16      MAC-ParametersFRX-Diff-r16  OPTIONAL
+}
+
+MAC-ParametersCommon ::=    SEQUENCE {
+    lcp-Restriction                         ENUMERATED {supported}      OPTIONAL,
+    dummy                                   ENUMERATED {supported}      OPTIONAL,
+    lch-ToSCellRestriction                  ENUMERATED {supported}      OPTIONAL,
+    ...,
+    [[
+    recommendedBitRate                      ENUMERATED {supported}      OPTIONAL,
+    recommendedBitRateQuery                 ENUMERATED {supported}      OPTIONAL
+    ]],
+    [[
+    recommendedBitRateMultiplier-r16         ENUMERATED {supported}     OPTIONAL,
+    preEmptiveBSR-r16                        ENUMERATED {supported}     OPTIONAL,
+    autonomousTransmission-r16               ENUMERATED {supported}     OPTIONAL,
+    lch-PriorityBasedPrioritization-r16      ENUMERATED {supported}     OPTIONAL,
+    lch-ToConfiguredGrantMapping-r16         ENUMERATED {supported}     OPTIONAL,
+    lch-ToGrantPriorityRestriction-r16       ENUMERATED {supported}     OPTIONAL,
+    singlePHR-P-r16                          ENUMERATED {supported}     OPTIONAL,
+    ul-LBT-FailureDetectionRecovery-r16      ENUMERATED {supported}     OPTIONAL,
+    -- R4 8-1: MPE
+    tdd-MPE-P-MPR-Reporting-r16              ENUMERATED {supported}     OPTIONAL,
+    lcid-ExtensionIAB-r16                    ENUMERATED {supported}     OPTIONAL
+    ]],
+    [[
+    spCell-BFR-CBRA-r16                      ENUMERATED {supported}     OPTIONAL
+    ]]
+}
+
+MAC-ParametersFRX-Diff-r16 ::=  SEQUENCE {
+    directMCG-SCellActivation-r16           ENUMERATED {supported}      OPTIONAL,
+    directMCG-SCellActivationResume-r16     ENUMERATED {supported}      OPTIONAL,
+    directSCG-SCellActivation-r16           ENUMERATED {supported}      OPTIONAL,
+    directSCG-SCellActivationResume-r16     ENUMERATED {supported}      OPTIONAL,
+    -- R1 19-1: DRX Adaptation
+    drx-Adaptation-r16          SEQUENCE {
+        non-SharedSpectrumChAccess-r16      MinTimeGap-r16              OPTIONAL,
+        sharedSpectrumChAccess-r16          MinTimeGap-r16              OPTIONAL
+    }                                                                   OPTIONAL,
+    ...
+}
+
+MAC-ParametersXDD-Diff ::=  SEQUENCE {
+    skipUplinkTxDynamic                     ENUMERATED {supported}     OPTIONAL,
+    logicalChannelSR-DelayTimer             ENUMERATED {supported}     OPTIONAL,
+    longDRX-Cycle                           ENUMERATED {supported}     OPTIONAL,
+    shortDRX-Cycle                          ENUMERATED {supported}     OPTIONAL,
+    multipleSR-Configurations               ENUMERATED {supported}     OPTIONAL,
+    multipleConfiguredGrants                ENUMERATED {supported}     OPTIONAL,
+    ...,
+    [[
+    secondaryDRX-Group-r16                  ENUMERATED {supported}     OPTIONAL
+    ]],
+    [[
+    enhancedSkipUplinkTxDynamic-r16         ENUMERATED {supported}     OPTIONAL,
+    enhancedSkipUplinkTxConfigured-r16      ENUMERATED {supported}     OPTIONAL
+    ]]
+}
+
+MinTimeGap-r16 ::=    SEQUENCE {
+    scs-15kHz-r16                         ENUMERATED {sl1, sl3}        OPTIONAL,
+    scs-30kHz-r16                         ENUMERATED {sl1, sl6}        OPTIONAL,
+    scs-60kHz-r16                         ENUMERATED {sl1, sl12}       OPTIONAL,
+    scs-120kHz-r16                        ENUMERATED {sl2, sl24}       OPTIONAL
+}
+
+-- TAG-MAC-PARAMETERS-STOP
+-- TAG-MEASANDMOBPARAMETERS-START
+
+MeasAndMobParameters ::=                    SEQUENCE {
+    measAndMobParametersCommon              MeasAndMobParametersCommon              OPTIONAL,
+    measAndMobParametersXDD-Diff                MeasAndMobParametersXDD-Diff        OPTIONAL,
+    measAndMobParametersFRX-Diff                MeasAndMobParametersFRX-Diff        OPTIONAL
+}
+
+MeasAndMobParametersCommon ::=          SEQUENCE {
+    supportedGapPattern                     BIT STRING (SIZE (22))                  OPTIONAL,
+    ssb-RLM                                 ENUMERATED {supported}                  OPTIONAL,
+    ssb-AndCSI-RS-RLM                       ENUMERATED {supported}                  OPTIONAL,
+    ...,
+    [[
+    eventB-MeasAndReport                    ENUMERATED {supported}                  OPTIONAL,
+    handoverFDD-TDD                         ENUMERATED {supported}                  OPTIONAL,
+    eutra-CGI-Reporting                     ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting                        ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    independentGapConfig                    ENUMERATED {supported}                  OPTIONAL,
+    periodicEUTRA-MeasAndReport             ENUMERATED {supported}                  OPTIONAL,
+    handoverFR1-FR2                         ENUMERATED {supported}                  OPTIONAL,
+    maxNumberCSI-RS-RRM-RS-SINR             ENUMERATED {n4, n8, n16, n32, n64, n96} OPTIONAL
+    ]],
+    [[
+    nr-CGI-Reporting-ENDC                   ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    eutra-CGI-Reporting-NEDC                ENUMERATED {supported}                  OPTIONAL,
+    eutra-CGI-Reporting-NRDC                ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting-NEDC                   ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting-NRDC                   ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    reportAddNeighMeasForPeriodic-r16       ENUMERATED {supported}                  OPTIONAL,
+    condHandoverParametersCommon-r16        SEQUENCE {
+       condHandoverFDD-TDD-r16                  ENUMERATED {supported}              OPTIONAL,
+       condHandoverFR1-FR2-r16                  ENUMERATED {supported}              OPTIONAL
+    }                                                                               OPTIONAL,
+    nr-NeedForGap-Reporting-r16             ENUMERATED {supported}                  OPTIONAL,
+    supportedGapPattern-NRonly-r16          BIT STRING (SIZE (10))                  OPTIONAL,
+    supportedGapPattern-NRonly-NEDC-r16     ENUMERATED {supported}                  OPTIONAL,
+    maxNumberCLI-RSSI-r16                   ENUMERATED {n8, n16, n32, n64}          OPTIONAL,
+    maxNumberCLI-SRS-RSRP-r16               ENUMERATED {n4, n8, n16, n32}           OPTIONAL,
+    maxNumberPerSlotCLI-SRS-RSRP-r16        ENUMERATED {n2, n4, n8}                 OPTIONAL,
+    mfbi-IAB-r16                            ENUMERATED {supported}                  OPTIONAL,
+    dummy                                   ENUMERATED {supported}                  OPTIONAL,
+    nr-CGI-Reporting-NPN-r16                ENUMERATED {supported}                  OPTIONAL,
+    idleInactiveEUTRA-MeasReport-r16        ENUMERATED {supported}                  OPTIONAL,
+    idleInactive-ValidityArea-r16           ENUMERATED {supported}                  OPTIONAL,
+    eutra-AutonomousGaps-r16                ENUMERATED {supported}                  OPTIONAL,
+    eutra-AutonomousGaps-NEDC-r16           ENUMERATED {supported}                  OPTIONAL,
+    eutra-AutonomousGaps-NRDC-r16           ENUMERATED {supported}                  OPTIONAL,
+    pcellT312-r16                           ENUMERATED {supported}                  OPTIONAL,
+    supportedGapPattern-r16                 BIT STRING (SIZE (2))                   OPTIONAL
+    ]]
+}
+
+MeasAndMobParametersXDD-Diff ::=        SEQUENCE {
+    intraAndInterF-MeasAndReport            ENUMERATED {supported}                  OPTIONAL,
+    eventA-MeasAndReport                    ENUMERATED {supported}                  OPTIONAL,
+    ...,
+    [[
+    handoverInterF                          ENUMERATED {supported}                  OPTIONAL,
+    handoverLTE-EPC                         ENUMERATED {supported}                  OPTIONAL,
+    handoverLTE-5GC                         ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    sftd-MeasNR-Neigh                       ENUMERATED {supported}                  OPTIONAL,
+    sftd-MeasNR-Neigh-DRX                   ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    dummy                                   ENUMERATED {supported}                  OPTIONAL
+    ]]
+}
+
+MeasAndMobParametersFRX-Diff ::=            SEQUENCE {
+    ss-SINR-Meas                                ENUMERATED {supported}              OPTIONAL,
+    csi-RSRP-AndRSRQ-MeasWithSSB                ENUMERATED {supported}              OPTIONAL,
+    csi-RSRP-AndRSRQ-MeasWithoutSSB             ENUMERATED {supported}              OPTIONAL,
+    csi-SINR-Meas                               ENUMERATED {supported}              OPTIONAL,
+    csi-RS-RLM                                  ENUMERATED {supported}              OPTIONAL,
+    ...,
+    [[
+    handoverInterF                              ENUMERATED {supported}              OPTIONAL,
+    handoverLTE-EPC                             ENUMERATED {supported}              OPTIONAL,
+    handoverLTE-5GC                             ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    maxNumberResource-CSI-RS-RLM                ENUMERATED {n2, n4, n6, n8}         OPTIONAL
+    ]],
+    [[
+    simultaneousRxDataSSB-DiffNumerology        ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    nr-AutonomousGaps-r16                       ENUMERATED {supported}              OPTIONAL,
+    nr-AutonomousGaps-ENDC-r16                  ENUMERATED {supported}              OPTIONAL,
+    nr-AutonomousGaps-NEDC-r16                  ENUMERATED {supported}              OPTIONAL,
+    nr-AutonomousGaps-NRDC-r16                  ENUMERATED {supported}              OPTIONAL,
+    dummy                                       ENUMERATED {supported}              OPTIONAL,
+    cli-RSSI-Meas-r16                           ENUMERATED {supported}              OPTIONAL,
+    cli-SRS-RSRP-Meas-r16                       ENUMERATED {supported}              OPTIONAL,
+    interFrequencyMeas-NoGap-r16                ENUMERATED {supported}              OPTIONAL,
+    simultaneousRxDataSSB-DiffNumerology-Inter-r16  ENUMERATED {supported}          OPTIONAL,
+    idleInactiveNR-MeasReport-r16               ENUMERATED {supported}              OPTIONAL,
+    -- R4 6-2: Support of beam level Early Measurement Reporting
+    idleInactiveNR-MeasBeamReport-r16           ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    increasedNumberofCSIRSPerMO-r16             ENUMERATED {supported}              OPTIONAL
+    ]]
+}
+
+-- TAG-MEASANDMOBPARAMETERS-STOP
+-- TAG-MEASANDMOBPARAMETERSMRDC-START
+
+MeasAndMobParametersMRDC ::=            SEQUENCE {
+    measAndMobParametersMRDC-Common         MeasAndMobParametersMRDC-Common                 OPTIONAL,
+    measAndMobParametersMRDC-XDD-Diff       MeasAndMobParametersMRDC-XDD-Diff               OPTIONAL,
+    measAndMobParametersMRDC-FRX-Diff       MeasAndMobParametersMRDC-FRX-Diff               OPTIONAL
+}
+
+MeasAndMobParametersMRDC-v1560 ::=      SEQUENCE {
+    measAndMobParametersMRDC-XDD-Diff-v1560    MeasAndMobParametersMRDC-XDD-Diff-v1560      OPTIONAL
+}
+
+MeasAndMobParametersMRDC-v1610 ::=      SEQUENCE {
+    measAndMobParametersMRDC-Common-v1610      MeasAndMobParametersMRDC-Common-v1610        OPTIONAL,
+    interNR-MeasEUTRA-IAB-r16                  ENUMERATED {supported}                       OPTIONAL
+}
+
+MeasAndMobParametersMRDC-Common ::=     SEQUENCE {
+    independentGapConfig                    ENUMERATED {supported}                          OPTIONAL
+}
+
+MeasAndMobParametersMRDC-Common-v1610 ::=   SEQUENCE {
+    condPSCellChangeParametersCommon-r16        SEQUENCE {
+        condPSCellChangeFDD-TDD-r16                 ENUMERATED {supported}                  OPTIONAL,
+        condPSCellChangeFR1-FR2-r16                 ENUMERATED {supported}                  OPTIONAL
+    }                                                                                       OPTIONAL,
+    pscellT312-r16                              ENUMERATED {supported}                      OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff ::=   SEQUENCE {
+    sftd-MeasPSCell                         ENUMERATED {supported}                          OPTIONAL,
+    sftd-MeasNR-Cell                        ENUMERATED {supported}                          OPTIONAL
+}
+
+MeasAndMobParametersMRDC-XDD-Diff-v1560 ::=    SEQUENCE {
+    sftd-MeasPSCell-NEDC                           ENUMERATED {supported}                   OPTIONAL
+}
+
+MeasAndMobParametersMRDC-FRX-Diff ::=          SEQUENCE {
+    simultaneousRxDataSSB-DiffNumerology           ENUMERATED {supported}                   OPTIONAL
+}
+
+-- TAG-MEASANDMOBPARAMETERSMRDC-STOP
+-- TAG-MIMO-LAYERS-START
+
+MIMO-LayersDL ::=   ENUMERATED {twoLayers, fourLayers, eightLayers}
+
+MIMO-LayersUL ::=   ENUMERATED {oneLayer, twoLayers, fourLayers}
+
+-- TAG-MIMO-LAYERS-STOP
+-- TAG-MIMO-PARAMETERSPERBAND-START
+
+MIMO-ParametersPerBand ::=          SEQUENCE {
+    tci-StatePDSCH                      SEQUENCE {
+        maxNumberConfiguredTCIstatesPerCC   ENUMERATED {n4, n8, n16, n32, n64, n128}                                   OPTIONAL,
+        maxNumberActiveTCI-PerBWP           ENUMERATED {n1, n2, n4, n8}                                                OPTIONAL
+    }                                                                                                              OPTIONAL,
+    additionalActiveTCI-StatePDCCH              ENUMERATED {supported}                                             OPTIONAL,
+    pusch-TransCoherence                        ENUMERATED {nonCoherent, partialCoherent, fullCoherent}            OPTIONAL,
+    beamCorrespondenceWithoutUL-BeamSweeping    ENUMERATED {supported}                                             OPTIONAL,
+    periodicBeamReport                          ENUMERATED {supported}                                             OPTIONAL,
+    aperiodicBeamReport                         ENUMERATED {supported}                                             OPTIONAL,
+    sp-BeamReportPUCCH                          ENUMERATED {supported}                                             OPTIONAL,
+    sp-BeamReportPUSCH                          ENUMERATED {supported}                                             OPTIONAL,
+    dummy1                                      DummyG                                                             OPTIONAL,
+    maxNumberRxBeam                             INTEGER (2..8)                                                     OPTIONAL,
+    maxNumberRxTxBeamSwitchDL                   SEQUENCE {
+        scs-15kHz                                   ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-30kHz                                   ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-60kHz                                   ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-120kHz                                  ENUMERATED {n4, n7, n14}                                           OPTIONAL,
+        scs-240kHz                                  ENUMERATED {n4, n7, n14}                                           OPTIONAL
+    }                                                                                                              OPTIONAL,
+    maxNumberNonGroupBeamReporting              ENUMERATED {n1, n2, n4}                                            OPTIONAL,
+    groupBeamReporting                          ENUMERATED {supported}                                             OPTIONAL,
+    uplinkBeamManagement                        SEQUENCE {
+        maxNumberSRS-ResourcePerSet-BM              ENUMERATED {n2, n4, n8, n16},
+        maxNumberSRS-ResourceSet                    INTEGER (1..8)
+    }                                                                                                              OPTIONAL,
+    maxNumberCSI-RS-BFD                 INTEGER (1..64)                                                            OPTIONAL,
+    maxNumberSSB-BFD                    INTEGER (1..64)                                                            OPTIONAL,
+    maxNumberCSI-RS-SSB-CBD             INTEGER (1..256)                                                           OPTIONAL,
+    dummy2                              ENUMERATED {supported}                                                     OPTIONAL,
+    twoPortsPTRS-UL                     ENUMERATED {supported}                                                     OPTIONAL,
+    dummy5                              SRS-Resources                                                              OPTIONAL,
+    dummy3                              INTEGER (1..4)                                                             OPTIONAL,
+    beamReportTiming                    SEQUENCE {
+        scs-15kHz                           ENUMERATED {sym2, sym4, sym8}                                              OPTIONAL,
+        scs-30kHz                           ENUMERATED {sym4, sym8, sym14, sym28}                                      OPTIONAL,
+        scs-60kHz                           ENUMERATED {sym8, sym14, sym28}                                            OPTIONAL,
+        scs-120kHz                          ENUMERATED {sym14, sym28, sym56}                                           OPTIONAL
+    }                                                                                                              OPTIONAL,
+    ptrs-DensityRecommendationSetDL     SEQUENCE {
+        scs-15kHz                           PTRS-DensityRecommendationDL                                               OPTIONAL,
+        scs-30kHz                           PTRS-DensityRecommendationDL                                               OPTIONAL,
+        scs-60kHz                           PTRS-DensityRecommendationDL                                               OPTIONAL,
+        scs-120kHz                          PTRS-DensityRecommendationDL                                               OPTIONAL
+    }                                                                                                              OPTIONAL,
+    ptrs-DensityRecommendationSetUL     SEQUENCE {
+        scs-15kHz                           PTRS-DensityRecommendationUL                                               OPTIONAL,
+        scs-30kHz                           PTRS-DensityRecommendationUL                                               OPTIONAL,
+        scs-60kHz                           PTRS-DensityRecommendationUL                                               OPTIONAL,
+        scs-120kHz                          PTRS-DensityRecommendationUL                                               OPTIONAL
+    }                                                                                                              OPTIONAL,
+    dummy4                              DummyH                                                                     OPTIONAL,
+    aperiodicTRS                        ENUMERATED {supported}                                                     OPTIONAL,
+    ...,
+    [[
+    dummy6                              ENUMERATED {true}                                                          OPTIONAL,
+    beamManagementSSB-CSI-RS            BeamManagementSSB-CSI-RS                                                   OPTIONAL,
+    beamSwitchTiming                    SEQUENCE {
+        scs-60kHz                           ENUMERATED {sym14, sym28, sym48, sym224, sym336}                           OPTIONAL,
+        scs-120kHz                          ENUMERATED {sym14, sym28, sym48, sym224, sym336}                           OPTIONAL
+    }                                                                                                              OPTIONAL,
+    codebookParameters                  CodebookParameters                                                         OPTIONAL,
+    csi-RS-IM-ReceptionForFeedback      CSI-RS-IM-ReceptionForFeedback                                             OPTIONAL,
+    csi-RS-ProcFrameworkForSRS          CSI-RS-ProcFrameworkForSRS                                                 OPTIONAL,
+    csi-ReportFramework                 CSI-ReportFramework                                                        OPTIONAL,
+    csi-RS-ForTracking                  CSI-RS-ForTracking                                                         OPTIONAL,
+    srs-AssocCSI-RS                     SEQUENCE (SIZE (1.. maxNrofCSI-RS-Resources)) OF SupportedCSI-RS-Resource  OPTIONAL,
+    spatialRelations                    SpatialRelations                                                           OPTIONAL
+    ]],
+    [[
+    -- R1 16-2b-0: Support of default QCL assumption with two TCI states
+    defaultQCL-TwoTCI-r16               ENUMERATED {supported}                                                     OPTIONAL,
+    codebookParametersPerBand-r16       CodebookParameters-v1610                                                   OPTIONAL,
+    -- R1 16-1b-3: Support of PUCCH resource groups per BWP for simultaneous spatial relation update
+    simul-SpatialRelationUpdatePUCCHResGroup-r16    ENUMERATED {supported}                                         OPTIONAL,
+
+    -- R1 16-1f: Maximum number of SCells configured for SCell beam failure recovery simultaneously
+    maxNumberSCellBFR-r16                           ENUMERATED {n1,n2,n4,n8}                                       OPTIONAL,
+
+    -- R1 16-2c: Supports simultaneous reception with different Type-D for FR2 only
+    simultaneousReceptionDiffTypeD-r16              ENUMERATED {supported}                                         OPTIONAL,
+    -- R1 16-1a-1: SSB/CSI-RS for L1-SINR measurement
+    ssb-csirs-SINR-measurement-r16      SEQUENCE {
+        maxNumberSSB-CSIRS-OneTx-CMR-r16    ENUMERATED {n8, n16, n32, n64},
+        maxNumberCSI-IM-NZP-IMR-res-r16     ENUMERATED {n8, n16, n32, n64},
+        maxNumberCSIRS-2Tx-res-r16          ENUMERATED {n0, n4, n8, n16, n32, n64},
+        maxNumberSSB-CSIRS-res-r16          ENUMERATED {n8, n16, n32, n64, n128},
+        maxNumberCSI-IM-NZP-IMR-res-mem-r16 ENUMERATED {n8, n16, n32, n64, n128},
+        supportedCSI-RS-Density-CMR-r16     ENUMERATED {one, three, oneAndThree},
+        maxNumberAperiodicCSI-RS-Res-r16    ENUMERATED {n2, n4, n8, n16, n32, n64},
+        supportedSINR-meas-r16              ENUMERATED {ssbWithCSI-IM, ssbWithNZP-IMR, csirsWithNZP-IMR, csi-RSWithoutIMR}  OPTIONAL
+    }                                                                                                              OPTIONAL,
+    -- R1 16-1a-2: Non-group based L1-SINR reporting
+    nonGroupSINR-reporting-r16              ENUMERATED {n1, n2, n4}                                                OPTIONAL,
+    -- R1 16-1a-3: Non-group based L1-SINR reporting
+    groupSINR-reporting-r16                 ENUMERATED {supported}                                                 OPTIONAL,
+
+    multiDCI-multiTRP-Parameters-r16        SEQUENCE {
+        -- R1 16-2a-0: Overlapping PDSCHs in time and fully overlapping in frequency and time
+        overlapPDSCHsFullyFreqTime-r16          INTEGER (1..2)                                                     OPTIONAL,
+        -- R1 16-2a-1: Overlapping PDSCHs in time and partially overlapping in frequency and time
+        overlapPDSCHsInTimePartiallyFreq-r16    ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-2: Out of order operation for DL
+        outOfOrderOperationDL-r16               SEQUENCE {
+            supportPDCCH-ToPDSCH-r16                ENUMERATED {supported}                                         OPTIONAL,
+            supportPDSCH-ToHARQ-ACK-r16             ENUMERATED {supported}                                         OPTIONAL
+        }                                                                                                          OPTIONAL,
+        -- R1 16-2a-3: Out of order operation for UL
+        outOfOrderOperationUL-r16               ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-5: Separate CRS rate matching
+        separateCRS-RateMatching-r16            ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-6: Default QCL enhancement for multi-DCI based multi-TRP
+        defaultQCL-PerCORESETPoolIndex-r16      ENUMERATED {supported}                                             OPTIONAL,
+        -- R1 16-2a-7: Maximum number of activated TCI states
+        maxNumberActivatedTCI-States-r16        SEQUENCE {
+            maxNumberPerCORESET-Pool-r16            ENUMERATED {n1, n2, n4, n8},
+            maxTotalNumberAcrossCORESET-Pool-r16    ENUMERATED {n2, n4, n8, n16}
+        }                                                                                                          OPTIONAL
+    }                                                                                                              OPTIONAL,
+    singleDCI-SDM-scheme-Parameters-r16         SEQUENCE {
+        -- R1 16-2b-1b: Single-DCI based SDM scheme - Support of new DMRS port entry
+        supportNewDMRS-Port-r16                     ENUMERATED {n0, n2, n3}                                        OPTIONAL,
+        -- R1 16-2b-1a: Support of s-port DL PTRS
+        supportTwoPortDL-PTRS-r16                   ENUMERATED {supported}                                         OPTIONAL
+    }                                                                                                              OPTIONAL,
+    -- R1 16-2b-2: Support of single-DCI based FDMSchemeA
+    supportFDM-SchemeA-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-2b-3a: Single-DCI based FDMSchemeB CW soft combining
+    supportCodeWordSoftCombining-r16            ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-2b-4: Single-DCI based TDMSchemeA	
+    supportTDM-SchemeA-r16                      ENUMERATED {kb3, kb5, kb10, kb20, noRestriction}                   OPTIONAL,
+    -- R1 16-2b-5: Single-DCI based inter-slot TDM
+    supportInter-slotTDM-r16                    SEQUENCE {
+        supportRepNumPDSCH-TDRA-r16                 ENUMERATED {n2, n3, n4, n5, n6, n7, n8, n16},
+        maxTBS-Size-r16                             ENUMERATED {kb3, kb5, kb10, kb20, noRestriction},
+        maxNumberTCI-states-r16                     INTEGER (1..2)
+    }                                                                                                              OPTIONAL,
+    -- R1 16-4: Low PAPR DMRS for PDSCH
+    lowPAPR-DMRS-PDSCH-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-6a: Low PAPR DMRS for PUSCH without transform precoding
+    lowPAPR-DMRS-PUSCHwithoutPrecoding-r16      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-6b: Low PAPR DMRS for PUCCH
+    lowPAPR-DMRS-PUCCH-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-6c: Low PAPR DMRS for PUSCH with transform precoding & pi/2 BPSK
+    lowPAPR-DMRS-PUSCHwithPrecoding-r16         ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 16-7: Extension of the maximum number of configured aperiodic CSI report settings
+    csi-ReportFrameworkExt-r16                  CSI-ReportFrameworkExt-r16                                         OPTIONAL,
+    -- R1 16-3a, 16-3a-1, 16-3b, 16-3b-1, 16-8: Individual new codebook types
+    codebookParametersAddition-r16              CodebookParametersAddition-r16                                     OPTIONAL,
+    -- R1 16-8: Mixed codebook types
+    codebookComboParametersAddition-r16         CodebookComboParametersAddition-r16                                OPTIONAL,
+    -- R4 8-2: SSB based beam correspondence
+    beamCorrespondenceSSB-based-r16             ENUMERATED {supported}                                             OPTIONAL,
+    -- R4 8-3: CSI-RS based beam correspondence
+    beamCorrespondenceCSI-RS-based-r16          ENUMERATED {supported}                                             OPTIONAL,
+    beamSwitchTiming-r16                        SEQUENCE {
+        scs-60kHz-r16                               ENUMERATED {sym224, sym336}                                    OPTIONAL,
+        scs-120kHz-r16                              ENUMERATED {sym224, sym336}                                    OPTIONAL
+    }                                                                                                              OPTIONAL
+    ]],
+    [[
+    -- R1 16-1a-4: Semi-persistent L1-SINR report on PUCCH
+    semi-PersistentL1-SINR-Report-PUCCH-r16     SEQUENCE {
+        supportReportFormat1-2OFDM-syms-r16         ENUMERATED {supported}                                     OPTIONAL,
+        supportReportFormat4-14OFDM-syms-r16        ENUMERATED {supported}                                     OPTIONAL
+    }                                                                                                          OPTIONAL,
+    -- R1 16-1a-5: Semi-persistent L1-SINR report on PUSCH
+    semi-PersistentL1-SINR-Report-PUSCH-r16     ENUMERATED {supported}                                         OPTIONAL
+    ]],
+    [[
+    -- R1 16-1h: Support of 64 configured PUCCH spatial relations
+    spatialRelations-v1640                      SEQUENCE {
+        maxNumberConfiguredSpatialRelations-v1640   ENUMERATED {n96, n128, n160, n192, n224, n256, n288, n320}
+    }                                                                                                          OPTIONAL,
+    -- R1 16-1i: Support of 64 configured candidate beam RSs for BFR
+    support64CandidateBeamRS-BFR-r16            ENUMERATED {supported}                                         OPTIONAL
+    ]]
+}
+
+DummyG ::=                          SEQUENCE {
+    maxNumberSSB-CSI-RS-ResourceOneTx   ENUMERATED {n8, n16, n32, n64},
+    maxNumberSSB-CSI-RS-ResourceTwoTx   ENUMERATED {n0, n4, n8, n16, n32, n64},
+    supportedCSI-RS-Density             ENUMERATED {one, three, oneAndThree}
+}
+
+BeamManagementSSB-CSI-RS ::=        SEQUENCE {
+    maxNumberSSB-CSI-RS-ResourceOneTx   ENUMERATED {n0, n8, n16, n32, n64},
+    maxNumberCSI-RS-Resource            ENUMERATED {n0, n4, n8, n16, n32, n64},
+    maxNumberCSI-RS-ResourceTwoTx       ENUMERATED {n0, n4, n8, n16, n32, n64},
+    supportedCSI-RS-Density             ENUMERATED {one, three, oneAndThree}                                       OPTIONAL,
+    maxNumberAperiodicCSI-RS-Resource   ENUMERATED {n0, n1, n4, n8, n16, n32, n64}
+}
+
+DummyH ::=                          SEQUENCE {
+    burstLength                         INTEGER (1..2),
+    maxSimultaneousResourceSetsPerCC    INTEGER (1..8),
+    maxConfiguredResourceSetsPerCC      INTEGER (1..64),
+    maxConfiguredResourceSetsAllCC      INTEGER (1..128)
+}
+
+CSI-RS-ForTracking ::=              SEQUENCE {
+    maxBurstLength                      INTEGER (1..2),
+    maxSimultaneousResourceSetsPerCC    INTEGER (1..8),
+    maxConfiguredResourceSetsPerCC      INTEGER (1..64),
+    maxConfiguredResourceSetsAllCC      INTEGER (1..256)
+}
+
+CSI-RS-IM-ReceptionForFeedback ::=              SEQUENCE {
+    maxConfigNumberNZP-CSI-RS-PerCC                 INTEGER (1..64),
+    maxConfigNumberPortsAcrossNZP-CSI-RS-PerCC      INTEGER (2..256),
+    maxConfigNumberCSI-IM-PerCC                     ENUMERATED {n1, n2, n4, n8, n16, n32},
+    maxNumberSimultaneousNZP-CSI-RS-PerCC           INTEGER (1..64),
+    totalNumberPortsSimultaneousNZP-CSI-RS-PerCC    INTEGER (2..256)
+}
+
+CSI-RS-ProcFrameworkForSRS ::=                  SEQUENCE {
+    maxNumberPeriodicSRS-AssocCSI-RS-PerBWP         INTEGER (1..4),
+    maxNumberAperiodicSRS-AssocCSI-RS-PerBWP        INTEGER (1..4),
+    maxNumberSP-SRS-AssocCSI-RS-PerBWP              INTEGER (0..4),
+    simultaneousSRS-AssocCSI-RS-PerCC               INTEGER (1..8)
+}
+
+CSI-ReportFramework ::=                         SEQUENCE {
+    maxNumberPeriodicCSI-PerBWP-ForCSI-Report       INTEGER (1..4),
+    maxNumberAperiodicCSI-PerBWP-ForCSI-Report      INTEGER (1..4),
+    maxNumberSemiPersistentCSI-PerBWP-ForCSI-Report INTEGER (0..4),
+    maxNumberPeriodicCSI-PerBWP-ForBeamReport       INTEGER (1..4),
+    maxNumberAperiodicCSI-PerBWP-ForBeamReport      INTEGER (1..4),
+    maxNumberAperiodicCSI-triggeringStatePerCC      ENUMERATED {n3, n7, n15, n31, n63, n128},
+    maxNumberSemiPersistentCSI-PerBWP-ForBeamReport INTEGER (0..4),
+    simultaneousCSI-ReportsPerCC                    INTEGER (1..8)
+}
+
+CSI-ReportFrameworkExt-r16 ::=                      SEQUENCE {
+    maxNumberAperiodicCSI-PerBWP-ForCSI-ReportExt-r16   INTEGER (5..8)
+}
+
+PTRS-DensityRecommendationDL ::=    SEQUENCE {
+    frequencyDensity1                   INTEGER (1..276),
+    frequencyDensity2                   INTEGER (1..276),
+    timeDensity1                        INTEGER (0..29),
+    timeDensity2                        INTEGER (0..29),
+    timeDensity3                        INTEGER (0..29)
+}
+
+PTRS-DensityRecommendationUL ::=    SEQUENCE {
+    frequencyDensity1                   INTEGER (1..276),
+    frequencyDensity2                   INTEGER (1..276),
+    timeDensity1                        INTEGER (0..29),
+    timeDensity2                        INTEGER (0..29),
+    timeDensity3                        INTEGER (0..29),
+    sampleDensity1                      INTEGER (1..276),
+    sampleDensity2                      INTEGER (1..276),
+    sampleDensity3                      INTEGER (1..276),
+    sampleDensity4                      INTEGER (1..276),
+    sampleDensity5                      INTEGER (1..276)
+}
+
+SpatialRelations ::=                    SEQUENCE {
+    maxNumberConfiguredSpatialRelations     ENUMERATED {n4, n8, n16, n32, n64, n96},
+    maxNumberActiveSpatialRelations         ENUMERATED {n1, n2, n4, n8, n14},
+    additionalActiveSpatialRelationPUCCH    ENUMERATED {supported}                              OPTIONAL,
+    maxNumberDL-RS-QCL-TypeD                ENUMERATED {n1, n2, n4, n8, n14}
+}
+
+DummyI ::=               SEQUENCE {
+    supportedSRS-TxPortSwitch           ENUMERATED {t1r2, t1r4, t2r4, t1r4-t2r4, tr-equal},
+    txSwitchImpactToRx                  ENUMERATED {true}                                       OPTIONAL
+}
+
+-- TAG-MIMO-PARAMETERSPERBAND-STOP
+-- TAG-MODULATIONORDER-START
+
+ModulationOrder ::= ENUMERATED {bpsk-halfpi, bpsk, qpsk, qam16, qam64, qam256}
+
+-- TAG-MODULATIONORDER-STOP
+-- TAG-MRDC-PARAMETERS-START
+
+MRDC-Parameters ::= SEQUENCE {
+    singleUL-Transmission               ENUMERATED {supported}              OPTIONAL,
+    dynamicPowerSharingENDC             ENUMERATED {supported}              OPTIONAL,
+    tdm-Pattern                         ENUMERATED {supported}              OPTIONAL,
+    ul-SharingEUTRA-NR                  ENUMERATED {tdm, fdm, both}         OPTIONAL,
+    ul-SwitchingTimeEUTRA-NR            ENUMERATED {type1, type2}           OPTIONAL,
+    simultaneousRxTxInterBandENDC       ENUMERATED {supported}              OPTIONAL,
+    asyncIntraBandENDC                  ENUMERATED {supported}              OPTIONAL,
+    ...,
+    [[
+    dualPA-Architecture                 ENUMERATED {supported}              OPTIONAL,
+    intraBandENDC-Support               ENUMERATED {non-contiguous, both}   OPTIONAL,
+    ul-TimingAlignmentEUTRA-NR          ENUMERATED {required}               OPTIONAL
+    ]]
+}
+
+MRDC-Parameters-v1580 ::= SEQUENCE {
+	dynamicPowerSharingNEDC             ENUMERATED {supported}              OPTIONAL
+}
+
+MRDC-Parameters-v1590 ::=	SEQUENCE {
+	interBandContiguousMRDC             ENUMERATED {supported}              OPTIONAL
+}
+
+MRDC-Parameters-v1620 ::=    SEQUENCE {
+    maxUplinkDutyCycle-interBandENDC-TDD-PC2-r16    SEQUENCE{
+        eutra-TDD-Config0-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config1-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config2-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config3-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config4-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config5-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        eutra-TDD-Config6-r16    ENUMERATED {n20, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL
+    }                                                                                    OPTIONAL,
+    -- R1 18-2 Single UL TX operation for TDD PCell in EN-DC
+    tdm-restrictionTDD-endc-r16          ENUMERATED {supported}                          OPTIONAL,
+    -- R1 18-2a Single UL TX operation for FDD PCell in EN-DC
+    tdm-restrictionFDD-endc-r16          ENUMERATED {supported}                          OPTIONAL,
+    --  R1 18-2b Support of HARQ-offset for SUO case1 in EN-DC with LTE TDD PCell for type 1 UE
+    singleUL-HARQ-offsetTDD-PCell-r16    ENUMERATED {supported}                          OPTIONAL,
+    --  R1 18-3 Dual Tx transmission for EN-DC with FDD PCell(TDM pattern for dual Tx UE)
+    tdm-restrictionDualTX-FDD-endc-r16   ENUMERATED {supported}                          OPTIONAL
+}
+
+MRDC-Parameters-v1630 ::= 	SEQUENCE {
+    -- R4 2-20 Maximum uplink duty cycle for FDD+TDD EN-DC power class 2
+    maxUplinkDutyCycle-interBandENDC-FDD-TDD-PC2-r16  SEQUENCE {
+        maxUplinkDutyCycle-FDD-TDD-EN-DC1-r16             ENUMERATED {n30, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL,
+        maxUplinkDutyCycle-FDD-TDD-EN-DC2-r16             ENUMERATED {n30, n40, n50, n60, n70, n80, n90, n100}    OPTIONAL
+    }                                                                                                             OPTIONAL,
+
+    -- R4 2-19 FDD-FDD or TDD-TDD inter-band MR-DC with overlapping or partially overlapping DL spectrum
+    interBandMRDC-WithOverlapDL-Bands-r16       ENUMERATED {supported}                   OPTIONAL
+}
+
+-- TAG-MRDC-PARAMETERS-STOP
+-- TAG-NRDC-PARAMETERS-START
+
+NRDC-Parameters ::=                 SEQUENCE {
+    measAndMobParametersNRDC            MeasAndMobParametersMRDC                    OPTIONAL,
+    generalParametersNRDC               GeneralParametersMRDC-XDD-Diff              OPTIONAL,
+    fdd-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode               OPTIONAL,
+    tdd-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode               OPTIONAL,
+    fr1-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode               OPTIONAL,
+    fr2-Add-UE-NRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode               OPTIONAL,
+    dummy2                              OCTET STRING                                OPTIONAL,
+    dummy                               SEQUENCE {}                                 OPTIONAL
+}
+
+NRDC-Parameters-v1570 ::=           SEQUENCE {
+    sfn-SyncNRDC                        ENUMERATED {supported}                      OPTIONAL
+}
+
+NRDC-Parameters-v15c0 ::=           SEQUENCE {
+    pdcp-DuplicationSplitSRB            ENUMERATED {supported}                      OPTIONAL,
+    pdcp-DuplicationSplitDRB            ENUMERATED {supported}                      OPTIONAL
+}
+
+NRDC-Parameters-v1610 ::=           SEQUENCE {
+    measAndMobParametersNRDC-v1610      MeasAndMobParametersMRDC-v1610              OPTIONAL
+}
+
+
+-- TAG-NRDC-PARAMETERS-STOP
+-- TAG-OLPC-SRS-POS-START
+
+OLPC-SRS-Pos-r16 ::=        SEQUENCE {
+    olpc-SRS-PosBasedOnPRS-Serving-r16         ENUMERATED {supported}               OPTIONAL,
+    olpc-SRS-PosBasedOnSSB-Neigh-r16           ENUMERATED {supported}               OPTIONAL,
+    olpc-SRS-PosBasedOnPRS-Neigh-r16           ENUMERATED {supported}               OPTIONAL,
+    maxNumberPathLossEstimatePerServing-r16    ENUMERATED {n1, n4, n8, n16}         OPTIONAL
+}
+
+--TAG-OLPC-SRS-POS-STOP
+-- TAG-PDCP-PARAMETERS-START
+
+PDCP-Parameters ::=         SEQUENCE {
+    supportedROHC-Profiles      SEQUENCE {
+        profile0x0000               BOOLEAN,
+        profile0x0001               BOOLEAN,
+        profile0x0002               BOOLEAN,
+        profile0x0003               BOOLEAN,
+        profile0x0004               BOOLEAN,
+        profile0x0006               BOOLEAN,
+        profile0x0101               BOOLEAN,
+        profile0x0102               BOOLEAN,
+        profile0x0103               BOOLEAN,
+        profile0x0104               BOOLEAN
+    },
+    maxNumberROHC-ContextSessions       ENUMERATED {cs2, cs4, cs8, cs12, cs16, cs24, cs32, cs48, cs64,
+                                                cs128, cs256, cs512, cs1024, cs16384, spare2, spare1},
+    uplinkOnlyROHC-Profiles             ENUMERATED {supported}      OPTIONAL,
+    continueROHC-Context                ENUMERATED {supported}      OPTIONAL,
+    outOfOrderDelivery                  ENUMERATED {supported}      OPTIONAL,
+    shortSN                             ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationSRB                 ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationMCG-OrSCG-DRB       ENUMERATED {supported}      OPTIONAL,
+    ...,
+    [[
+    drb-IAB-r16                         ENUMERATED {supported}      OPTIONAL,
+    non-DRB-IAB-r16                     ENUMERATED {supported}      OPTIONAL,
+    extendedDiscardTimer-r16            ENUMERATED {supported}      OPTIONAL,
+    continueEHC-Context-r16             ENUMERATED {supported}      OPTIONAL,
+    ehc-r16                             ENUMERATED {supported}      OPTIONAL,
+    maxNumberEHC-Contexts-r16           ENUMERATED {cs2, cs4, cs8, cs16, cs32, cs64, cs128, cs256, cs512,
+                                                    cs1024, cs2048, cs4096, cs8192, cs16384, cs32768, cs65536}    OPTIONAL,
+    jointEHC-ROHC-Config-r16            ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationMoreThanTwoRLC-r16  ENUMERATED {supported}      OPTIONAL
+    ]]
+}
+
+-- TAG-PDCP-PARAMETERS-STOP
+-- TAG-PDCP-PARAMETERSMRDC-START
+
+PDCP-ParametersMRDC ::=                 SEQUENCE {
+    pdcp-DuplicationSplitSRB                ENUMERATED {supported}      OPTIONAL,
+    pdcp-DuplicationSplitDRB                ENUMERATED {supported}      OPTIONAL
+}
+
+PDCP-ParametersMRDC-v1610 ::= SEQUENCE {
+    scg-DRB-NR-IAB-r16                  ENUMERATED {supported}          OPTIONAL
+}
+
+-- TAG-PDCP-PARAMETERSMRDC-STOP
+-- TAG-PHY-PARAMETERS-START
+
+Phy-Parameters ::=                  SEQUENCE {
+    phy-ParametersCommon                Phy-ParametersCommon                        OPTIONAL,
+    phy-ParametersXDD-Diff              Phy-ParametersXDD-Diff                      OPTIONAL,
+    phy-ParametersFRX-Diff              Phy-ParametersFRX-Diff                      OPTIONAL,
+    phy-ParametersFR1                   Phy-ParametersFR1                           OPTIONAL,
+    phy-ParametersFR2                   Phy-ParametersFR2                           OPTIONAL
+}
+
+Phy-ParametersCommon ::=            SEQUENCE {
+    csi-RS-CFRA-ForHO                   ENUMERATED {supported}                      OPTIONAL,
+    dynamicPRB-BundlingDL               ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-ReportPUCCH                  ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-ReportPUSCH                  ENUMERATED {supported}                      OPTIONAL,
+    nzp-CSI-RS-IntefMgmt                ENUMERATED {supported}                      OPTIONAL,
+    type2-SP-CSI-Feedback-LongPUCCH     ENUMERATED {supported}                      OPTIONAL,
+    precoderGranularityCORESET          ENUMERATED {supported}                      OPTIONAL,
+    dynamicHARQ-ACK-Codebook            ENUMERATED {supported}                      OPTIONAL,
+    semiStaticHARQ-ACK-Codebook         ENUMERATED {supported}                      OPTIONAL,
+    spatialBundlingHARQ-ACK             ENUMERATED {supported}                      OPTIONAL,
+    dynamicBetaOffsetInd-HARQ-ACK-CSI   ENUMERATED {supported}                      OPTIONAL,
+    pucch-Repetition-F1-3-4             ENUMERATED {supported}                      OPTIONAL,
+    ra-Type0-PUSCH                      ENUMERATED {supported}                      OPTIONAL,
+    dynamicSwitchRA-Type0-1-PDSCH       ENUMERATED {supported}                      OPTIONAL,
+    dynamicSwitchRA-Type0-1-PUSCH       ENUMERATED {supported}                      OPTIONAL,
+    pdsch-MappingTypeA                  ENUMERATED {supported}                      OPTIONAL,
+    pdsch-MappingTypeB                  ENUMERATED {supported}                      OPTIONAL,
+    interleavingVRB-ToPRB-PDSCH         ENUMERATED {supported}                      OPTIONAL,
+    interSlotFreqHopping-PUSCH          ENUMERATED {supported}                      OPTIONAL,
+    type1-PUSCH-RepetitionMultiSlots    ENUMERATED {supported}                      OPTIONAL,
+    type2-PUSCH-RepetitionMultiSlots    ENUMERATED {supported}                      OPTIONAL,
+    pusch-RepetitionMultiSlots          ENUMERATED {supported}                      OPTIONAL,
+    pdsch-RepetitionMultiSlots          ENUMERATED {supported}                      OPTIONAL,
+    downlinkSPS                         ENUMERATED {supported}                      OPTIONAL,
+    configuredUL-GrantType1             ENUMERATED {supported}                      OPTIONAL,
+    configuredUL-GrantType2             ENUMERATED {supported}                      OPTIONAL,
+    pre-EmptIndication-DL               ENUMERATED {supported}                      OPTIONAL,
+    cbg-TransIndication-DL              ENUMERATED {supported}                      OPTIONAL,
+    cbg-TransIndication-UL              ENUMERATED {supported}                      OPTIONAL,
+    cbg-FlushIndication-DL              ENUMERATED {supported}                      OPTIONAL,
+    dynamicHARQ-ACK-CodeB-CBG-Retx-DL   ENUMERATED {supported}                      OPTIONAL,
+    rateMatchingResrcSetSemi-Static     ENUMERATED {supported}                      OPTIONAL,
+    rateMatchingResrcSetDynamic         ENUMERATED {supported}                      OPTIONAL,
+    bwp-SwitchingDelay                  ENUMERATED {type1, type2}                   OPTIONAL,
+    ...,
+    [[
+    dummy                               ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    maxNumberSearchSpaces               ENUMERATED {n10}                            OPTIONAL,
+    rateMatchingCtrlResrcSetDynamic     ENUMERATED {supported}                      OPTIONAL,
+    maxLayersMIMO-Indication            ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    spCellPlacement                             CarrierAggregationVariant           OPTIONAL
+    ]],
+    [[
+    -- R1 9-1: Basic channel structure and procedure of 2-step RACH
+    twoStepRACH-r16                             ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-1: Monitoring DCI format 1_2 and DCI format 0_2
+    dci-Format1-2And0-2-r16                     ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-1a: Monitoring both DCI format 0_1/1_1 and DCI format 0_2/1_2 in the same search space
+    monitoringDCI-SameSearchSpace-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-10: Type 2 configured grant release by DCI format 0_1
+    type2-CG-ReleaseDCI-0-1-r16                 ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-11: Type 2 configured grant release by DCI format 0_2
+    type2-CG-ReleaseDCI-0-2-r16                 ENUMERATED {supported}              OPTIONAL,
+    -- R1 12-3: SPS release by DCI format 1_1
+    sps-ReleaseDCI-1-1-r16                      ENUMERATED {supported}              OPTIONAL,
+    -- R1 12-3a: SPS release by DCI format 1_2
+    sps-ReleaseDCI-1-2-r16                      ENUMERATED {supported}              OPTIONAL,
+    -- R1 14-8: CSI trigger states containing non-active BWP
+    csi-TriggerStateNon-ActiveBWP-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-2: Support up to 4 SMTCs configured for an IAB node MT per frequency location, including IAB-specific SMTC window periodicities
+    seperateSMTC-InterIAB-Support-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-3: Support RACH configuration separately from the RACH configuration for UE access, including new IAB-specific offset and scaling factors
+    seperateRACH-IAB-Support-r16                ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-5a: Support semi-static configuration/indication of UL-Flexible-DL slot formats for IAB-MT resources
+    ul-flexibleDL-SlotFormatSemiStatic-IAB-r16  ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-5b: Support dynamic indication of UL-Flexible-DL slot formats for IAB-MT resources
+    ul-flexibleDL-SlotFormatDynamics-IAB-r16    ENUMERATED {supported}              OPTIONAL,
+    dft-S-OFDM-WaveformUL-IAB-r16               ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-6: Support DCI Format 2_5 based indication of soft resource availability to an IAB node
+    dci-25-AI-RNTI-Support-IAB-r16              ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-7: Support T_delta reception.
+    t-DeltaReceptionSupport-IAB-r16             ENUMERATED {supported}              OPTIONAL,
+    -- R1 20-8: Support of Desired guard symbol reporting and provided guard symbok reception.
+    guardSymbolReportReception-IAB-r16          ENUMERATED {supported}              OPTIONAL,
+    -- R1 18-8 HARQ-ACK codebook type and spatial bundling per PUCCH group
+    harqACK-CB-SpatialBundlingPUCCH-Group-r16   ENUMERATED {supported}              OPTIONAL,
+    -- R1 19-2: Cross Slot Scheduling
+    crossSlotScheduling-r16                     SEQUENCE {
+        non-SharedSpectrumChAccess-r16              ENUMERATED {supported}          OPTIONAL,
+        sharedSpectrumChAccess-r16                  ENUMERATED {supported}          OPTIONAL
+    }                                                                               OPTIONAL,
+    maxNumberSRS-PosPathLossEstimateAllServingCells-r16  ENUMERATED {n1, n4, n8, n16}         OPTIONAL,
+    extendedCG-Periodicities-r16                ENUMERATED {supported}              OPTIONAL,
+    extendedSPS-Periodicities-r16               ENUMERATED {supported}              OPTIONAL,
+    codebookVariantsList-r16                    CodebookVariantsList-r16            OPTIONAL,
+    -- R1 11-6: PUSCH repetition Type A
+    pusch-RepetitionTypeA-r16                   SEQUENCE {
+        sharedSpectrumChAccess-r16                  ENUMERATED {supported}          OPTIONAL,
+        non-SharedSpectrumChAccess-r16              ENUMERATED {supported}          OPTIONAL
+    }                                                                               OPTIONAL,
+    -- R1 11-4b: DL priority indication in DCI with mixed DCI formats
+    dci-DL-PriorityIndicator-r16                ENUMERATED {supported}              OPTIONAL,
+    -- R1 12-1a: UL priority indication in DCI with mixed DCI formats
+    dci-UL-PriorityIndicator-r16                ENUMERATED {supported}              OPTIONAL,
+    -- R1 16-1e: Maximum number of configured pathloss reference RSs for PUSCH/PUCCH/SRS by RRC for MAC-CE based pathloss reference RS update
+    maxNumberPathlossRS-Update-r16              ENUMERATED {n4, n8, n16, n32, n64}  OPTIONAL,
+
+    -- R1 18-9: Usage of the PDSCH starting time for HARQ-ACK type 2 codebook
+    type2-HARQ-ACK-Codebook-r16                 ENUMERATED {supported}              OPTIONAL,
+    -- R1 16-1g-1: Resources for beam management, pathloss measurement, BFD, RLM and new beam identification across frequency ranges
+    maxTotalResourcesForAcrossFreqRanges-r16    SEQUENCE {
+        maxNumberResWithinSlotAcrossCC-AcrossFR-r16 ENUMERATED {n2, n4, n8, n12, n16, n32, n64, n128}        OPTIONAL,
+        maxNumberResAcrossCC-AcrossFR-r16           ENUMERATED {n2, n4, n8, n12, n16, n32, n40, n48, n64, n72, n80, n96, n128, n256}
+                                                                                    OPTIONAL
+    }                                                                               OPTIONAL,
+    -- R1 16-2a-4: HARQ-ACK for multi-DCI based multi-TRP - separate
+    harqACK-separateMultiDCI-MultiTRP-r16       SEQUENCE {
+    maxNumberLongPUCCHs-r16                         ENUMERATED {longAndLong, longAndShort, shortAndShort}    OPTIONAL
+    }                                                                               OPTIONAL,
+    -- R1 16-2a-4: HARQ-ACK for multi-DCI based multi-TRP - joint
+    harqACK-jointMultiDCI-MultiTRP-r16          ENUMERATED {supported}              OPTIONAL,
+    -- R4 9-1: BWP switching on multiple CCs RRM requirements
+    bwp-SwitchingMultiCCs-r16                   CHOICE {
+        type1-r16                                   ENUMERATED {us100, us200},
+        type2-r16                                   ENUMERATED {us200, us400, us800, us1000}
+    }                                                                               OPTIONAL
+    ]],
+    [[
+    targetSMTC-SCG-r16                          ENUMERATED {supported}              OPTIONAL,
+    supportRepetitionZeroOffsetRV-r16           ENUMERATED {supported}              OPTIONAL,
+    -- R1 11-12: in-order CBG-based re-transmission
+    cbg-TransInOrderPUSCH-UL-r16                ENUMERATED {supported}              OPTIONAL
+    ]],
+    [[
+    -- R4 6-3: Dormant BWP switching on multiple CCs RRM requirements
+    bwp-SwitchingMultiDormancyCCs-r16           CHOICE {
+        type1-r16                                   ENUMERATED {us100, us200},
+        type2-r16                                   ENUMERATED {us200, us400, us800, us1000}
+    }                                                                               OPTIONAL,
+    -- R1 16-2a-8: Indicates that retransmission scheduled by a different CORESETPoolIndex for multi-DCI multi-TRP is not supported.
+    supportRetx-Diff-CoresetPool-Multi-DCI-TRP-r16               ENUMERATED {notSupported}          OPTIONAL,
+    -- R1 22-10: Support of pdcch-MonitoringAnyOccasionsWithSpanGap in case of cross-carrier scheduling with different SCSs
+    pdcch-MonitoringAnyOccasionsWithSpanGapCrossCarrierSch-r16   ENUMERATED {mode2, mode3}          OPTIONAL
+    ]]
+}
+
+Phy-ParametersXDD-Diff ::=          SEQUENCE {
+    dynamicSFI                          ENUMERATED {supported}                      OPTIONAL,
+    twoPUCCH-F0-2-ConsecSymbols         ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUSCH          ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUCCH          ENUMERATED {supported}                      OPTIONAL,
+    ...,
+    [[
+    dl-SchedulingOffset-PDSCH-TypeA     ENUMERATED {supported}                      OPTIONAL,
+    dl-SchedulingOffset-PDSCH-TypeB     ENUMERATED {supported}                      OPTIONAL,
+    ul-SchedulingOffset                 ENUMERATED {supported}                      OPTIONAL
+    ]]
+}
+
+Phy-ParametersFRX-Diff ::=                  SEQUENCE {
+    dynamicSFI                                  ENUMERATED {supported}                      OPTIONAL,
+    dummy1                                      BIT STRING (SIZE (2))                       OPTIONAL,
+    twoFL-DMRS                                  BIT STRING (SIZE (2))                       OPTIONAL,
+    dummy2                                      BIT STRING (SIZE (2))                       OPTIONAL,
+    dummy3                                      BIT STRING (SIZE (2))                       OPTIONAL,
+    supportedDMRS-TypeDL                        ENUMERATED {type1, type1And2}               OPTIONAL,
+    supportedDMRS-TypeUL                        ENUMERATED {type1, type1And2}               OPTIONAL,
+    semiOpenLoopCSI                             ENUMERATED {supported}                      OPTIONAL,
+    csi-ReportWithoutPMI                        ENUMERATED {supported}                      OPTIONAL,
+    csi-ReportWithoutCQI                        ENUMERATED {supported}                      OPTIONAL,
+    onePortsPTRS                                BIT STRING (SIZE (2))                       OPTIONAL,
+    twoPUCCH-F0-2-ConsecSymbols                 ENUMERATED {supported}                      OPTIONAL,
+    pucch-F2-WithFH                             ENUMERATED {supported}                      OPTIONAL,
+    pucch-F3-WithFH                             ENUMERATED {supported}                      OPTIONAL,
+    pucch-F4-WithFH                             ENUMERATED {supported}                      OPTIONAL,
+    pucch-F0-2WithoutFH                         ENUMERATED {notSupported}                   OPTIONAL,
+    pucch-F1-3-4WithoutFH                       ENUMERATED {notSupported}                   OPTIONAL,
+    mux-SR-HARQ-ACK-CSI-PUCCH-MultiPerSlot      ENUMERATED {supported}                      OPTIONAL,
+    uci-CodeBlockSegmentation                   ENUMERATED {supported}                      OPTIONAL,
+    onePUCCH-LongAndShortFormat                 ENUMERATED {supported}                      OPTIONAL,
+    twoPUCCH-AnyOthersInSlot                    ENUMERATED {supported}                      OPTIONAL,
+    intraSlotFreqHopping-PUSCH                  ENUMERATED {supported}                      OPTIONAL,
+    pusch-LBRM                                  ENUMERATED {supported}                      OPTIONAL,
+    pdcch-BlindDetectionCA                      INTEGER (4..16)                             OPTIONAL,
+    tpc-PUSCH-RNTI                              ENUMERATED {supported}                      OPTIONAL,
+    tpc-PUCCH-RNTI                              ENUMERATED {supported}                      OPTIONAL,
+    tpc-SRS-RNTI                                ENUMERATED {supported}                      OPTIONAL,
+    absoluteTPC-Command                         ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUSCH                  ENUMERATED {supported}                      OPTIONAL,
+    twoDifferentTPC-Loop-PUCCH                  ENUMERATED {supported}                      OPTIONAL,
+    pusch-HalfPi-BPSK                           ENUMERATED {supported}                      OPTIONAL,
+    pucch-F3-4-HalfPi-BPSK                      ENUMERATED {supported}                      OPTIONAL,
+    almostContiguousCP-OFDM-UL                  ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-RS                                   ENUMERATED {supported}                      OPTIONAL,
+    sp-CSI-IM                                   ENUMERATED {supported}                      OPTIONAL,
+    tdd-MultiDL-UL-SwitchPerSlot                ENUMERATED {supported}                      OPTIONAL,
+    multipleCORESET                             ENUMERATED {supported}                      OPTIONAL,
+    ...,
+    [[
+    csi-RS-IM-ReceptionForFeedback              CSI-RS-IM-ReceptionForFeedback              OPTIONAL,
+    csi-RS-ProcFrameworkForSRS                  CSI-RS-ProcFrameworkForSRS                  OPTIONAL,
+    csi-ReportFramework                         CSI-ReportFramework                         OPTIONAL,
+    mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot       SEQUENCE {
+        sameSymbol                                  ENUMERATED {supported}                      OPTIONAL,
+        diffSymbol                                  ENUMERATED {supported}                      OPTIONAL
+    }                                                                                       OPTIONAL,
+    mux-SR-HARQ-ACK-PUCCH                       ENUMERATED {supported}                      OPTIONAL,
+    mux-MultipleGroupCtrlCH-Overlap             ENUMERATED {supported}                      OPTIONAL,
+    dl-SchedulingOffset-PDSCH-TypeA             ENUMERATED {supported}                      OPTIONAL,
+    dl-SchedulingOffset-PDSCH-TypeB             ENUMERATED {supported}                      OPTIONAL,
+    ul-SchedulingOffset                         ENUMERATED {supported}                      OPTIONAL,
+    dl-64QAM-MCS-TableAlt                       ENUMERATED {supported}                      OPTIONAL,
+    ul-64QAM-MCS-TableAlt                       ENUMERATED {supported}                      OPTIONAL,
+    cqi-TableAlt                                ENUMERATED {supported}                      OPTIONAL,
+    oneFL-DMRS-TwoAdditionalDMRS-UL             ENUMERATED {supported}                      OPTIONAL,
+    twoFL-DMRS-TwoAdditionalDMRS-UL             ENUMERATED {supported}                      OPTIONAL,
+    oneFL-DMRS-ThreeAdditionalDMRS-UL           ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    pdcch-BlindDetectionNRDC                SEQUENCE {
+        pdcch-BlindDetectionMCG-UE              INTEGER (1..15),
+        pdcch-BlindDetectionSCG-UE              INTEGER (1..15)
+    }                                                                                       OPTIONAL,
+    mux-HARQ-ACK-PUSCH-DiffSymbol               ENUMERATED {supported}                      OPTIONAL
+    ]],
+    [[
+    -- R1 11-1b: Type 1 HARQ-ACK codebook support for relative TDRA for DL
+    type1-HARQ-ACK-Codebook-r16                 ENUMERATED {supported}                      OPTIONAL,
+    -- R1 11-8: Enhanced UL power control scheme
+    enhancedPowerControl-r16                    ENUMERATED {supported}                      OPTIONAL,
+    -- R1 16-1b-1: TCI state activation across multiple CCs
+    simultaneousTCI-ActMultipleCC-r16           ENUMERATED {supported}                      OPTIONAL,
+    -- R1 16-1b-2: Spatial relation update across multiple CCs
+    simultaneousSpatialRelationMultipleCC-r16   ENUMERATED {supported}                      OPTIONAL,
+    cli-RSSI-FDM-DL-r16                         ENUMERATED {supported}                      OPTIONAL,
+    cli-SRS-RSRP-FDM-DL-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- R1 19-3: Maximum MIMO Layer Adaptation
+    maxLayersMIMO-Adaptation-r16                ENUMERATED {supported}                      OPTIONAL,
+    -- R1 12-5: Configuration of aggregation factor per SPS configuration
+    aggregationFactorSPS-DL-r16                 ENUMERATED {supported}                      OPTIONAL,
+    -- R1 16-1g: Resources for beam management, pathloss measurement, BFD, RLM and new beam identification
+    maxTotalResourcesForOneFreqRange-r16        SEQUENCE {
+        maxNumberResWithinSlotAcrossCC-OneFR-r16    ENUMERATED {n2, n4, n8, n12, n16, n32, n64, n128}    OPTIONAL,
+        maxNumberResAcrossCC-OneFR-r16              ENUMERATED {n2, n4, n8, n12, n16, n32, n40, n48, n64, n72, n80, n96, n128, n256}
+                                                                                            OPTIONAL
+    }                                           OPTIONAL,
+    -- R1 16-7: Extension of the maximum number of configured aperiodic CSI report settings
+    csi-ReportFrameworkExt-r16                  CSI-ReportFrameworkExt-r16                  OPTIONAL
+    ]],
+    [[
+    twoTCI-Act-servingCellInCC-List-r16         ENUMERATED {supported}                      OPTIONAL
+    ]]
+}
+
+Phy-ParametersFR1 ::=                       SEQUENCE {
+    pdcch-MonitoringSingleOccasion              ENUMERATED {supported}                      OPTIONAL,
+    scs-60kHz                                   ENUMERATED {supported}                      OPTIONAL,
+    pdsch-256QAM-FR1                            ENUMERATED {supported}                      OPTIONAL,
+    pdsch-RE-MappingFR1-PerSymbol               ENUMERATED {n10, n20}                       OPTIONAL,
+    ...,
+    [[
+    pdsch-RE-MappingFR1-PerSlot                 ENUMERATED {n16, n32, n48, n64, n80, n96, n112, n128,
+                                                n144, n160, n176, n192, n208, n224, n240, n256}         OPTIONAL
+    ]]
+}
+
+Phy-ParametersFR2 ::=                       SEQUENCE {
+    dummy                                       ENUMERATED {supported}                                  OPTIONAL,
+    pdsch-RE-MappingFR2-PerSymbol               ENUMERATED {n6, n20}                                    OPTIONAL,
+    ...,
+    [[
+    pCell-FR2                                   ENUMERATED {supported}                                  OPTIONAL,
+    pdsch-RE-MappingFR2-PerSlot                 ENUMERATED {n16, n32, n48, n64, n80, n96, n112, n128,
+                                                    n144, n160, n176, n192, n208, n224, n240, n256}     OPTIONAL
+    ]],
+    [[
+    -- R1 16-1c: Support of default spatial relation and pathloss reference RS for dedicated-PUCCH/SRS and PUSCH
+    defaultSpatialRelationPathlossRS-r16        ENUMERATED {supported}                                  OPTIONAL,
+    -- R1 16-1d: Support of spatial relation update for AP-SRS via MAC CE
+    spatialRelationUpdateAP-SRS-r16             ENUMERATED {supported}                                  OPTIONAL,
+    maxNumberSRS-PosSpatialRelationsAllServingCells-r16  ENUMERATED {n0, n1, n2, n4, n8, n16}           OPTIONAL
+    ]]
+}
+
+-- TAG-PHY-PARAMETERS-STOP
+-- TAG-PHY-PARAMETERSMRDC-START
+
+Phy-ParametersMRDC ::=              SEQUENCE {
+    naics-Capability-List               SEQUENCE (SIZE (1..maxNrofNAICS-Entries)) OF NAICS-Capability-Entry         OPTIONAL,
+    ...,
+    [[
+    spCellPlacement                     CarrierAggregationVariant                                                   OPTIONAL
+    ]],
+    [[
+    -- R1 18-3b: Semi-statically configured LTE UL transmissions in all UL subframes not limited to tdm-pattern in case of TDD PCell
+    tdd-PCellUL-TX-AllUL-Subframe-r16   ENUMERATED {supported}                                                      OPTIONAL,
+    -- R1 18-3a: Semi-statically configured LTE UL transmissions in all UL subframes not limited to tdm-pattern in case of FDD PCell
+    fdd-PCellUL-TX-AllUL-Subframe-r16   ENUMERATED {supported}                                                      OPTIONAL
+    ]]
+}
+
+NAICS-Capability-Entry ::=          SEQUENCE {
+    numberOfNAICS-CapableCC             INTEGER(1..5),
+    numberOfAggregatedPRB               ENUMERATED {n50, n75, n100, n125, n150, n175, n200, n225,
+                                                    n250, n275, n300, n350, n400, n450, n500, spare},
+    ...
+}
+
+-- TAG-PHY-PARAMETERSMRDC-STOP
+-- TAG-PHY-PARAMETERSSHAREDSPECTRUMCHACCESS-START
+
+Phy-ParametersSharedSpectrumChAccess-r16 ::=    SEQUENCE {
+    -- 10-32 (1-2): SS block based SINR measurement (SS-SINR) for unlicensed spectrum
+    ss-SINR-Meas-r16                                ENUMERATED {supported}                      OPTIONAL,
+    -- 10-33 (2-32a): Semi-persistent CSI report on PUCCH for unlicensed spectrum
+    sp-CSI-ReportPUCCH-r16                          ENUMERATED {supported}                      OPTIONAL,
+    -- 10-33a (2-32b): Semi-persistent CSI report on PUSCH for unlicensed spectrum
+    sp-CSI-ReportPUSCH-r16                          ENUMERATED {supported}                      OPTIONAL,
+    -- 10-34 (3-6): Dynamic SFI monitoring for unlicensed spectrum
+    dynamicSFI-r16                                  ENUMERATED {supported}                      OPTIONAL,
+    -- 10-35c (4-19c): SR/HARQ-ACK/CSI multiplexing once per slot using a PUCCH (or HARQ-ACK/CSI piggybacked on a PUSCH) when SR/HARQ-
+    -- ACK/CSI are supposed to be sent with different starting symbols in a slot for unlicensed spectrum
+    -- 10-35 (4-19): SR/HARQ-ACK/CSI multiplexing once per slot using a PUCCH (or HARQ-ACK/CSI piggybacked on a PUSCH) when SR/HARQ-
+    -- ACK/CSI are supposed to be sent with the same starting symbol on the PUCCH resources in a slot for unlicensed spectrum
+    mux-SR-HARQ-ACK-CSI-PUCCH-OncePerSlot-r16       SEQUENCE {
+        sameSymbol-r16                                  ENUMERATED {supported}                  OPTIONAL,
+        diffSymbol-r16                                  ENUMERATED {supported}                  OPTIONAL
+    }                                                                                           OPTIONAL,
+    -- 10-35a (4-19a): Overlapping PUCCH resources have different starting symbols in a slot for unlicensed spectrum
+    mux-SR-HARQ-ACK-PUCCH-r16                       ENUMERATED {supported}                      OPTIONAL,
+    -- 10-35b (4-19b): SR/HARQ-ACK/CSI multiplexing more than once per slot using a PUCCH (or HARQ-ACK/CSI piggybacked on a PUSCH) when
+    -- SR/HARQ ACK/CSI are supposed to be sent with the same or different starting symbol in a slot for unlicensed spectrum
+    mux-SR-HARQ-ACK-CSI-PUCCH-MultiPerSlot-r16      ENUMERATED {supported}                      OPTIONAL,
+    -- 10-36 (4-28): HARQ-ACK multiplexing on PUSCH with different PUCCH/PUSCH starting OFDM symbols for unlicensed spectrum
+    mux-HARQ-ACK-PUSCH-DiffSymbol-r16               ENUMERATED {supported}                      OPTIONAL,
+    -- 10-37 (4-23): Repetitions for PUCCH format 1, 3, and 4 over multiple slots with K = 2, 4, 8 for unlicensed spectrum
+    pucch-Repetition-F1-3-4-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- 10-38 (5-14): Type 1 configured PUSCH repetitions over multiple slots for unlicensed spectrum
+    type1-PUSCH-RepetitionMultiSlots-r16            ENUMERATED {supported}                      OPTIONAL,
+    -- 10-39 (5-16): Type 2 configured PUSCH repetitions over multiple slots for unlicensed spectrum
+    type2-PUSCH-RepetitionMultiSlots-r16            ENUMERATED {supported}                      OPTIONAL,
+    -- 10-40 (5-17): PUSCH repetitions over multiple slots for unlicensed spectrum
+    pusch-RepetitionMultiSlots-r16                  ENUMERATED {supported}                      OPTIONAL,
+    -- 10-40a (5-17a): PDSCH repetitions over multiple slots for unlicensed spectrum
+    pdsch-RepetitionMultiSlots-r16                  ENUMERATED {supported}                      OPTIONAL,
+    -- 10-41 (5-18): DL SPS
+    downlinkSPS-r16                                 ENUMERATED {supported}                      OPTIONAL,
+    -- 10-42 (5-19): Type 1 Configured UL grant
+    configuredUL-GrantType1-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- 10-43 (5-20): Type 2 Configured UL grant
+    configuredUL-GrantType2-r16                     ENUMERATED {supported}                      OPTIONAL,
+    -- 10-44 (5-21): Pre-emption indication for DL
+    pre-EmptIndication-DL-r16                       ENUMERATED {supported}                      OPTIONAL,
+    ...
+}
+
+-- TAG-PHY-PARAMETERSSHAREDSPECTRUMCHACCESS-STOP
+-- TAG-POWSAV-PARAMETERS-START
+
+PowSav-Parameters-r16 ::=         SEQUENCE {
+    powSav-ParametersCommon-r16               PowSav-ParametersCommon-r16                                        OPTIONAL,
+    powSav-ParametersFRX-Diff-r16             PowSav-ParametersFRX-Diff-r16                                      OPTIONAL,
+    ...
+}
+
+PowSav-ParametersCommon-r16 ::=    SEQUENCE {
+    drx-Preference-r16                        ENUMERATED {supported}                                             OPTIONAL,
+    maxCC-Preference-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    releasePreference-r16                     ENUMERATED {supported}                                             OPTIONAL,
+    -- R1 19-4a: UE assistance information
+    minSchedulingOffsetPreference-r16         ENUMERATED {supported}                                             OPTIONAL,
+    ...
+}
+
+PowSav-ParametersFRX-Diff-r16 ::=    SEQUENCE {
+    maxBW-Preference-r16                      ENUMERATED {supported}                                             OPTIONAL,
+    maxMIMO-LayerPreference-r16               ENUMERATED {supported}                                             OPTIONAL,
+    ...
+}
+
+-- TAG-POWSAV-PARAMETERS-STOP
+-- TAG-PROCESSINGPARAMETERS-START
+
+ProcessingParameters ::=        SEQUENCE {
+    fallback                        ENUMERATED {sc, cap1-only},
+    differentTB-PerSlot              SEQUENCE {
+        upto1                          NumberOfCarriers                    OPTIONAL,
+        upto2                          NumberOfCarriers                    OPTIONAL,
+        upto4                          NumberOfCarriers                    OPTIONAL,
+        upto7                          NumberOfCarriers                    OPTIONAL
+    }                                                                 OPTIONAL
+}
+
+NumberOfCarriers ::=    INTEGER (1..16)
+
+-- TAG-PROCESSINGPARAMETERS-STOP
+-- TAG-RAT-TYPE-START
+
+RAT-Type ::= ENUMERATED {nr, eutra-nr, eutra, utra-fdd-v1610, ...}
+
+-- TAG-RAT-TYPE-STOP
+-- TAG-RF-PARAMETERS-START
+
+RF-Parameters ::=                                   SEQUENCE {
+    supportedBandListNR                                 SEQUENCE (SIZE (1..maxBands)) OF BandNR,
+    supportedBandCombinationList                        BandCombinationList                         OPTIONAL,
+    appliedFreqBandListFilter                           FreqBandList                                OPTIONAL,
+    ...,
+    [[
+    supportedBandCombinationList-v1540                  BandCombinationList-v1540                   OPTIONAL,
+    srs-SwitchingTimeRequested                          ENUMERATED {true}                           OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1550                  BandCombinationList-v1550                   OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1560                  BandCombinationList-v1560                   OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1610                  BandCombinationList-v1610                   OPTIONAL,
+    supportedBandCombinationListSidelinkEUTRA-NR-r16    BandCombinationListSidelinkEUTRA-NR-r16     OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-r16     BandCombinationList-UplinkTxSwitch-r16      OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1630                  BandCombinationList-v1630                   OPTIONAL,
+    supportedBandCombinationListSidelinkEUTRA-NR-v1630  BandCombinationListSidelinkEUTRA-NR-v1630   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1630   BandCombinationList-UplinkTxSwitch-v1630    OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1640                  BandCombinationList-v1640                   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1640   BandCombinationList-UplinkTxSwitch-v1640    OPTIONAL
+    ]]
+
+}
+
+BandNR ::=                          SEQUENCE {
+    bandNR                              FreqBandIndicatorNR,
+    modifiedMPR-Behaviour               BIT STRING (SIZE (8))                           OPTIONAL,
+    mimo-ParametersPerBand              MIMO-ParametersPerBand                          OPTIONAL,
+    extendedCP                          ENUMERATED {supported}                          OPTIONAL,
+    multipleTCI                         ENUMERATED {supported}                          OPTIONAL,
+    bwp-WithoutRestriction              ENUMERATED {supported}                          OPTIONAL,
+    bwp-SameNumerology                  ENUMERATED {upto2, upto4}                       OPTIONAL,
+    bwp-DiffNumerology                  ENUMERATED {upto4}                              OPTIONAL,
+    crossCarrierScheduling-SameSCS      ENUMERATED {supported}                          OPTIONAL,
+    pdsch-256QAM-FR2                    ENUMERATED {supported}                          OPTIONAL,
+    pusch-256QAM                        ENUMERATED {supported}                          OPTIONAL,
+    ue-PowerClass                       ENUMERATED {pc1, pc2, pc3, pc4}                 OPTIONAL,
+    rateMatchingLTE-CRS                 ENUMERATED {supported}                          OPTIONAL,
+    channelBWs-DL                       CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (10))                      OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (3))                       OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (3))                       OPTIONAL
+        }
+    }                                                                                   OPTIONAL,
+    channelBWs-UL                       CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (10))                      OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (10))                      OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (3))                       OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (3))                       OPTIONAL
+        }
+    }                                                                                   OPTIONAL,
+    ...,
+    [[
+    maxUplinkDutyCycle-PC2-FR1                  ENUMERATED {n60, n70, n80, n90, n100}   OPTIONAL
+    ]],
+    [[
+    pucch-SpatialRelInfoMAC-CE          ENUMERATED {supported}                          OPTIONAL,
+    powerBoosting-pi2BPSK               ENUMERATED {supported}                          OPTIONAL
+    ]],
+    [[
+    maxUplinkDutyCycle-FR2          ENUMERATED {n15, n20, n25, n30, n40, n50, n60, n70, n80, n90, n100}     OPTIONAL
+    ]],
+    [[
+    channelBWs-DL-v1590                 CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (16))              OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (8))               OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (8))               OPTIONAL
+        }
+    }                                                                               OPTIONAL,
+    channelBWs-UL-v1590                 CHOICE {
+        fr1                                 SEQUENCE {
+            scs-15kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-30kHz                           BIT STRING (SIZE (16))              OPTIONAL,
+            scs-60kHz                           BIT STRING (SIZE (16))              OPTIONAL
+        },
+        fr2                                 SEQUENCE {
+            scs-60kHz                           BIT STRING (SIZE (8))               OPTIONAL,
+            scs-120kHz                          BIT STRING (SIZE (8))               OPTIONAL
+        }
+    }                                                                               OPTIONAL
+    ]],
+    [[
+    asymmetricBandwidthCombinationSet     BIT STRING (SIZE (1..32))           OPTIONAL
+    ]],
+    [[
+    -- R1 10: NR-unlicensed
+    sharedSpectrumChAccessParamsPerBand-r16 SharedSpectrumChAccessParamsPerBand-r16 OPTIONAL,
+    -- R1 11-7b: Independent cancellation of the overlapping PUSCHs in an intra-band UL CA
+    cancelOverlappingPUSCH-r16              ENUMERATED {supported}                  OPTIONAL,
+    -- R1 14-1: Multiple LTE-CRS rate matching patterns
+    multipleRateMatchingEUTRA-CRS-r16       SEQUENCE {
+        maxNumberPatterns-r16               INTEGER (2..6),
+        maxNumberNon-OverlapPatterns-r16    INTEGER (1..3)
+    }                                                                               OPTIONAL,
+    -- R1 14-1a: Two LTE-CRS overlapping rate matching patterns within a part of NR carrier using 15 kHz overlapping with a LTE carrier
+    overlapRateMatchingEUTRA-CRS-r16        ENUMERATED {supported}                  OPTIONAL,
+    -- R1 14-2: PDSCH Type B mapping of length 9 and 10 OFDM symbols
+    pdsch-MappingTypeB-Alt-r16              ENUMERATED {supported}                  OPTIONAL,
+    -- R1 14-3: One slot periodic TRS configuration for FR1
+    oneSlotPeriodicTRS-r16                  ENUMERATED {supported}                  OPTIONAL,
+    olpc-SRS-Pos-r16                        OLPC-SRS-Pos-r16                        OPTIONAL,
+    spatialRelationsSRS-Pos-r16             SpatialRelationsSRS-Pos-r16             OPTIONAL,
+    simulSRS-MIMO-TransWithinBand-r16       ENUMERATED {n2}                         OPTIONAL,
+    channelBW-DL-IAB-r16                    CHOICE {
+        fr1-100mhz                              SEQUENCE {
+            scs-15kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-30kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-60kHz                               ENUMERATED {supported}          OPTIONAL
+        },
+        fr2-200mhz                          SEQUENCE {
+            scs-60kHz                           ENUMERATED {supported}              OPTIONAL,
+            scs-120kHz                          ENUMERATED {supported}              OPTIONAL
+        }
+    }                                                                               OPTIONAL,
+    channelBW-UL-IAB-r16                    CHOICE {
+        fr1-100mhz                              SEQUENCE {
+            scs-15kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-30kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-60kHz                               ENUMERATED {supported}          OPTIONAL
+        },
+        fr2-200mhz                              SEQUENCE {
+            scs-60kHz                               ENUMERATED {supported}          OPTIONAL,
+            scs-120kHz                              ENUMERATED {supported}          OPTIONAL
+        }
+    }                                                                               OPTIONAL,
+    rasterShift7dot5-IAB-r16                ENUMERATED {supported}                  OPTIONAL,
+    ue-PowerClass-v1610                     ENUMERATED {pc1dot5}                    OPTIONAL,
+    condHandover-r16                        ENUMERATED {supported}                  OPTIONAL,
+    condHandoverFailure-r16                 ENUMERATED {supported}                  OPTIONAL,
+    condHandoverTwoTriggerEvents-r16        ENUMERATED {supported}                  OPTIONAL,
+    condPSCellChange-r16                    ENUMERATED {supported}                  OPTIONAL,
+    condPSCellChangeTwoTriggerEvents-r16    ENUMERATED {supported}                  OPTIONAL,
+    mpr-PowerBoost-FR2-r16                  ENUMERATED {supported}                  OPTIONAL,
+
+    -- R1 11-9: Multiple active configured grant configurations for a BWP of a serving cell
+    activeConfiguredGrant-r16               SEQUENCE {
+    maxNumberConfigsPerBWP-r16                  ENUMERATED {n1, n2, n4, n8, n12},
+    maxNumberConfigsAllCC-r16                   INTEGER (2..32)
+    }                                                                               OPTIONAL,
+    -- R1 11-9a: Joint release in a DCI for two or more configured grant Type 2 configurations for a given BWP of a serving cell
+    jointReleaseConfiguredGrantType2-r16    ENUMERATED {supported}                  OPTIONAL,
+    -- R1 12-2: Multiple SPS configurations
+    sps-r16                                 SEQUENCE {
+    maxNumberConfigsPerBWP-r16                  INTEGER (1..8),
+    maxNumberConfigsAllCC-r16                   INTEGER (2..32)
+    }                                                                               OPTIONAL,
+    -- R1 12-2a: Joint release in a DCI for two or more SPS configurations for a given BWP of a serving cell
+    jointReleaseSPS-r16                     ENUMERATED {supported}                  OPTIONAL,
+    -- R1 13-19: Simultaneous positioning SRS and MIMO SRS transmission within a band across multiple CCs
+    simulSRS-TransWithinBand-r16            ENUMERATED {n2}                         OPTIONAL,
+    trs-AdditionalBandwidth-r16             ENUMERATED {trs-AddBW-Set1, trs-AddBW-Set2}  OPTIONAL,
+    handoverIntraF-IAB-r16                  ENUMERATED {supported}                  OPTIONAL
+    ]],
+    [[
+    -- R1 22-5a: Simultaneous transmission of SRS for antenna switching and SRS for CB/NCB /BM for intra-band UL CA
+    -- R1 22-5c: Simultaneous transmission of SRS for antenna switching and SRS for antenna switching for intra-band UL CA
+    simulTX-SRS-AntSwitchingIntraBandUL-CA-r16  SimulSRS-ForAntennaSwitching-r16            OPTIONAL,
+    -- R1 10: NR-unlicensed
+    sharedSpectrumChAccessParamsPerBand-v1630   SharedSpectrumChAccessParamsPerBand-v1630   OPTIONAL
+    ]],
+    [[
+    handoverUTRA-FDD-r16                      ENUMERATED {supported}                       OPTIONAL,
+    -- R4 7-4: Report the shorter transient capability supported by the UE: 2, 4 or 7us
+    enhancedUL-TransientPeriod-r16            ENUMERATED {us2, us4, us7}                   OPTIONAL,
+    sharedSpectrumChAccessParamsPerBand-v1640 SharedSpectrumChAccessParamsPerBand-v1640    OPTIONAL
+    ]]
+}
+
+-- TAG-RF-PARAMETERS-STOP
+-- TAG-RF-PARAMETERSMRDC-START
+
+RF-ParametersMRDC ::=                   SEQUENCE {
+    supportedBandCombinationList            BandCombinationList                             OPTIONAL,
+    appliedFreqBandListFilter               FreqBandList                                    OPTIONAL,
+    ...,
+    [[
+    srs-SwitchingTimeRequested              ENUMERATED {true}                               OPTIONAL,
+    supportedBandCombinationList-v1540      BandCombinationList-v1540                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1550      BandCombinationList-v1550                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1560      BandCombinationList-v1560                       OPTIONAL,
+    supportedBandCombinationListNEDC-Only   BandCombinationList                             OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1570      BandCombinationList-v1570                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1580      BandCombinationList-v1580                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1590      BandCombinationList-v1590                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationListNEDC-Only-v15a0    SEQUENCE {
+        supportedBandCombinationList-v1540      BandCombinationList-v1540                   OPTIONAL,
+        supportedBandCombinationList-v1560      BandCombinationList-v1560                   OPTIONAL,
+        supportedBandCombinationList-v1570      BandCombinationList-v1570                   OPTIONAL,
+        supportedBandCombinationList-v1580      BandCombinationList-v1580                   OPTIONAL,
+        supportedBandCombinationList-v1590      BandCombinationList-v1590                   OPTIONAL
+    }                                                                                       OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1610      BandCombinationList-v1610                       OPTIONAL,
+    supportedBandCombinationListNEDC-Only-v1610   BandCombinationList-v1610                 OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-r16 BandCombinationList-UplinkTxSwitch-r16  OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1630                  BandCombinationList-v1630                   OPTIONAL,
+    supportedBandCombinationListNEDC-Only-v1630         BandCombinationList-v1630                   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1630   BandCombinationList-UplinkTxSwitch-v1630    OPTIONAL
+    ]],
+    [[
+    supportedBandCombinationList-v1640                  BandCombinationList-v1640                   OPTIONAL,
+    supportedBandCombinationListNEDC-Only-v1640         BandCombinationList-v1640                   OPTIONAL,
+    supportedBandCombinationList-UplinkTxSwitch-v1640   BandCombinationList-UplinkTxSwitch-v1640    OPTIONAL
+    ]]
+}
+
+-- TAG-RF-PARAMETERSMRDC-STOP
+-- TAG-RLC-PARAMETERS-START
+
+RLC-Parameters ::= SEQUENCE {
+    am-WithShortSN                  ENUMERATED {supported}  OPTIONAL,
+    um-WithShortSN                  ENUMERATED {supported}  OPTIONAL,
+    um-WithLongSN                   ENUMERATED {supported}  OPTIONAL,
+    ...,
+    [[
+    extendedT-PollRetransmit-r16    ENUMERATED {supported}  OPTIONAL,
+    extendedT-StatusProhibit-r16    ENUMERATED {supported}  OPTIONAL
+    ]]
+}
+
+-- TAG-RLC-PARAMETERS-STOP
+-- TAG-SDAP-PARAMETERS-START
+
+SDAP-Parameters ::= SEQUENCE {
+    as-ReflectiveQoS                 ENUMERATED {true}               OPTIONAL,
+    ...,
+    [[
+    sdap-QOS-IAB-r16              ENUMERATED {supported}       OPTIONAL,
+    sdapHeaderIAB-r16             ENUMERATED {supported}       OPTIONAL
+    ]]
+
+}
+
+-- TAG-SDAP-PARAMETERS-STOP
+-- TAG-SIDELINKPARAMETERS-START
+
+SidelinkParameters-r16 ::=    SEQUENCE {
+    sidelinkParametersNR-r16                  SidelinkParametersNR-r16                                                  OPTIONAL,
+    sidelinkParametersEUTRA-r16               SidelinkParametersEUTRA-r16                                               OPTIONAL
+}
+
+SidelinkParametersNR-r16 ::= SEQUENCE {
+    rlc-ParametersSidelink-r16                RLC-ParametersSidelink-r16                                                OPTIONAL,
+    mac-ParametersSidelink-r16                MAC-ParametersSidelink-r16                                                OPTIONAL,
+    fdd-Add-UE-Sidelink-Capabilities-r16      UE-SidelinkCapabilityAddXDD-Mode-r16                                      OPTIONAL,
+    tdd-Add-UE-Sidelink-Capabilities-r16      UE-SidelinkCapabilityAddXDD-Mode-r16                                      OPTIONAL,
+    supportedBandListSidelink-r16             SEQUENCE (SIZE (1..maxBands)) OF BandSidelink-r16                         OPTIONAL,
+    ...
+}
+
+SidelinkParametersEUTRA-r16 ::= SEQUENCE {
+    sl-ParametersEUTRA1-r16                   OCTET STRING                                                              OPTIONAL,
+    sl-ParametersEUTRA2-r16                   OCTET STRING                                                              OPTIONAL,
+    sl-ParametersEUTRA3-r16                   OCTET STRING                                                              OPTIONAL,
+    supportedBandListSidelinkEUTRA-r16        SEQUENCE (SIZE (1..maxBandsEUTRA)) OF BandSidelinkEUTRA-r16               OPTIONAL,
+    ...
+}
+
+RLC-ParametersSidelink-r16 ::= SEQUENCE {
+    am-WithLongSN-Sidelink-r16                ENUMERATED {supported}                                                    OPTIONAL,
+    um-WithLongSN-Sidelink-r16                ENUMERATED {supported}                                                    OPTIONAL,
+    ...
+}
+
+MAC-ParametersSidelink-r16 ::= SEQUENCE {
+    mac-ParametersSidelinkCommon-r16          MAC-ParametersSidelinkCommon-r16                                          OPTIONAL,
+    mac-ParametersSidelinkXDD-Diff-r16        MAC-ParametersSidelinkXDD-Diff-r16                                        OPTIONAL,
+    ...
+}
+
+UE-SidelinkCapabilityAddXDD-Mode-r16 ::=  SEQUENCE {
+    mac-ParametersSidelinkXDD-Diff-r16        MAC-ParametersSidelinkXDD-Diff-r16                                        OPTIONAL
+}
+
+MAC-ParametersSidelinkCommon-r16 ::= SEQUENCE {
+    lcp-RestrictionSidelink-r16               ENUMERATED {supported}                                                    OPTIONAL,
+    multipleConfiguredGrantsSidelink-r16      ENUMERATED {supported}                                                    OPTIONAL,
+    ...
+}
+
+MAC-ParametersSidelinkXDD-Diff-r16 ::=  SEQUENCE {
+    multipleSR-ConfigurationsSidelink-r16     ENUMERATED {supported}                                                    OPTIONAL,
+    logicalChannelSR-DelayTimerSidelink-r16   ENUMERATED {supported}                                                    OPTIONAL,
+    ...
+}
+
+BandSidelinkEUTRA-r16 ::=               SEQUENCE {
+    freqBandSidelinkEUTRA-r16               FreqBandIndicatorEUTRA,
+    -- R1 15-7: Transmitting LTE sidelink mode 3 scheduled by NR Uu
+    gnb-ScheduledMode3SidelinkEUTRA-r16     SEQUENCE {
+        gnb-ScheduledMode3DelaySidelinkEUTRA-r16 ENUMERATED {ms0, ms0dot25, ms0dot5, ms0dot625, ms0dot75, ms1,
+                                                             ms1dot25, ms1dot5, ms1dot75, ms2, ms2dot5, ms3, ms4,
+                                                             ms5, ms6, ms8, ms10, ms20}
+    }                                                                                                                   OPTIONAL,
+    -- R1 15-9: Transmitting LTE sidelink mode 4 configured by NR Uu
+    gnb-ScheduledMode4SidelinkEUTRA-r16     ENUMERATED {supported}                                                      OPTIONAL
+}
+
+BandSidelink-r16 ::=  SEQUENCE {
+    freqBandSidelink-r16                          FreqBandIndicatorNR,
+    --15-1
+    sl-Reception-r16                              SEQUENCE {
+        harq-RxProcessSidelink-r16                    ENUMERATED {n16, n24, n32, n48, n64},
+        pscch-RxSidelink-r16                          ENUMERATED {value1, value2},
+        scs-CP-PatternRxSidelink-r16                  CHOICE {
+            fr1-r16                                       SEQUENCE {
+                scs-15kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-30kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL
+            },
+            fr2-r16                                       SEQUENCE {
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-120kHz-r16                                BIT STRING (SIZE (16))                OPTIONAL
+            }
+        }                                                                                           OPTIONAL,
+        extendedCP-RxSidelink-r16                     ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-2
+    sl-TransmissionMode1-r16                      SEQUENCE {
+        harq-TxProcessModeOneSidelink-r16             ENUMERATED {n8, n16},
+        scs-CP-PatternTxSidelinkModeOne-r16           CHOICE {
+            fr1-r16                                       SEQUENCE {
+                scs-15kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-30kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL
+            },
+            fr2-r16                                       SEQUENCE {
+                scs-60kHz-r16                                 BIT STRING (SIZE (16))                OPTIONAL,
+                scs-120kHz-r16                                BIT STRING (SIZE (16))                OPTIONAL
+            }
+        },
+        extendedCP-TxSidelink-r16                     ENUMERATED {supported}                        OPTIONAL,
+        harq-ReportOnPUCCH-r16                        ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-4
+    sync-Sidelink-r16                             SEQUENCE {
+        gNB-Sync-r16                                  ENUMERATED {supported}                        OPTIONAL,
+        gNB-GNSS-UE-SyncWithPriorityOnGNB-ENB-r16     ENUMERATED {supported}                        OPTIONAL,
+        gNB-GNSS-UE-SyncWithPriorityOnGNSS-r16        ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-10
+    sl-Tx-256QAM-r16                              ENUMERATED {supported}                            OPTIONAL,
+    --15-11
+    psfch-FormatZeroSidelink-r16                  SEQUENCE {
+        psfch-RxNumber                                ENUMERATED {n5, n15, n25, n32, n35, n45, n50, n64},
+        psfch-TxNumber                                ENUMERATED {n4, n8, n16}
+    }                                                                                               OPTIONAL,
+    --15-12
+    lowSE-64QAM-MCS-TableSidelink-r16             ENUMERATED {supported}                            OPTIONAL,
+    --15-15
+    enb-sync-Sidelink-r16                         ENUMERATED {supported}                            OPTIONAL,
+    ...,
+    [[
+    --15-3
+    sl-TransmissionMode2-r16                      SEQUENCE {
+        harq-TxProcessModeTwoSidelink-r16              ENUMERATED {n8, n16},
+        scs-CP-PatternTxSidelinkModeTwo-r16           ENUMERATED {supported}                        OPTIONAL,
+        dl-openLoopPC-Sidelink-r16                    ENUMERATED {supported}                        OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-5
+    congestionControlSidelink-r16                 SEQUENCE {
+        cbr-ReportSidelink-r16                        ENUMERATED {supported}                        OPTIONAL,
+        cbr-CR-TimeLimitSidelink-r16                  ENUMERATED {time1, time2}
+    }                                                                                               OPTIONAL,
+    --15-22
+    fewerSymbolSlotSidelink-r16                   ENUMERATED {supported}                            OPTIONAL,
+    --15-23
+    sl-openLoopPC-RSRP-ReportSidelink-r16         ENUMERATED {supported}                            OPTIONAL,
+    --13-1
+    sl-Rx-256QAM-r16                              ENUMERATED {supported}                            OPTIONAL
+    ]]
+}
+
+-- TAG-SIDELINKPARAMETERS-STOP
+-- TAG-SON-PARAMETERS-START
+
+SON-Parameters-r16 ::= SEQUENCE {
+    rach-Report-r16        ENUMERATED {supported}    OPTIONAL,
+    ...
+}
+
+-- TAG-SON-PARAMETERS-STOP
+-- TAG-SPATIALRELATIONSSRS-POS-START
+
+SpatialRelationsSRS-Pos-r16 ::=                    SEQUENCE {
+    spatialRelation-SRS-PosBasedOnSSB-Serving-r16      ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnCSI-RS-Serving-r16   ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnPRS-Serving-r16      ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnSRS-r16              ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnSSB-Neigh-r16        ENUMERATED {supported}                OPTIONAL,
+    spatialRelation-SRS-PosBasedOnPRS-Neigh-r16        ENUMERATED {supported}                OPTIONAL
+}
+
+--TAG-SPATIALRELATIONSSRS-POS-STOP
+-- TAG-SRS-SWITCHINGTIMENR-START
+
+SRS-SwitchingTimeNR ::= SEQUENCE {
+    switchingTimeDL         ENUMERATED {n0us, n30us, n100us, n140us, n200us, n300us, n500us, n900us}  OPTIONAL,
+    switchingTimeUL         ENUMERATED {n0us, n30us, n100us, n140us, n200us, n300us, n500us, n900us}  OPTIONAL
+}
+
+-- TAG-SRS-SWITCHINGTIMENR-STOP
+-- TAG-SRS-SWITCHINGTIMEEUTRA-START
+
+SRS-SwitchingTimeEUTRA ::= SEQUENCE {
+    switchingTimeDL            ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, n7}
+                                                                                               OPTIONAL,
+    switchingTimeUL            ENUMERATED {n0, n0dot5, n1, n1dot5, n2, n2dot5, n3, n3dot5, n4, n4dot5, n5, n5dot5, n6, n6dot5, n7}
+                                                                                               OPTIONAL
+}
+-- TAG-SRS-SWITCHINGTIMEEUTRA-STOP
+-- TAG-SUPPORTEDBANDWIDTH-START
+
+SupportedBandwidth ::=      CHOICE {
+    fr1                         ENUMERATED {mhz5, mhz10, mhz15, mhz20, mhz25, mhz30, mhz40, mhz50, mhz60, mhz80, mhz100},
+    fr2                         ENUMERATED {mhz50, mhz100, mhz200, mhz400}
+}
+
+-- TAG-SUPPORTEDBANDWIDTH-STOP
+-- TAG-UE-BASEDPERFMEAS-PARAMETERS-START
+
+UE-BasedPerfMeas-Parameters-r16 ::= SEQUENCE {
+    barometerMeasReport-r16      ENUMERATED {supported}        OPTIONAL,
+    immMeasBT-r16                ENUMERATED {supported}        OPTIONAL,
+    immMeasWLAN-r16              ENUMERATED {supported}        OPTIONAL,
+    loggedMeasBT-r16             ENUMERATED {supported}        OPTIONAL,
+    loggedMeasurements-r16       ENUMERATED {supported}        OPTIONAL,
+    loggedMeasWLAN-r16           ENUMERATED {supported}        OPTIONAL,
+    orientationMeasReport-r16    ENUMERATED {supported}        OPTIONAL,
+    speedMeasReport-r16          ENUMERATED {supported}        OPTIONAL,
+    gnss-Location-r16            ENUMERATED {supported}        OPTIONAL,
+    ulPDCP-Delay-r16             ENUMERATED {supported}        OPTIONAL,
+   ...
+}
+
+-- TAG-UE-BASEDPERFMEAS-PARAMETERS-STOP
+-- TAG-UE-CAPABILITYRAT-CONTAINERLIST-START
+
+UE-CapabilityRAT-ContainerList ::=    SEQUENCE (SIZE (0..maxRAT-CapabilityContainers)) OF UE-CapabilityRAT-Container
+
+UE-CapabilityRAT-Container ::=        SEQUENCE {
+    rat-Type                              RAT-Type,
+    ue-CapabilityRAT-Container            OCTET STRING
+}
+
+-- TAG-UE-CAPABILITYRAT-CONTAINERLIST-STOP
+-- TAG-UE-CAPABILITYRAT-REQUESTLIST-START
+
+UE-CapabilityRAT-RequestList ::=        SEQUENCE (SIZE (1..maxRAT-CapabilityContainers)) OF UE-CapabilityRAT-Request
+
+UE-CapabilityRAT-Request ::=            SEQUENCE {
+    rat-Type                                RAT-Type,
+    capabilityRequestFilter                 OCTET STRING                    OPTIONAL,   -- Need N
+    ...
+}
+
+-- TAG-UE-CAPABILITYRAT-REQUESTLIST-STOP
+-- TAG-UE-CAPABILITYREQUESTFILTERCOMMON-START
+
+UE-CapabilityRequestFilterCommon ::=            SEQUENCE {
+    mrdc-Request                                SEQUENCE {
+        omitEN-DC                                   ENUMERATED {true}                      OPTIONAL,    -- Need N
+        includeNR-DC                                ENUMERATED {true}                      OPTIONAL,    -- Need N
+        includeNE-DC                                ENUMERATED {true}                      OPTIONAL     -- Need N
+    }                                                                                  OPTIONAL,        -- Need N
+    ...,
+    [[
+    codebookTypeRequest-r16        SEQUENCE {
+        type1-SinglePanel-r16          ENUMERATED {true}                                    OPTIONAL,    -- Need N
+        type1-MultiPanel-r16           ENUMERATED {true}                                    OPTIONAL,    -- Need N
+        type2-r16                      ENUMERATED {true}                                    OPTIONAL,    -- Need N
+        type2-PortSelection-r16        ENUMERATED {true}                                    OPTIONAL     -- Need N
+    }                                                                                   OPTIONAL,    -- Need N
+    uplinkTxSwitchRequest-r16      ENUMERATED {true}                                    OPTIONAL     -- Need N
+    ]]
+}
+
+-- TAG-UE-CAPABILITYREQUESTFILTERCOMMON-STOP
+-- TAG-UE-CAPABILITYREQUESTFILTERNR-START
+
+UE-CapabilityRequestFilterNR ::=            SEQUENCE {
+    frequencyBandListFilter                     FreqBandList                          OPTIONAL,   -- Need N
+    nonCriticalExtension                        UE-CapabilityRequestFilterNR-v1540    OPTIONAL
+}
+
+UE-CapabilityRequestFilterNR-v1540 ::=      SEQUENCE {
+    srs-SwitchingTimeRequest                    ENUMERATED {true}                     OPTIONAL,  -- Need N
+    nonCriticalExtension                        SEQUENCE {}                           OPTIONAL
+}
+
+-- TAG-UE-CAPABILITYREQUESTFILTERNR-STOP
+-- TAG-UE-MRDC-CAPABILITY-START
+
+UE-MRDC-Capability ::=              SEQUENCE {
+    measAndMobParametersMRDC            MeasAndMobParametersMRDC                                                        OPTIONAL,
+    phy-ParametersMRDC-v1530            Phy-ParametersMRDC                                                              OPTIONAL,
+    rf-ParametersMRDC                   RF-ParametersMRDC,
+    generalParametersMRDC               GeneralParametersMRDC-XDD-Diff                                                  OPTIONAL,
+    fdd-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode                                                   OPTIONAL,
+    tdd-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddXDD-Mode                                                   OPTIONAL,
+    fr1-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode                                                   OPTIONAL,
+    fr2-Add-UE-MRDC-Capabilities        UE-MRDC-CapabilityAddFRX-Mode                                                   OPTIONAL,
+    featureSetCombinations              SEQUENCE (SIZE (1..maxFeatureSetCombinations)) OF FeatureSetCombination         OPTIONAL,
+    pdcp-ParametersMRDC-v1530           PDCP-ParametersMRDC                                                             OPTIONAL,
+    lateNonCriticalExtension            OCTET STRING                                                                    OPTIONAL,
+    nonCriticalExtension                UE-MRDC-Capability-v1560                                                        OPTIONAL
+}
+
+UE-MRDC-Capability-v1560 ::=        SEQUENCE {
+    receivedFilters                     OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs)                         OPTIONAL,
+    measAndMobParametersMRDC-v1560      MeasAndMobParametersMRDC-v1560                                                  OPTIONAL,
+    fdd-Add-UE-MRDC-Capabilities-v1560  UE-MRDC-CapabilityAddXDD-Mode-v1560                                             OPTIONAL,
+    tdd-Add-UE-MRDC-Capabilities-v1560  UE-MRDC-CapabilityAddXDD-Mode-v1560                                             OPTIONAL,
+    nonCriticalExtension                UE-MRDC-Capability-v1610                                                        OPTIONAL
+}
+
+UE-MRDC-Capability-v1610 ::=        SEQUENCE {
+    measAndMobParametersMRDC-v1610      MeasAndMobParametersMRDC-v1610                                                  OPTIONAL,
+    generalParametersMRDC-v1610         GeneralParametersMRDC-v1610                                                     OPTIONAL,
+    pdcp-ParametersMRDC-v1610           PDCP-ParametersMRDC-v1610                                                       OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                                                                     OPTIONAL
+}
+
+UE-MRDC-CapabilityAddXDD-Mode ::=   SEQUENCE {
+    measAndMobParametersMRDC-XDD-Diff       MeasAndMobParametersMRDC-XDD-Diff                                           OPTIONAL,
+    generalParametersMRDC-XDD-Diff          GeneralParametersMRDC-XDD-Diff                                              OPTIONAL
+}
+
+UE-MRDC-CapabilityAddXDD-Mode-v1560 ::=    SEQUENCE {
+    measAndMobParametersMRDC-XDD-Diff-v1560    MeasAndMobParametersMRDC-XDD-Diff-v1560                                  OPTIONAL
+}
+
+UE-MRDC-CapabilityAddFRX-Mode ::=   SEQUENCE {
+    measAndMobParametersMRDC-FRX-Diff       MeasAndMobParametersMRDC-FRX-Diff
+}
+
+
+GeneralParametersMRDC-XDD-Diff ::= SEQUENCE {
+    splitSRB-WithOneUL-Path             ENUMERATED {supported}                                                          OPTIONAL,
+    splitDRB-withUL-Both-MCG-SCG        ENUMERATED {supported}                                                          OPTIONAL,
+    srb3                                ENUMERATED {supported}                                                          OPTIONAL,
+    dummy                               ENUMERATED {supported}                                                          OPTIONAL,
+    ...
+}
+
+GeneralParametersMRDC-v1610 ::= SEQUENCE {
+    f1c-OverEUTRA-r16                   ENUMERATED {supported}                                                          OPTIONAL
+}
+
+-- TAG-UE-MRDC-CAPABILITY-STOP
+-- TAG-UE-NR-CAPABILITY-START
+
+UE-NR-Capability ::=            SEQUENCE {
+    accessStratumRelease            AccessStratumRelease,
+    pdcp-Parameters                 PDCP-Parameters,
+    rlc-Parameters                  RLC-Parameters                                                        OPTIONAL,
+    mac-Parameters                  MAC-Parameters                                                        OPTIONAL,
+    phy-Parameters                  Phy-Parameters,
+    rf-Parameters                   RF-Parameters,
+    measAndMobParameters            MeasAndMobParameters                                                  OPTIONAL,
+    fdd-Add-UE-NR-Capabilities      UE-NR-CapabilityAddXDD-Mode                                           OPTIONAL,
+    tdd-Add-UE-NR-Capabilities      UE-NR-CapabilityAddXDD-Mode                                           OPTIONAL,
+    fr1-Add-UE-NR-Capabilities      UE-NR-CapabilityAddFRX-Mode                                           OPTIONAL,
+    fr2-Add-UE-NR-Capabilities      UE-NR-CapabilityAddFRX-Mode                                           OPTIONAL,
+    featureSets                     FeatureSets                                                           OPTIONAL,
+    featureSetCombinations          SEQUENCE (SIZE (1..maxFeatureSetCombinations)) OF FeatureSetCombination         OPTIONAL,
+    lateNonCriticalExtension        OCTET STRING (CONTAINING UE-NR-Capability-v15c0)                      OPTIONAL,
+    nonCriticalExtension            UE-NR-Capability-v1530                                                OPTIONAL
+}
+
+-- Regular non-critical extensions:
+UE-NR-Capability-v1530 ::=               SEQUENCE {
+    fdd-Add-UE-NR-Capabilities-v1530         UE-NR-CapabilityAddXDD-Mode-v1530                            OPTIONAL,
+    tdd-Add-UE-NR-Capabilities-v1530         UE-NR-CapabilityAddXDD-Mode-v1530                            OPTIONAL,
+    dummy                                    ENUMERATED {supported}                                       OPTIONAL,
+    interRAT-Parameters                      InterRAT-Parameters                                          OPTIONAL,
+    inactiveState                            ENUMERATED {supported}                                       OPTIONAL,
+    delayBudgetReporting                     ENUMERATED {supported}                                       OPTIONAL,
+    nonCriticalExtension                     UE-NR-Capability-v1540                                       OPTIONAL
+}
+
+UE-NR-Capability-v1540 ::=              SEQUENCE {
+    sdap-Parameters                         SDAP-Parameters                                               OPTIONAL,
+    overheatingInd                          ENUMERATED {supported}                                        OPTIONAL,
+    ims-Parameters                          IMS-Parameters                                                OPTIONAL,
+    fr1-Add-UE-NR-Capabilities-v1540        UE-NR-CapabilityAddFRX-Mode-v1540                             OPTIONAL,
+    fr2-Add-UE-NR-Capabilities-v1540        UE-NR-CapabilityAddFRX-Mode-v1540                             OPTIONAL,
+    fr1-fr2-Add-UE-NR-Capabilities          UE-NR-CapabilityAddFRX-Mode                                   OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1550                                        OPTIONAL
+}
+
+UE-NR-Capability-v1550 ::=               SEQUENCE {
+    reducedCP-Latency                        ENUMERATED {supported}                                       OPTIONAL,
+    nonCriticalExtension                     UE-NR-Capability-v1560                                       OPTIONAL
+}
+
+UE-NR-Capability-v1560 ::=               SEQUENCE {
+    nrdc-Parameters                         NRDC-Parameters                                               OPTIONAL,
+    receivedFilters                         OCTET STRING (CONTAINING UECapabilityEnquiry-v1560-IEs)       OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1570                                        OPTIONAL
+}
+
+UE-NR-Capability-v1570 ::=               SEQUENCE {
+    nrdc-Parameters-v1570                   NRDC-Parameters-v1570                                         OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1610                                        OPTIONAL
+}
+
+-- Late non-critical extensions:
+UE-NR-Capability-v15c0 ::=               SEQUENCE {
+    nrdc-Parameters-v15c0                    NRDC-Parameters-v15c0                                        OPTIONAL,
+    partialFR2-FallbackRX-Req                ENUMERATED {true}                                            OPTIONAL,
+    nonCriticalExtension                     SEQUENCE {}                                                  OPTIONAL
+}
+
+-- Regular non-critical extensions:
+UE-NR-Capability-v1610 ::=               SEQUENCE {
+    inDeviceCoexInd-r16                     ENUMERATED {supported}                                        OPTIONAL,
+    dl-DedicatedMessageSegmentation-r16     ENUMERATED {supported}                                        OPTIONAL,
+    nrdc-Parameters-v1610                   NRDC-Parameters-v1610                                         OPTIONAL,
+    powSav-Parameters-r16                   PowSav-Parameters-r16                                         OPTIONAL,
+    fr1-Add-UE-NR-Capabilities-v1610        UE-NR-CapabilityAddFRX-Mode-v1610                             OPTIONAL,
+    fr2-Add-UE-NR-Capabilities-v1610        UE-NR-CapabilityAddFRX-Mode-v1610                             OPTIONAL,
+    bh-RLF-Indication-r16                   ENUMERATED {supported}                                        OPTIONAL,
+    directSN-AdditionFirstRRC-IAB-r16       ENUMERATED {supported}                                        OPTIONAL,
+    bap-Parameters-r16                      BAP-Parameters-r16                                            OPTIONAL,
+    referenceTimeProvision-r16              ENUMERATED {supported}                                        OPTIONAL,
+    sidelinkParameters-r16                  SidelinkParameters-r16                                        OPTIONAL,
+    highSpeedParameters-r16                 HighSpeedParameters-r16                                       OPTIONAL,
+    mac-Parameters-v1610                    MAC-Parameters-v1610                                          OPTIONAL,
+    mcgRLF-RecoveryViaSCG-r16               ENUMERATED {supported}                                        OPTIONAL,
+    resumeWithStoredMCG-SCells-r16          ENUMERATED {supported}                                        OPTIONAL,
+    resumeWithStoredSCG-r16                 ENUMERATED {supported}                                        OPTIONAL,
+    resumeWithSCG-Config-r16                ENUMERATED {supported}                                        OPTIONAL,
+    ue-BasedPerfMeas-Parameters-r16         UE-BasedPerfMeas-Parameters-r16                               OPTIONAL,
+    son-Parameters-r16                      SON-Parameters-r16                                            OPTIONAL,
+    onDemandSIB-Connected-r16               ENUMERATED {supported}                                        OPTIONAL,
+    nonCriticalExtension                    UE-NR-Capability-v1640                                        OPTIONAL
+}
+
+UE-NR-Capability-v1640 ::=               SEQUENCE {
+    redirectAtResumeByNAS-r16               ENUMERATED {supported}                                        OPTIONAL,
+    phy-ParametersSharedSpectrumChAccess-r16  Phy-ParametersSharedSpectrumChAccess-r16                    OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                                   OPTIONAL
+}
+
+UE-NR-CapabilityAddXDD-Mode ::=         SEQUENCE {
+    phy-ParametersXDD-Diff                  Phy-ParametersXDD-Diff                                        OPTIONAL,
+    mac-ParametersXDD-Diff                  MAC-ParametersXDD-Diff                                        OPTIONAL,
+    measAndMobParametersXDD-Diff            MeasAndMobParametersXDD-Diff                                  OPTIONAL
+}
+
+UE-NR-CapabilityAddXDD-Mode-v1530 ::=    SEQUENCE {
+    eutra-ParametersXDD-Diff                 EUTRA-ParametersXDD-Diff
+}
+
+UE-NR-CapabilityAddFRX-Mode ::= SEQUENCE {
+    phy-ParametersFRX-Diff              Phy-ParametersFRX-Diff                                            OPTIONAL,
+    measAndMobParametersFRX-Diff        MeasAndMobParametersFRX-Diff                                      OPTIONAL
+}
+
+UE-NR-CapabilityAddFRX-Mode-v1540 ::=    SEQUENCE {
+    ims-ParametersFRX-Diff                   IMS-ParametersFRX-Diff                                       OPTIONAL
+}
+
+UE-NR-CapabilityAddFRX-Mode-v1610 ::=    SEQUENCE {
+    powSav-ParametersFRX-Diff-r16            PowSav-ParametersFRX-Diff-r16                                OPTIONAL,
+    mac-ParametersFRX-Diff-r16               MAC-ParametersFRX-Diff-r16                                   OPTIONAL
+}
+
+BAP-Parameters-r16 ::=                   SEQUENCE {
+    flowControlBH-RLC-ChannelBased-r16       ENUMERATED {supported}                                       OPTIONAL,
+    flowControlRouting-ID-Based-r16          ENUMERATED {supported}                                       OPTIONAL
+}
+
+-- TAG-UE-NR-CAPABILITY-STOP
+-- TAG-SHAREDSPECTRUMCHACCESSPARAMSPERBAND-START
+
+SharedSpectrumChAccessParamsPerBand-r16 ::=           SEQUENCE {
+
+    -- R1 10-1: UL channel access for dynamic channel access mode
+    ul-DynamicChAccess-r16                              ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-1a: UL channel access for semi-static channel access mode
+    ul-Semi-StaticChAccess-r16                          ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2: SSB-based RRM for dynamic channel access mode
+    ssb-RRM-DynamicChAccess-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2a: SSB-based RRM for semi-static channel access mode
+    ssb-RRM-Semi-StaticChAccess-r16                     ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2b: MIB reading on unlicensed cell
+    mib-Acquisition-r16                                 ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2c: SSB-based RLM for dynamic channel access mode
+    ssb-RLM-DynamicChAccess-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2d: SSB-based RLM for semi-static channel access mode
+    ssb-RLM-Semi-StaticChAccess-r16                     ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2e: SIB1 reception on unlicensed cell
+    sib1-Acquisition-r16                                ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2f: Support monitoring of extended RAR window
+    extRA-ResponseWindow-r16                            ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2g: SSB-based BFD/CBD for dynamic channel access mode
+    ssb-BFD-CBD-dynamicChannelAccess-r16                ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2h: SSB-based BFD/CBD for semi-static channel access mode
+    ssb-BFD-CBD-semi-staticChannelAccess-r16            ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-2i: CSI-RS-based BFD/CBD for NR-U
+    csi-RS-BFD-CBD-r16                                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-7: UL channel access for 10 MHz SCell
+    ul-ChannelBW-SCell-10mhz-r16                        ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-10: RSSI and channel occupancy measurement and reporting
+    rssi-ChannelOccupancyReporting-r16                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-11:SRS starting position at any OFDM symbol in a slot
+    srs-StartAnyOFDM-Symbol-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-20: Support search space set configuration with freqMonitorLocation-r16
+    searchSpaceFreqMonitorLocation-r16                  INTEGER (1..5)                    OPTIONAL,
+    -- R1 10-20a: Support coreset configuration with rb-Offset
+    coreset-RB-Offset-r16                               ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-23:CGI reading on unlicensed cell for ANR functionality
+    cgi-Acquisition-r16                                 ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-25: Enable configured UL transmissions when DCI 2_0 is configured but not detected
+    configuredUL-Tx-r16                                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-27: Wideband PRACH
+    prach-Wideband-r16                                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-29: Support available RB set indicator field in DCI 2_0
+    dci-AvailableRB-Set-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-30: Support channel occupancy duration indicator field in DCI 2_0
+    dci-ChOccupancyDuration-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-8: Type B PDSCH length {3, 5, 6, 8, 9, 10, 11, 12, 13} without DMRS shift due to CRS collision
+    typeB-PDSCH-length-r16                              ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-9: Search space set group switching with explicit DCI 2_0 bit field trigger or with implicit PDCCH decoding with DCI 2_0 monitoring
+    searchSpaceSetGroupSwitchingwithDCI-r16             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-9b: Search space set group switching with implicit PDCCH decoding without DCI 2_0 monitoring FFS:per band or per UE
+    searchSpaceSetGroupSwitchingwithoutDCI-r16          ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-9d: Support Search space set group switching capability 2
+    searchSpaceSetGroupSwitchingcapability2-r16         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-14: Non-numerical PDSCH to HARQ-ACK timing
+    non-numericalPDSCH-HARQ-timing-r16                  ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-15: Enhanced dynamic HARQ codebook
+    enhancedDynamicHARQ-codebook-r16                    ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-16: One-shot HARQ ACK feedback
+    oneShotHARQ-feedback-r16                            ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-17: Multi-PUSCH UL grant
+    multiPUSCH-UL-grant-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-26: CSI-RS based RLM for NR-U
+    csi-RS-RLM-r16                                      ENUMERATED {supported}            OPTIONAL,
+    dummy                                              ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-31: Support of P/SP-CSI-RS reception with CSI-RS-ValidationWith-DCI-r16 configured
+    periodicAndSemi-PersistentCSI-RS-r16                ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-3: PRB interlace mapping for PUSCH
+    pusch-PRB-interlace-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-3a: PRB interlace mapping for PUCCH
+    pucch-F0-F1-PRB-Interlace-r16                       ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-12: OCC for PRB interlace mapping for PF2 and PF3
+    occ-PRB-PF2-PF3-r16                                 ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-13a: Extended CP range of more than one symbol for CG-PUSCH
+    extCP-rangeCG-PUSCH-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-18: Configured grant with retransmission in CG resources
+    configuredGrantWithReTx-r16                         ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-21a: Support using ED threshold given by gNB for UL to DL COT sharing
+    ed-Threshold-r16                                    ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-21b: Support UL to DL COT sharing
+    ul-DL-COT-Sharing-r16                               ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-24: CG-UCI multiplexing with HARQ ACK
+    mux-CG-UCI-HARQ-ACK-r16                             ENUMERATED {supported}            OPTIONAL,
+    -- R1 10-28: Configured grant with Rel-16 enhanced resource configuration
+    cg-resourceConfig-r16                               ENUMERATED {supported}            OPTIONAL
+}
+
+SharedSpectrumChAccessParamsPerBand-v1630 ::=       SEQUENCE {
+    -- R4 4-1: DL reception in intra-carrier guardband
+    dl-ReceptionIntraCellGuardband-r16                  ENUMERATED {supported}            OPTIONAL,
+    -- R4 4-2: DL reception when gNB does not transmit on all RB sets of a carrier as a result of LBT
+    dl-ReceptionLBT-subsetRB-r16                        ENUMERATED {supported}            OPTIONAL
+}
+
+SharedSpectrumChAccessParamsPerBand-v1640 ::=       SEQUENCE {
+    -- 10-26b(1-4): CSI-RS based RRM measurement with associated SS-block
+    csi-RSRP-AndRSRQ-MeasWithSSB-r16                ENUMERATED {supported}              OPTIONAL,
+    -- 10-26c(1-5): CSI-RS based RRM measurement without associated SS-block
+    csi-RSRP-AndRSRQ-MeasWithoutSSB-r16             ENUMERATED {supported}              OPTIONAL,
+    -- 10-26d(1-6): CSI-RS based RS-SINR measurement
+    csi-SINR-Meas-r16                               ENUMERATED {supported}              OPTIONAL,
+    -- 10-26e(1-8): RLM based on a mix of SS block and CSI-RS signals within active BWP
+    ssb-AndCSI-RS-RLM-r16                       	ENUMERATED {supported}              OPTIONAL,
+    -- 10-26f(1-9): CSI-RS based contention free RA for HO
+    csi-RS-CFRA-ForHO-r16                   		ENUMERATED {supported}              OPTIONAL
+}
+-- TAG-SHAREDSPECTRUMCHACCESSPARAMSPERBAND-STOP
+-- TAG-ABSOLUTETIMEINFO-START
+
+AbsoluteTimeInfo-r16 ::= BIT STRING (SIZE (48))
+
+-- TAG-ABSOLUTETIMEINFO-STOP
+-- TAG-AREACONFIGURATION-START
+
+AreaConfiguration-r16 ::=        SEQUENCE {
+    areaConfig-r16                   AreaConfig-r16,
+    interFreqTargetList-r16          SEQUENCE(SIZE (1..maxFreq)) OF InterFreqTargetInfo-r16              OPTIONAL  -- Need R
+}
+
+AreaConfig-r16 ::=     CHOICE {
+    cellGlobalIdList-r16             CellGlobalIdList-r16,
+    trackingAreaCodeList-r16         TrackingAreaCodeList-r16,
+    trackingAreaIdentityList-r16     TrackingAreaIdentityList-r16
+}
+
+InterFreqTargetInfo-r16    ::=   SEQUENCE {
+    dl-CarrierFreq	                ARFCN-ValueNR,
+    cellList                         SEQUENCE (SIZE (1..32)) OF  PhysCellId  OPTIONAL
+}
+
+CellGlobalIdList-r16 ::=         SEQUENCE (SIZE (1..32)) OF CGI-Info-Logging-r16
+
+TrackingAreaCodeList-r16 ::=     SEQUENCE (SIZE (1..8)) OF TrackingAreaCode
+
+TrackingAreaIdentityList-r16 ::= SEQUENCE (SIZE (1..8)) OF TrackingAreaIdentity-r16
+
+TrackingAreaIdentity-r16 ::=     SEQUENCE {
+    plmn-Identity-r16                PLMN-Identity,
+    trackingAreaCode-r16             TrackingAreaCode
+}
+
+-- TAG-AREACONFIGURATION-STOP
+-- TAG-BTNAMELIST-START
+
+BT-NameList-r16 ::=                SEQUENCE (SIZE (1..maxBT-Name-r16)) OF BT-Name-r16
+
+BT-Name-r16 ::=                    OCTET STRING (SIZE (1..248))
+
+-- TAG-BTNAMELIST-STOP
+-- TAG-EUTRA-ALLOWEDMEASBANDWIDTH-START
+
+EUTRA-AllowedMeasBandwidth ::=              ENUMERATED {mbw6, mbw15, mbw25, mbw50, mbw75, mbw100}
+
+-- TAG-EUTRA-ALLOWEDMEASBANDWIDTH-STOP
+-- TAG-EUTRA-MBSFN-SUBFRAMECONFIGLIST-START
+
+EUTRA-MBSFN-SubframeConfigList ::= SEQUENCE (SIZE (1..maxMBSFN-Allocations)) OF EUTRA-MBSFN-SubframeConfig
+
+EUTRA-MBSFN-SubframeConfig ::=      SEQUENCE {
+    radioframeAllocationPeriod          ENUMERATED {n1, n2, n4, n8, n16, n32},
+    radioframeAllocationOffset          INTEGER (0..7),
+    subframeAllocation1                 CHOICE {
+        oneFrame                            BIT STRING (SIZE(6)),
+        fourFrames                          BIT STRING (SIZE(24))
+    },
+    subframeAllocation2                 CHOICE {
+        oneFrame                            BIT STRING (SIZE(2)),
+        fourFrames                          BIT STRING (SIZE(8))
+    }                                                                                                       OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-EUTRA-MBSFN-SUBFRAMECONFIGLIST-STOP
+-- TAG-EUTRA-MULTIBANDINFOLIST-START
+
+EUTRA-MultiBandInfoList ::=     SEQUENCE (SIZE (1..maxMultiBands)) OF EUTRA-MultiBandInfo
+
+EUTRA-MultiBandInfo ::=         SEQUENCE {
+    eutra-FreqBandIndicator         FreqBandIndicatorEUTRA,
+    eutra-NS-PmaxList               EUTRA-NS-PmaxList                           OPTIONAL    -- Need R
+}
+
+-- TAG-EUTRA-MULTIBANDINFOLIST-STOP
+-- TAG-EUTRA-NS-PMAXLIST-START
+
+EUTRA-NS-PmaxList ::=               SEQUENCE (SIZE (1..maxEUTRA-NS-Pmax)) OF EUTRA-NS-PmaxValue
+
+EUTRA-NS-PmaxValue ::=              SEQUENCE {
+    additionalPmax                      INTEGER (-30..33)                       OPTIONAL,   -- Need R
+    additionalSpectrumEmission          INTEGER (1..288)                        OPTIONAL    -- Need R
+}
+
+-- TAG-EUTRA-NS-PMAXLIST-STOP
+-- TAG-EUTRA-PHYSCELLID-START
+
+EUTRA-PhysCellId ::=                        INTEGER (0..503)
+
+-- TAG-EUTRA-PHYSCELLID-STOP
+-- TAG-EUTRA-PHYSCELLIDRANGE-START
+
+EUTRA-PhysCellIdRange ::=       SEQUENCE {
+    start                           EUTRA-PhysCellId,
+    range                           ENUMERATED {n4, n8, n12, n16, n24, n32, n48, n64, n84, n96,
+                                                n128, n168, n252, n504, spare2, spare1}                         OPTIONAL    -- Need N
+}
+
+-- TAG-EUTRA-PHYSCELLIDRANGE-STOP
+-- TAG-EUTRA-PRESENCEANTENNAPORT1-START
+
+EUTRA-PresenceAntennaPort1 ::=              BOOLEAN
+
+-- TAG-EUTRA-PRESENCEANTENNAPORT1-STOP
+-- TAG-EUTRA-Q-OFFSETRANGE-START
+
+EUTRA-Q-OffsetRange ::=                     ENUMERATED {
+                                                dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+                                                dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+                                                dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+                                                dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+                                                dB20, dB22, dB24}
+
+-- TAG-EUTRA-Q-OFFSETRANGE-STOP
+-- TAG-IABIPADDRESS-START
+
+IAB-IP-Address-r16 ::=  CHOICE {
+    iPv4-Address-r16                BIT STRING (SIZE(32)),
+    iPv6-Address-r16                BIT STRING (SIZE(128)),
+    iPv6-Prefix-r16                 BIT STRING (SIZE(64)),
+    ...
+}
+
+-- TAG-IABIPADDRESS-STOP
+-- TAG-IABIPADDRESSINDEX-START
+
+IAB-IP-AddressIndex-r16 ::= INTEGER (1..maxIAB-IP-Address-r16)
+
+-- TAG-IABIPADDRESSINDEX-STOP
+-- TAG-IAB-IP-USAGE-START
+
+IAB-IP-Usage-r16 ::= ENUMERATED {f1-C, f1-U, non-F1, spare}
+
+-- TAG-IAB-IP-USAGE-STOP
+-- TAG-LOGGINGDURATION-START
+
+LoggingDuration-r16 ::=   ENUMERATED {
+                              min10, min20, min40, min60, min90, min120, spare2, spare1}
+
+-- TAG-LOGGINGDURATION-STOP
+-- TAG-LOGGINGINTERVAL-START
+
+LoggingInterval-r16 ::=   ENUMERATED {
+                              ms320, ms640, ms1280, ms2560, ms5120, ms10240, ms20480,
+                              ms30720, ms40960, ms61440 , infinity}
+
+-- TAG-LOGGINGINTERVAL-STOP
+-- TAG-LOGMEASRESULTLISTBT-START
+
+LogMeasResultListBT-r16 ::= SEQUENCE (SIZE (1..maxBT-IdReport-r16)) OF LogMeasResultBT-r16
+
+LogMeasResultBT-r16 ::= SEQUENCE {
+    bt-Addr-r16             BIT STRING (SIZE (48)),
+    rssi-BT-r16             INTEGER (-128..127)        OPTIONAL,
+    ...
+}
+
+-- TAG-LOGMEASRESULTLISTBT-STOP
+-- TAG-LOGMEASRESULTLISTWLAN-START
+
+LogMeasResultListWLAN-r16 ::=    SEQUENCE (SIZE (1..maxWLAN-Id-Report-r16)) OF LogMeasResultWLAN-r16
+
+LogMeasResultWLAN-r16 ::=        SEQUENCE {
+    wlan-Identifiers-r16             WLAN-Identifiers-r16,
+    rssiWLAN-r16                     WLAN-RSSI-Range-r16          OPTIONAL,
+    rtt-WLAN-r16                     WLAN-RTT-r16                 OPTIONAL,
+    ...
+}
+
+WLAN-Identifiers-r16 ::=         SEQUENCE {
+    ssid-r16                         OCTET STRING (SIZE (1..32))  OPTIONAL,
+    bssid-r16                        OCTET STRING (SIZE (6))      OPTIONAL,
+    hessid-r16                       OCTET STRING (SIZE (6))      OPTIONAL,
+    ...
+}
+
+WLAN-RSSI-Range-r16 ::= INTEGER(0..141)
+
+WLAN-RTT-r16 ::=                 SEQUENCE {
+    rttValue-r16                     INTEGER (0..16777215),
+    rttUnits-r16                     ENUMERATED {
+                                         microseconds,
+                                         hundredsofnanoseconds,
+                                         tensofnanoseconds,
+                                         nanoseconds,
+                                         tenthsofnanoseconds,
+                                         ...},
+    rttAccuracy-r16                  INTEGER (0..255)             OPTIONAL,
+    ...
+}
+
+-- TAG-OTHERCONFIG-START
+
+OtherConfig ::=                 SEQUENCE {
+    delayBudgetReportingConfig  CHOICE{
+        release                 NULL,
+        setup                   SEQUENCE{
+            delayBudgetReportingProhibitTimer   ENUMERATED {s0, s0dot4, s0dot8, s1dot6, s3, s6, s12, s30}
+        }
+    }                                                                                                     OPTIONAL        -- Need M
+}
+
+OtherConfig-v1540 ::=           SEQUENCE {
+    overheatingAssistanceConfig     SetupRelease {OverheatingAssistanceConfig}                            OPTIONAL, -- Need M
+    ...
+}
+CandidateServingFreqListNR-r16 ::= SEQUENCE (SIZE (1..maxFreqIDC-r16)) OF ARFCN-ValueNR
+
+OtherConfig-v1610 ::=                   SEQUENCE {
+    idc-AssistanceConfig-r16                SetupRelease {IDC-AssistanceConfig-r16}                       OPTIONAL, -- Need M
+    drx-PreferenceConfig-r16                SetupRelease {DRX-PreferenceConfig-r16}                       OPTIONAL, -- Need M
+    maxBW-PreferenceConfig-r16              SetupRelease {MaxBW-PreferenceConfig-r16}                     OPTIONAL, -- Need M
+    maxCC-PreferenceConfig-r16              SetupRelease {MaxCC-PreferenceConfig-r16}                     OPTIONAL, -- Need M
+    maxMIMO-LayerPreferenceConfig-r16       SetupRelease {MaxMIMO-LayerPreferenceConfig-r16}              OPTIONAL, -- Need M
+    minSchedulingOffsetPreferenceConfig-r16 SetupRelease {MinSchedulingOffsetPreferenceConfig-r16}        OPTIONAL, -- Need M
+    releasePreferenceConfig-r16             SetupRelease {ReleasePreferenceConfig-r16}                    OPTIONAL, -- Need M
+    referenceTimePreferenceReporting-r16    ENUMERATED {true}                                             OPTIONAL,  -- Need R
+    btNameList-r16                          SetupRelease {BT-NameList-r16}                                OPTIONAL, -- Need M
+    wlanNameList-r16                        SetupRelease {WLAN-NameList-r16}                              OPTIONAL, -- Need M
+    sensorNameList-r16                      SetupRelease {Sensor-NameList-r16}                            OPTIONAL, -- Need M
+    obtainCommonLocation-r16                ENUMERATED {true}                                             OPTIONAL,  -- Need R
+    sl-AssistanceConfigNR-r16               ENUMERATED{true}                                              OPTIONAL -- Need R
+}
+
+OverheatingAssistanceConfig ::= SEQUENCE {
+    overheatingIndicationProhibitTimer    ENUMERATED {s0, s0dot5, s1, s2, s5, s10, s20, s30,
+                                          s60, s90, s120, s300, s600, spare3, spare2, spare1}
+}
+
+IDC-AssistanceConfig-r16 ::=    SEQUENCE {
+    candidateServingFreqListNR-r16  CandidateServingFreqListNR-r16                     OPTIONAL, -- Need R
+    ...
+}
+
+DRX-PreferenceConfig-r16 ::=          SEQUENCE {
+    drx-PreferenceProhibitTimer-r16       ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxBW-PreferenceConfig-r16 ::=        SEQUENCE {
+    maxBW-PreferenceProhibitTimer-r16     ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxCC-PreferenceConfig-r16 ::=        SEQUENCE {
+    maxCC-PreferenceProhibitTimer-r16     ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MaxMIMO-LayerPreferenceConfig-r16 ::= SEQUENCE {
+    maxMIMO-LayerPreferenceProhibitTimer-r16 ENUMERATED {
+                                                 s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                                 s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+MinSchedulingOffsetPreferenceConfig-r16 ::=   SEQUENCE {
+    minSchedulingOffsetPreferenceProhibitTimer-r16 ENUMERATED {
+                                                       s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                                       s8, s9, s10, s20, s30, spare2, spare1}
+}
+
+ReleasePreferenceConfig-r16 ::=       SEQUENCE {
+    releasePreferenceProhibitTimer-r16    ENUMERATED {
+                                              s0, s0dot5, s1, s2, s3, s4, s5, s6, s7,
+                                              s8, s9, s10, s20, s30, infinity, spare1},
+    connectedReporting                    ENUMERATED {true}                                               OPTIONAL  -- Need R
+}
+
+-- TAG-OTHERCONFIG-STOP
+-- TAG-PHYSCELLIDUTRA-FDD-START
+
+PhysCellIdUTRA-FDD-r16 ::=        INTEGER (0..511)
+
+-- TAG-PHYSCELLIDUTRA-FDD-STOP
+-- TAG-RRC-TRANSACTIONIDENTIFIER-START
+
+RRC-TransactionIdentifier ::=       INTEGER (0..3)
+
+-- TAG-RRC-TRANSACTIONIDENTIFIER-STOP
+-- TAG-SENSORNAMELIST-START
+
+Sensor-NameList-r16 ::= SEQUENCE {
+    measUncomBarPre-r16     ENUMERATED {true}            OPTIONAL,  -- Need R
+    measUeSpeed             ENUMERATED {true}            OPTIONAL,  -- Need R
+    measUeOrientation       ENUMERATED {true}            OPTIONAL   -- Need R
+}
+
+-- TAG-SENSORNAMELIST-STOP
+-- TAG-TRACEREFERENCE-START
+
+TraceReference-r16 ::= SEQUENCE {
+    plmn-Identity-r16      PLMN-Identity,
+    traceId-r16            OCTET STRING (SIZE (3))
+}
+
+-- TAG-TRACEREFERENCE-STOP
+-- TAG-UE-MeasurementsAvailable-START
+
+UE-MeasurementsAvailable-r16 ::=              SEQUENCE {
+    logMeasAvailable-r16                         ENUMERATED {true}               OPTIONAL,
+    logMeasAvailableBT-r16                       ENUMERATED {true}               OPTIONAL,
+    logMeasAvailableWLAN-r16                     ENUMERATED {true}               OPTIONAL,
+    connEstFailInfoAvailable-r16                 ENUMERATED {true}               OPTIONAL,
+    rlf-InfoAvailable-r16                        ENUMERATED {true}               OPTIONAL,
+    ...
+}
+
+-- TAG-UE-MeasurementsAvailable-STOP
+-- TAG-UTRA-FDD-Q-OFFSETRANGE-START
+
+UTRA-FDD-Q-OffsetRange-r16 ::=              ENUMERATED {
+                                                dB-24, dB-22, dB-20, dB-18, dB-16, dB-14,
+                                                dB-12, dB-10, dB-8, dB-6, dB-5, dB-4, dB-3,
+                                                dB-2, dB-1, dB0, dB1, dB2, dB3, dB4, dB5,
+                                                dB6, dB8, dB10, dB12, dB14, dB16, dB18,
+                                                dB20, dB22, dB24}
+
+-- TAG-UTRA-FDD-Q-OFFSETRANGE-STOP
+-- TAG-VISITEDCELLINFOLIST-START
+
+VisitedCellInfoList-r16 ::= SEQUENCE (SIZE (1..maxCellHistory-r16)) OF VisitedCellInfo-r16
+
+VisitedCellInfo-r16 ::=  SEQUENCE {
+    visitedCellId-r16        CHOICE {
+        nr-CellId-r16            CHOICE {
+            cgi-Info                 CGI-Info-Logging-r16,
+            pci-arfcn-r16            SEQUENCE {
+                physCellId-r16           PhysCellId,
+                carrierFreq-r16          ARFCN-ValueNR
+            }
+        },
+        eutra-CellId-r16         CHOICE {
+            cellGlobalId-r16         CGI-InfoEUTRA,
+            pci-arfcn-r16                SEQUENCE {
+                physCellId-r16               EUTRA-PhysCellId,
+                carrierFreq-r16              ARFCN-ValueEUTRA
+            }
+        }
+    }                                        OPTIONAL,
+    timeSpent-r16            INTEGER (0..4095),
+    ...
+}
+
+-- TAG-VISITEDCELLINFOLIST-STOP
+-- TAG-WLANNAMELIST-START
+
+WLAN-NameList-r16 ::= SEQUENCE (SIZE (1..maxWLAN-Name-r16)) OF WLAN-Name-r16
+
+WLAN-Name-r16 ::= OCTET STRING (SIZE (1..32))
+
+-- TAG-SL-BWP-CONFIG-START
+
+SL-BWP-Config-r16 ::=                    SEQUENCE {
+    sl-BWP-Id                                BWP-Id,
+    sl-BWP-Generic-r16                       SL-BWP-Generic-r16                                   OPTIONAL,    -- Need M
+    sl-BWP-PoolConfig-r16                    SL-BWP-PoolConfig-r16                                OPTIONAL,    -- Need M
+    ...
+}
+
+SL-BWP-Generic-r16 ::=                   SEQUENCE {
+    sl-BWP-r16                               BWP                                                                OPTIONAL,    -- Need M
+    sl-LengthSymbols-r16                     ENUMERATED {sym7, sym8, sym9, sym10, sym11, sym12, sym13, sym14}   OPTIONAL,    -- Need M
+    sl-StartSymbol-r16                       ENUMERATED {sym0, sym1, sym2, sym3, sym4, sym5, sym6, sym7}        OPTIONAL,    -- Need M
+    sl-PSBCH-Config-r16                      SetupRelease {SL-PSBCH-Config-r16}                                 OPTIONAL,    -- Need M
+    sl-TxDirectCurrentLocation-r16           INTEGER (0..3301)                                                  OPTIONAL,    -- Need M
+    ...
+}
+
+-- TAG-SL-BWP-CONFIG-STOP
+-- TAG-SL-BWP-CONFIGCOMMON-START
+
+SL-BWP-ConfigCommon-r16 ::=              SEQUENCE {
+    sl-BWP-Generic-r16                       SL-BWP-Generic-r16                                         OPTIONAL,    -- Need R
+    sl-BWP-PoolConfigCommon-r16              SL-BWP-PoolConfigCommon-r16                                OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-BWP-CONFIGCOMMON-STOP
+-- TAG-SL-BWP-POOLCONFIG-START
+
+SL-BWP-PoolConfig-r16 ::=        SEQUENCE {
+    sl-RxPool-r16                    SEQUENCE (SIZE (1..maxNrofRXPool-r16)) OF SL-ResourcePool-r16        OPTIONAL,    -- Cond HO
+    sl-TxPoolSelectedNormal-r16      SL-TxPoolDedicated-r16                                               OPTIONAL,    -- Need M
+    sl-TxPoolScheduling-r16          SL-TxPoolDedicated-r16                                               OPTIONAL,    -- Need N
+    sl-TxPoolExceptional-r16         SL-ResourcePoolConfig-r16                                            OPTIONAL     -- Need M
+}
+
+SL-TxPoolDedicated-r16 ::=       SEQUENCE {
+    sl-PoolToReleaseList-r16         SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolID-r16      OPTIONAL,    -- Need N
+    sl-PoolToAddModList-r16          SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolConfig-r16  OPTIONAL     -- Need N
+}
+
+SL-ResourcePoolConfig-r16 ::=    SEQUENCE {
+    sl-ResourcePoolID-r16            SL-ResourcePoolID-r16,
+    sl-ResourcePool-r16              SL-ResourcePool-r16                                                  OPTIONAL    -- Need M
+}
+
+SL-ResourcePoolID-r16 ::=        INTEGER (1..maxNrofPoolID-r16)
+
+-- TAG-SL-BWP-POOLCONFIG-STOP
+-- TAG-SL-BWP-POOLCONFIGCOMMON-START
+
+SL-BWP-PoolConfigCommon-r16 ::=      SEQUENCE {
+    sl-RxPool-r16                        SEQUENCE (SIZE (1..maxNrofRXPool-r16)) OF SL-ResourcePool-r16         OPTIONAL,    -- Need R
+    sl-TxPoolSelectedNormal-r16          SEQUENCE (SIZE (1..maxNrofTXPool-r16)) OF SL-ResourcePoolConfig-r16   OPTIONAL,    -- Need R
+    sl-TxPoolExceptional-r16             SL-ResourcePoolConfig-r16                                             OPTIONAL     -- Need R
+}
+
+-- TAG-SL-BWP-POOLCONFIGCOMMON-STOP
+-- TAG-SL-CBR-PRIORITYTXCONFIGLIST-START
+
+SL-CBR-PriorityTxConfigList-r16 ::= SEQUENCE (SIZE (1..8)) OF SL-PriorityTxConfigIndex-r16
+
+SL-PriorityTxConfigIndex-r16 ::=    SEQUENCE {
+    sl-PriorityThreshold-r16             INTEGER (1..8)                                                   OPTIONAL,    -- Need M
+    sl-DefaultTxConfigIndex-r16          INTEGER (0..maxCBR-Level-1-r16)                                  OPTIONAL,    -- Need M
+    sl-CBR-ConfigIndex-r16               INTEGER (0..maxCBR-Config-1-r16)                                 OPTIONAL,    -- Need M
+    sl-Tx-ConfigIndexList-r16            SEQUENCE (SIZE (1.. maxCBR-Level-r16)) OF SL-TxConfigIndex-r16   OPTIONAL     -- Need M
+}
+
+SL-TxConfigIndex-r16 ::=             INTEGER (0..maxTxConfig-1-r16)
+
+-- TAG-SL-CBR-PRIORITYTXCONFIGLIST-STOP
+-- TAG-SL-CBR-COMMONTXCONFIGLIST-START
+
+SL-CBR-CommonTxConfigList-r16 ::=     SEQUENCE {
+    sl-CBR-RangeConfigList-r16            SEQUENCE (SIZE (1..maxCBR-Config-r16)) OF SL-CBR-LevelsConfig-r16     OPTIONAL,   -- Need M
+    sl-CBR-PSSCH-TxConfigList-r16         SEQUENCE (SIZE (1.. maxTxConfig-r16)) OF SL-CBR-PSSCH-TxConfig-r16    OPTIONAL    -- Need M
+}
+
+SL-CBR-LevelsConfig-r16 ::=           SEQUENCE (SIZE (1..maxCBR-Level-r16)) OF SL-CBR-r16
+
+SL-CBR-PSSCH-TxConfig-r16 ::=         SEQUENCE {
+    sl-CR-Limit-r16                       INTEGER(0..10000)                                                     OPTIONAL,   -- Need M
+    sl-TxParameters-r16                   SL-PSSCH-TxParameters-r16                                             OPTIONAL    -- Need M
+}
+
+SL-CBR-r16 ::=                        INTEGER (0..100)
+
+-- TAG-SL-CBR-COMMONTXCONFIGLIST-STOP
+-- TAG-SL-CONFIGDEDICATEDNR-START
+
+SL-ConfigDedicatedNR-r16 ::=         SEQUENCE {
+    sl-PHY-MAC-RLC-Config-r16            SL-PHY-MAC-RLC-Config-r16                                              OPTIONAL,    -- Need M
+    sl-RadioBearerToReleaseList-r16      SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-Uu-ConfigIndex-r16        OPTIONAL,    -- Need N
+    sl-RadioBearerToAddModList-r16       SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16       OPTIONAL,    -- Need N
+    sl-MeasConfigInfoToReleaseList-r16   SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-DestinationIndex-r16     OPTIONAL,    -- Need N
+    sl-MeasConfigInfoToAddModList-r16    SEQUENCE (SIZE (1..maxNrofSL-Dest-r16)) OF SL-MeasConfigInfo-r16       OPTIONAL,    -- Need M
+    t400-r16                             ENUMERATED {ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL,    -- Need M
+    ...
+}
+
+SL-DestinationIndex-r16  ::=             INTEGER (0..maxNrofSL-Dest-1-r16)
+
+SL-PHY-MAC-RLC-Config-r16::=         SEQUENCE {
+    sl-ScheduledConfig-r16               SetupRelease { SL-ScheduledConfig-r16 }                                OPTIONAL,    -- Need M
+    sl-UE-SelectedConfig-r16             SetupRelease { SL-UE-SelectedConfig-r16 }                              OPTIONAL,    -- Need M
+    sl-FreqInfoToReleaseList-r16         SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-Freq-Id-r16               OPTIONAL,    -- Need N
+    sl-FreqInfoToAddModList-r16          SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfig-r16            OPTIONAL,    -- Need N
+    sl-RLC-BearerToReleaseList-r16       SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfigIndex-r16    OPTIONAL,    -- Need N
+    sl-RLC-BearerToAddModList-r16        SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16         OPTIONAL,    -- Need N
+    sl-MaxNumConsecutiveDTX-r16          ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32}                          OPTIONAL,    -- Need M
+    sl-CSI-Acquisition-r16               ENUMERATED {enabled}                                                   OPTIONAL,    -- Need R
+    sl-CSI-SchedulingRequestId-r16       SetupRelease {SchedulingRequestId}                                     OPTIONAL,    -- Need M
+    sl-SSB-PriorityNR-r16                INTEGER (1..8)                                                         OPTIONAL,    -- Need R
+    networkControlledSyncTx-r16          ENUMERATED {on, off}                                                   OPTIONAL     -- Need M
+}
+
+-- TAG-SL-CONFIGDEDICATEDNR-STOP
+-- TAG-SL-CONFIGUREDGRANTCONFIG-START
+
+SL-ConfiguredGrantConfig-r16 ::=           SEQUENCE {
+    sl-ConfigIndexCG-r16                       SL-ConfigIndexCG-r16,
+    sl-PeriodCG-r16                            SL-PeriodCG-r16                                                       OPTIONAL, -- Need M
+    sl-NrOfHARQ-Processes-r16                  INTEGER (1..16)                                                       OPTIONAL, -- Need M
+    sl-HARQ-ProcID-offset-r16                  INTEGER (0..15)                                                       OPTIONAL, -- Need M
+    sl-CG-MaxTransNumList-r16                  SL-CG-MaxTransNumList-r16                                             OPTIONAL, -- Need M
+    rrc-ConfiguredSidelinkGrant-r16            SEQUENCE {
+        sl-TimeResourceCG-Type1-r16                INTEGER (0..496)                                                  OPTIONAL, -- Need M
+        sl-StartSubchannelCG-Type1-r16             INTEGER (0..26)                                                   OPTIONAL, -- Need M
+        sl-FreqResourceCG-Type1-r16                INTEGER (0..6929)                                                 OPTIONAL, -- Need M
+        sl-TimeOffsetCG-Type1-r16                  INTEGER (0..7999)                                                 OPTIONAL, -- Need R
+        sl-N1PUCCH-AN-r16                          PUCCH-ResourceId                                                  OPTIONAL, -- Need M
+        sl-PSFCH-ToPUCCH-CG-Type1-r16              INTEGER (0..15)                                                   OPTIONAL, -- Need M
+        sl-ResourcePoolID-r16                      SL-ResourcePoolID-r16                                             OPTIONAL, -- Need M
+        sl-TimeReferenceSFN-Type1-r16              ENUMERATED {sfn512}                                               OPTIONAL  -- Need S
+    }                                                                                                                OPTIONAL, -- Need M
+    ...
+}
+
+SL-ConfigIndexCG-r16 ::=          INTEGER (0..maxNrofCG-SL-r16-1)
+
+SL-CG-MaxTransNumList-r16 ::=     SEQUENCE (SIZE (1..8)) OF SL-CG-MaxTransNum-r16
+
+SL-CG-MaxTransNum-r16 ::=                  SEQUENCE {
+    sl-Priority-r16                            INTEGER (1..8),
+    sl-MaxTransNum-r16                         INTEGER (1..32)
+}
+
+SL-PeriodCG-r16 ::=            CHOICE{
+    sl-PeriodCG1-r16               ENUMERATED {ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000, spare6,
+                                               spare5, spare4, spare3, spare2, spare1},
+    sl-PeriodCG2-r16               INTEGER (1..99)
+}
+
+-- TAG-SL-CONFIGUREDGRANTCONFIG-STOP
+-- TAG-SL-DESTINATIONIDENTITY-START
+
+SL-DestinationIdentity-r16 ::=           BIT STRING (SIZE (24))
+
+-- TAG-SL-DESTINATIONIDENTITY-STOP
+-- TAG-SL-FREQCONFIG-START
+
+SL-FreqConfig-r16 ::=              SEQUENCE {
+    sl-Freq-Id-r16                     SL-Freq-Id-r16,
+    sl-SCS-SpecificCarrierList-r16     SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    sl-AbsoluteFrequencyPointA-r16     ARFCN-ValueNR                                                   OPTIONAL,  -- Need M
+    sl-AbsoluteFrequencySSB-r16        ARFCN-ValueNR                                                   OPTIONAL,  -- Need R
+    frequencyShift7p5khzSL-r16         ENUMERATED {true}                                               OPTIONAL,  -- Cond V2X-SL-Shared
+    valueN-r16                         INTEGER (-1..1),
+    sl-BWP-ToReleaseList-r16           SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF BWP-Id               OPTIONAL,  -- Need N
+    sl-BWP-ToAddModList-r16            SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF SL-BWP-Config-r16    OPTIONAL,  -- Need N
+    sl-SyncConfigList-r16              SL-SyncConfigList-r16                                           OPTIONAL,  -- Need M
+    sl-SyncPriority-r16                ENUMERATED {gnss, gnbEnb}                                       OPTIONAL   -- Need M
+}
+
+SL-Freq-Id-r16 ::=                     INTEGER (1.. maxNrofFreqSL-r16)
+
+-- TAG-SL-FREQCONFIG-STOP
+-- TAG-SL-FREQCONFIGCOMMON-START
+
+SL-FreqConfigCommon-r16 ::=      SEQUENCE {
+    sl-SCS-SpecificCarrierList-r16   SEQUENCE (SIZE (1..maxSCSs)) OF SCS-SpecificCarrier,
+    sl-AbsoluteFrequencyPointA-r16   ARFCN-ValueNR,
+    sl-AbsoluteFrequencySSB-r16      ARFCN-ValueNR                                                       OPTIONAL, -- Need R
+    frequencyShift7p5khzSL-r16       ENUMERATED {true}                                                   OPTIONAL, -- Cond V2X-SL-Shared
+    valueN-r16                       INTEGER (-1..1),
+    sl-BWP-List-r16                  SEQUENCE (SIZE (1..maxNrofSL-BWPs-r16)) OF SL-BWP-ConfigCommon-r16  OPTIONAL, -- Need R
+    sl-SyncPriority-r16              ENUMERATED {gnss, gnbEnb}                                           OPTIONAL, -- Need R
+    sl-NbAsSync-r16                  BOOLEAN                                                             OPTIONAL, -- Need R
+    sl-SyncConfigList-r16            SL-SyncConfigList-r16                                               OPTIONAL, -- Need R
+    ...
+}
+-- TAG-SL-FREQCONFIGCOMMON-STOP
+-- TAG-SL-LOGICALCHANNELCONFIG-START
+
+SL-LogicalChannelConfig-r16 ::=            SEQUENCE {
+    sl-Priority-r16                            INTEGER (1..8),
+    sl-PrioritisedBitRate-r16                  ENUMERATED {kBps0, kBps8, kBps16, kBps32, kBps64, kBps128, kBps256, kBps512,
+                                               kBps1024, kBps2048, kBps4096, kBps8192, kBps16384, kBps32768, kBps65536, infinity},
+    sl-BucketSizeDuration-r16                  ENUMERATED {ms5, ms10, ms20, ms50, ms100, ms150, ms300, ms500, ms1000,
+                                               spare7, spare6, spare5, spare4, spare3,spare2, spare1},
+    sl-ConfiguredGrantType1Allowed-r16         ENUMERATED {true}                                                        OPTIONAL,   -- Need R
+    sl-HARQ-FeedbackEnabled-r16                ENUMERATED {enabled, disabled }                                          OPTIONAL,   -- Need R
+    sl-AllowedCG-List-r16                      SEQUENCE (SIZE (0.. maxNrofCG-SL-r16-1)) OF SL-ConfigIndexCG-r16
+                                                                                                                        OPTIONAL,   -- Need R
+    sl-AllowedSCS-List-r16                     SEQUENCE (SIZE (1..maxSCSs)) OF SubcarrierSpacing                        OPTIONAL,   -- Need R
+    sl-MaxPUSCH-Duration-r16                   ENUMERATED {ms0p02, ms0p04, ms0p0625, ms0p125, ms0p25, ms0p5, spare2, spare1}
+                                                                                                                        OPTIONAL,   -- Need R
+    sl-LogicalChannelGroup-r16                 INTEGER (0..maxLCG-ID)                                                   OPTIONAL,   -- Need R
+    sl-SchedulingRequestId-r16                 SchedulingRequestId                                                      OPTIONAL,   -- Need R
+    sl-LogicalChannelSR-DelayTimerApplied-r16  BOOLEAN                                                                  OPTIONAL,   -- Need R
+    ...
+}
+-- TAG-SL-LOGICALCHANNELCONFIG-STOP
+-- TAG-SL-MEASCONFIGCOMMON-START
+
+SL-MeasConfigCommon-r16 ::=          SEQUENCE {
+    sl-MeasObjectListCommon-r16          SL-MeasObjectList-r16                                           OPTIONAL,   -- Need R
+    sl-ReportConfigListCommon-r16        SL-ReportConfigList-r16                                         OPTIONAL,   -- Need R
+    sl-MeasIdListCommon-r16              SL-MeasIdList-r16                                               OPTIONAL,   -- Need R
+    sl-QuantityConfigCommon-r16          SL-QuantityConfig-r16                                           OPTIONAL,   -- Need R
+    ...
+}
+
+-- TAG-SL-MEASCONFIGCOMMON-STOP
+-- TAG-SL-MEASCONFIGINFO-START
+
+SL-MeasConfigInfo-r16 ::=           SEQUENCE {
+    sl-DestinationIndex-r16             SL-DestinationIndex-r16,
+    sl-MeasConfig-r16                   SL-MeasConfig-r16,
+    ...
+}
+
+SL-MeasConfig-r16 ::=               SEQUENCE {
+    sl-MeasObjectToRemoveList-r16       SL-MeasObjectToRemoveList-r16                                           OPTIONAL,   -- Need N
+    sl-MeasObjectToAddModList-r16       SL-MeasObjectList-r16                                                   OPTIONAL,   -- Need N
+    sl-ReportConfigToRemoveList-r16     SL-ReportConfigToRemoveList-r16                                         OPTIONAL,   -- Need N
+    sl-ReportConfigToAddModList-r16     SL-ReportConfigList-r16                                                 OPTIONAL,   -- Need N
+    sl-MeasIdToRemoveList-r16           SL-MeasIdToRemoveList-r16                                               OPTIONAL,   -- Need N
+    sl-MeasIdToAddModList-r16           SL-MeasIdList-r16                                                       OPTIONAL,   -- Need N
+    sl-QuantityConfig-r16               SL-QuantityConfig-r16                                                   OPTIONAL,   -- Need M
+    ...
+}
+
+SL-MeasObjectToRemoveList-r16 ::=   SEQUENCE (SIZE (1..maxNrofSL-ObjectId-r16)) OF SL-MeasObjectId-r16
+
+SL-ReportConfigToRemoveList-r16 ::= SEQUENCE (SIZE (1..maxNrofSL-ReportConfigId-r16)) OF SL-ReportConfigId-r16
+
+SL-MeasIdToRemoveList-r16 ::=       SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF SL-MeasId-r16
+
+-- TAG-SL-MEASCONFIGINFO-STOP
+-- TAG-SL-MEASIDLIST-START
+
+SL-MeasIdList-r16 ::=               SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF SL-MeasIdInfo-r16
+
+SL-MeasIdInfo-r16 ::=               SEQUENCE {
+    sl-MeasId-r16                       SL-MeasId-r16,
+    sl-MeasObjectId-r16                 SL-MeasObjectId-r16,
+    sl-ReportConfigId-r16               SL-ReportConfigId-r16,
+    ...
+}
+
+SL-MeasId-r16 ::=                   INTEGER (1..maxNrofSL-MeasId-r16)
+
+-- TAG-SL-MEASIDLIST-STOP
+-- TAG-SL-MEASOBJECTLIST-START
+
+SL-MeasObjectList-r16 ::=               SEQUENCE (SIZE (1..maxNrofSL-ObjectId-r16)) OF SL-MeasObjectInfo-r16
+
+SL-MeasObjectInfo-r16 ::=               SEQUENCE {
+    sl-MeasObjectId-r16                     SL-MeasObjectId-r16,
+    sl-MeasObject-r16                       SL-MeasObject-r16,
+    ...
+}
+
+SL-MeasObjectId-r16 ::=                 INTEGER (1..maxNrofSL-ObjectId-r16)
+
+SL-MeasObject-r16 ::=                   SEQUENCE {
+    frequencyInfoSL-r16                     ARFCN-ValueNR,
+    ...
+}
+
+-- TAG-SL-MEASOBJECTLIST-STOP
+-- TAG-SL-PDCP-CONFIG-START
+
+SL-PDCP-Config-r16 ::=       SEQUENCE {
+    sl-DiscardTimer-r16          ENUMERATED {ms3, ms10, ms20, ms25, ms30, ms40, ms50, ms60, ms75, ms100, ms150, ms200,
+                                 ms250, ms300, ms500, ms750, ms1500, infinity}                                           OPTIONAL, -- Cond Setup
+    sl-PDCP-SN-Size-r16          ENUMERATED {len12bits, len18bits}                                                       OPTIONAL, -- Cond Setup2
+    sl-OutOfOrderDelivery        ENUMERATED { true }                                                                     OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-PDCP-CONFIG-STOP
+-- TAG-SL-PSBCH-CONFIG-START
+
+SL-PSBCH-Config-r16 ::= SEQUENCE {
+    dl-P0-PSBCH-r16         INTEGER (-16..15)                                                                   OPTIONAL,    -- Need M
+    dl-Alpha-PSBCH-r16      ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}   OPTIONAL,    -- Need M
+    ...
+}
+
+-- TAG-SL-PSBCH-CONFIG-STOP
+-- TAG-SL-PSSCH-TXCONFIGLIST-START
+
+SL-PSSCH-TxConfigList-r16 ::=    SEQUENCE (SIZE (1..maxPSSCH-TxConfig-r16)) OF SL-PSSCH-TxConfig-r16
+
+SL-PSSCH-TxConfig-r16 ::=        SEQUENCE {
+    sl-TypeTxSync-r16                SL-TypeTxSync-r16                                   OPTIONAL,    -- Need R
+    sl-ThresUE-Speed-r16             ENUMERATED {kmph60, kmph80, kmph100, kmph120,
+                                                kmph140, kmph160, kmph180, kmph200},
+    sl-ParametersAboveThres-r16      SL-PSSCH-TxParameters-r16,
+    sl-ParametersBelowThres-r16      SL-PSSCH-TxParameters-r16,
+    ...
+}
+
+
+SL-PSSCH-TxParameters-r16 ::=    SEQUENCE {
+    sl-MinMCS-PSSCH-r16              INTEGER (0..27),
+    sl-MaxMCS-PSSCH-r16              INTEGER (0..31),
+    sl-MinSubChannelNumPSSCH-r16     INTEGER (1..27),
+    sl-MaxSubchannelNumPSSCH-r16     INTEGER (1..27),
+    sl-MaxTxTransNumPSSCH-r16        INTEGER (1..32),
+    sl-MaxTxPower-r16                SL-TxPower-r16                                      OPTIONAL    -- Cond CBR
+}
+
+-- TAG-SL-PSSCH-TXCONFIGLIST-STOP
+-- TAG-SL-QOS-FLOWIDENTITY-START
+
+SL-QoS-FlowIdentity-r16 ::=                    INTEGER (1..maxNrofSL-QFIs-r16)
+
+-- TAG-SL-QOS-FLOWIDENTITY-STOP
+-- TAG-SL-QOS-PROFILE-START
+
+SL-QoS-Profile-r16 ::=        SEQUENCE {
+    sl-PQI-r16                    SL-PQI-r16                                                  OPTIONAL,   -- Need R
+    sl-GFBR-r16                   INTEGER (0..4000000000)                                     OPTIONAL,   -- Need R
+    sl-MFBR-r16                   INTEGER (0..4000000000)                                     OPTIONAL,   -- Need R
+    sl-Range-r16                  INTEGER (1..1000)                                           OPTIONAL,   -- Need R
+    ...
+}
+
+SL-PQI-r16 ::=                CHOICE {
+    sl-StandardizedPQI-r16        INTEGER (0..255),
+    sl-Non-StandardizedPQI-r16    SEQUENCE {
+        sl-ResourceType-r16           ENUMERATED {gbr, non-GBR, delayCriticalGBR, spare1}     OPTIONAL,   -- Need R
+        sl-PriorityLevel-r16          INTEGER (1..8)                                          OPTIONAL,   -- Need R
+        sl-PacketDelayBudget-r16      INTEGER (0..1023)                                       OPTIONAL,   -- Need R
+        sl-PacketErrorRate-r16        INTEGER (0..9)                                          OPTIONAL,   -- Need R
+        sl-AveragingWindow-r16        INTEGER (0..4095)                                       OPTIONAL,   -- Need R
+        sl-MaxDataBurstVolume-r16     INTEGER (0..4095)                                       OPTIONAL,   -- Need R
+    ...
+   }
+}
+
+-- TAG-SL-QOS-PROFILE-STOP
+-- TAG-SL-QUANTITYCONFIG-START
+
+SL-QuantityConfig-r16 ::=               SEQUENCE {
+    sl-FilterCoefficientDMRS-r16            FilterCoefficient                             DEFAULT fc4,
+    ...
+}
+
+-- TAG-SL-QuantityConfig-STOP
+-- TAG-SL-RADIOBEARERCONFIG-START
+
+SL-RadioBearerConfig-r16 ::=     SEQUENCE {
+    slrb-Uu-ConfigIndex-r16           SLRB-Uu-ConfigIndex-r16,
+    sl-SDAP-Config-r16                SL-SDAP-Config-r16                                                 OPTIONAL,    -- Cond SLRBSetup
+    sl-PDCP-Config-r16                SL-PDCP-Config-r16                                                 OPTIONAL,    -- Cond SLRBSetup
+    sl-TransRange-r16                 ENUMERATED {m20, m50, m80, m100, m120, m150, m180, m200, m220, m250, m270, m300, m350, m370,
+                                                 m400, m420, m450, m480, m500, m550, m600, m700, m1000, spare9, spare8, spare7, spare6,
+                                                 spare5, spare4, spare3, spare2, spare1}                OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-RADIOBEARERCONFIG-STOP
+-- TAG-SL-REPORTCONFIGLIST-START
+
+SL-ReportConfigList-r16 ::=           SEQUENCE (SIZE (1..maxNrofSL-ReportConfigId-r16)) OF SL-ReportConfigInfo-r16
+
+SL-ReportConfigInfo-r16 ::=           SEQUENCE {
+    sl-ReportConfigId-r16                     SL-ReportConfigId-r16,
+    sl-ReportConfig-r16                       SL-ReportConfig-r16,
+    ...
+}
+
+SL-ReportConfigId-r16 ::=             INTEGER (1..maxNrofSL-ReportConfigId-r16)
+
+SL-ReportConfig-r16 ::=               SEQUENCE {
+    sl-ReportType-r16                     CHOICE {
+        sl-Periodical-r16                     SL-PeriodicalReportConfig-r16,
+        sl-EventTriggered-r16                 SL-EventTriggerConfig-r16,
+        ...
+    },
+    ...
+}
+
+SL-PeriodicalReportConfig-r16 ::=     SEQUENCE {
+    sl-ReportInterval-r16                 ReportInterval,
+    sl-ReportAmount-r16                   ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    sl-ReportQuantity-r16                 SL-MeasReportQuantity-r16,
+    sl-RS-Type-r16                        SL-RS-Type-r16,
+    ...
+}
+
+SL-EventTriggerConfig-r16 ::=        SEQUENCE {
+    sl-EventId-r16                       CHOICE {
+        eventS1-r16                          SEQUENCE {
+            s1-Threshold-r16                     SL-MeasTriggerQuantity-r16,
+            sl-ReportOnLeave-r16                 BOOLEAN,
+            sl-Hysteresis-r16                    Hysteresis,
+            sl-TimeToTrigger-r16                 TimeToTrigger,
+            ...
+        },
+        eventS2-r16                          SEQUENCE {
+            s2-Threshold-r16                     SL-MeasTriggerQuantity-r16,
+            sl-ReportOnLeave-r16                 BOOLEAN,
+            sl-Hysteresis-r16                    Hysteresis,
+            sl-TimeToTrigger-r16                 TimeToTrigger,
+            ...
+        },
+        ...
+    },
+    sl-ReportInterval-r16                ReportInterval,
+    sl-ReportAmount-r16                      ENUMERATED {r1, r2, r4, r8, r16, r32, r64, infinity},
+    sl-ReportQuantity-r16                    SL-MeasReportQuantity-r16,
+    sl-RS-Type-r16                           SL-RS-Type-r16,
+    ...
+}
+
+SL-MeasReportQuantity-r16 ::=         CHOICE {
+    sl-RSRP-r16                           BOOLEAN,
+    ...
+}
+
+SL-MeasTriggerQuantity-r16 ::=        CHOICE {
+    sl-RSRP-r16                           RSRP-Range,
+    ...
+}
+
+SL-RS-Type-r16 ::=                    ENUMERATED {dmrs, spare3, spare2, spare1}
+
+-- TAG-SL-REPORTCONFIGLIST-STOP
+-- TAG-SL-RESOURCEPOOL-START
+
+SL-ResourcePool-r16 ::=            SEQUENCE {
+    sl-PSCCH-Config-r16                SetupRelease { SL-PSCCH-Config-r16 }                                  OPTIONAL,   -- Need M
+    sl-PSSCH-Config-r16                SetupRelease { SL-PSSCH-Config-r16 }                                  OPTIONAL,   -- Need M
+    sl-PSFCH-Config-r16                SetupRelease { SL-PSFCH-Config-r16 }                                  OPTIONAL,   -- Need M
+    sl-SyncAllowed-r16                 SL-SyncAllowed-r16                                                    OPTIONAL,   -- Need M
+    sl-SubchannelSize-r16              ENUMERATED {n10, n12, n15, n20, n25, n50, n75, n100}                  OPTIONAL,   -- Need M
+    dummy                              INTEGER (10..160)                                                     OPTIONAL,   -- Need M
+    sl-StartRB-Subchannel-r16          INTEGER (0..265)                                                      OPTIONAL,   -- Need M
+    sl-NumSubchannel-r16               INTEGER (1..27)                                                       OPTIONAL,   -- Need M
+    sl-Additional-MCS-Table-r16        ENUMERATED {qam256, qam64LowSE, qam256-qam64LowSE }                   OPTIONAL,   -- Need M
+    sl-ThreshS-RSSI-CBR-r16            INTEGER (0..45)                                                       OPTIONAL,   -- Need M
+    sl-TimeWindowSizeCBR-r16           ENUMERATED {ms100, slot100}                                           OPTIONAL,   -- Need M
+    sl-TimeWindowSizeCR-r16            ENUMERATED {ms1000, slot1000}                                         OPTIONAL,   -- Need M
+    sl-PTRS-Config-r16                 SL-PTRS-Config-r16                                                    OPTIONAL,    -- Need M
+    sl-UE-SelectedConfigRP-r16         SL-UE-SelectedConfigRP-r16                                            OPTIONAL,   -- Need M
+    sl-RxParametersNcell-r16           SEQUENCE {
+        sl-TDD-Configuration-r16           TDD-UL-DL-ConfigCommon                                            OPTIONAL,   -- Need M
+        sl-SyncConfigIndex-r16             INTEGER (0..15)
+    }                                                                                                        OPTIONAL,   -- Need M
+    sl-ZoneConfigMCR-List-r16          SEQUENCE (SIZE (16)) OF SL-ZoneConfigMCR-r16                          OPTIONAL,   -- Need M
+    sl-FilterCoefficient-r16           FilterCoefficient                                                     OPTIONAL,   -- Need M
+    sl-RB-Number-r16                   INTEGER (10..275)                                                     OPTIONAL,   -- Need M
+    sl-PreemptionEnable-r16            ENUMERATED {enabled, pl1, pl2, pl3, pl4, pl5, pl6, pl7, pl8}          OPTIONAL,   -- Need R
+    sl-PriorityThreshold-UL-URLLC-r16  INTEGER (1..9)                                                        OPTIONAL,   -- Need M
+    sl-PriorityThreshold-r16           INTEGER (1..9)                                                        OPTIONAL,   -- Need M
+    sl-X-Overhead-r16                  ENUMERATED {n0,n3, n6, n9}                                            OPTIONAL,   -- Need S
+    sl-PowerControl-r16                SL-PowerControl-r16                                                   OPTIONAL,   -- Need M
+    sl-TxPercentageList-r16            SL-TxPercentageList-r16                                               OPTIONAL,   -- Need M
+    sl-MinMaxMCS-List-r16              SL-MinMaxMCS-List-r16                                                 OPTIONAL,   -- Need M
+    ...,
+    [[
+    sl-TimeResource-r16                BIT STRING (SIZE (10..160))                                           OPTIONAL    -- Need M
+    ]]
+}
+
+SL-ZoneConfigMCR-r16 ::=               SEQUENCE {
+    sl-ZoneConfigMCR-Index-r16             INTEGER (0..15),
+    sl-TransRange-r16                      ENUMERATED {m20, m50, m80, m100, m120, m150, m180, m200, m220, m250, m270, m300, m350,
+                                                       m370, m400, m420, m450, m480, m500, m550, m600, m700, m1000, spare9, spare8,
+                                                       spare7, spare6, spare5, spare4, spare3, spare2, spare1}
+                                                                                                             OPTIONAL,   -- Need M
+    sl-ZoneConfig-r16                      SL-ZoneConfig-r16                                                 OPTIONAL,   -- Need M
+    ...
+}
+
+SL-SyncAllowed-r16 ::=                 SEQUENCE {
+    gnss-Sync-r16                          ENUMERATED {true}                                                 OPTIONAL,   -- Need R
+    gnbEnb-Sync-r16                        ENUMERATED {true}                                                 OPTIONAL,   -- Need R
+    ue-Sync-r16                            ENUMERATED {true}                                                 OPTIONAL    -- Need R
+}
+
+SL-PSCCH-Config-r16 ::=                SEQUENCE {
+    sl-TimeResourcePSCCH-r16               ENUMERATED {n2, n3}                                               OPTIONAL,   -- Need M
+    sl-FreqResourcePSCCH-r16               ENUMERATED {n10,n12, n15, n20, n25}                               OPTIONAL,   -- Need M
+    sl-DMRS-ScrambleID-r16                 INTEGER (0..65535)                                                OPTIONAL,   -- Need M
+    sl-NumReservedBits-r16                 INTEGER (2..4)                                                    OPTIONAL,   -- Need M
+   ...
+}
+
+SL-PSSCH-Config-r16 ::=                SEQUENCE {
+    sl-PSSCH-DMRS-TimePatternList-r16      SEQUENCE (SIZE (1..3)) OF INTEGER (2..4)                          OPTIONAL,   -- Need M
+    sl-BetaOffsets2ndSCI-r16               SEQUENCE (SIZE (4)) OF SL-BetaOffsets-r16                         OPTIONAL,   -- Need M
+    sl-Scaling-r16                         ENUMERATED {f0p5, f0p65, f0p8, f1}                                OPTIONAL,   -- Need M
+   ...
+}
+
+SL-PSFCH-Config-r16 ::=                SEQUENCE {
+    sl-PSFCH-Period-r16                    ENUMERATED {sl0, sl1, sl2, sl4}                                   OPTIONAL,   -- Need M
+    sl-PSFCH-RB-Set-r16                    BIT STRING (SIZE (10..275))                                       OPTIONAL,   -- Need M
+    sl-NumMuxCS-Pair-r16                   ENUMERATED {n1, n2, n3, n6}                                       OPTIONAL,   -- Need M
+    sl-MinTimeGapPSFCH-r16                 ENUMERATED {sl2, sl3}                                             OPTIONAL,   -- Need M
+    sl-PSFCH-HopID-r16                     INTEGER (0..1023)                                                 OPTIONAL,   -- Need M
+    sl-PSFCH-CandidateResourceType-r16     ENUMERATED {startSubCH, allocSubCH}                               OPTIONAL,   -- Need M
+   ...
+}
+SL-PTRS-Config-r16 ::=                 SEQUENCE {
+    sl-PTRS-FreqDensity-r16                SEQUENCE (SIZE (2)) OF INTEGER (1..276)                           OPTIONAL,   -- Need M
+    sl-PTRS-TimeDensity-r16                SEQUENCE (SIZE (3)) OF INTEGER (0..29)                            OPTIONAL,   -- Need M
+    sl-PTRS-RE-Offset-r16                  ENUMERATED {offset01, offset10, offset11}                         OPTIONAL,   -- Need M
+    ...
+}
+
+SL-UE-SelectedConfigRP-r16 ::=         SEQUENCE {
+    sl-CBR-PriorityTxConfigList-r16        SL-CBR-PriorityTxConfigList-r16                                  OPTIONAL,   -- Need M
+    sl-Thres-RSRP-List-r16                 SL-Thres-RSRP-List-r16                                            OPTIONAL,   -- Need M
+    sl-MultiReserveResource-r16            ENUMERATED {enabled}                                              OPTIONAL,   -- Need M
+    sl-MaxNumPerReserve-r16                ENUMERATED {n2, n3}                                               OPTIONAL,   -- Need M
+    sl-SensingWindow-r16                   ENUMERATED {ms100, ms1100}                                        OPTIONAL,   -- Need M
+    sl-SelectionWindowList-r16             SL-SelectionWindowList-r16                                        OPTIONAL,   -- Need M
+    sl-ResourceReservePeriodList-r16       SEQUENCE (SIZE (1..16)) OF SL-ResourceReservePeriod-r16           OPTIONAL,   -- Need M
+    sl-RS-ForSensing-r16                   ENUMERATED {pscch, pssch},
+    ...
+}
+
+SL-ResourceReservePeriod-r16 ::=       CHOICE {
+    sl-ResourceReservePeriod1-r16          ENUMERATED {ms0, ms100, ms200, ms300, ms400, ms500, ms600, ms700, ms800, ms900, ms1000},
+    sl-ResourceReservePeriod2-r16          INTEGER (1..99)
+}
+
+SL-SelectionWindowList-r16 ::=         SEQUENCE (SIZE (8)) OF SL-SelectionWindowConfig-r16
+
+SL-SelectionWindowConfig-r16 ::=       SEQUENCE {
+    sl-Priority-r16                        INTEGER (1..8),
+    sl-SelectionWindow-r16                 ENUMERATED {n1, n5, n10, n20}
+}
+
+SL-TxPercentageList-r16 ::=            SEQUENCE (SIZE (8)) OF SL-TxPercentageConfig-r16
+
+SL-TxPercentageConfig-r16 ::=          SEQUENCE {
+    sl-Priority-r16                        INTEGER (1..8),
+    sl-TxPercentage-r16                    ENUMERATED {p20, p35, p50}
+}
+
+SL-MinMaxMCS-List-r16 ::=              SEQUENCE (SIZE (1..3)) OF SL-MinMaxMCS-Config-r16
+
+SL-MinMaxMCS-Config-r16 ::=            SEQUENCE {
+    sl-MCS-Table-r16                       ENUMERATED {qam64, qam256, qam64LowSE},
+    sl-MinMCS-PSSCH-r16                    INTEGER (0..27),
+    sl-MaxMCS-PSSCH-r16                    INTEGER (0..31)
+}
+
+SL-BetaOffsets-r16 ::=                 INTEGER (0..31)
+
+SL-PowerControl-r16 ::=    SEQUENCE {
+    sl-MaxTransPower-r16       INTEGER (-30..33),
+    sl-Alpha-PSSCH-PSCCH-r16   ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}  OPTIONAL,   -- Need M
+    dl-Alpha-PSSCH-PSCCH-r16   ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}  OPTIONAL,   -- Need S
+    sl-P0-PSSCH-PSCCH-r16      INTEGER (-16..15)                                                                  OPTIONAL,   -- Need S
+    dl-P0-PSSCH-PSCCH-r16      INTEGER (-16..15)                                                                  OPTIONAL,   -- Need M
+    dl-Alpha-PSFCH-r16         ENUMERATED {alpha0, alpha04, alpha05, alpha06, alpha07, alpha08, alpha09, alpha1}  OPTIONAL,   -- Need S
+    dl-P0-PSFCH-r16            INTEGER (-16..15)                                                                  OPTIONAL,   -- Need M
+    ...
+}
+
+-- TAG-SL-RESOURCEPOOL-STOP
+-- TAG-SL-RLC-BEARERCONFIG-START
+
+SL-RLC-BearerConfig-r16 ::=                   SEQUENCE {
+    sl-RLC-BearerConfigIndex-r16                  SL-RLC-BearerConfigIndex-r16,
+    sl-ServedRadioBearer-r16                      SLRB-Uu-ConfigIndex-r16                          OPTIONAL,   -- Cond LCH-SetupOnly
+    sl-RLC-Config-r16                             SL-RLC-Config-r16                                OPTIONAL,   -- Cond LCH-Setup
+    sl-MAC-LogicalChannelConfig-r16               SL-LogicalChannelConfig-r16                      OPTIONAL,   -- Cond LCH-Setup
+    ...
+}
+
+-- TAG-SL-RLC-BEARERCONFIG-STOP
+-- TAG-SL-RLC-BEARERCONFIGINDEX-START
+
+SL-RLC-BearerConfigIndex-r16 ::=                    INTEGER (1..maxSL-LCID-r16)
+
+-- TAG-RLC-BEARERCONFIGINDEX-STOP
+-- TAG-SL-RLC-CONFIG-START
+
+SL-RLC-Config-r16 ::=                        CHOICE {
+    sl-AM-RLC-r16                                SEQUENCE {
+        sl-SN-FieldLengthAM-r16                      SN-FieldLengthAM                               OPTIONAL,   -- Cond SLRBSetup
+        sl-T-PollRetransmit-r16                      T-PollRetransmit,
+        sl-PollPDU-r16                                   PollPDU,
+        sl-PollByte-r16                                  PollByte,
+        sl-MaxRetxThreshold-r16                          ENUMERATED { t1, t2, t3, t4, t6, t8, t16, t32 },
+    ...
+    },
+    sl-UM-RLC-r16                                SEQUENCE {
+        sl-SN-FieldLengthUM-r16                      SN-FieldLengthUM                               OPTIONAL,    -- Cond SLRBSetup
+    ...
+    },
+    ...
+}
+
+-- TAG-SL-RLC-CONFIG-STOP
+-- TAG-SL-SCHEDULEDCONFIG-START
+
+SL-ScheduledConfig-r16 ::=                   SEQUENCE {
+    sl-RNTI-r16                                  RNTI-Value,
+    mac-MainConfigSL-r16                         MAC-MainConfigSL-r16                                     OPTIONAL,    -- Need M
+    sl-CS-RNTI-r16                               RNTI-Value                                               OPTIONAL,    -- Need M
+    sl-PSFCH-ToPUCCH-r16                         SEQUENCE (SIZE (1..8)) OF INTEGER (0..15)                OPTIONAL,    -- Need M
+    sl-ConfiguredGrantConfigList-r16             SL-ConfiguredGrantConfigList-r16                         OPTIONAL,    -- Need M
+    ...,
+    [[
+    sl-DCI-ToSL-Trans-r16                        SEQUENCE (SIZE (1..8)) OF INTEGER (1..32)                OPTIONAL     -- Need M
+    ]]
+}
+
+MAC-MainConfigSL-r16 ::=                     SEQUENCE {
+    sl-BSR-Config-r16                            BSR-Config                                           OPTIONAL,    -- Need M
+    ul-PrioritizationThres-r16                   INTEGER (1..16)                                      OPTIONAL,    -- Need M
+    sl-PrioritizationThres-r16                   INTEGER (1..8)                                       OPTIONAL,    -- Need M
+    ...
+}
+
+SL-ConfiguredGrantConfigList-r16 ::=       SEQUENCE {
+    sl-ConfiguredGrantConfigToReleaseList-r16  SEQUENCE (SIZE (1..maxNrofCG-SL-r16)) OF SL-ConfigIndexCG-r16         OPTIONAL, -- Need N
+    sl-ConfiguredGrantConfigToAddModList-r16   SEQUENCE (SIZE (1..maxNrofCG-SL-r16)) OF SL-ConfiguredGrantConfig-r16 OPTIONAL  -- Need N
+}
+
+-- TAG-SL-SCHEDULEDCONFIG-STOP
+-- TAG-SL-SDAP-CONFIG-START
+
+SL-SDAP-Config-r16 ::=                  SEQUENCE {
+    sl-SDAP-Header-r16                      ENUMERATED {present, absent},
+    sl-DefaultRB-r16                        BOOLEAN,
+    sl-MappedQoS-Flows-r16                  CHOICE {
+        sl-MappedQoS-FlowsList-r16              SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-Profile-r16,
+        sl-MappedQoS-FlowsListDedicated-r16     SL-MappedQoS-FlowsListDedicated-r16
+    }                                                                                                           OPTIONAL,   -- Need M
+    sl-CastType-r16                        ENUMERATED {broadcast, groupcast, unicast, spare1}                   OPTIONAL,   -- Need M
+    ...
+}
+
+SL-MappedQoS-FlowsListDedicated-r16 ::= SEQUENCE {
+    sl-MappedQoS-FlowsToAddList-r16         SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-FlowIdentity-r16  OPTIONAL,    -- Need N
+    sl-MappedQoS-FlowsToReleaseList-16      SEQUENCE (SIZE (1..maxNrofSL-QFIs-r16)) OF SL-QoS-FlowIdentity-r16  OPTIONAL     -- Need N
+}
+
+-- TAG-SL-SDAP-CONFIG-STOP
+-- TAG-SL-SYNCCONFIG-START
+
+SL-SyncConfigList-r16 ::=          SEQUENCE (SIZE (1..maxSL-SyncConfig-r16)) OF SL-SyncConfig-r16
+
+SL-SyncConfig-r16 ::=              SEQUENCE {
+    sl-SyncRefMinHyst-r16              ENUMERATED {dB0, dB3, dB6, dB9, dB12}                                   OPTIONAL,    -- Need R
+    sl-SyncRefDiffHyst-r16             ENUMERATED {dB0, dB3, dB6, dB9, dB12, dBinf}                            OPTIONAL,    -- Need R
+    sl-filterCoefficient-r16           FilterCoefficient                                                       OPTIONAL,    -- Need R
+    sl-SSB-TimeAllocation1-r16         SL-SSB-TimeAllocation-r16                                               OPTIONAL,    -- Need R
+    sl-SSB-TimeAllocation2-r16         SL-SSB-TimeAllocation-r16                                               OPTIONAL,    -- Need R
+    sl-SSB-TimeAllocation3-r16         SL-SSB-TimeAllocation-r16                                               OPTIONAL,    -- Need R
+    sl-SSID-r16                        INTEGER (0..671)                                                        OPTIONAL,    -- Need R
+    txParameters-r16                   SEQUENCE {
+        syncTxThreshIC-r16                 SL-RSRP-Range-r16                                                   OPTIONAL,    -- Need R
+        syncTxThreshOoC-r16                SL-RSRP-Range-r16                                                   OPTIONAL,    -- Need R
+        syncInfoReserved-r16               BIT STRING (SIZE (2))                                               OPTIONAL     -- Need R
+    },
+    gnss-Sync-r16                      ENUMERATED {true}                                                       OPTIONAL,    -- Need R
+    ...
+}
+
+SL-RSRP-Range-r16 ::=                  INTEGER (0..13)
+
+SL-SSB-TimeAllocation-r16 ::=          SEQUENCE {
+    sl-NumSSB-WithinPeriod-r16             ENUMERATED {n1, n2, n4, n8, n16, n32, n64}                          OPTIONAL,    -- Need R
+    sl-TimeOffsetSSB-r16                   INTEGER (0..1279)                                                   OPTIONAL,    -- Need R
+    sl-TimeInterval-r16                    INTEGER (0..639)                                                    OPTIONAL     -- Need R
+}
+
+-- TAG-SL-SYNCCONFIG-STOP
+-- TAG-SL-THRES-RSRP-LIST-START
+
+SL-Thres-RSRP-List-r16 ::=    SEQUENCE (SIZE (64)) OF SL-Thres-RSRP-r16
+
+SL-Thres-RSRP-r16 ::=         INTEGER (0..66)
+
+-- TAG-SL-THRES-RSRP-LIST-STOP
+-- TAG-SL-TXPOWER-START
+
+SL-TxPower-r16 ::=                    CHOICE{
+    minusinfinity-r16                     NULL,
+    txPower-r16                           INTEGER (-30..33)
+}
+
+-- TAG-SL-TXPOWER-STOP
+-- TAG-SL-TYPETXSYNC-START
+
+SL-TypeTxSync-r16 ::=                     ENUMERATED {gnss, gnbEnb, ue}
+
+-- TAG-SL-TYPETXSYNC-STOP
+-- TAG-SL-UE-SELECTEDCONFIG-START
+
+SL-UE-SelectedConfig-r16 ::=                 SEQUENCE {
+    sl-PSSCH-TxConfigList-r16                    SL-PSSCH-TxConfigList-r16                                   OPTIONAL,    -- Need R
+    sl-ProbResourceKeep-r16                      ENUMERATED {v0, v0dot2, v0dot4, v0dot6, v0dot8}             OPTIONAL,    -- Need R
+    sl-ReselectAfter-r16                         ENUMERATED {n1, n2, n3, n4, n5, n6, n7, n8, n9}             OPTIONAL,    -- Need R
+    sl-CBR-CommonTxConfigList-r16                SL-CBR-CommonTxConfigList-r16                               OPTIONAL,    -- Need R
+    ul-PrioritizationThres-r16                   INTEGER (1..16)                                             OPTIONAL,    -- Need R
+    sl-PrioritizationThres-r16                   INTEGER (1..8)                                              OPTIONAL,    -- Need R
+    ...
+}
+
+-- TAG-SL-UE-SELECTEDCONFIG-STOP
+-- TAG-SL-ZONECONFIG-START
+
+SL-ZoneConfig-r16 ::=              SEQUENCE {
+    sl-ZoneLength-r16                  ENUMERATED { m5, m10, m20, m30, m40, m50, spare2, spare1},
+    ...
+}
+
+-- TAG-SL-ZONECONFIG-STOP
+-- TAG-SLRB-UU-CONFIGINDEX-START
+
+SLRB-Uu-ConfigIndex-r16 ::=                    INTEGER (1..maxNrofSLRB-r16)
+
+-- TAG-SLRB-UU-CONFIGINDEX-STOP
+-- TAG-MULTIPLICITY-AND-TYPE-CONSTRAINT-DEFINITIONS-START
+
+maxAI-DCI-PayloadSize-r16               INTEGER ::= 128      --Maximum size of the DCI payload scrambled with ai-RNTI
+maxAI-DCI-PayloadSize-r16-1             INTEGER ::= 127      --Maximum size of the DCI payload scrambled with ai-RNTI minus 1
+maxBandComb                             INTEGER ::= 65536   -- Maximum number of DL band combinations
+maxBandsUTRA-FDD-r16                    INTEGER ::= 64      -- Maximum number of bands listed in UTRA-FDD UE caps
+maxBH-RLC-ChannelID-r16                 INTEGER ::= 65536   -- Maximum value of BH RLC Channel ID
+maxBT-IdReport-r16                      INTEGER ::= 32      -- Maximum number of Bluetooth IDs to report
+maxBT-Name-r16                          INTEGER ::= 4       -- Maximum number of Bluetooth name
+maxCAG-Cell-r16                         INTEGER ::= 16      -- Maximum number of NR CAG cell ranges in SIB3, SIB4
+maxTwoPUCCH-Grp-ConfigList-r16          INTEGER ::= 32      -- Maximum number of supported configuration(s) of {primary PUCCH group
+                                                            -- config, secondary PUCCH group config}
+maxCBR-Config-r16                       INTEGER ::= 8       -- Maximum number of CBR range configurations for sidelink communication
+                                                            -- congestion control
+maxCBR-Config-1-r16                     INTEGER ::= 7       -- Maximum number of CBR range configurations for sidelink communication
+                                                            -- congestion control minus 1
+maxCBR-Level-r16                        INTEGER ::= 16      -- Maximum nuber of CBR levels
+maxCBR-Level-1-r16                      INTEGER ::= 15      -- Maximum number of CBR levels minus 1
+maxCellBlack                            INTEGER ::= 16      -- Maximum number of NR blacklisted cell ranges in SIB3, SIB4
+maxCellHistory-r16                      INTEGER ::= 16      -- Maximum number of visited cells reported
+maxCellInter                            INTEGER ::= 16      -- Maximum number of inter-Freq cells listed in SIB4
+maxCellIntra                            INTEGER ::= 16      -- Maximum number of intra-Freq cells listed in SIB3
+maxCellMeasEUTRA                        INTEGER ::= 32      -- Maximum number of cells in E-UTRAN
+maxCellMeasIdle-r16                     INTEGER ::= 8       -- Maximum number of cells per carrier for idle/inactive measurements
+maxCellMeasUTRA-FDD-r16                 INTEGER ::= 32      -- Maximum number of cells in FDD UTRAN
+maxCellWhite                            INTEGER ::= 16      -- Maximum number of NR whitelisted cell ranges in SIB3, SIB4
+maxEARFCN                               INTEGER ::= 262143  -- Maximum value of E-UTRA carrier frequency
+maxEUTRA-CellBlack                      INTEGER ::= 16      -- Maximum number of E-UTRA blacklisted physical cell identity ranges
+                                                            -- in SIB5
+maxEUTRA-NS-Pmax                        INTEGER ::= 8       -- Maximum number of NS and P-Max values per band
+maxLogMeasReport-r16                    INTEGER ::= 520     -- Maximum number of entries for logged measurements
+maxMultiBands                           INTEGER ::= 8       -- Maximum number of additional frequency bands that a cell belongs to
+maxNARFCN                               INTEGER ::= 3279165 -- Maximum value of NR carrier frequency
+maxNR-NS-Pmax                           INTEGER ::= 8       -- Maximum number of NS and P-Max values per band
+maxFreqIdle-r16                         INTEGER ::= 8       -- Maximum number of carrier frequencies for idle/inactive measurements
+maxNrofServingCells                     INTEGER ::= 32      -- Max number of serving cells (SpCells + SCells)
+maxNrofServingCells-1                   INTEGER ::= 31      -- Max number of serving cells (SpCell + SCells) per cell group
+maxNrofAggregatedCellsPerCellGroup      INTEGER ::= 16
+maxNrofDUCells-r16                      INTEGER ::= 512     -- Max number of cells configured on the collocated IAB-DU
+maxNrofAssociatedDUCellsPerMT-r16       INTEGER ::= 65535
+maxNrofAvailabilityCombinationsPerSet-r16   INTEGER ::= 512 -- Max number of AvailabilityCombinationId used in the DCI format 2_5
+maxNrofAvailabilityCombinationsPerSet-r16-1 INTEGER ::= 511 -- Max number of AvailabilityCombinationId used in the DCI format 2_5 minus 1
+maxNrofSCells                           INTEGER ::= 31      -- Max number of secondary serving cells per cell group
+maxNrofCellMeas                         INTEGER ::= 32      -- Maximum number of entries in each of the cell lists in a measurement object
+maxNrofCG-SL-r16                        INTEGER ::= 8       -- Max number of sidelink configured grant
+maxNrofCG-SL-r16-1                      INTEGER ::= 7       -- Max number of sidelink configured grant minus 1
+maxNrofSS-BlocksToAverage               INTEGER ::= 16      -- Max number for the (max) number of SS blocks to average to determine cell measurement
+maxNrofCondCells-r16                    INTEGER ::= 8       -- Max number of conditional candidate SpCells
+maxNrofCSI-RS-ResourcesToAverage        INTEGER ::= 16      -- Max number for the (max) number of CSI-RS to average to determine cell measurement
+maxNrofDL-Allocations                   INTEGER ::= 16      -- Maximum number of PDSCH time domain resource allocations
+maxNrofSR-ConfigPerCellGroup            INTEGER ::= 8       -- Maximum number of SR configurations per cell group
+maxLCG-ID                               INTEGER ::= 7       -- Maximum value of LCG ID
+maxLC-ID                                INTEGER ::= 32      -- Maximum value of Logical Channel ID
+maxLC-ID-Iab-r16                        INTEGER ::= 65855   -- Maximum value of BH Logical Channel ID extension
+maxLTE-CRS-Patterns-r16                 INTEGER ::= 3       -- Maximum number of additional LTE CRS rate matching patterns
+maxNrofTAGs                             INTEGER ::= 4       -- Maximum number of Timing Advance Groups
+maxNrofTAGs-1                           INTEGER ::= 3       -- Maximum number of Timing Advance Groups minus 1
+maxNrofBWPs                             INTEGER ::= 4       -- Maximum number of BWPs per serving cell
+maxNrofCombIDC                          INTEGER ::= 128     -- Maximum number of reported MR-DC combinations for IDC
+maxNrofSymbols-1                        INTEGER ::= 13      -- Maximum index identifying a symbol within a slot (14 symbols, indexed from 0..13)
+maxNrofSlots                            INTEGER ::= 320     -- Maximum number of slots in a 10 ms period
+maxNrofSlots-1                          INTEGER ::= 319     -- Maximum number of slots in a 10 ms period minus 1
+maxNrofPhysicalResourceBlocks           INTEGER ::= 275     -- Maximum number of PRBs
+maxNrofPhysicalResourceBlocks-1         INTEGER ::= 274     -- Maximum number of PRBs minus 1
+maxNrofPhysicalResourceBlocksPlus1      INTEGER ::= 276     -- Maximum number of PRBs plus 1
+maxNrofControlResourceSets              INTEGER ::= 12      -- Max number of CoReSets configurable on a serving cell
+maxNrofControlResourceSets-1            INTEGER ::= 11      -- Max number of CoReSets configurable on a serving cell minus 1
+maxNrofControlResourceSets-1-r16        INTEGER ::= 15      -- Max number of CoReSets configurable on a serving cell extended in minus 1
+maxNrofCoresetPools-r16                 INTEGER ::= 2       -- Maximum number of CORESET pools
+maxCoReSetDuration                      INTEGER ::= 3       -- Max number of OFDM symbols in a control resource set
+maxNrofSearchSpaces-1                   INTEGER ::= 39      -- Max number of Search Spaces minus 1
+maxSFI-DCI-PayloadSize                  INTEGER ::= 128     -- Max number payload of a DCI scrambled with SFI-RNTI
+maxSFI-DCI-PayloadSize-1                INTEGER ::= 127     -- Max number payload of a DCI scrambled with SFI-RNTI minus 1
+maxIAB-IP-Address-r16                   INTEGER ::= 32      -- Max number of assigned IP addresses
+maxINT-DCI-PayloadSize                  INTEGER ::= 126     -- Max number payload of a DCI scrambled with INT-RNTI
+maxINT-DCI-PayloadSize-1                INTEGER ::= 125     -- Max number payload of a DCI scrambled with INT-RNTI minus 1
+maxNrofRateMatchPatterns                INTEGER ::= 4       -- Max number of rate matching patterns that may be configured
+maxNrofRateMatchPatterns-1              INTEGER ::= 3       -- Max number of rate matching patterns that may be configured minus 1
+maxNrofRateMatchPatternsPerGroup        INTEGER ::= 8       -- Max number of rate matching patterns that may be configured in one group
+maxNrofCSI-ReportConfigurations         INTEGER ::= 48      -- Maximum number of report configurations
+maxNrofCSI-ReportConfigurations-1       INTEGER ::= 47      -- Maximum number of report configurations minus 1
+maxNrofCSI-ResourceConfigurations       INTEGER ::= 112     -- Maximum number of resource configurations
+maxNrofCSI-ResourceConfigurations-1     INTEGER ::= 111     -- Maximum number of resource configurations minus 1
+maxNrofAP-CSI-RS-ResourcesPerSet        INTEGER ::= 16
+maxNrOfCSI-AperiodicTriggers            INTEGER ::= 128     -- Maximum number of triggers for aperiodic CSI reporting
+maxNrofReportConfigPerAperiodicTrigger  INTEGER ::= 16      -- Maximum number of report configurations per trigger state for aperiodic reporting
+maxNrofNZP-CSI-RS-Resources             INTEGER ::= 192     -- Maximum number of Non-Zero-Power (NZP) CSI-RS resources
+maxNrofNZP-CSI-RS-Resources-1           INTEGER ::= 191     -- Maximum number of Non-Zero-Power (NZP) CSI-RS resources minus 1
+maxNrofNZP-CSI-RS-ResourcesPerSet       INTEGER ::= 64      -- Maximum number of NZP CSI-RS resources per resource set
+maxNrofNZP-CSI-RS-ResourceSets          INTEGER ::= 64      -- Maximum number of NZP CSI-RS resources per cell
+maxNrofNZP-CSI-RS-ResourceSets-1        INTEGER ::= 63      -- Maximum number of NZP CSI-RS resources per cell minus 1
+maxNrofNZP-CSI-RS-ResourceSetsPerConfig INTEGER ::= 16      -- Maximum number of resource sets per resource configuration
+maxNrofNZP-CSI-RS-ResourcesPerConfig    INTEGER ::= 128     -- Maximum number of resources per resource configuration
+maxNrofZP-CSI-RS-Resources              INTEGER ::= 32      -- Maximum number of Zero-Power (ZP) CSI-RS resources
+maxNrofZP-CSI-RS-Resources-1            INTEGER ::= 31      -- Maximum number of Zero-Power (ZP) CSI-RS resources minus 1
+maxNrofZP-CSI-RS-ResourceSets-1         INTEGER ::= 15
+maxNrofZP-CSI-RS-ResourcesPerSet        INTEGER ::= 16
+maxNrofZP-CSI-RS-ResourceSets           INTEGER ::= 16
+maxNrofCSI-IM-Resources                 INTEGER ::= 32      -- Maximum number of CSI-IM resources. See CSI-IM-ResourceMax in 38.214.
+maxNrofCSI-IM-Resources-1               INTEGER ::= 31      -- Maximum number of CSI-IM resources minus 1. See CSI-IM-ResourceMax in 38.214.
+maxNrofCSI-IM-ResourcesPerSet           INTEGER ::= 8       -- Maximum number of CSI-IM resources per set. See CSI-IM-ResourcePerSetMax in 38.214
+maxNrofCSI-IM-ResourceSets              INTEGER ::= 64      -- Maximum number of NZP CSI-IM resources per cell
+maxNrofCSI-IM-ResourceSets-1            INTEGER ::= 63      -- Maximum number of NZP CSI-IM resources per cell minus 1
+maxNrofCSI-IM-ResourceSetsPerConfig     INTEGER ::= 16      -- Maximum number of CSI IM resource sets per resource configuration
+maxNrofCSI-SSB-ResourcePerSet           INTEGER ::= 64      -- Maximum number of SSB resources in a resource set
+maxNrofCSI-SSB-ResourceSets             INTEGER ::= 64      -- Maximum number of CSI SSB resource sets per cell
+maxNrofCSI-SSB-ResourceSets-1           INTEGER ::= 63      -- Maximum number of CSI SSB resource sets per cell minus 1
+maxNrofCSI-SSB-ResourceSetsPerConfig    INTEGER ::= 1       -- Maximum number of CSI SSB resource sets per resource configuration
+maxNrofFailureDetectionResources        INTEGER ::= 10      -- Maximum number of failure detection resources
+maxNrofFailureDetectionResources-1      INTEGER ::= 9       -- Maximum number of failure detection resources minus 1
+maxNrofFreqSL-r16                       INTEGER ::= 8       -- Maximum number of carrier frequncy for for NR sidelink communication
+maxNrofSL-BWPs-r16                      INTEGER ::= 4       -- Maximum number of BWP for for NR sidelink communication
+maxFreqSL-EUTRA-r16                     INTEGER ::= 8       -- Maximum number of EUTRA anchor carrier frequncy for NR sidelink communication
+maxNrofSL-MeasId-r16                    INTEGER ::= 64      -- Maximum number of sidelink measurement identity (RSRP) per destination
+maxNrofSL-ObjectId-r16                  INTEGER ::= 64      -- Maximum number of sidelink measurement objects (RSRP) per destination
+maxNrofSL-ReportConfigId-r16            INTEGER ::= 64      -- Maximum number of sidelink measurement reporting configuration(RSRP) per destination
+maxNrofSL-PoolToMeasureNR-r16           INTEGER ::= 8       -- Maximum number of resoure pool for NR sidelink measurement to measure for
+                                                            -- each measurement object (for CBR)
+maxFreqSL-NR-r16                        INTEGER ::= 8       -- Maximum number of NR anchor carrier frequncy for NR sidelink communication
+maxNrofSL-QFIs-r16                      INTEGER ::= 2048    -- Maximum number of QoS flow for NR sidelink communication per UE
+maxNrofSL-QFIsPerDest-r16               INTEGER ::= 64      -- Maximum number of QoS flow per destination for NR sidelink communication
+maxNrofObjectId                         INTEGER ::= 64      -- Maximum number of measurement objects
+maxNrofPageRec                          INTEGER ::= 32      -- Maximum number of page records
+maxNrofPCI-Ranges                       INTEGER ::= 8       -- Maximum number of PCI ranges
+maxPLMN                                 INTEGER ::= 12      -- Maximum number of PLMNs broadcast and reported by UE at establisghment
+maxNrofCSI-RS-ResourcesRRM              INTEGER ::= 96      -- Maximum number of CSI-RS resources per cell for an RRM measurement object
+maxNrofCSI-RS-ResourcesRRM-1            INTEGER ::= 95      -- Maximum number of CSI-RS resources per cell for an RRM measurement object minus 1
+maxNrofMeasId                           INTEGER ::= 64      -- Maximum number of configured measurements
+maxNrofQuantityConfig                   INTEGER ::= 2       -- Maximum number of quantity configurations
+maxNrofCSI-RS-CellsRRM                  INTEGER ::= 96      -- Maximum number of cells with CSI-RS resources for an RRM measurement object
+maxNrofSL-Dest-r16                      INTEGER ::= 32      -- Maximum number of destination for NR sidelink communication
+maxNrofSL-Dest-1-r16                    INTEGER ::= 31      -- Highest index of destination for NR sidelink communication
+maxNrofSLRB-r16                         INTEGER ::= 512     -- Maximum number of radio bearer for NR sidelink communication per UE
+maxSL-LCID-r16                          INTEGER ::= 512     -- Maximum number of RLC bearer for NR sidelink communication per UE
+maxSL-SyncConfig-r16                    INTEGER ::= 16      -- Maximum number of sidelink Sync configurations
+maxNrofRXPool-r16                       INTEGER ::= 16      -- Maximum number of Rx resource poolfor NR sidelink communication
+maxNrofTXPool-r16                       INTEGER ::= 8       -- Maximum number of Tx resourcepoolfor NR sidelink communication
+maxNrofPoolID-r16                       INTEGER ::= 16      -- Maximum index of resource pool for NR sidelink communication
+maxNrofSRS-PathlossReferenceRS-r16      INTEGER ::= 64      -- Maximum number of RSs used as pathloss reference for SRS power control.
+maxNrofSRS-PathlossReferenceRS-1-r16    INTEGER ::= 63      -- Maximum number of RSs used as pathloss reference for SRS power control-1.
+maxNrofSRS-ResourceSets                 INTEGER ::= 16      -- Maximum number of SRS resource sets in a BWP.
+maxNrofSRS-ResourceSets-1               INTEGER ::= 15      -- Maximum number of SRS resource sets in a BWP minus 1.
+maxNrofSRS-PosResourceSets-r16          INTEGER ::= 16      -- Maximum number of SRS Positioning resource sets in a BWP.
+maxNrofSRS-PosResourceSets-1-r16        INTEGER ::= 15      -- Maximum number of SRS Positioning resource sets in a BWP minus 1.
+maxNrofSRS-Resources                    INTEGER ::= 64      -- Maximum number of SRS resources.
+maxNrofSRS-Resources-1                  INTEGER ::= 63      -- Maximum number of SRS resources minus 1.
+maxNrofSRS-PosResources-r16             INTEGER ::= 64      -- Maximum number of SRS Positioning resources.
+maxNrofSRS-PosResources-1-r16           INTEGER ::= 63      -- Maximum number of SRS Positioning resources in an SRS Positioning
+                                                            -- resource set minus 1.
+maxNrofSRS-ResourcesPerSet              INTEGER ::= 16      -- Maximum number of SRS resources in an SRS resource set
+maxNrofSRS-TriggerStates-1              INTEGER ::= 3       -- Maximum number of SRS trigger states minus 1, i.e., the largest code point.
+maxNrofSRS-TriggerStates-2              INTEGER ::= 2       -- Maximum number of SRS trigger states minus 2.
+maxRAT-CapabilityContainers             INTEGER ::= 8       -- Maximum number of interworking RAT containers (incl NR and MRDC)
+maxSimultaneousBands                    INTEGER ::= 32      -- Maximum number of simultaneously aggregated bands
+maxULTxSwitchingBandPairs               INTEGER ::= 32      -- Maximum number of band pairs supporting dynamic UL Tx switching in a band combination
+maxNrofSlotFormatCombinationsPerSet     INTEGER ::= 512     -- Maximum number of Slot Format Combinations in a SF-Set.
+maxNrofSlotFormatCombinationsPerSet-1   INTEGER ::= 511     -- Maximum number of Slot Format Combinations in a SF-Set minus 1.
+maxNrofTrafficPattern-r16               INTEGER ::= 8       -- Maximum number of Traffic Pattern for NR sidelink communication.
+maxNrofPUCCH-Resources                  INTEGER ::= 128
+maxNrofPUCCH-Resources-1                INTEGER ::= 127
+maxNrofPUCCH-ResourceSets               INTEGER ::= 4       -- Maximum number of PUCCH Resource Sets
+maxNrofPUCCH-ResourceSets-1             INTEGER ::= 3       -- Maximum number of PUCCH Resource Sets minus 1.
+maxNrofPUCCH-ResourcesPerSet            INTEGER ::= 32      -- Maximum number of PUCCH Resources per PUCCH-ResourceSet
+maxNrofPUCCH-P0-PerSet                  INTEGER ::= 8       -- Maximum number of P0-pucch present in a p0-pucch set
+maxNrofPUCCH-PathlossReferenceRSs       INTEGER ::= 4       -- Maximum number of RSs used as pathloss reference for PUCCH power control.
+maxNrofPUCCH-PathlossReferenceRSs-1     INTEGER ::= 3       -- Maximum number of RSs used as pathloss reference for PUCCH power control minus 1.
+maxNrofPUCCH-PathlossReferenceRSs-r16   INTEGER ::= 64      -- Maximum number of RSs used as pathloss reference for PUCCH power control extended.
+maxNrofPUCCH-PathlossReferenceRSs-1-r16 INTEGER ::= 63      -- Maximum number of RSs used as pathloss reference for PUCCH power control
+                                                            -- minus 1 extended.
+maxNrofPUCCH-PathlossReferenceRSsDiff-r16 INTEGER ::= 60    -- Difference between the extended maximum and the non-extended maximum
+maxNrofPUCCH-ResourceGroups-r16         INTEGER ::= 4       -- Maximum number of PUCCH resources groups.
+maxNrofPUCCH-ResourcesPerGroup-r16      INTEGER ::= 128     -- Maximum number of PUCCH resources in a PUCCH group.
+maxNrofMultiplePUSCHs-r16               INTEGER ::= 8       -- Maximum number of multiple PUSCHs in PUSCH TDRA list
+maxNrofP0-PUSCH-AlphaSets               INTEGER ::= 30      -- Maximum number of P0-pusch-alpha-sets (see 38,213, clause 7.1)
+maxNrofP0-PUSCH-AlphaSets-1             INTEGER ::= 29      -- Maximum number of P0-pusch-alpha-sets minus 1 (see 38,213, clause 7.1)
+maxNrofPUSCH-PathlossReferenceRSs       INTEGER ::= 4       -- Maximum number of RSs used as pathloss reference for PUSCH power control.
+maxNrofPUSCH-PathlossReferenceRSs-1     INTEGER ::= 3       -- Maximum number of RSs used as pathloss reference for PUSCH power control minus 1.
+maxNrofPUSCH-PathlossReferenceRSs-r16   INTEGER ::= 64      -- Maximum number of RSs used as pathloss reference for PUSCH power control extended
+maxNrofPUSCH-PathlossReferenceRSs-1-r16 INTEGER ::= 63      -- Maximum number of RSs used as pathloss reference for PUSCH power control minus 1
+maxNrofPUSCH-PathlossReferenceRSsDiff-r16  INTEGER ::= 60   -- Difference between maxNrofPUSCH-PathlossReferenceRSs-r16 and
+                                                            -- maxNrofPUSCH-PathlossReferenceRSs
+maxNrofNAICS-Entries                    INTEGER ::= 8       -- Maximum number of supported NAICS capability set
+maxBands                                INTEGER ::= 1024    -- Maximum number of supported bands in UE capability.
+maxBandsMRDC                            INTEGER ::= 1280
+maxBandsEUTRA                           INTEGER ::= 256
+maxCellReport                           INTEGER ::= 8
+maxDRB                                  INTEGER ::= 29      -- Maximum number of DRBs (that can be added in DRB-ToAddModLIst).
+maxFreq                                 INTEGER ::= 8       -- Max number of frequencies.
+maxFreqLayers                           INTEGER ::= 4       -- Max number of frequency layers.
+maxFreqIDC-r16                          INTEGER ::= 128     -- Max number of frequencies for IDC indication.
+maxCombIDC-r16                          INTEGER ::= 128     -- Max number of reported UL CA for IDC indication.
+maxFreqIDC-MRDC                         INTEGER ::= 32      -- Maximum number of candidate NR frequencies for MR-DC IDC indication
+maxNrofCandidateBeams                   INTEGER ::= 16      -- Max number of PRACH-ResourceDedicatedBFR that in BFR config.
+maxNrofCandidateBeams-r16               INTEGER ::= 64      -- Max number of candidate beam resources in BFR config.
+maxNrofCandidateBeamsExt-r16            INTEGER ::= 48      -- Max number of PRACH-ResourceDedicatedBFR in the CandidateBeamRSListExt
+maxNrofPCIsPerSMTC                      INTEGER ::= 64      -- Maximun number of PCIs per SMTC.
+maxNrofQFIs                             INTEGER ::= 64
+maxNrofResourceAvailabilityPerCombination-r16 INTEGER ::= 256
+maxNrOfSemiPersistentPUSCH-Triggers     INTEGER ::= 64      -- Maximum number of triggers for semi persistent reporting on PUSCH
+maxNrofSR-Resources                     INTEGER ::= 8       -- Maximum number of SR resources per BWP in a cell.
+maxNrofSlotFormatsPerCombination        INTEGER ::= 256
+maxNrofSpatialRelationInfos             INTEGER ::= 8
+maxNrofSpatialRelationInfos-plus-1      INTEGER ::= 9
+maxNrofSpatialRelationInfos-r16         INTEGER ::= 64
+maxNrofSpatialRelationInfosDiff-r16     INTEGER ::= 56      -- Difference between maxNrofSpatialRelationInfos-r16 and maxNrofSpatialRelationInfos
+maxNrofIndexesToReport                  INTEGER ::= 32
+maxNrofIndexesToReport2                 INTEGER ::= 64
+maxNrofSSBs-r16                         INTEGER ::= 64      -- Maximum number of SSB resources in a resource set.
+maxNrofSSBs-1                           INTEGER ::= 63      -- Maximum number of SSB resources in a resource set minus 1.
+maxNrofS-NSSAI                          INTEGER ::= 8       -- Maximum number of S-NSSAI.
+maxNrofTCI-StatesPDCCH                  INTEGER ::= 64
+maxNrofTCI-States                       INTEGER ::= 128     -- Maximum number of TCI states.
+maxNrofTCI-States-1                     INTEGER ::= 127     -- Maximum number of TCI states minus 1.
+maxNrofUL-Allocations                   INTEGER ::= 16      -- Maximum number of PUSCH time domain resource allocations.
+maxQFI                                  INTEGER ::= 63
+maxRA-CSIRS-Resources                   INTEGER ::= 96
+maxRA-OccasionsPerCSIRS                 INTEGER ::= 64      -- Maximum number of RA occasions for one CSI-RS
+maxRA-Occasions-1                       INTEGER ::= 511     -- Maximum number of RA occasions in the system
+maxRA-SSB-Resources                     INTEGER ::= 64
+maxSCSs                                 INTEGER ::= 5
+maxSecondaryCellGroups                  INTEGER ::= 3
+maxNrofServingCellsEUTRA                INTEGER ::= 32
+maxMBSFN-Allocations                    INTEGER ::= 8
+maxNrofMultiBands                       INTEGER ::= 8
+maxCellSFTD                             INTEGER ::= 3       -- Maximum number of cells for SFTD reporting
+maxReportConfigId                       INTEGER ::= 64
+maxNrofCodebooks                        INTEGER ::= 16      -- Maximum number of codebooks suppoted by the UE
+maxNrofCSI-RS-ResourcesExt-r16          INTEGER ::= 16      -- Maximum number of codebook resources supported by the UE for eType2/Codebook combo
+maxNrofCSI-RS-Resources                 INTEGER ::= 7       -- Maximum number of codebook resources supported by the UE
+maxNrofCSI-RS-ResourcesAlt-r16          INTEGER ::= 512     -- Maximum number of alternative codebook resources supported by the UE
+maxNrofCSI-RS-ResourcesAlt-1-r16        INTEGER ::= 511     -- Maximum number of alternative codebook resources supported by the UE minus 1
+maxNrofSRI-PUSCH-Mappings               INTEGER ::= 16
+maxNrofSRI-PUSCH-Mappings-1             INTEGER ::= 15
+maxSIB                                  INTEGER::= 32       -- Maximum number of SIBs
+maxSI-Message                           INTEGER::= 32       -- Maximum number of SI messages
+maxPO-perPF                             INTEGER ::= 4       -- Maximum number of paging occasion per paging frame
+maxAccessCat-1                          INTEGER ::= 63      -- Maximum number of Access Categories minus 1
+maxBarringInfoSet                       INTEGER ::= 8       -- Maximum number of Access Categories
+maxCellEUTRA                            INTEGER ::= 8       -- Maximum number of E-UTRA cells in SIB list
+maxEUTRA-Carrier                        INTEGER ::= 8       -- Maximum number of E-UTRA carriers in SIB list
+maxPLMNIdentities                       INTEGER ::= 8       -- Maximum number of PLMN identites in RAN area configurations
+maxDownlinkFeatureSets                  INTEGER ::= 1024    -- (for NR DL) Total number of FeatureSets (size of the pool)
+maxUplinkFeatureSets                    INTEGER ::= 1024    -- (for NR UL) Total number of FeatureSets (size of the pool)
+maxEUTRA-DL-FeatureSets                 INTEGER ::= 256     -- (for E-UTRA) Total number of FeatureSets (size of the pool)
+maxEUTRA-UL-FeatureSets                 INTEGER ::= 256     -- (for E-UTRA) Total number of FeatureSets (size of the pool)
+maxFeatureSetsPerBand                   INTEGER ::= 128     -- (for NR) The number of feature sets associated with one band.
+maxPerCC-FeatureSets                    INTEGER ::= 1024    -- (for NR) Total number of CC-specific FeatureSets (size of the pool)
+maxFeatureSetCombinations               INTEGER ::= 1024    -- (for MR-DC/NR)Total number of Feature set combinations (size of the pool)
+maxInterRAT-RSTD-Freq                   INTEGER ::= 3
+maxHRNN-Len-r16                         INTEGER ::= 48      -- Maximum length of HRNNs
+maxNPN-r16                              INTEGER ::= 12      -- Maximum number of NPNs broadcast and reported by UE at establishment
+maxNrOfMinSchedulingOffsetValues-r16    INTEGER ::= 2       -- Maximum number of min. scheduling offset (K0/K2) configurations
+maxK0-SchedulingOffset-r16              INTEGER ::= 16      -- Maximum number of slots configured as min. scheduling offset (K0)
+maxK2-SchedulingOffset-r16              INTEGER ::= 16      -- Maximum number of slots configured as min. scheduling offset (K2)
+maxDCI-2-6-Size-r16                     INTEGER ::= 140     -- Maximum size of DCI format 2-6
+maxDCI-2-6-Size-1-r16                   INTEGER ::= 139     -- Maximum DCI format 2-6 size minus 1
+maxNrofUL-Allocations-r16               INTEGER ::= 64      -- Maximum number of PUSCH time domain resource allocations
+maxNrofP0-PUSCH-Set-r16                 INTEGER ::= 2       -- Maximum number of P0 PUSCH set(s)
+maxOnDemandSIB-r16                      INTEGER ::= 8       -- Maximum number of SIB(s) that can be requested on-demand
+maxOnDemandPosSIB-r16                   INTEGER ::= 32      -- Maximum number of posSIB(s) that can be requested on-demand
+maxCI-DCI-PayloadSize-r16               INTEGER ::= 126     -- Maximum number of the DCI size for CI
+maxCI-DCI-PayloadSize-r16-1             INTEGER ::= 125     -- Maximum number of the DCI size for CI minus 1
+maxWLAN-Id-Report-r16                   INTEGER ::= 32      -- Maximum number of WLAN IDs to report
+maxWLAN-Name-r16                        INTEGER ::= 4       -- Maximum number of WLAN name
+maxRAReport-r16                         INTEGER ::= 8       -- Maximum number of RA procedures information to be included in the RA report
+maxTxConfig-r16                         INTEGER ::= 64      -- Maximum number of sidelink transmission parameters configurations
+maxTxConfig-1-r16                       INTEGER ::= 63      -- Maximum number of sidelink transmission parameters configurations minus 1
+maxPSSCH-TxConfig-r16                   INTEGER ::= 16      -- Maximum number of PSSCH TX configurations
+maxNrofCLI-RSSI-Resources-r16           INTEGER ::= 64      -- Maximum number of CLI-RSSI resources for UE
+maxNrofCLI-RSSI-Resources-r16-1         INTEGER ::= 63      -- Maximum number of CLI-RSSI resources for UE minus 1
+maxNrofCLI-SRS-Resources-r16             INTEGER ::= 32      -- Maximum number of SRS resources for CLI measurement for UE
+maxCLI-Report-r16                       INTEGER ::= 8
+maxNrofConfiguredGrantConfig-r16        INTEGER ::= 12      -- Maximum number of configured grant configurations per BWP
+maxNrofConfiguredGrantConfig-r16-1      INTEGER ::= 11      -- Maximum number of configured grant configurations per BWP minus 1
+maxNrofCG-Type2DeactivationState        INTEGER ::= 16      -- Maximum number of deactivation state for type 2 configured grants per BWP
+maxNrofConfiguredGrantConfigMAC-r16     INTEGER ::= 32      -- Maximum number of configured grant configurations per MAC entity
+maxNrofConfiguredGrantConfigMAC-r16-1   INTEGER ::= 31      -- Maximum number of configured grant configurations per MAC entity minus 1
+maxNrofSPS-Config-r16                   INTEGER ::= 8       -- Maximum number of SPS configurations per BWP
+maxNrofSPS-Config-r16-1                 INTEGER ::= 7       -- Maximum number of SPS configurations per BWP minus 1
+maxNrofSPS-DeactivationState            INTEGER ::= 16      -- Maximum number of deactivation state for SPS per BWP
+maxNrofDormancyGroups                   INTEGER ::= 5       --
+maxNrofPUCCH-ResourceGroups-1-r16       INTEGER ::= 3       --
+maxNrofServingCellsTCI-r16              INTEGER ::= 32      -- Maximum number of serving cells in simultaneousTCI-UpdateList
+maxNrofTxDC-TwoCarrier-r16              INTEGER ::= 64      -- Maximum number of UL Tx DC locations reported by the UE for 2CC uplink CA
+
+-- TAG-MULTIPLICITY-AND-TYPE-CONSTRAINT-DEFINITIONS-STOP
+
+END
+
+-- TAG-PC5-RRC-DEFINITIONS-START
+						
+PC5-RRC-Definitions DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS
+	SetupRelease,
+	RRC-TransactionIdentifier,
+	SN-FieldLengthAM,
+	SN-FieldLengthUM,
+	LogicalChannelIdentity,
+	maxNrofSLRB-r16,
+	maxNrofSL-QFIs-r16,
+	maxNrofSL-QFIsPerDest-r16,
+	RSRP-Range,
+	SL-MeasConfig-r16,
+	SL-MeasId-r16,
+	FreqBandList,
+	FreqBandIndicatorNR,
+	maxSimultaneousBands,
+	maxBandComb,
+	maxBands,
+	BandParametersSidelink-r16,
+	RLC-ParametersSidelink-r16
+
+
+FROM NR-RRC-Definitions;
+
+-- TAG-PC5-RRC-DEFINITIONS-STOP
+	
+
+-- TAG-SBCCH-SL-BCH-MESSAGE-START
+
+SBCCH-SL-BCH-Message ::= SEQUENCE {
+    message                  SBCCH-SL-BCH-MessageType
+}
+
+SBCCH-SL-BCH-MessageType::=     CHOICE {
+    c1                              CHOICE {
+        masterInformationBlockSidelink              MasterInformationBlockSidelink,
+        spare1 NULL
+    },
+    messageClassExtension   SEQUENCE {}
+}
+
+-- TAG-SBCCH-SL-BCH-MESSAGE-STOP
+-- TAG-SCCH-MESSAGE-START
+
+SCCH-Message ::=             SEQUENCE {
+    message                         SCCH-MessageType
+}
+
+SCCH-MessageType ::=         CHOICE {
+    c1                              CHOICE {
+        measurementReportSidelink                MeasurementReportSidelink,
+        rrcReconfigurationSidelink               RRCReconfigurationSidelink,
+        rrcReconfigurationCompleteSidelink       RRCReconfigurationCompleteSidelink,
+        rrcReconfigurationFailureSidelink        RRCReconfigurationFailureSidelink,
+        ueCapabilityEnquirySidelink              UECapabilityEnquirySidelink,
+        ueCapabilityInformationSidelink          UECapabilityInformationSidelink,
+        spare2 NULL, spare1 NULL
+    },
+    messageClassExtension           SEQUENCE {}
+}
+
+-- TAG-SCCH-MESSAGE-STOP
+-- TAG-MASTERINFORMATIONBLOCKSIDELINK-START
+
+MasterInformationBlockSidelink ::=           SEQUENCE {
+    sl-TDD-Config-r16                            BIT STRING (SIZE (12)),
+    inCoverage-r16                               BOOLEAN,
+    directFrameNumber-r16                        BIT STRING (SIZE (10)),
+    slotIndex-r16                                BIT STRING (SIZE (7)),
+    reservedBits-r16                             BIT STRING (SIZE (2))
+}
+
+-- TAG-MASTERINFORMATIONBLOCKSIDELINK-STOP
+-- TAG-MEASUREMENTREPORTSIDELINK-START
+
+MeasurementReportSidelink ::=                   SEQUENCE {
+    criticalExtensions                              CHOICE {
+        measurementReportSidelink-r16                   MeasurementReportSidelink-IEs-r16,
+        criticalExtensionsFuture                        SEQUENCE {}
+    }
+}
+
+MeasurementReportSidelink-IEs-r16 ::=           SEQUENCE {
+    sl-measResults-r16                              SL-MeasResults-r16,
+    lateNonCriticalExtension                        OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                            SEQUENCE{}                                                              OPTIONAL
+}
+
+SL-MeasResults-r16 ::=                          SEQUENCE {
+    sl-MeasId-r16                                   SL-MeasId-r16,
+    sl-MeasResult-r16                               SL-MeasResult-r16,
+    ...
+}
+
+SL-MeasResult-r16 ::=                           SEQUENCE {
+    sl-ResultDMRS-r16                               SL-MeasQuantityResult-r16                                               OPTIONAL,
+    ...
+}
+
+SL-MeasQuantityResult-r16 ::=                   SEQUENCE {
+    sl-RSRP-r16                                     RSRP-Range                                                              OPTIONAL,
+    ...
+}
+
+-- TAG-MEASUREMENTREPORTSIDELINK-STOP
+-- TAG-RRCRECONFIGURATIONSIDELINK-START
+
+RRCReconfigurationSidelink ::=          SEQUENCE {
+    rrc-TransactionIdentifier-r16           RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        rrcReconfigurationSidelink-r16          RRCReconfigurationSidelink-IEs-r16,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+RRCReconfigurationSidelink-IEs-r16 ::=  SEQUENCE {
+    slrb-ConfigToAddModList-r16             SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-Config-r16             OPTIONAL, -- Need N
+    slrb-ConfigToReleaseList-r16            SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SLRB-PC5-ConfigIndex-r16    OPTIONAL, -- Need N
+    sl-MeasConfig-r16                       SetupRelease {SL-MeasConfig-r16}                                    OPTIONAL, -- Need M
+    sl-CSI-RS-Config-r16                    SetupRelease {SL-CSI-RS-Config-r16}                                 OPTIONAL, -- Need M
+    sl-ResetConfig-r16                      ENUMERATED {true}                                                   OPTIONAL, -- Need N
+    sl-LatencyBoundCSI-Report-r16           INTEGER (3..160)                                                    OPTIONAL, -- Need M
+    lateNonCriticalExtension                OCTET STRING                                                        OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                                         OPTIONAL
+}
+
+SLRB-Config-r16::=                      SEQUENCE {
+    slrb-PC5-ConfigIndex-r16                SLRB-PC5-ConfigIndex-r16,
+    sl-SDAP-ConfigPC5-r16                   SL-SDAP-ConfigPC5-r16                                               OPTIONAL, -- Need M
+    sl-PDCP-ConfigPC5-r16                   SL-PDCP-ConfigPC5-r16                                               OPTIONAL, -- Need M
+    sl-RLC-ConfigPC5-r16                    SL-RLC-ConfigPC5-r16                                                OPTIONAL, -- Need M
+    sl-MAC-LogicalChannelConfigPC5-r16      SL-LogicalChannelConfigPC5-r16                                      OPTIONAL, -- Need M
+    ...
+}
+
+SLRB-PC5-ConfigIndex-r16 ::=            INTEGER (1..maxNrofSLRB-r16)
+
+SL-SDAP-ConfigPC5-r16 ::=               SEQUENCE {
+    sl-MappedQoS-FlowsToAddList-r16         SEQUENCE (SIZE (1.. maxNrofSL-QFIsPerDest-r16)) OF SL-PQFI-r16      OPTIONAL, -- Need N
+    sl-MappedQoS-FlowsToReleaseList-r16     SEQUENCE (SIZE (1.. maxNrofSL-QFIsPerDest-r16)) OF SL-PQFI-r16      OPTIONAL, -- Need N
+    sl-SDAP-Header-r16                      ENUMERATED {present, absent},
+    ...
+}
+
+SL-PDCP-ConfigPC5-r16 ::=               SEQUENCE {
+    sl-PDCP-SN-Size-r16                     ENUMERATED {len12bits, len18bits}                                   OPTIONAL, -- Need M
+    sl-OutOfOrderDelivery-r16               ENUMERATED { true }                                                 OPTIONAL,  -- Need R
+    ...
+}
+
+SL-RLC-ConfigPC5-r16 ::=                CHOICE {
+    sl-AM-RLC-r16                           SEQUENCE {
+        sl-SN-FieldLengthAM-r16                 SN-FieldLengthAM                                                OPTIONAL, -- Need M
+        ...
+    },
+    sl-UM-Bi-Directional-RLC-r16            SEQUENCE {
+        sl-SN-FieldLengthUM-r16                 SN-FieldLengthUM                                                OPTIONAL, -- Need M
+        ...
+    },
+    sl-UM-Uni-Directional-RLC-r16           SEQUENCE {
+        sl-SN-FieldLengthUM-r16                 SN-FieldLengthUM                                                OPTIONAL, -- Need M
+        ...
+    }
+}
+
+SL-LogicalChannelConfigPC5-r16 ::=      SEQUENCE {
+    sl-LogicalChannelIdentity-r16           LogicalChannelIdentity,
+    ...
+}
+
+SL-PQFI-r16 ::=                         INTEGER (1..64)
+
+SL-CSI-RS-Config-r16 ::=                SEQUENCE {
+    sl-CSI-RS-FreqAllocation-r16            CHOICE {
+        sl-OneAntennaPort-r16                   BIT STRING (SIZE (12)),
+        sl-TwoAntennaPort-r16                   BIT STRING (SIZE (6))
+    }                                                                                                           OPTIONAL, -- Need M
+    sl-CSI-RS-FirstSymbol-r16               INTEGER (3..12)                                                     OPTIONAL, -- Need M
+    ...
+}
+
+-- TAG-RRCRECONFIGURATIONSIDELINK-STOP
+-- TAG-RRCRECONFIGURATIONCOMPLETESIDELINK-START
+
+RRCReconfigurationCompleteSidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16                  RRC-TransactionIdentifier,
+    criticalExtensions                             CHOICE {
+        rrcReconfigurationCompleteSidelink-r16         RRCReconfigurationCompleteSidelink-IEs-r16,
+        criticalExtensionsFuture                       SEQUENCE {}
+    }
+}
+
+RRCReconfigurationCompleteSidelink-IEs-r16 ::= SEQUENCE {
+    lateNonCriticalExtension                       OCTET STRING                                                       OPTIONAL,
+    nonCriticalExtension                           SEQUENCE {}                                                        OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONCOMPLETESIDELINK-STOP
+-- TAG-RRCRECONFIGURATIONFAILURESIDELINK-START
+
+RRCReconfigurationFailureSidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16                 RRC-TransactionIdentifier,
+    criticalExtensions                            CHOICE {
+        rrcReconfigurationFailureSidelink-r16         RRCReconfigurationFailureSidelink-IEs-r16,
+        criticalExtensionsFuture                      SEQUENCE {}
+    }
+}
+
+RRCReconfigurationFailureSidelink-IEs-r16 ::= SEQUENCE {
+    lateNonCriticalExtension                      OCTET STRING                                                         OPTIONAL,
+    nonCriticalExtension                          SEQUENCE {}                                                          OPTIONAL
+}
+
+-- TAG-RRCRECONFIGURATIONFAILURESIDELINK-STOP
+-- TAG-UECAPABILITYENQUIRYSIDELINK-START
+
+UECapabilityEnquirySidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16           RRC-TransactionIdentifier,
+    criticalExtensions                      CHOICE {
+        ueCapabilityEnquirySidelink-r16         UECapabilityEnquirySidelink-IEs-r16,
+        criticalExtensionsFuture                SEQUENCE {}
+    }
+}
+
+UECapabilityEnquirySidelink-IEs-r16 ::= SEQUENCE {
+    frequencyBandListFilterSidelink-r16     FreqBandList                                                            OPTIONAL, -- Need N
+    ue-CapabilityInformationSidelink-r16    OCTET STRING                                                            OPTIONAL,
+    lateNonCriticalExtension                OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                    SEQUENCE{}                                                              OPTIONAL
+}
+
+-- TAG-UECAPABILITYENQUIRYSIDELINK-STOP
+-- TAG-UECAPABILITYINFORMATIONSIDELINK-START
+
+UECapabilityInformationSidelink ::=         SEQUENCE {
+    rrc-TransactionIdentifier-r16               RRC-TransactionIdentifier,
+    criticalExtensions                          CHOICE {
+        ueCapabilityInformationSidelink-r16         UECapabilityInformationSidelink-IEs-r16,
+        criticalExtensionsFuture                    SEQUENCE {}
+    }
+}
+
+UECapabilityInformationSidelink-IEs-r16 ::= SEQUENCE {
+    accessStratumReleaseSidelink-r16            AccessStratumReleaseSidelink-r16,
+    pdcp-ParametersSidelink-r16                 PDCP-ParametersSidelink-r16                                             OPTIONAL,
+    rlc-ParametersSidelink-r16                  RLC-ParametersSidelink-r16                                              OPTIONAL,
+    supportedBandCombinationListSidelinkNR-r16  BandCombinationListSidelinkNR-r16                                       OPTIONAL,
+    supportedBandListSidelink-r16               SEQUENCE (SIZE (1..maxBands)) OF BandSidelinkPC5-r16                    OPTIONAL,
+    appliedFreqBandListFilter-r16               FreqBandList                                                            OPTIONAL,
+    lateNonCriticalExtension                    OCTET STRING                                                            OPTIONAL,
+    nonCriticalExtension                        SEQUENCE{}                                                              OPTIONAL
+}
+
+AccessStratumReleaseSidelink-r16 ::= ENUMERATED { rel16, spare7, spare6, spare5, spare4, spare3, spare2, spare1, ... }
+
+PDCP-ParametersSidelink-r16 ::= SEQUENCE {
+    outOfOrderDeliverySidelink-r16              ENUMERATED {supported}      OPTIONAL,
+    ...
+}
+
+BandCombinationListSidelinkNR-r16 ::= SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationParametersSidelinkNR-r16
+
+BandCombinationParametersSidelinkNR-r16 ::= SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandParametersSidelink-r16
+
+BandSidelinkPC5-r16 ::=           SEQUENCE {
+    freqBandSidelink-r16              FreqBandIndicatorNR,
+    --15-1
+    sl-Reception-r16                  SEQUENCE {
+        harq-RxProcessSidelink-r16        ENUMERATED {n16, n24, n32, n64},
+        pscch-RxSidelink-r16              ENUMERATED {value1, value2},
+        scs-CP-PatternRxSidelink-r16      CHOICE {
+            fr1-r16                           SEQUENCE {
+                scs-15kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL,
+                scs-30kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL,
+                scs-60kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL
+            },
+            fr2-r16                           SEQUENCE {
+                scs-60kHz-r16                     BIT STRING (SIZE (16))                            OPTIONAL,
+                scs-120kHz-r16                    BIT STRING (SIZE (16))                            OPTIONAL
+            }
+        }                                                                                           OPTIONAL,
+        extendedCP-RxSidelink-r16         ENUMERATED {supported}                                    OPTIONAL
+    }                                                                                               OPTIONAL,
+    --15-10
+    sl-Tx-256QAM-r16                  ENUMERATED {supported}                                        OPTIONAL,
+    --15-12
+    lowSE-64QAM-MCS-TableSidelink-r16 ENUMERATED {supported}                                        OPTIONAL,
+    ...,
+    [[
+    --15-14
+    csi-ReportSidelink-r16                SEQUENCE {
+        csi-RS-PortsSidelink-r16              ENUMERATED {p1, p2}
+    }                                                                                               OPTIONAL,
+    --15-19
+    rankTwoReception-r16                  ENUMERATED {supported}                                    OPTIONAL,
+    --15-23
+    sl-openLoopPC-RSRP-ReportSidelink-r16 ENUMERATED {supported}                                    OPTIONAL,
+    --13-1
+    sl-Rx-256QAM-r16                      ENUMERATED {supported}                                    OPTIONAL
+    ]]
+}
+
+-- TAG-UECAPABILITYINFORMATIONSIDELINK-STOP
+
+END
+
+-- NR-UE-VARIABLES-START
+NR-UE-Variables DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS	   
+    ARFCN-ValueNR,
+    CellIdentity,
+    EUTRA-PhysCellId,
+    MeasId,
+    MeasIdToAddModList,
+    MeasIdleCarrierEUTRA-r16,
+    MeasIdleCarrierNR-r16,
+    MeasResultIdleEUTRA-r16,
+    MeasResultIdleNR-r16,
+    MeasObjectToAddModList,
+    PhysCellId,
+    RNTI-Value,
+    ReportConfigToAddModList,
+    RSRP-Range,
+    SL-MeasId-r16,
+    SL-MeasIdList-r16,
+    SL-MeasObjectList-r16,
+    SL-ReportConfigList-r16,
+    SL-QuantityConfig-r16,
+    Tx-PoolMeasList-r16,
+    QuantityConfig,
+    maxNrofCellMeas,
+    maxNrofMeasId,
+    maxFreqIdle-r16,
+    PhysCellIdUTRA-FDD-r16,
+    ValidityAreaList-r16,
+    CondReconfigToAddModList-r16,
+    ConnEstFailReport-r16,
+    LoggingDuration-r16,
+    LoggingInterval-r16,
+    LogMeasInfoList-r16,
+    LogMeasInfo-r16,
+    RA-Report-r16,
+    RLF-Report-r16,
+    TraceReference-r16,
+    WLAN-Identifiers-r16,
+    WLAN-NameList-r16,
+    BT-NameList-r16,
+    PLMN-Identity,
+    maxPLMN,
+    RA-ReportList-r16,
+    VisitedCellInfoList-r16,
+    AbsoluteTimeInfo-r16,
+    LoggedEventTriggerConfig-r16,
+    LoggedPeriodicalReportConfig-r16,
+    Sensor-NameList-r16,
+    PLMN-IdentityList2-r16,
+    AreaConfiguration-r16,
+    maxNrofSL-MeasId-r16,
+    maxNrofFreqSL-r16,
+    maxNrofCLI-RSSI-Resources-r16,
+    maxNrofCLI-SRS-Resources-r16,
+    RSSI-ResourceId-r16,
+    SRS-ResourceId
+FROM NR-RRC-Definitions;
+
+-- NR-UE-VARIABLES-STOP	
+-- TAG-VARCONDITIONALRECONFIG-START
+
+VarConditionalReconfig ::=     SEQUENCE {
+    condReconfigList               CondReconfigToAddModList-r16        OPTIONAL
+}
+
+
+-- TAG-VARCONDITIONALRECONFIG-STOP
+-- TAG-VARCONNESTFAILREPORT-START
+
+VarConnEstFailReport-r16 ::= SEQUENCE {
+    connEstFailReport-r16        ConnEstFailReport-r16,
+    plmn-Identity-r16            PLMN-Identity
+}
+
+-- TAG-VARCONNESTFAILREPORT-STOP
+-- TAG-VARLOGMEASCONFIG-START
+
+VarLogMeasConfig-r16-IEs ::= SEQUENCE {
+    areaConfiguration-r16        AreaConfiguration-r16        OPTIONAL,
+    bt-NameList-r16              BT-NameList-r16              OPTIONAL,
+    wlan-NameList-r16            WLAN-NameList-r16            OPTIONAL,
+    sensor-NameList-r16          Sensor-NameList-r16          OPTIONAL,
+    loggingDuration-r16          LoggingDuration-r16,
+    reportType                   CHOICE {
+        periodical                   LoggedPeriodicalReportConfig-r16,
+        eventTriggered               LoggedEventTriggerConfig-r16
+    }
+}
+-- TAG-VARLOGMEASCONFIG-STOP
+-- TAG-VARLOGMEASREPORT-START
+
+VarLogMeasReport-r16 ::=     SEQUENCE {
+    absoluteTimeInfo-r16         AbsoluteTimeInfo-r16,
+    traceReference-r16           TraceReference-r16,
+    traceRecordingSessionRef-r16 OCTET STRING (SIZE (2)),
+    tce-Id-r16                   OCTET STRING (SIZE (1)),
+    logMeasInfoList-r16          LogMeasInfoList-r16,
+    plmn-IdentityList-r16        PLMN-IdentityList2-r16
+}
+
+-- TAG-VARLOGMEASREPORT-STOP
+-- TAG-VARMEASCONFIG-START
+
+VarMeasConfig ::=                   SEQUENCE {
+    -- Measurement identities
+    measIdList                          MeasIdToAddModList                  OPTIONAL,
+    -- Measurement objects
+    measObjectList                      MeasObjectToAddModList              OPTIONAL,
+    -- Reporting configurations
+    reportConfigList                    ReportConfigToAddModList            OPTIONAL,
+    -- Other parameters
+    quantityConfig                      QuantityConfig                      OPTIONAL,
+    s-MeasureConfig                         CHOICE {
+        ssb-RSRP                                RSRP-Range,
+        csi-RSRP                                RSRP-Range
+    }                                                                       OPTIONAL
+
+}
+
+-- TAG-VARMEASCONFIG-STOP
+-- TAG-VARMEASCONFIGSL-START
+
+VarMeasConfigSL-r16 ::=                        SEQUENCE {
+    -- NR sidelink measurement identities
+    sl-MeasIdList-r16                              SL-MeasIdList-r16                          OPTIONAL,
+    -- NR sidelink measurement objects
+    sl-MeasObjectList-r16                          SL-MeasObjectList-r16                      OPTIONAL,
+    -- NR sidelink reporting configurations
+    sl-reportConfigList-r16                        SL-ReportConfigList-r16                    OPTIONAL,
+    -- Other parameters
+    sl-QuantityConfig-r16                          SL-QuantityConfig-r16                      OPTIONAL
+}
+
+-- TAG-VARMEASCONFIGSL-STOP
+-- TAG-VARMEASIDLECONFIG-START
+
+VarMeasIdleConfig-r16 ::=     SEQUENCE {
+    measIdleCarrierListNR-r16     SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierNR-r16                  OPTIONAL,
+    measIdleCarrierListEUTRA-r16  SEQUENCE (SIZE (1..maxFreqIdle-r16)) OF MeasIdleCarrierEUTRA-r16               OPTIONAL,
+    measIdleDuration-r16          ENUMERATED {sec10, sec30, sec60, sec120, sec180, sec240, sec300, spare},
+    validityAreaList-r16          ValidityAreaList-r16                                                           OPTIONAL
+}
+
+-- TAG-VARMEASIDLECONFIG-STOP
+-- TAG-VARMEASIDLEREPORT-START
+
+VarMeasIdleReport-r16 ::=    SEQUENCE {
+    measReportIdleNR-r16         MeasResultIdleNR-r16                     OPTIONAL,
+    measReportIdleEUTRA-r16      MeasResultIdleEUTRA-r16                  OPTIONAL
+}
+
+-- TAG-VARMEASIDLEREPORT-STOP
+-- TAG-VARMEASREPORTLIST-START
+
+VarMeasReportList ::=               SEQUENCE (SIZE (1..maxNrofMeasId)) OF VarMeasReport
+
+VarMeasReport ::=                   SEQUENCE {
+    -- List of measurement that have been triggered
+    measId                              MeasId,
+    cellsTriggeredList                  CellsTriggeredList              OPTIONAL,
+    numberOfReportsSent                 INTEGER,
+    cli-TriggeredList-r16               CLI-TriggeredList-r16           OPTIONAL,
+    tx-PoolMeasToAddModListNR-r16       Tx-PoolMeasList-r16             OPTIONAL
+}
+
+CellsTriggeredList ::=              SEQUENCE (SIZE (1..maxNrofCellMeas)) OF CHOICE {
+    physCellId                          PhysCellId,
+    physCellIdEUTRA                     EUTRA-PhysCellId,
+    physCellIdUTRA-FDD-r16              PhysCellIdUTRA-FDD-r16
+    }
+
+CLI-TriggeredList-r16 ::=           CHOICE {
+    srs-RSRP-TriggeredList-r16          SRS-RSRP-TriggeredList-r16,
+    cli-RSSI-TriggeredList-r16          CLI-RSSI-TriggeredList-r16
+    }
+
+SRS-RSRP-TriggeredList-r16 ::=      SEQUENCE (SIZE (1.. maxNrofCLI-SRS-Resources-r16)) OF SRS-ResourceId
+
+CLI-RSSI-TriggeredList-r16 ::=      SEQUENCE (SIZE (1.. maxNrofCLI-RSSI-Resources-r16)) OF RSSI-ResourceId-r16
+
+-- TAG-VARMEASREPORTLIST-STOP
+-- TAG-VARMEASREPORTLISTSL-START
+
+VarMeasReportListSL-r16 ::=               SEQUENCE (SIZE (1..maxNrofSL-MeasId-r16)) OF VarMeasReportSL-r16
+
+VarMeasReportSL-r16 ::=                   SEQUENCE {
+    -- List of NR sidelink measurement that have been triggered
+    sl-MeasId-r16                             SL-MeasId-r16,
+    sl-FrequencyTriggeredList-r16             SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF ARFCN-ValueNR              OPTIONAL,
+    sl-NumberOfReportsSent-r16                INTEGER
+}
+
+-- TAG-VARMEASREPORTLISTSL-STOP
+-- TAG-VARMOBILITYHISTORYREPORT-START
+
+VarMobilityHistoryReport-r16 ::= VisitedCellInfoList-r16
+
+-- TAG-VARMOBILITYHISTORYREPORT-STOP
+-- TAG-VARPENDINGRNA-UPDATE-START
+
+VarPendingRNA-Update ::=                    SEQUENCE {
+    pendingRNA-Update                   BOOLEAN                             OPTIONAL
+}
+
+-- TAG-VARPENDINGRNA-UPDATE-STOP
+-- TAG-VARRA-REPORT-START
+
+VarRA-Report-r16 ::=      SEQUENCE {
+    ra-ReportList-r16         RA-ReportList-r16,
+    plmn-IdentityList-r16     PLMN-IdentityList-r16
+}
+
+PLMN-IdentityList-r16 ::= SEQUENCE (SIZE (1..maxPLMN)) OF PLMN-Identity
+
+-- TAG-VARRA-REPORT-STOP
+-- TAG-VARRESUMEMAC-INPUT-START
+
+VarResumeMAC-Input  ::=     SEQUENCE {
+    sourcePhysCellId                        PhysCellId,
+    targetCellIdentity                      CellIdentity,
+    source-c-RNTI                           RNTI-Value
+
+}
+
+-- TAG-VARRESUMEMAC-INPUT-STOP
+-- TAG-VARRLF-REPORT-START
+
+VarRLF-Report-r16 ::=    SEQUENCE {
+    rlf-Report-r16           RLF-Report-r16,
+    plmn-IdentityList-r16    PLMN-IdentityList2-r16
+}
+
+-- TAG-VARRLF-REPORT-STOP
+-- TAG-VARSHORTMAC-INPUT-START
+
+VarShortMAC-Input   ::=                 SEQUENCE {
+    sourcePhysCellId                        PhysCellId,
+    targetCellIdentity                      CellIdentity,
+    source-c-RNTI                           RNTI-Value
+}
+
+-- TAG-VARSHORTMAC-INPUT-STOP
+
+END
+
+-- TAG-NR-SIDELINK-PRECONF-DEFINITIONS-START
+
+NR-Sidelink-Preconf DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS
+	SL-CBR-CommonTxConfigList-r16,
+	SL-FreqConfigCommon-r16,
+	SL-RadioBearerConfig-r16,
+	SL-RLC-BearerConfig-r16,
+	SL-EUTRA-AnchorCarrierFreqList-r16,
+	SL-NR-AnchorCarrierFreqList-r16,
+	SL-MeasConfigCommon-r16,
+	SL-UE-SelectedConfig-r16,
+	TDD-UL-DL-ConfigCommon,
+	maxNrofFreqSL-r16,
+	maxNrofSLRB-r16,
+	maxSL-LCID-r16
+FROM NR-RRC-Definitions;
+
+-- TAG-NR-SIDELINK-PRECONF-DEFINITIONS-STOP
+
+-- TAG-SL-PRECONFIGURATIONNR-START
+
+SL-PreconfigurationNR-r16 ::=             SEQUENCE {
+    sidelinkPreconfigNR-r16                   SidelinkPreconfigNR-r16,
+    ...
+}
+
+SidelinkPreconfigNR-r16 ::=                 SEQUENCE {
+    sl-PreconfigFreqInfoList-r16                SEQUENCE (SIZE (1..maxNrofFreqSL-r16)) OF SL-FreqConfigCommon-r16     OPTIONAL,
+    sl-PreconfigNR-AnchorCarrierFreqList-r16    SL-NR-AnchorCarrierFreqList-r16                                       OPTIONAL,
+    sl-PreconfigEUTRA-AnchorCarrierFreqList-r16 SL-EUTRA-AnchorCarrierFreqList-r16                                    OPTIONAL,
+    sl-RadioBearerPreConfigList-r16             SEQUENCE (SIZE (1..maxNrofSLRB-r16)) OF SL-RadioBearerConfig-r16      OPTIONAL,
+    sl-RLC-BearerPreConfigList-r16              SEQUENCE (SIZE (1..maxSL-LCID-r16)) OF SL-RLC-BearerConfig-r16        OPTIONAL,
+    sl-MeasPreConfig-r16                        SL-MeasConfigCommon-r16                                               OPTIONAL,
+    sl-OffsetDFN-r16                            INTEGER (1..1000)                                                     OPTIONAL,
+    t400-r16                                    ENUMERATED{ms100, ms200, ms300, ms400, ms600, ms1000, ms1500, ms2000} OPTIONAL,
+    sl-MaxNumConsecutiveDTX-r16                 ENUMERATED {n1, n2, n3, n4, n6, n8, n16, n32}	                      OPTIONAL,
+    sl-SSB-PriorityNR-r16                       INTEGER (1..8)                                                        OPTIONAL,
+    sl-PreconfigGeneral-r16                     SL-PreconfigGeneral-r16                                               OPTIONAL,
+    sl-UE-SelectedPreConfig-r16                 SL-UE-SelectedConfig-r16                                              OPTIONAL,
+    sl-CSI-Acquisition-r16                      ENUMERATED {enabled}                                                  OPTIONAL,
+    sl-RoHC-Profiles-r16                        SL-RoHC-Profiles-r16                                                  OPTIONAL,
+    sl-MaxCID-r16                               INTEGER (1..16383)                                                    DEFAULT 15,
+    ...
+}
+
+SL-PreconfigGeneral-r16 ::=                 SEQUENCE {
+    sl-TDD-Configuration-r16                    TDD-UL-DL-ConfigCommon                                                OPTIONAL,
+    reservedBits-r16                            BIT STRING (SIZE (2))                                                 OPTIONAL,
+    ...
+}
+
+SL-RoHC-Profiles-r16 ::=              SEQUENCE {
+    profile0x0001-r16                     BOOLEAN,
+    profile0x0002-r16                     BOOLEAN,
+    profile0x0003-r16                     BOOLEAN,
+    profile0x0004-r16                     BOOLEAN,
+    profile0x0006-r16                     BOOLEAN,
+    profile0x0101-r16                     BOOLEAN,
+    profile0x0102-r16                     BOOLEAN,
+    profile0x0103-r16                     BOOLEAN,
+    profile0x0104-r16                     BOOLEAN
+}
+
+-- TAG-SL-PRECONFIGURATIONNR-STOP
+
+END
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-START									  
+NR-InterNodeDefinitions DEFINITIONS AUTOMATIC TAGS ::=
+ 
+BEGIN
+
+IMPORTS
+    ARFCN-ValueNR,
+    ARFCN-ValueEUTRA,
+    CellIdentity,
+    CGI-InfoEUTRA,
+    CGI-InfoNR,
+    CSI-RS-Index,
+    CSI-RS-CellMobility,
+    DRX-Config,
+    EUTRA-PhysCellId,
+    FeatureSetDownlinkPerCC-Id,
+    FeatureSetUplinkPerCC-Id,
+    FreqBandIndicatorNR,
+    GapConfig,
+    maxBandComb,
+    maxBands,
+    maxCellSFTD,
+    maxFeatureSetsPerBand,
+    maxFreqIDC-MRDC,
+    maxNrofCombIDC,
+    maxNrofPhysicalResourceBlocks,
+    maxNrofSCells,
+    maxNrofServingCells,
+    maxNrofServingCells-1,
+    maxNrofServingCellsEUTRA,
+    maxNrofIndexesToReport,
+    maxSimultaneousBands,
+    MeasQuantityResults,
+    MeasResultCellListSFTD-EUTRA,
+    MeasResultCellListSFTD-NR,
+    MeasResultList2NR,
+    MeasResultSCG-Failure,
+    MeasResultServFreqListEUTRA-SCG,
+    NeedForGapsInfoNR-r16,
+    OverheatingAssistance,
+    P-Max,
+    PhysCellId,
+    RadioBearerConfig,
+    RAN-NotificationAreaInfo,
+    RRCReconfiguration,
+    ServCellIndex,
+    SetupRelease,
+    SSB-Index,
+    SSB-MTC,
+    SSB-ToMeasure,
+    SS-RSSI-Measurement,
+    ShortMAC-I,
+    SubcarrierSpacing,
+    UEAssistanceInformation,
+    UE-CapabilityRAT-ContainerList,
+    maxNrofCLI-RSSI-Resources-r16,
+    maxNrofCLI-SRS-Resources-r16,
+    RSSI-ResourceId-r16,
+    SidelinkUEInformationNR-r16,
+    SRS-ResourceId
+FROM NR-RRC-Definitions;
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-STOP						
+-- TAG-HANDOVER-COMMAND-START
+
+HandoverCommand ::=                 SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            handoverCommand                     HandoverCommand-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+HandoverCommand-IEs ::=             SEQUENCE {
+    handoverCommandMessage              OCTET STRING (CONTAINING RRCReconfiguration),
+    nonCriticalExtension                SEQUENCE {}                                        OPTIONAL
+}
+
+-- TAG-HANDOVER-COMMAND-STOP
+-- TAG-HANDOVER-PREPARATION-INFORMATION-START
+
+HandoverPreparationInformation ::=      SEQUENCE {
+    criticalExtensions                      CHOICE {
+        c1                                      CHOICE{
+            handoverPreparationInformation          HandoverPreparationInformation-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+HandoverPreparationInformation-IEs ::=  SEQUENCE {
+    ue-CapabilityRAT-List                   UE-CapabilityRAT-ContainerList,
+    sourceConfig                            AS-Config                                       OPTIONAL, -- Cond HO
+    rrm-Config                              RRM-Config                                      OPTIONAL,
+    as-Context                              AS-Context                                      OPTIONAL,
+    nonCriticalExtension                    SEQUENCE {}                                     OPTIONAL
+}
+
+AS-Config ::=                           SEQUENCE {
+    rrcReconfiguration                      OCTET STRING (CONTAINING RRCReconfiguration),
+    ...,
+    [[
+    sourceRB-SN-Config                      OCTET STRING (CONTAINING RadioBearerConfig)     OPTIONAL,
+    sourceSCG-NR-Config                     OCTET STRING (CONTAINING RRCReconfiguration)    OPTIONAL,
+    sourceSCG-EUTRA-Config                  OCTET STRING                                    OPTIONAL
+    ]],
+    [[
+    sourceSCG-Configured                    ENUMERATED {true}                               OPTIONAL
+    ]]
+
+}
+
+AS-Context ::=                          SEQUENCE {
+    reestablishmentInfo                     ReestablishmentInfo                                 OPTIONAL,
+    configRestrictInfo                      ConfigRestrictInfoSCG                               OPTIONAL,
+    ...,
+    [[  ran-NotificationAreaInfo            RAN-NotificationAreaInfo                            OPTIONAL
+    ]],
+    [[  ueAssistanceInformation             OCTET STRING (CONTAINING UEAssistanceInformation)   OPTIONAL   -- Cond HO2
+    ]],
+    [[
+    selectedBandCombinationSN               BandCombinationInfoSN                               OPTIONAL
+    ]],
+    [[
+    configRestrictInfoDAPS-r16              ConfigRestrictInfoDAPS-r16                          OPTIONAL,
+    sidelinkUEInformationNR-r16             OCTET STRING                                        OPTIONAL,
+    sidelinkUEInformationEUTRA-r16          OCTET STRING                                        OPTIONAL,
+    ueAssistanceInformationEUTRA-r16        OCTET STRING                                        OPTIONAL,
+    ueAssistanceInformationSCG-r16          OCTET STRING (CONTAINING UEAssistanceInformation)   OPTIONAL,   -- Cond HO2
+    needForGapsInfoNR-r16                   NeedForGapsInfoNR-r16                               OPTIONAL
+    ]],
+    [[
+    configRestrictInfoDAPS-v1640            ConfigRestrictInfoDAPS-v1640                        OPTIONAL
+    ]]
+}
+
+ConfigRestrictInfoDAPS-r16 ::=          SEQUENCE {
+    powerCoordination-r16                   SEQUENCE {
+        p-DAPS-Source-r16                       P-Max,
+        p-DAPS-Target-r16                       P-Max,
+        uplinkPowerSharingDAPS-Mode-r16          ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic }
+    }                                                                                                       OPTIONAL
+}
+
+ConfigRestrictInfoDAPS-v1640 ::=    SEQUENCE {
+    sourceFeatureSetPerDownlinkCC-r16   FeatureSetDownlinkPerCC-Id,
+    sourceFeatureSetPerUplinkCC-r16     FeatureSetUplinkPerCC-Id
+}
+
+ReestablishmentInfo ::=             SEQUENCE {
+    sourcePhysCellId                        PhysCellId,
+    targetCellShortMAC-I                    ShortMAC-I,
+    additionalReestabInfoList               ReestabNCellInfoList                            OPTIONAL
+}
+
+ReestabNCellInfoList ::=             SEQUENCE ( SIZE (1..maxCellPrep) ) OF ReestabNCellInfo
+
+ReestabNCellInfo::= SEQUENCE{
+    cellIdentity                            CellIdentity,
+    key-gNodeB-Star                         BIT STRING (SIZE (256)),
+    shortMAC-I                              ShortMAC-I
+}
+
+RRM-Config ::=              SEQUENCE {
+    ue-InactiveTime             ENUMERATED {
+                                    s1, s2, s3, s5, s7, s10, s15, s20,
+                                    s25, s30, s40, s50, min1, min1s20, min1s40,
+                                    min2, min2s30, min3, min3s30, min4, min5, min6,
+                                    min7, min8, min9, min10, min12, min14, min17, min20,
+                                    min24, min28, min33, min38, min44, min50, hr1,
+                                    hr1min30, hr2, hr2min30, hr3, hr3min30, hr4, hr5, hr6,
+                                    hr8, hr10, hr13, hr16, hr20, day1, day1hr12, day2,
+                                    day2hr12, day3, day4, day5, day7, day10, day14, day19,
+                                    day24, day30, dayMoreThan30}                            OPTIONAL,
+    candidateCellInfoList       MeasResultList2NR                                           OPTIONAL,
+    ...,
+    [[
+    candidateCellInfoListSN-EUTRA      MeasResultServFreqListEUTRA-SCG                      OPTIONAL
+    ]]
+}
+
+-- TAG-HANDOVER-PREPARATION-INFORMATION-STOP
+-- TAG-CG-CONFIG-START
+
+CG-Config ::=                   SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            cg-Config                           CG-Config-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+CG-Config-IEs ::=                   SEQUENCE {
+    scg-CellGroupConfig                 OCTET STRING (CONTAINING RRCReconfiguration)    OPTIONAL,
+    scg-RB-Config                       OCTET STRING (CONTAINING RadioBearerConfig)     OPTIONAL,
+    configRestrictModReq                ConfigRestrictModReqSCG                         OPTIONAL,
+    drx-InfoSCG                         DRX-Info                                        OPTIONAL,
+    candidateCellInfoListSN             OCTET STRING (CONTAINING MeasResultList2NR)     OPTIONAL,
+    measConfigSN                        MeasConfigSN                                    OPTIONAL,
+    selectedBandCombination             BandCombinationInfoSN                           OPTIONAL,
+    fr-InfoListSCG                      FR-InfoList                                     OPTIONAL,
+    candidateServingFreqListNR          CandidateServingFreqListNR                      OPTIONAL,
+    nonCriticalExtension                CG-Config-v1540-IEs                             OPTIONAL
+}
+
+CG-Config-v1540-IEs ::=             SEQUENCE {
+    pSCellFrequency                     ARFCN-ValueNR                                   OPTIONAL,
+    reportCGI-RequestNR                 SEQUENCE {
+        requestedCellInfo                   SEQUENCE {
+            ssbFrequency                        ARFCN-ValueNR,
+            cellForWhichToReportCGI             PhysCellId
+        }                                                                               OPTIONAL
+    }                                                                                   OPTIONAL,
+    ph-InfoSCG                          PH-TypeListSCG                                  OPTIONAL,
+    nonCriticalExtension                CG-Config-v1560-IEs                             OPTIONAL
+}
+
+CG-Config-v1560-IEs ::=             SEQUENCE {
+    pSCellFrequencyEUTRA                ARFCN-ValueEUTRA                                OPTIONAL,
+    scg-CellGroupConfigEUTRA            OCTET STRING                                    OPTIONAL,
+    candidateCellInfoListSN-EUTRA       OCTET STRING                                    OPTIONAL,
+    candidateServingFreqListEUTRA       CandidateServingFreqListEUTRA                   OPTIONAL,
+    needForGaps                         ENUMERATED {true}                               OPTIONAL,
+    drx-ConfigSCG                       DRX-Config                                      OPTIONAL,
+    reportCGI-RequestEUTRA              SEQUENCE {
+        requestedCellInfoEUTRA          SEQUENCE {
+            eutraFrequency                             ARFCN-ValueEUTRA,
+            cellForWhichToReportCGI-EUTRA              EUTRA-PhysCellId
+        }                                                                               OPTIONAL
+    }                                                                                   OPTIONAL,
+    nonCriticalExtension                CG-Config-v1590-IEs                             OPTIONAL
+}
+
+CG-Config-v1590-IEs ::=             SEQUENCE {
+    scellFrequenciesSN-NR               SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF  ARFCN-ValueNR          OPTIONAL,
+    scellFrequenciesSN-EUTRA            SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF  ARFCN-ValueEUTRA       OPTIONAL,
+    nonCriticalExtension                CG-Config-v1610-IEs                                                    OPTIONAL
+}
+
+CG-Config-v1610-IEs ::=             SEQUENCE {
+    drx-InfoSCG2                        DRX-Info2                                       OPTIONAL,
+    nonCriticalExtension                CG-Config-v1620-IEs                             OPTIONAL
+}
+
+CG-Config-v1620-IEs ::=             SEQUENCE {
+    ueAssistanceInformationSCG-r16      OCTET STRING (CONTAINING UEAssistanceInformation)  OPTIONAL,
+    nonCriticalExtension                CG-Config-v1630-IEs                                OPTIONAL
+}
+
+CG-Config-v1630-IEs ::=             SEQUENCE {
+    selectedToffset-r16                 T-Offset-r16                                       OPTIONAL,
+    nonCriticalExtension                CG-Config-v1640-IEs                                OPTIONAL
+}
+
+CG-Config-v1640-IEs ::=             SEQUENCE {
+    servCellInfoListSCG-NR-r16          ServCellInfoListSCG-NR-r16                      OPTIONAL,
+    servCellInfoListSCG-EUTRA-r16       ServCellInfoListSCG-EUTRA-r16                   OPTIONAL,
+    nonCriticalExtension            SEQUENCE {}                                         OPTIONAL
+}
+
+ServCellInfoListSCG-NR-r16 ::=      SEQUENCE (SIZE (1.. maxNrofServingCells)) OF  ServCellInfoXCG-NR-r16
+
+ServCellInfoXCG-NR-r16 ::=          SEQUENCE {
+    dl-FreqInfo-NR-r16                  FrequencyConfig-NR-r16                          OPTIONAL,
+    ul-FreqInfo-NR-r16                  FrequencyConfig-NR-r16                          OPTIONAL, -- Cond FDD
+    ...
+}
+
+FrequencyConfig-NR-r16 ::=          SEQUENCE {
+    freqBandIndicatorNR-r16             FreqBandIndicatorNR,
+    carrierCenterFreq-NR-r16            ARFCN-ValueNR,
+    carrierBandwidth-NR-r16             INTEGER (1..maxNrofPhysicalResourceBlocks),
+    subcarrierSpacing-NR-r16            SubcarrierSpacing
+}
+
+ServCellInfoListSCG-EUTRA-r16 ::=   SEQUENCE (SIZE (1.. maxNrofServingCellsEUTRA)) OF ServCellInfoXCG-EUTRA-r16
+
+ServCellInfoXCG-EUTRA-r16 ::=       SEQUENCE {
+    dl-CarrierFreq-EUTRA-r16            ARFCN-ValueEUTRA                                OPTIONAL,
+    ul-CarrierFreq-EUTRA-r16            ARFCN-ValueEUTRA                                OPTIONAL, -- Cond FDD
+    transmissionBandwidth-EUTRA-r16     TransmissionBandwidth-EUTRA-r16                 OPTIONAL,
+    ...
+}
+
+TransmissionBandwidth-EUTRA-r16 ::= ENUMERATED {rb6, rb15, rb25, rb50, rb75, rb100}
+
+PH-TypeListSCG ::=                  SEQUENCE (SIZE (1..maxNrofServingCells)) OF PH-InfoSCG
+
+PH-InfoSCG ::=                      SEQUENCE {
+    servCellIndex                       ServCellIndex,
+    ph-Uplink                           PH-UplinkCarrierSCG,
+    ph-SupplementaryUplink              PH-UplinkCarrierSCG                             OPTIONAL,
+    ...
+}
+
+PH-UplinkCarrierSCG ::=             SEQUENCE{
+    ph-Type1or3                         ENUMERATED {type1, type3},
+    ...
+}
+
+MeasConfigSN ::=                    SEQUENCE {
+    measuredFrequenciesSN               SEQUENCE (SIZE (1..maxMeasFreqsSN)) OF NR-FreqInfo  OPTIONAL,
+    ...
+}
+
+NR-FreqInfo ::=                     SEQUENCE {
+    measuredFrequency                   ARFCN-ValueNR                                       OPTIONAL,
+    ...
+}
+
+ConfigRestrictModReqSCG ::=         SEQUENCE {
+    requestedBC-MRDC                    BandCombinationInfoSN                               OPTIONAL,
+    requestedP-MaxFR1                   P-Max                                               OPTIONAL,
+    ...,
+    [[
+    requestedPDCCH-BlindDetectionSCG    INTEGER (1..15)                                     OPTIONAL,
+    requestedP-MaxEUTRA                 P-Max                                               OPTIONAL
+    ]],
+    [[
+    requestedP-MaxFR2-r16               P-Max                                               OPTIONAL,
+    requestedMaxInterFreqMeasIdSCG-r16  INTEGER(1..maxMeasIdentitiesMN)                     OPTIONAL,
+    requestedMaxIntraFreqMeasIdSCG-r16  INTEGER(1..maxMeasIdentitiesMN)                     OPTIONAL,
+    requestedToffset-r16                T-Offset-r16                                        OPTIONAL
+    ]]
+}
+
+BandCombinationIndex ::= INTEGER (1..maxBandComb)
+
+BandCombinationInfoSN ::=           SEQUENCE {
+    bandCombinationIndex                BandCombinationIndex,
+    requestedFeatureSets                FeatureSetEntryIndex
+}
+
+FR-InfoList ::= SEQUENCE (SIZE (1..maxNrofServingCells-1)) OF FR-Info
+
+FR-Info ::= SEQUENCE {
+    servCellIndex       ServCellIndex,
+    fr-Type             ENUMERATED {fr1, fr2}
+}
+
+CandidateServingFreqListNR ::= SEQUENCE (SIZE (1.. maxFreqIDC-MRDC)) OF ARFCN-ValueNR
+
+CandidateServingFreqListEUTRA ::= SEQUENCE (SIZE (1.. maxFreqIDC-MRDC)) OF ARFCN-ValueEUTRA
+
+T-Offset-r16 ::= ENUMERATED {ms0dot5, ms0dot75, ms1, ms1dot5, ms2, ms2dot5, ms3, spare1}
+
+-- TAG-CG-CONFIG-STOP
+-- TAG-CG-CONFIG-INFO-START
+
+CG-ConfigInfo ::=               SEQUENCE {
+    criticalExtensions              CHOICE {
+        c1                              CHOICE{
+            cg-ConfigInfo               CG-ConfigInfo-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+CG-ConfigInfo-IEs ::=           SEQUENCE {
+    ue-CapabilityInfo               OCTET STRING (CONTAINING UE-CapabilityRAT-ContainerList)          OPTIONAL,-- Cond SN-AddMod
+    candidateCellInfoListMN         MeasResultList2NR                                                 OPTIONAL,
+    candidateCellInfoListSN         OCTET STRING (CONTAINING MeasResultList2NR)                       OPTIONAL,
+    measResultCellListSFTD-NR       MeasResultCellListSFTD-NR                                         OPTIONAL,
+    scgFailureInfo                  SEQUENCE {
+        failureType                     ENUMERATED { t310-Expiry, randomAccessProblem,
+                                                     rlc-MaxNumRetx, synchReconfigFailure-SCG,
+                                                     scg-reconfigFailure,
+                                                     srb3-IntegrityFailure},
+        measResultSCG                   OCTET STRING (CONTAINING MeasResultSCG-Failure)
+    }                                                                                                 OPTIONAL,
+    configRestrictInfo              ConfigRestrictInfoSCG                                             OPTIONAL,
+    drx-InfoMCG                     DRX-Info                                                          OPTIONAL,
+    measConfigMN                    MeasConfigMN                                                      OPTIONAL,
+    sourceConfigSCG                 OCTET STRING (CONTAINING RRCReconfiguration)                      OPTIONAL,
+    scg-RB-Config                   OCTET STRING (CONTAINING RadioBearerConfig)                       OPTIONAL,
+    mcg-RB-Config                   OCTET STRING (CONTAINING RadioBearerConfig)                       OPTIONAL,
+    mrdc-AssistanceInfo             MRDC-AssistanceInfo                                               OPTIONAL,
+    nonCriticalExtension            CG-ConfigInfo-v1540-IEs                                           OPTIONAL
+}
+
+CG-ConfigInfo-v1540-IEs ::=     SEQUENCE {
+    ph-InfoMCG                      PH-TypeListMCG                                                    OPTIONAL,
+    measResultReportCGI             SEQUENCE {
+        ssbFrequency                    ARFCN-ValueNR,
+        cellForWhichToReportCGI         PhysCellId,
+        cgi-Info                        CGI-InfoNR
+    }                                                                                                 OPTIONAL,
+    nonCriticalExtension            CG-ConfigInfo-v1560-IEs                                           OPTIONAL
+}
+
+CG-ConfigInfo-v1560-IEs ::=	 SEQUENCE {
+    candidateCellInfoListMN-EUTRA       OCTET STRING                                                  OPTIONAL,
+    candidateCellInfoListSN-EUTRA       OCTET STRING                                                  OPTIONAL,
+    sourceConfigSCG-EUTRA               OCTET STRING                                                  OPTIONAL,
+    scgFailureInfoEUTRA                 SEQUENCE {
+        failureTypeEUTRA                    ENUMERATED { t313-Expiry, randomAccessProblem,
+                                                    rlc-MaxNumRetx, scg-ChangeFailure},
+        measResultSCG-EUTRA                 OCTET STRING
+    }                                                                                                 OPTIONAL,
+    drx-ConfigMCG                       DRX-Config                                                    OPTIONAL,
+    measResultReportCGI-EUTRA               SEQUENCE {
+        eutraFrequency                      ARFCN-ValueEUTRA,
+        cellForWhichToReportCGI-EUTRA           EUTRA-PhysCellId,
+        cgi-InfoEUTRA                           CGI-InfoEUTRA
+    }                                                                                                 OPTIONAL,
+    measResultCellListSFTD-EUTRA        MeasResultCellListSFTD-EUTRA                                  OPTIONAL,
+    fr-InfoListMCG                      FR-InfoList                                                   OPTIONAL,
+    nonCriticalExtension                CG-ConfigInfo-v1570-IEs                                       OPTIONAL
+}
+
+CG-ConfigInfo-v1570-IEs ::=  SEQUENCE {
+    sftdFrequencyList-NR                SFTD-FrequencyList-NR                                         OPTIONAL,
+    sftdFrequencyList-EUTRA             SFTD-FrequencyList-EUTRA                                      OPTIONAL,
+    nonCriticalExtension                CG-ConfigInfo-v1590-IEs                                       OPTIONAL
+}
+
+CG-ConfigInfo-v1590-IEs ::=  SEQUENCE {
+    servFrequenciesMN-NR            SEQUENCE (SIZE (1.. maxNrofServingCells-1)) OF  ARFCN-ValueNR     OPTIONAL,
+    nonCriticalExtension            CG-ConfigInfo-v1610-IEs                                           OPTIONAL
+}
+
+CG-ConfigInfo-v1610-IEs ::=  SEQUENCE {
+    drx-InfoMCG2                 DRX-Info2                                                            OPTIONAL,
+    alignedDRX-Indication        ENUMERATED {true}                                                    OPTIONAL,
+    scgFailureInfo-r16                  SEQUENCE {
+        failureType-r16                     ENUMERATED { scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+                                                         t312-Expiry-r16, bh-RLF-r16,
+                                                         spare4, spare3, spare2, spare1},
+        measResultSCG-r16                   OCTET STRING (CONTAINING MeasResultSCG-Failure)
+    }                                                                                                 OPTIONAL,
+    scgFailureInfoEUTRA-r16                 SEQUENCE {
+        failureTypeEUTRA-r16                    ENUMERATED { scg-lbtFailure-r16, beamFailureRecoveryFailure-r16,
+                                                         t312-Expiry-r16, spare5,
+                                                                     spare4, spare3, spare2, spare1},
+        measResultSCG-EUTRA-r16                 OCTET STRING
+    }                                                                                                 OPTIONAL,
+    sidelinkUEInformationNR-r16      OCTET STRING (CONTAINING SidelinkUEInformationNR-r16)            OPTIONAL,
+    sidelinkUEInformationEUTRA-r16   OCTET STRING                                                     OPTIONAL,
+    nonCriticalExtension             CG-ConfigInfo-v1620-IEs                                          OPTIONAL
+}
+
+CG-ConfigInfo-v1620-IEs ::=             SEQUENCE {
+    ueAssistanceInformationSourceSCG-r16    OCTET STRING (CONTAINING UEAssistanceInformation)         OPTIONAL,
+    nonCriticalExtension                    CG-ConfigInfo-v1640-IEs                                   OPTIONAL
+}
+
+CG-ConfigInfo-v1640-IEs ::=             SEQUENCE {
+	servCellInfoListMCG-NR-r16              ServCellInfoListMCG-NR-r16                   OPTIONAL,
+	servCellInfoListMCG-EUTRA-r16           ServCellInfoListMCG-EUTRA-r16                OPTIONAL,
+	nonCriticalExtension                    SEQUENCE {}                                  OPTIONAL
+}
+
+ServCellInfoListMCG-NR-r16 ::=          SEQUENCE (SIZE (1.. maxNrofServingCells)) OF  ServCellInfoXCG-NR-r16
+
+ServCellInfoListMCG-EUTRA-r16 ::=       SEQUENCE (SIZE (1.. maxNrofServingCellsEUTRA)) OF ServCellInfoXCG-EUTRA-r16
+
+SFTD-FrequencyList-NR ::=               SEQUENCE (SIZE (1..maxCellSFTD)) OF ARFCN-ValueNR
+
+SFTD-FrequencyList-EUTRA ::=            SEQUENCE (SIZE (1..maxCellSFTD)) OF ARFCN-ValueEUTRA
+
+ConfigRestrictInfoSCG ::=       SEQUENCE {
+    allowedBC-ListMRDC              BandCombinationInfoList                                           OPTIONAL,
+    powerCoordination-FR1               SEQUENCE {
+        p-maxNR-FR1                     P-Max                                                         OPTIONAL,
+        p-maxEUTRA                      P-Max                                                         OPTIONAL,
+        p-maxUE-FR1                     P-Max                                                         OPTIONAL
+    }                                                                                                 OPTIONAL,
+    servCellIndexRangeSCG           SEQUENCE {
+        lowBound                        ServCellIndex,
+        upBound                         ServCellIndex
+    }                                                                                                 OPTIONAL,   -- Cond SN-AddMod
+    maxMeasFreqsSCG                     INTEGER(1..maxMeasFreqsMN)                                    OPTIONAL,
+    dummy                               INTEGER(1..maxMeasIdentitiesMN)                               OPTIONAL,
+    ...,
+    [[
+    selectedBandEntriesMNList        SEQUENCE (SIZE (1..maxBandComb)) OF SelectedBandEntriesMN        OPTIONAL,
+    pdcch-BlindDetectionSCG          INTEGER (1..15)                                                  OPTIONAL,
+    maxNumberROHC-ContextSessionsSN  INTEGER(0.. 16384)                                               OPTIONAL
+    ]],
+    [[
+    maxIntraFreqMeasIdentitiesSCG     INTEGER(1..maxMeasIdentitiesMN)                                 OPTIONAL,
+    maxInterFreqMeasIdentitiesSCG     INTEGER(1..maxMeasIdentitiesMN)                                 OPTIONAL
+    ]],
+    [[
+    p-maxNR-FR1-MCG-r16               P-Max                                                           OPTIONAL,
+    powerCoordination-FR2-r16         SEQUENCE {
+        p-maxNR-FR2-MCG-r16                P-Max                                                      OPTIONAL,
+        p-maxNR-FR2-SCG-r16                P-Max                                                      OPTIONAL,
+        p-maxUE-FR2-r16                    P-Max                                                      OPTIONAL
+    }                                                                                                 OPTIONAL,
+    nrdc-PC-mode-FR1-r16    ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}                OPTIONAL,
+    nrdc-PC-mode-FR2-r16    ENUMERATED {semi-static-mode1, semi-static-mode2, dynamic}                OPTIONAL,
+    maxMeasSRS-ResourceSCG-r16       INTEGER(0..maxNrofCLI-SRS-Resources-r16)                         OPTIONAL,
+    maxMeasCLI-ResourceSCG-r16       INTEGER(0..maxNrofCLI-RSSI-Resources-r16)                        OPTIONAL,
+    maxNumberEHC-ContextsSN-r16      INTEGER(0..65536)                                                OPTIONAL,
+    allowedReducedConfigForOverheating-r16      OverheatingAssistance                                 OPTIONAL,
+    maxToffset-r16                   T-Offset-r16                                                     OPTIONAL
+    ]]
+}
+
+SelectedBandEntriesMN ::=       SEQUENCE (SIZE (1..maxSimultaneousBands)) OF BandEntryIndex
+
+BandEntryIndex ::=              INTEGER (0.. maxNrofServingCells)
+
+PH-TypeListMCG ::=              SEQUENCE (SIZE (1..maxNrofServingCells)) OF PH-InfoMCG
+
+PH-InfoMCG ::=                  SEQUENCE {
+    servCellIndex                       ServCellIndex,
+    ph-Uplink                           PH-UplinkCarrierMCG,
+    ph-SupplementaryUplink              PH-UplinkCarrierMCG                                           OPTIONAL,
+    ...
+}
+
+PH-UplinkCarrierMCG ::=         SEQUENCE{
+    ph-Type1or3                         ENUMERATED {type1, type3},
+    ...
+}
+
+BandCombinationInfoList ::=     SEQUENCE (SIZE (1..maxBandComb)) OF BandCombinationInfo
+
+BandCombinationInfo ::=         SEQUENCE {
+    bandCombinationIndex            BandCombinationIndex,
+    allowedFeatureSetsList          SEQUENCE (SIZE (1..maxFeatureSetsPerBand)) OF FeatureSetEntryIndex
+}
+
+FeatureSetEntryIndex ::=        INTEGER (1.. maxFeatureSetsPerBand)
+
+DRX-Info ::=                    SEQUENCE {
+    drx-LongCycleStartOffset        CHOICE {
+        ms10                            INTEGER(0..9),
+        ms20                            INTEGER(0..19),
+        ms32                            INTEGER(0..31),
+        ms40                            INTEGER(0..39),
+        ms60                            INTEGER(0..59),
+        ms64                            INTEGER(0..63),
+        ms70                            INTEGER(0..69),
+        ms80                            INTEGER(0..79),
+        ms128                           INTEGER(0..127),
+        ms160                           INTEGER(0..159),
+        ms256                           INTEGER(0..255),
+        ms320                           INTEGER(0..319),
+        ms512                           INTEGER(0..511),
+        ms640                           INTEGER(0..639),
+        ms1024                          INTEGER(0..1023),
+        ms1280                          INTEGER(0..1279),
+        ms2048                          INTEGER(0..2047),
+        ms2560                          INTEGER(0..2559),
+        ms5120                          INTEGER(0..5119),
+        ms10240                         INTEGER(0..10239)
+    },
+    shortDRX                            SEQUENCE {
+        drx-ShortCycle                      ENUMERATED  {
+                                                ms2, ms3, ms4, ms5, ms6, ms7, ms8, ms10, ms14, ms16, ms20, ms30, ms32,
+                                                ms35, ms40, ms64, ms80, ms128, ms160, ms256, ms320, ms512, ms640, spare9,
+                                                spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 },
+        drx-ShortCycleTimer                 INTEGER (1..16)
+    }                                                                                             OPTIONAL
+}
+
+DRX-Info2 ::=          SEQUENCE {
+    drx-onDurationTimer    CHOICE {
+                               subMilliSeconds INTEGER (1..31),
+                               milliSeconds    ENUMERATED {
+                                   ms1, ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60,
+                                   ms80, ms100, ms200, ms300, ms400, ms500, ms600, ms800, ms1000, ms1200,
+                                   ms1600, spare8, spare7, spare6, spare5, spare4, spare3, spare2, spare1 }
+                           }
+}
+
+MeasConfigMN ::= SEQUENCE {
+    measuredFrequenciesMN               SEQUENCE (SIZE (1..maxMeasFreqsMN)) OF NR-FreqInfo        OPTIONAL,
+    measGapConfig                       SetupRelease { GapConfig }                                OPTIONAL,
+    gapPurpose                          ENUMERATED {perUE, perFR1}                                OPTIONAL,
+    ...,
+    [[
+    measGapConfigFR2                    SetupRelease { GapConfig }                                OPTIONAL
+    ]]
+
+}
+
+MRDC-AssistanceInfo ::= SEQUENCE {
+    affectedCarrierFreqCombInfoListMRDC     SEQUENCE (SIZE (1..maxNrofCombIDC)) OF AffectedCarrierFreqCombInfoMRDC,
+    ...,
+    [[
+    overheatingAssistanceSCG-r16            OCTET STRING (CONTAINING OverheatingAssistance)       OPTIONAL
+    ]]
+}
+
+AffectedCarrierFreqCombInfoMRDC ::= SEQUENCE {
+    victimSystemType                    VictimSystemType,
+    interferenceDirectionMRDC           ENUMERATED {eutra-nr, nr, other, utra-nr-other, nr-other, spare3, spare2, spare1},
+    affectedCarrierFreqCombMRDC         SEQUENCE    {
+        affectedCarrierFreqCombEUTRA        AffectedCarrierFreqCombEUTRA                          OPTIONAL,
+        affectedCarrierFreqCombNR           AffectedCarrierFreqCombNR
+    }                                                                                             OPTIONAL
+}
+
+VictimSystemType ::= SEQUENCE {
+    gps                         ENUMERATED {true}               OPTIONAL,
+    glonass                     ENUMERATED {true}               OPTIONAL,
+    bds                         ENUMERATED {true}               OPTIONAL,
+    galileo                     ENUMERATED {true}               OPTIONAL,
+    wlan                        ENUMERATED {true}               OPTIONAL,
+    bluetooth                   ENUMERATED {true}               OPTIONAL
+}
+
+AffectedCarrierFreqCombEUTRA ::= SEQUENCE (SIZE (1..maxNrofServingCellsEUTRA)) OF ARFCN-ValueEUTRA
+
+AffectedCarrierFreqCombNR ::= SEQUENCE (SIZE (1..maxNrofServingCells)) OF ARFCN-ValueNR
+
+-- TAG-CG-CONFIG-INFO-STOP
+-- TAG-MEASUREMENT-TIMING-CONFIGURATION-START
+
+MeasurementTimingConfiguration ::=      SEQUENCE {
+    criticalExtensions                      CHOICE {
+        c1                                      CHOICE{
+            measTimingConf                          MeasurementTimingConfiguration-IEs,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture        SEQUENCE {}
+    }
+}
+
+MeasurementTimingConfiguration-IEs ::=  SEQUENCE {
+    measTiming                              MeasTimingList                                      OPTIONAL,
+    nonCriticalExtension                    MeasurementTimingConfiguration-v1550-IEs            OPTIONAL
+}
+
+MeasurementTimingConfiguration-v1550-IEs ::= SEQUENCE {
+    campOnFirstSSB                               BOOLEAN,
+    psCellOnlyOnFirstSSB                         BOOLEAN,
+    nonCriticalExtension                         MeasurementTimingConfiguration-v1610-IEs       OPTIONAL
+}
+
+MeasurementTimingConfiguration-v1610-IEs ::=  SEQUENCE {
+    csi-RS-Config-r16                             SEQUENCE {
+        csi-RS-SubcarrierSpacing-r16                  SubcarrierSpacing,
+        csi-RS-CellMobility-r16                       CSI-RS-CellMobility,
+        refSSBFreq-r16                                ARFCN-ValueNR
+    },
+    nonCriticalExtension                          SEQUENCE {}                                   OPTIONAL
+}
+
+MeasTimingList ::= SEQUENCE (SIZE (1..maxMeasFreqsMN)) OF MeasTiming
+
+MeasTiming ::= SEQUENCE {
+    frequencyAndTiming                      SEQUENCE {
+        carrierFreq                             ARFCN-ValueNR,
+        ssbSubcarrierSpacing                    SubcarrierSpacing,
+        ssb-MeasurementTimingConfiguration      SSB-MTC,
+        ss-RSSI-Measurement                     SS-RSSI-Measurement                             OPTIONAL
+    }                                                                                           OPTIONAL,
+    ...,
+    [[
+    ssb-ToMeasure                           SSB-ToMeasure                                       OPTIONAL,
+    physCellId                              PhysCellId                                          OPTIONAL
+    ]]
+}
+
+-- TAG-MEASUREMENT-TIMING-CONFIGURATION-STOP
+-- TAG-UE-RADIO-PAGING-INFORMATION-START
+
+UERadioPagingInformation ::= SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            ueRadioPagingInformation            UERadioPagingInformation-IEs,
+            spare7 NULL,
+            spare6 NULL, spare5 NULL, spare4 NULL,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UERadioPagingInformation-IEs ::=    SEQUENCE {
+    supportedBandListNRForPaging        SEQUENCE (SIZE (1..maxBands)) OF FreqBandIndicatorNR    OPTIONAL,
+    nonCriticalExtension                SEQUENCE {}                                             OPTIONAL
+}
+
+
+-- TAG-UE-RADIO-PAGING-INFORMATION-STOP
+-- TAG-UE-RADIO-ACCESS-CAPABILITY-INFORMATION-START
+
+UERadioAccessCapabilityInformation ::= SEQUENCE {
+    criticalExtensions                  CHOICE {
+        c1                                  CHOICE{
+            ueRadioAccessCapabilityInformation    UERadioAccessCapabilityInformation-IEs,
+            spare7 NULL,
+            spare6 NULL, spare5 NULL, spare4 NULL,
+            spare3 NULL, spare2 NULL, spare1 NULL
+        },
+        criticalExtensionsFuture            SEQUENCE {}
+    }
+}
+
+UERadioAccessCapabilityInformation-IEs ::= SEQUENCE {
+    ue-RadioAccessCapabilityInfo               OCTET STRING (CONTAINING UE-CapabilityRAT-ContainerList),
+    nonCriticalExtension                       SEQUENCE {}                                                   OPTIONAL
+}
+
+-- TAG-UE-RADIO-ACCESS-CAPABILITY-INFORMATION-STOP
+-- TAG-NR-MULTIPLICITY-AND-CONSTRAINTS-START
+
+maxMeasFreqsMN              INTEGER ::= 32  -- Maximum number of MN-configured measurement frequencies
+maxMeasFreqsSN              INTEGER ::= 32  -- Maximum number of SN-configured measurement frequencies
+maxMeasIdentitiesMN         INTEGER ::= 62  -- Maximum number of measurement identities that a UE can be configured with
+maxCellPrep                 INTEGER ::= 32  -- Maximum number of cells prepared for handover
+
+-- TAG-NR-MULTIPLICITY-AND-CONSTRAINTS-STOP
+-- TAG-NR-INTER-NODE-DEFINITIONS-END-START
+
+END
+
+-- TAG-NR-INTER-NODE-DEFINITIONS-END-STOP													
diff --git a/openair2/RRC/NR/rrc_gNB_reconfig.c b/openair2/RRC/NR/rrc_gNB_reconfig.c
index 420238e75151de549f1d48ad90d4c0de8e9beb9d..b20b014b45e6c6283572a4593384d079495e2ce1 100644
--- a/openair2/RRC/NR/rrc_gNB_reconfig.c
+++ b/openair2/RRC/NR/rrc_gNB_reconfig.c
@@ -1382,7 +1382,7 @@ if (!servingcellconfigdedicated) {
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->sCellDeactivationTimer=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->crossCarrierSchedulingConfig=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->tag_Id=0;
- secondaryCellGroup->spCellConfig->spCellConfigDedicated->dummy=NULL;
+ secondaryCellGroup->spCellConfig->spCellConfigDedicated->dummy1=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->pathlossReferenceLinking=NULL;
  secondaryCellGroup->spCellConfig->spCellConfigDedicated->servingCellMO=NULL;
 
diff --git a/targets/ARCH/rfsimulator/apply_channelmod.c b/targets/ARCH/rfsimulator/apply_channelmod.c
index ab8ae77edde7320d887b670663ce45eaa5c66a0c..d7d3a68965717280276ec9d839ab6e576e98d390 100644
--- a/targets/ARCH/rfsimulator/apply_channelmod.c
+++ b/targets/ARCH/rfsimulator/apply_channelmod.c
@@ -74,10 +74,10 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si
 
   for (int i=0; i<((int)nbSamples-dd); i++) {
     struct complex16 *out_ptr=after_channel_sig+dd+i;
-    struct complex rx_tmp= {0};
+    struct complexd rx_tmp= {0};
 
     for (int txAnt=0; txAnt < nbTx; txAnt++) {
-      const struct complex *channelModel= channelDesc->ch[rxAnt+(txAnt*channelDesc->nb_rx)];
+      const struct complexd *channelModel= channelDesc->ch[rxAnt+(txAnt*channelDesc->nb_rx)];
 
       //const struct complex *channelModelEnd=channelModel+channelDesc->channel_length;
       for (int l = 0; l<(int)channelDesc->channel_length; l++) {
@@ -88,14 +88,14 @@ void rxAddInput( struct complex16 *input_sig, struct complex16 *after_channel_si
         // it would be better to split out each antenna in a separate flow
         // that will allow to mix ru antennas freely
         struct complex16 tx16=input_sig[((TS+i-l)*nbTx+txAnt)%CirSize];
-        rx_tmp.x += tx16.r * channelModel[l].x - tx16.i * channelModel[l].y;
-        rx_tmp.y += tx16.i * channelModel[l].x + tx16.r * channelModel[l].y;
+        rx_tmp.r += tx16.r * channelModel[l].r - tx16.i * channelModel[l].i;
+        rx_tmp.i += tx16.i * channelModel[l].r + tx16.r * channelModel[l].i;
       } //l
     }
 
     // Fixme: lround(), rount(), ... is detected by valgrind as error, not found why
-    out_ptr->r += lround(rx_tmp.x*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
-    out_ptr->i += lround(rx_tmp.y*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
+    out_ptr->r += lround(rx_tmp.r*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
+    out_ptr->i += lround(rx_tmp.i*pathLossLinear + noise_per_sample*gaussZiggurat(0.0,1.0));
     out_ptr++;
   }
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
index ef171bf0a9748041308c13fc3c32007a81d4d32f..0fd0dd455156bd98aaeebc6fa742a3b347bf423b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpn300.conf
@@ -234,8 +234,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
index 360b75c67df50642b9f8487fca656523f533e12e..2c97e2cad35c3a116a97769ee07393f3ec1f7e66 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.32PRB.usrpx300.conf
@@ -218,8 +218,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
index e018aef006ec0f5c9165dc56f19885f517f7c6d3..3ec84d34cec730e85ff9d843f9f62942b40f0714 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band257.tm1.66PRB.usrpn300.conf
@@ -216,8 +216,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
index 834060b071731f9df400830291adffe6f81dab5b..90ae80fb8d0481f51c127223e2d33081bbb01bb1 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band261.tm1.32PRB.usrpn300.conf
@@ -235,6 +235,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
index 2028f405527468ba66ad4cbc5949b0099d422e6d..cd57096e006929ee6369727fb6383ab6eb24de1e 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpn300.conf
@@ -219,6 +219,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
   }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
index 35c4924ba1c1f491a8254bc83fb29c3f494f524b..5230fa91ef2f2e30ea84b0ddb7c8ca8b0c3970ee 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band66.tm1.106PRB.usrpx300.conf
@@ -219,6 +219,7 @@ L1s = (
   num_cc = 1;
   tr_n_preference = "local_mac";
   pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
   }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
index aa61153c93c3e5a87a4735ba4e3aa21c782440f0..51b252e1a49f0d5e1ce0204959cfb7ba5acb2def 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.106PRB.slave.conf
@@ -231,8 +231,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
index d08234ab1678ba1e0a8e6c7d71f7aaff1f88e953..5530f33d6559d42fa3d78dd996aa21869c9f2335 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.PTRS.usrpx300.conf
@@ -269,6 +269,7 @@ L1s = (
    num_cc = 1;
    tr_n_preference = "local_mac";
    pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
  }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
index f22d5f781f22d398e8fb80789f92f07c65740196..1cd08ec115d48e1c1d48e2a345a75db48592c5d3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpb210.conf
@@ -215,8 +215,10 @@ MACRLCs = (
 
 L1s = (
     	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
+  num_cc = 1;
+  tr_n_preference = "local_mac";
+  pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index b57cb00779d41a7e2224fbb88b2d25dba8fc9c42..8a5fbb740f97f7420441adae959791ade2ec9e84 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -218,6 +218,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
 	}
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index 862185835e3dc7abd7cd306d95d345bed3144b35..705fa277e03a93c95de22fafdef6029dc6edecd4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -219,6 +219,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
 	}
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
index 335c3d9f0b5aae258d9d9494d133070c5caef658..7d8b80f83c30334f9b61bb5c8fcf41da64fc150b 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpn300.conf
@@ -230,11 +230,12 @@ MACRLCs = (
 );
 
 L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-        pusch_proc_threads = 8;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 8;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }
 );
 
 RUs = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
index bf75edc360e56a0130fc99177694617ef4def640..a1a49724703206dd2bfa66e44f7b06724f699011 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.217PRB.usrpx300.conf
@@ -214,11 +214,12 @@ MACRLCs = (
 );
 
 L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-        pusch_proc_threads = 8;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 8;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }
 );
 
 RUs = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
index b4f40d2205d0c7b29b75572647962b5d30d1c59c..44d238bce242dae4829a465fe7d9d67d923f18a0 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpb210.conf
@@ -219,6 +219,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
index 639b11828ba98cb07b9257507310aa228e8e6925..a4df8399eadd61f4eb359b98b2a41700317ab99f 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpn300.conf
@@ -219,6 +219,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
index b93b530bed6f9deaf1d6be4e9b433de33613d93b..2899f6982d19101c2437ef602f6ff6f0cd028c55 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.24PRB.usrpx300.conf
@@ -219,6 +219,7 @@ L1s = (
         num_cc = 1;
         tr_n_preference = "local_mac";
         pusch_proc_threads = 8;
+        ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
     }
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
index 50276c32897ab2fd805981f17922303ce43b5868..2b646fcacd578177ac402289ed019770dd941ab2 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.273PRB.usrpn300.conf
@@ -214,11 +214,12 @@ MACRLCs = (
 );
 
 L1s = (
-    	{
-	num_cc = 1;
-	tr_n_preference = "local_mac";
-        pusch_proc_threads = 8;
-        }  
+  {
+    num_cc = 1;
+    tr_n_preference = "local_mac";
+    pusch_proc_threads = 8;
+    ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+  }
 );
 
 RUs = (
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf
index 5cfd4dc768b71510cc9837ea038912fb78a320c7..06ae5af06678efcde9262c118b8c5b06075efab4 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/oaiL1.nfapi.usrpx300.conf
@@ -28,6 +28,7 @@ L1s = (
     remote_n_portc   = 50001; // vnf p5 port
     local_n_portd    = 50010; // pnf p7 port
     remote_n_portd   = 50011; // vnf p7 port
+    pusch_proc_threads = 8;
   }  
 );
 
@@ -42,5 +43,7 @@ RUs = (
        max_pdschReferenceSignalPower = -27;
        max_rxgain                    = 114;
        sdr_addrs = "type=x300"; // USRP type
+       clock_src = "external";
+       time_src = "external";
     }		      
 );
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
index 7d21dce681162e31336431a27f33b8d1aaea3f71..95b05f320b89171808bbe1d621852ad615a0bf55 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb.conf
@@ -235,6 +235,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
index 463b7d6d069ab77be97605b08acc4ea7eedd446e..f7546cde792b591721ed5e9c96712bd4b0e265e3 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_gnb_24PRB.conf
@@ -251,6 +251,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
         }  
 );
 
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
index 1a28ebb9508b7eebbd3ebba0da22e437a2decdd6..e573d3499d297137142785dfdf95082d3e826143 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.106PRB.usrpb210.conf
@@ -240,6 +240,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
     }
 );
 
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
index 718038657b30ae4052f750988beb71f9759e0d4c..0cac691e741a2d2e3dc7e452bb5844cfdd5fefcd 100644
--- a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.106PRB.usrpb210.conf
@@ -240,6 +240,7 @@ L1s = (
 	num_cc = 1;
 	tr_n_preference = "local_mac";
 	pusch_proc_threads = 8;
+  ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
     }
 );