diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index 62ef17f43f05aa50181ffd670e8e3da660885dc6..7b78ca537ae9dae124a3e29ec7910b534617e1f7 100755
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -1113,50 +1113,109 @@ static uint8_t pack_ul_tti_request_pucch_pdu(nfapi_nr_pucch_pdu_t* pucch_pdu, ui
 	
 }
 
-//pack_ul_tti_request_pusch_pdu
+
 static uint8_t pack_ul_tti_request_pusch_pdu(nfapi_nr_pusch_pdu_t* pusch_pdu, uint8_t **ppWritePackedMsg, uint8_t *end)
 { 
-	//Optional data indicated by pdubitmap
- // nfapi_nr_pusch_data_t pusch_data;
-  //nfapi_nr_pusch_uci_t  pusch_uci;
-  //nfapi_nr_pusch_ptrs_t pusch_ptrs;
-  //nfapi_nr_dfts_ofdm_t dfts_ofdm;
-	return(
-		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) &&
-		pusharray8(pusch_pdu->resource_alloc,36,36,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) 
-        //Pack Optional Data only included if indicated in pduBitmap
-		// TODO: ignoring beamforming tlv for now
-	);
 	
+	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) &&
+	pusharray8(pusch_pdu->resource_alloc,36,36,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) &&
+				pusharray32(pusch_pdu->pusch_ptrs.ptrs_ports_list, 
+					pusch_pdu->pusch_ptrs.num_ptrs_ports, 
+					pusch_pdu->pusch_ptrs.num_ptrs_ports,
+					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)
@@ -1587,8 +1646,6 @@ static uint8_t pack_ul_tti_pdu_list_value(void* tlv, uint8_t **ppWritePackedMsg,
 			NFAPI_TRACE(NFAPI_TRACE_ERROR, "FIXME : Invalid UL_TTI pdu type %d \n", value->pdu_type );
 		}
 		break;
-
-
 	}
 
 	return 1;
@@ -1785,9 +1842,11 @@ static uint8_t pack_ul_tti_request(void *msg, uint8_t **ppWritePackedMsg, uint8_
 		
 	for(int i=0; i<pNfapiMsg->n_pdus; i++)
 	{
-		if(!pack_tlv(NFAPI_NR_UL_TTI_PDU_LIST_REL_IISC, &pNfapiMsg->pdus_list, ppWritePackedMsg, end, &pack_ul_tti_pdu_list_value))
-			return 0;
+		// if(!pack_tlv(NFAPI_NR_UL_TTI_PDU_LIST_REL_IISC, &pNfapiMsg->pdus_list, ppWritePackedMsg, end, &pack_ul_tti_pdu_list_value))
+		// 	return 0;
 
+		if(!pack_ul_tti_pdu_list_value(&pNfapiMsg->pdus_list[i], ppWritePackedMsg, end))
+			return 0;
 	}
 #if 0
 	for(int i=0; i<pNfapiMsg->n_group; i++)
@@ -4025,7 +4084,7 @@ static uint8_t unpack_dl_tti_request_body_value(void *tlv, uint8_t **ppReadPacke
 			{
 				unpack_tlv_t unpack_fns[] =
 				{
-					{ NFAPI_NR_DL_TTI_SSB_REL_IISC, &pdu->ssb_pdu.ssb_pdu_rel15, &pack_dl_tti_ssb_pdu_rel15_value},
+					{ NFAPI_NR_DL_TTI_SSB_REL_IISC, &pdu->ssb_pdu.ssb_pdu_rel15, &unpack_dl_tti_ssb_pdu_rel15_value},
 				};
 
 				unpack_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, packedPduEnd, 0, 0);
@@ -4404,7 +4463,7 @@ static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, vo
     //TODO: Check if we need to add a seperate tag for dl_tti_request_body
 	unpack_p7_tlv_t unpack_fns[] =
 	{
-		{ NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, &pNfapiMsg->dl_tti_request_body, &unpack_dl_config_request_body_value},
+		{ NFAPI_NR_PHY_MSG_TYPE_DL_TTI_REQUEST, &pNfapiMsg->dl_tti_request_body, &unpack_dl_tti_request_body_value},
 	};
 
 	return ( pull16(ppReadPackedMsg, &pNfapiMsg->SFN, end) &&
@@ -4413,28 +4472,107 @@ static uint8_t unpack_dl_tti_request(uint8_t **ppReadPackedMsg, uint8_t *end, vo
 }
 
 
+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_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(!(pull8(ppReadPackedMsg, &pNfapiMsg->pdu_size, end) &&
+	 	 pull8(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;
+#if 0
+		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;
+#endif
+		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_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *msg, nfapi_p7_codec_config_t* config)
 {
-	#if 0
 	nfapi_nr_ul_tti_request_t *pNfapiMsg = (nfapi_nr_ul_tti_request_t*)msg;
-    //TODO: Check if we need to add a seperate tag for ul_tti_request_body
-	unpack_p7_tlv_t unpack_fns[] =
-	{
-		{ NFAPI_NR_PHY_MSG_TYPE_UL_TTI_REQUEST, &pNfapiMsg->ul_tti_request_body, &unpack_dl_config_request_body_value},
-	};
 
-	return ( 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) &&
-			unpack_p7_tlv_list(unpack_fns, sizeof(unpack_fns)/sizeof(unpack_tlv_t), ppReadPackedMsg, end, config, &pNfapiMsg->vendor_extension));
+	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;
+	}
+#if 0
+	for(int i=0; i< pNfapiMsg->n_group; i++)
+	{
+		if (!unpack_ul_tti_groups_list_value(ppReadPackedMsg, end, &pNfapiMsg->groups_list[i], NULL))
+			return 0;
+	}
 #endif
 	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;
@@ -4450,6 +4588,9 @@ static uint8_t unpack_dl_config_request(uint8_t **ppReadPackedMsg, uint8_t *end,
 
 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) &&
@@ -4468,6 +4609,7 @@ static uint8_t unpack_ul_config_ulsch_pdu_rel8_value(void *tlv, uint8_t **ppRead
 			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;