diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index dbf5fb8fb2b6ca3365a3d19c2213fe7574d17f25..de24bb91360572bb9e2384b0e811f893da1841c0 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -142,16 +142,16 @@ void rx_func(void *param) {
   int slot_tx = info->slot_tx;
   sl_ahead = sf_ahead*gNB->frame_parms.slots_per_subframe;
   nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config;
-
+  LOG_I(PHY,"slot rx %d \n", slot_rx);
   start_meas(&softmodem_stats_rxtx_sf);
 
   // *******************************************************************
 
   if (NFAPI_MODE == NFAPI_MODE_PNF) {
     // I am a PNF and I need to let nFAPI know that we have a (sub)frame tick
-    //LOG_D(PHY, "oai_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx);
+    //LOG_D(PHY, "oai_nfapi_slot_ind(frame:%u, slot:%d) ********\n", frame_rx, slot_rx);
     start_meas(&nfapi_meas);
-    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||
diff --git a/nfapi/oai_integration/nfapi_pnf.c b/nfapi/oai_integration/nfapi_pnf.c
index da8912e6a92e0d8f3a67a4ef137a4316f3fb4a44..520a5dc578b977773390b1391c30b65a5c5e2141 100644
--- a/nfapi/oai_integration/nfapi_pnf.c
+++ b/nfapi/oai_integration/nfapi_pnf.c
@@ -2304,50 +2304,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
+    //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);
+
+    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
     int slot_ret = nfapi_pnf_p7_slot_ind(p7_config_g, p7_config_g->phy_id, sfn, slot); 
 
-    // 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 {
-  }
+    return;
 }
 
 int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind) {
@@ -2401,6 +2375,12 @@ int oai_nfapi_sr_indication(nfapi_sr_indication_t *ind) {
 
 //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;
diff --git a/nfapi/oai_integration/nfapi_pnf.h b/nfapi/oai_integration/nfapi_pnf.h
index 61d4847ebab2a70196366753135a846d6efb96f5..463bd42692273c8e9a5ca20146c7c483032f4468 100644
--- a/nfapi/oai_integration/nfapi_pnf.h
+++ b/nfapi/oai_integration/nfapi_pnf.h
@@ -27,5 +27,5 @@ void configure_nfapi_pnf(char *vnf_ip_addr, int vnf_p5_port, char *pnf_ip_addr,
 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);
+void handle_nr_slot_ind(uint16_t sfn, uint16_t slot);
 #endif
diff --git a/nfapi/oai_integration/nfapi_vnf.c b/nfapi/oai_integration/nfapi_vnf.c
index 1bc2f70d939039e26ddf503caf4e281ba68ffea5..8c8a19e8834e572b863feb4ff92e40cf61e047c3 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"
@@ -1014,8 +1014,47 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
   return 1;
 }
 
+// void add_slot(uint16_t *frameP, uint16_t *slotP, int offset)
+// {
+// 	uint16_t num_slots = 20; // set based on numerlogy (fixing for 1)
+
+//     *frameP    = (*frameP + ((*slotP + offset) / num_slots))%1024; 
+
+//     *slotP = ((*slotP + offset) % num_slots);
+// }
+
+// uint32_t sfnslot_add_slot(uint16_t sfn, uint16_t slot, int offset)
+// {
+//   uint32_t new_sfnslot;
+// //   uint16_t sfn = NFAPI_SFNSLOT2SFN(sfnslot);
+// //   uint16_t slot  = NFAPI_SFNSLOT2SLOT(sfnslot);
+
+//   //printf("%s() sfn:%u sf:%u\n", __FUNCTION__, sfn, sf);
+//   add_slot(&sfn, &slot, offset);
+
+//   new_sfnslot = sfn<<6|slot;
+
+//   //printf("%s() sfn:%u sf:%u offset:%d sfnsf:%d(DEC:%d) new:%d(DEC:%d)\n", __FUNCTION__, sfn, sf, offset, sfnsf, NFAPI_SFNSF2DEC(sfnsf), new_sfnsf, NFAPI_SFNSF2DEC(new_sfnsf));
+
+//   return new_sfnslot;
+// }
+
 //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);
+}
+
 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);
@@ -1282,6 +1321,7 @@ void *vnf_nr_p7_thread_start(void *ptr) {
   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;
@@ -1739,7 +1779,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/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface_scf.h
index faa30582dcc8e88c097d74284febfb2bebb5bb14..9c3dd6fd8fe85ff29ffe91f91fde1f6268f06478 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
   
diff --git a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
index e18aa7fda2ef0abb06d96c6badf3532aba8a9203..c25e6bc11c6a98b6ed23ad964a26dc65e4ed2ed5 100755
--- a/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
+++ b/nfapi/open-nFAPI/nfapi/src/nfapi_p7.c
@@ -3355,6 +3355,20 @@ static uint8_t pack_nr_timing_info(void *msg, uint8_t **ppWritePackedMsg, uint8_
 
 //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)
@@ -3696,18 +3710,19 @@ int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packe
 	// 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);
-			//printf("result of pack dl_tti_req is %d. \n",result);
 			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;
@@ -3720,6 +3735,9 @@ int nfapi_nr_p7_message_pack(void *pMessageBuf, void *pPackedBuf, uint32_t packe
 			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;
@@ -6350,6 +6368,21 @@ static uint8_t unpack_tx_request(uint8_t **ppReadPackedMsg, uint8_t *end, void *
 
 //UNPACK NR UPLINK INDICATION FUNCTIONS 
 
+//SLOT INDICATION
+
+static uint8_t unpack_nr_slot_indication(uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_nr_rx_data_indication_t *msg, nfapi_p7_codec_config_t* config)
+{	
+	nfapi_nr_slot_indication_scf_t *pNfapiMsg = (nfapi_nr_slot_indication_scf_t*)msg;
+	
+	printf("\n");
+	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)
@@ -8707,6 +8740,14 @@ int nfapi_nr_p7_message_unpack(void *pMessageBuf, uint32_t messageBufLen, void *
 			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)){
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7.c b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
index 0b75d3c7ecab92f3eecaab284d5db303fef80c79..c04285c62e4708bb49a14e6b600c3fe0ae5a7fbf 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7.c
@@ -940,11 +940,11 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 
 	//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->sfn = sfn_tx; //gokul
 	pnf_p7->slot = slot_tx; 
 
-	uint32_t slot_dec = NFAPI_SFNSLOT2DEC(sfn, slot);
-	uint8_t buffer_index_rx = slot_dec % 20; 
+	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;
@@ -978,14 +978,14 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 
 		nfapi_pnf_p7_slot_buffer_t* tx_slot_buffer = &(pnf_p7->slot_buffer[buffer_index_tx]);
 
-                if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d slot_buffer->sfn_sf:%d tx_slot_buffer->sfn_slot:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] "
-                    "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", 
-                    __FUNCTION__, 
-                    pnf_p7->slot_shift, 
-                    NFAPI_SFNSLOT2DEC(rx_slot_buffer->sfn, rx_slot_buffer->slot), 
-                    NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), 
-                       	slot_dec,    buffer_index_rx, rx_slot_buffer->dl_tti_req, rx_slot_buffer->tx_data_req, 
-                    	tx_slot_dec, buffer_index_tx, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req);
+                // if (0) NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() shift:%d slot_buffer->sfn_sf:%d tx_slot_buffer->sfn_slot:%d sfn_sf:%d subframe_buffer[buffer_index:%u dl_config_req:%p tx_req:%p] "
+                //     "TX:sfn_sf:%d:tx_buffer_index:%d[dl_config_req:%p tx_req:%p]\n", 
+                //     __FUNCTION__, 
+                //     pnf_p7->slot_shift, 
+                //     NFAPI_SFNSLOT2DEC(rx_slot_buffer->sfn, rx_slot_buffer->slot), 
+                //     NFAPI_SFNSLOT2DEC(tx_slot_buffer->sfn, tx_slot_buffer->slot), 
+                //        	slot_dec,    buffer_index_rx, rx_slot_buffer->dl_tti_req, rx_slot_buffer->tx_data_req, 
+                //     	tx_slot_dec, buffer_index_tx, tx_slot_buffer->dl_tti_req, tx_slot_buffer->tx_data_req);
 					//TODO: Change later if required
 
 		// todo : how to handle the messages we don't have, send dummies for
@@ -1004,7 +1004,8 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 				
 			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);	
+				//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);
 			}
 		}
@@ -1045,6 +1046,7 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			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);
 			}
 		}
@@ -1098,6 +1100,7 @@ int pnf_p7_slot_ind(pnf_p7_t* pnf_p7, uint16_t phy_id, uint16_t sfn, uint16_t sl
 			{
 				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);
 			}
 		}
@@ -1603,7 +1606,7 @@ void pnf_handle_dl_tti_request(void* pRecvMsg, int recvMsgLen, pnf_p7_t* pnf_p7)
                 struct timespec t;
                 clock_gettime(CLOCK_MONOTONIC, &t);
 
-                NFAPI_TRACE(NFAPI_TRACE_INFO,"%s() POPULATE DL_TTI_REQ SFN/slot: %d.%d buffer_index:%d\n", __FUNCTION__, req->SFN, req->Slot, 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_tti_req make sure we free it.
 			if(pnf_p7->slot_buffer[buffer_index].dl_tti_req != 0)
@@ -1764,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 % 20;
+			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)
 			{
diff --git a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
index 88aa1391cb4bc37cb8661390bf87ca781b152e39..a5cd9bcd16fb8a22238baca5b4cb179d8dde86b8 100644
--- a/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
+++ b/nfapi/open-nFAPI/pnf/src/pnf_p7_interface.c
@@ -258,6 +258,18 @@ int nfapi_pnf_ue_release_resp(nfapi_pnf_p7_config_t* config, nfapi_ue_release_re
 
 //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)
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 14c53b870b8f6ed1964401e6fc16650bc1a92f56..31328393c9a5749f8dc784abf74c3a78638b4248 100644
--- a/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
+++ b/nfapi/open-nFAPI/vnf/public_inc/nfapi_vnf_interface.h
@@ -854,7 +854,7 @@ typedef struct nfapi_vnf_p7_config
 	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);
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7.c b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
index 7f5d33466dfd2c2eb71d388af7ea424dccbfb7c0..4b68f016a88b91f122b101a98ddbd21cc1bf1f4b 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7.c
@@ -23,7 +23,6 @@
 #include <unistd.h>
 #include <errno.h>
 #include <stdio.h>
-
 #include "vnf_p7.h"
 
 #define SYNC_CYCLE_COUNT 2
@@ -1455,7 +1454,31 @@ 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); //gokul
+			}
+		}
 
+	}
+}
 void vnf_handle_nr_rx_data_indication(void *pRecvMsg, int recvMsgLen, vnf_p7_t* vnf_p7)
 {
 	// ensure it's valid
@@ -2179,7 +2202,11 @@ 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_NR_PHY_MSG_TYPE_SLOT_INDICATION:
+			vnf_handle_nr_slot_indication(pRecvMsg, recvMsgLen, vnf_p7);
+			break;
+		
 		case NFAPI_NR_PHY_MSG_TYPE_RX_DATA_INDICATION:
 			vnf_handle_nr_rx_data_indication(pRecvMsg, recvMsgLen, vnf_p7);
 			break;
diff --git a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
index 71a912057e57d19d09edfe171d2fd4a8dd2b1d9e..5c0ff7b068a4afb39354d42258686988e95be88e 100644
--- a/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
+++ b/nfapi/open-nFAPI/vnf/src/vnf_p7_interface.c
@@ -25,6 +25,7 @@
 #include <errno.h>
 
 #include "vnf_p7.h"
+#include "nfapi_vnf.h"
 
 #include "common/ran_context.h"
 
@@ -96,8 +97,10 @@ 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)
-{
-	uint16_t vnf_frame; uint8_t vnf_slot; uint16_t slot_scheduled;
+{	
+	struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+	uint8_t temp_slot;
+	uint16_t vnf_frame; uint8_t vnf_slot;
 	if(config == 0)
 		return -1;
 
@@ -150,8 +153,8 @@ 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_sec = 100; 
+	pselect_timeout.tv_nsec = 0; // ns in a 0.5 ms
 	//pselect_timeout.tv_nsec = 500000;
 
 	struct timespec pselect_start;
@@ -213,19 +216,15 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 			pselect_timeout = timespec_sub(slot_start, pselect_start);
 		}
 
-		if(setup_time > 10 && slot_scheduled == 0){
+		if(setup_time > 10 && temp_slot != gNB->UL_INFO.slot){
 
-			// Call the scheduler
-			struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
+			//Call the scheduler
 			pthread_mutex_lock(&gNB->UL_INFO_mutex);
-			gNB->UL_INFO.frame     = vnf_frame;
-			gNB->UL_INFO.slot      = vnf_slot;
-
 			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);
-			slot_scheduled = 1;
+			temp_slot = gNB->UL_INFO.slot;
 		}
 
 		selectRetval = pselect(maxSock+1, &rfds, NULL, NULL, &pselect_timeout, NULL);
@@ -277,7 +276,6 @@ int nfapi_nr_vnf_p7_start(nfapi_vnf_p7_config_t* config)
 				curr = curr->next;	
 			}
 			send_mac_slot_indications(vnf_p7);
-			slot_scheduled = 0;
 
 		}
 		else if(selectRetval > 0)
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index 2ae2549df31743e6d7263e1087c8d0714bf34091..e01adc1bf28324d70465db0159725d58d1fcdf67 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -292,7 +292,7 @@ int nr_dlsch_encoding(PHY_VARS_gNB *gNB,
   }
   G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs,mod_order,rel15->nrOfLayers);
 
-  LOG_D(NR_PHY,"dlsch coding A %d G %d (nb_rb %d, nb_symb_sch %d, nb_re_dmrs %d, length_dmrs %d, mod_order %d)\n", A,G, nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,mod_order);
+  LOG_I(NR_PHY,"dlsch coding A %d G %d (nb_rb %d, nb_symb_sch %d, nb_re_dmrs %d, length_dmrs %d, mod_order %d)\n", A,G, nb_rb,nb_symb_sch,nb_re_dmrs,length_dmrs,mod_order);
 
   if (A > 3824) {
     // Add 24-bit crc (polynomial A) to payload
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 42441e9f53ffb2d9691c98f6a44282aeef472ccd..23e18f5787458b0172a80c48f4bae2d8c7ed019f 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -268,7 +268,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
   //printf("Inside NR schedule response SFN/slot %d.%d. \n",frame,slot);
   if(NFAPI_MODE != NFAPI_MONOLITHIC && number_ul_tti_pdu>0)
   { 
-    //printf("SFN/slot %d.%d Sending ul tti req \n",frame,slot);
+    LOG_I(MAC,"SFN/slot %d.%d Sending ul tti req \n",frame,slot);
     oai_nfapi_ul_tti_req(UL_tti_req);
   }
   
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 9f40821d04d0570640abc120d2f66ea849c10048..c1dd64af5d5c42288704f8fc173a96615a39e0f1 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -164,7 +164,7 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
 	gNB->Mod_id,frame,slot,pdcch_pdu_id,ul_pdcch_pdu_id);
 
   if (pdcch_pdu_id >= 0 || ul_pdcch_pdu_id >= 0) {
-    LOG_D(PHY, "[gNB %d] Frame %d slot %d Calling nr_generate_dci_top (number of UL/DL DCI %d/%d)\n",
+    LOG_I(PHY, "[gNB %d] Frame %d slot %d Calling nr_generate_dci_top (number of UL/DL DCI %d/%d)\n",
 	  gNB->Mod_id, frame, slot,
 	  gNB->ul_pdcch_pdu[ul_pdcch_pdu_id].pdcch_pdu.pdcch_pdu.pdcch_pdu_rel15.numDlDci,
 	  gNB->pdcch_pdu[pdcch_pdu_id].pdcch_pdu.pdcch_pdu_rel15.numDlDci);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index b678988be12f6c475219a71f7a3f95eba053a1d9..5e474f1bd2c14a3cd390d9413a80d903d3a7e91e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -406,7 +406,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
       {
         printf("First sched entry at slot %d \n", slot);
         for (int i = 0; i<num_slots; i++){
-          if(i <= slot)
+          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;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index c77bd93203e12b248e26f2b67a75d21be493588d..9da818c2ab2306735422dca9391ebcb03347af10 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -835,8 +835,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
     int8_t current_harq_pid = sched_pdsch->dl_harq_pid;
     if (current_harq_pid < 0) {
       /* PP has not selected a specific HARQ Process, get a new one */
-      // if (NFAPI_MODE == NFAPI_MODE_VNF)
-      //   sched_ctrl->available_dl_harq.head = 0;
       current_harq_pid = sched_ctrl->available_dl_harq.head;
       AssertFatal(current_harq_pid >= 0,
                   "no free HARQ process available for UE %d\n",
@@ -853,9 +851,6 @@ void nr_schedule_ue_spec(module_id_t module_id,
         remove_nr_list(&sched_ctrl->retrans_dl_harq, current_harq_pid);
     }
     NR_UE_harq_t *harq = &sched_ctrl->harq_processes[current_harq_pid];
-    // if (NFAPI_MODE == NFAPI_MODE_VNF) {
-    //   harq->is_waiting = false;
-    // }
     DevAssert(!harq->is_waiting);
     add_tail_nr_list(&sched_ctrl->feedback_dl_harq, current_harq_pid);
     NR_sched_pucch_t *pucch = &sched_ctrl->sched_pucch[sched_pdsch->pucch_allocation];
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 1eb7fa7f7d8d41c1b238b69a6de8d357559b48a9..139b22788df39e06703b2ce4af5b50d250f50bab 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -502,9 +502,6 @@ void nr_csi_meas_reporting(int Mod_idP,
       // find free PUCCH that is in order with possibly existing PUCCH
       // schedulings (other CSI, SR)
       NR_sched_pucch_t *curr_pucch = &sched_ctrl->sched_pucch[1];
-      // if(NFAPI_MODE == NFAPI_MODE_VNF){
-      //   curr_pucch->csi_bits = 0; curr_pucch->sr_flag = 0; curr_pucch->dai_c = 0;
-      // }
       AssertFatal(curr_pucch->csi_bits == 0
                   && !curr_pucch->sr_flag
                   && curr_pucch->dai_c == 0,
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index 5a1cb970eb809e6989b35cd817f2585a3782ffe0..26978ebc30427c3a9b5d1f0fb01076ae2d26c105 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -99,7 +99,7 @@ void handle_nr_uci(NR_UL_IND_t *UL_info)
     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_I(MAC,"handling UCI SFN/slot: %d.%d, num_ucis: %d \n", frame,slot, num_ucis);
+    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: