diff --git a/nfapi/README.md b/nfapi/README.md
index f3faac4137be9278841fa35d02cd89593baf5c5b..2308b7e82e1fe90fa9943298eddb1d83e15b7cc2 100644
--- a/nfapi/README.md
+++ b/nfapi/README.md
@@ -28,14 +28,14 @@ sudo <oai_codebase>/cmake_targets/ran_build/build/nr-softmodem -O <oai_codebase>
 * In the switch case, change the labels as well as the pack functions:
     * `pack_dl_config_request` becomes `pack_dl_tti_request`    [x]
     * `pack_ul_config_request` becomes `pack_ul_tti_request`    [x]
-    * `pack_hi_dci0_request` becomes `pack_ul_dci_request`
+    * `pack_hi_dci0_request` becomes `pack_ul_dci_request`      [x]
     * `pack_tx_request` becomes `pack_tx_data_request`          [x]
 
 ### Task-B [unpacking]
 * Modify `nfapi_p7_message_unpack()` in `nfapi_p7.c`
     * `unpack_dl_tti_request`   [x]
     * `unpack_ul_tti_request`   [x]
-    * `unpack_ul_dci_request`
+    * `unpack_ul_dci_request`   [x]
     * `unpack_tx_data_request`  [x]
 
 * Similarly change all the `unpack` functions within the switch-case block.
@@ -44,22 +44,27 @@ sudo <oai_codebase>/cmake_targets/ran_build/build/nr-softmodem -O <oai_codebase>
     * this is where the unpack functions are called
         * `dl_tti_request`  [x]
         * `ul_tti_request`  [x]
-        * `ul_dci_request`
+        * `ul_dci_request`  [x]
         * `tx_data_request` [x]
-
+* `nfapi_p7_message_unpack()` is called in `pnf_handle_dl_config_request()` in pnf_p7.c, so we need to add 
+    * `pnf_handle_dl_tti_request`
+    * `pnf_handle_ul_tti_request`
+    * `pnf_handle_ul_dci_request`
+    * `pnf_handle_tx_data_request`
+    to handle DL P7 messages at pnf
 ### Task-C
 * Write the `ul_tti` alternative for `nfapi_vnf_p7_ul_config_req()` in `vnf_p7_interface.c` and other such functions.
     * `dl_tti` is present as `nr_dl_config` [x]
-    * `ul_tti` [x]
-    * `ul_dci`
+    * `ul_tti`  [x]
+    * `ul_dci`  [x]
     * `tx_data` [x]
 
 * Resolve the hard-coded areas in source code. [`HIGH-PRIORITY`] [x]
 
 * Write the `ul_tti` equivalent for `oai_nfapi_dl_config_req` in `nfapi_vnf.c` and other such functions.
-    * `dl_tti` is present as `nr_dl_config` [x]
-    * `ul_tti` is present as `oai_nfapi_ul_tti_req()` [x]
-    * `ul_dci` 
+    * `dl_tti` is present as `nr_dl_config`             [x]
+    * `ul_tti` is present as `oai_nfapi_ul_tti_req()`   [x]
+    * `ul_dci` is present as `oai_nfapi_ul_dci_req()`   [x]
     * `tx_data` is present as `oai_nfapi_tx_data_req()` [x]
 
 * Check if `nr_schedule_response()` needs to be upgraded [x]
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
index f19a94261224915018ba33d85e74aeb57b3832f9..8a743c1acf6af0548de208b1240d637fc64f008d 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
@@ -141,6 +141,12 @@ void pnf_p7_free(pnf_p7_t* pnf_p7, void* ptr)
 }
 
 // todo : for now these just malloc/free need to move to a memory cache
+nfapi_nr_dl_tti_request_t* allocate_nfapi_dl_tti_request(pnf_p7_t* pnf_p7) 
+{ 
+	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_nr_dl_tti_request_t));
+        //printf("%s() ptr:%p\n", __FUNCTION__, ptr);
+        return ptr;
+}
 nfapi_dl_config_request_t* allocate_nfapi_dl_config_request(pnf_p7_t* pnf_p7) 
 { 
 	void *ptr= pnf_p7_malloc(pnf_p7, sizeof(nfapi_dl_config_request_t));
@@ -1350,7 +1356,99 @@ uint8_t is_p7_request_in_window(uint16_t sfnsf, const char* name, pnf_p7_t* phy)
 
 
 // P7 messages
-//
+#if 0 
+void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
+{
+	//NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n");
+
+	nfapi_nr_dl_tti_request_t* req  = allocate_nfapi_dl_tti_request(pnf_p7);
+
+	if(req == NULL)
+	{
+		NFAPI_TRACE(NFAPI_TRACE_INFO, "%s failed to alloced nfapi_dl_tti_request structure\n");
+		return;
+	}
+
+	int unpack_result = nfapi_p7_message_unpack(pRecvMsg, recvMsgLen, req, sizeof(nfapi_nr_dl_tti_request_t), &(pnf_p7->_public.codec_config));
+
+	if(unpack_result == 0)
+	{
+		if(pthread_mutex_lock(&(pnf_p7->mutex)) != 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to lock mutex\n");
+			return;
+		}
+#if 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_p7_request_in_window(req->sfn_sf, "dl_config_request", pnf_p7))
+                {
+                  uint32_t sfn_sf_dec = NFAPI_SFNSF2DEC(req->sfn_sf);
+                  uint8_t buffer_index = sfn_sf_dec % pnf_p7->_public.subframe_buffer_size;
+
+                        struct timespec t;
+                        clock_gettime(CLOCK_MONOTONIC, &t);
+
+                  NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() %ld.%09ld POPULATE DL_CONFIG_REQ sfn_sf:%d buffer_index:%d\n", __FUNCTION__, t.tv_sec, t.tv_nsec, sfn_sf_dec, buffer_index);
+
+			// if there is already an dl_config_req make sure we free it.
+			if(pnf_p7->subframe_buffer[buffer_index].dl_config_req != 0)
+			{
+				NFAPI_TRACE(NFAPI_TRACE_NOTE, "%s() is_p7_request_in_window()=TRUE buffer_index occupied - free it first sfn_sf:%d buffer_index:%d\n", __FUNCTION__, NFAPI_SFNSF2DEC(req->sfn_sf), buffer_index);
+				//NFAPI_TRACE(NFAPI_TRACE_NOTE, "[%d] Freeing dl_config_req at index %d (%d/%d)", 
+				//			pMyPhyInfo->sfnSf, bufferIdx,
+				//			SFNSF2SFN(dreq->sfn_sf), SFNSF2SF(dreq->sfn_sf));
+				deallocate_nfapi_dl_config_request(pnf_p7->subframe_buffer[buffer_index].dl_config_req, pnf_p7);
+			}
+
+			// saving dl_config_request in subframe buffer
+			pnf_p7->subframe_buffer[buffer_index].sfn_sf = req->sfn_sf;
+			pnf_p7->subframe_buffer[buffer_index].dl_config_req = req;
+
+			pnf_p7->stats.dl_conf_ontime++;
+			
+		}
+		else
+		{
+			//NFAPI_TRACE(NFAPI_TRACE_NOTE, "NOT storing dl_config_req SFN/SF %d\n", req->sfn_sf);
+			deallocate_nfapi_dl_config_request(req, pnf_p7);
+
+			if(pnf_p7->_public.timing_info_mode_aperiodic)
+			{
+				pnf_p7->timing_info_aperiodic_send = 1;
+			}
+
+			pnf_p7->stats.dl_conf_late++;
+		}
+
+		if(pthread_mutex_unlock(&(pnf_p7->mutex)) != 0)
+		{
+			NFAPI_TRACE(NFAPI_TRACE_INFO, "failed to unlock mutex\n");
+			return;
+		}
+	}
+	else
+	{
+		NFAPI_TRACE(NFAPI_TRACE_ERROR, "Failed to unpack dl_config_req");
+		deallocate_nfapi_dl_config_request(req, pnf_p7);
+	}
+}
+#endif
+
+
 void pnf_handle_dl_config_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
 {
 	//NFAPI_TRACE(NFAPI_TRACE_INFO, "DL_CONFIG.req Received\n");