diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
index e30f2c8bd3d5273deb9c00cab587cdbc766adeb0..5fbd88987e30981c63f4bfd1d54e23465e9c43c0 100644
--- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
+++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c
@@ -122,6 +122,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
             dlsch0->g_pucch = dlsch_config_pdu->accumulated_delta_PUCCH;
             dlsch0_harq->Nl=1;
             dlsch0_harq->mcs_table=dlsch_config_pdu->mcs_table;
+            downlink_harq_process(dlsch0_harq, dlsch0->current_harq_pid, dlsch_config_pdu->ndi, dlsch0->rnti_type);
             if (dlsch0_harq->status != ACTIVE) {
               // dlsch0_harq->status not ACTIVE may be due to false retransmission. Reset the 
               // following flag to skip PDSCH procedures in that case.
@@ -201,6 +202,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
             if(pucch_vars->active[j] == false) {
               LOG_D(PHY,"%d.%d Copying pucch pdu to UE PHY\n",scheduled_response->frame,slot);
               memcpy((void*)&(pucch_vars->pucch_pdu[j]), (void*)pucch_config_pdu, sizeof(fapi_nr_ul_config_pucch_pdu));
+              pucch_vars->active[j] = true;
               found = true;
             }
           }
diff --git a/openair1/SCHED_NR_UE/harq_nr.c b/openair1/SCHED_NR_UE/harq_nr.c
index 06395c79e8641107d99fa185138891c362f8e1f4..3f528f02d4693d47711d251ea16ec09df1aff423 100644
--- a/openair1/SCHED_NR_UE/harq_nr.c
+++ b/openair1/SCHED_NR_UE/harq_nr.c
@@ -308,4 +308,59 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq)
   dl_harq->status = SCH_IDLE;
   dl_harq->first_tx = 1;
   dl_harq->round  = 0;
+  dl_harq->ack = DL_ACKNACK_NO_SET;
 }
+
+/*******************************************************************
+*
+* NAME :         downlink_harq_process
+*
+* PARAMETERS :   downlink harq context
+*                harq identifier
+*                ndi (new data indicator) from DCI
+*                rnti_type from DCI
+*
+* RETURN :      none
+*
+* DESCRIPTION : manage downlink information from DCI for downlink transmissions/retransmissions
+*               TS 38.321 5.3.1 DL Assignment reception
+*               TS 38.321 5.3.2 HARQ operation
+*
+*********************************************************************/
+
+void downlink_harq_process(NR_DL_UE_HARQ_t *dl_harq, int harq_pid, int ndi, uint8_t rnti_type) {
+
+  if (rnti_type == _CS_RNTI_) {
+    LOG_E(PHY, "Fatal error in HARQ entity due to not supported CS_RNTI at line %d in function %s of file %s \n", __LINE__ , __func__, __FILE__);
+    return;
+  }
+  else if ((rnti_type != _C_RNTI_) && (rnti_type != _TC_RNTI_)) {
+    /* harq mechanism is not relevant for other rnti */
+    return;
+  }
+
+  if (dl_harq->first_tx == 1) {
+    dl_harq->round = 0;
+    dl_harq->status = ACTIVE;
+    dl_harq->DCINdi = ndi;
+    dl_harq->first_tx = 0;
+
+    LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] first new reception \n", harq_pid);
+  }
+  else if (dl_harq->DCINdi != ndi) {
+    dl_harq->round = 0;
+    dl_harq->status = ACTIVE;
+    dl_harq->DCINdi = ndi;
+
+    LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] new reception due to toogle of ndi \n", harq_pid);
+  }
+  else {
+
+    dl_harq->round++;
+
+    if (dl_harq->ack) dl_harq->status = SCH_IDLE;
+
+    LOG_D(PHY, "[HARQ-DL-PDSCH harqId : %d] reception of a retransmission \n", harq_pid);
+  }
+}
+
diff --git a/openair1/SCHED_NR_UE/harq_nr.h b/openair1/SCHED_NR_UE/harq_nr.h
index 8b48886d88e14f88ff12769e5028d7f677161479..47d1de8a1155fc6e1d052e1c34cfd53000385bfb 100644
--- a/openair1/SCHED_NR_UE/harq_nr.h
+++ b/openair1/SCHED_NR_UE/harq_nr.h
@@ -120,7 +120,7 @@ void init_downlink_harq_status(NR_DL_UE_HARQ_t *dl_harq);
     @param rnti_type type of rnti
     @returns retransmission or new transmission */
 
-harq_result_t downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, uint8_t rnti_type);
+void downlink_harq_process(NR_DL_UE_HARQ_t *dlsch, int harq_pid, int ndi, uint8_t rnti_type);
 
 #undef EXTERN
 #undef INIT_VARIABLES_HARQ_NR_H
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 028009e75bb24f86d290779edb85d079a69d99d0..2b8678da0e32fa82e65c49e1f860b9715040fbb8 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -1786,13 +1786,14 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
   // do procedures for C-RNTI
   int ret_pdsch = 0;
   if (ue->dlsch[proc->thread_id][gNB_id][0]->active == 1) {
+
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_IN);
     ret_pdsch = nr_ue_pdsch_procedures(ue,
-			   proc,
-			   gNB_id,
-			   PDSCH,
-			   ue->dlsch[proc->thread_id][gNB_id][0],
-			   NULL);
+                                       proc,
+                                       gNB_id,
+                                       PDSCH,
+                                       ue->dlsch[proc->thread_id][gNB_id][0],
+                                       NULL);
 
     nr_ue_measurement_procedures(2, ue, proc, gNB_id, nr_slot_rx);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_C, VCD_FUNCTION_OUT);