diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index a7115617479f8760641a68ea95e5e5e11705939d..bc89695620c4b10700b6903bec35364ce014fe51 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -222,11 +222,6 @@ typedef struct {
   uint32_t RA_tx_frame;
   /// Random-access variable for window calculation (subframe of last change in window counter)
   uint8_t RA_tx_subframe;
-  /// Scheduled RX frame for RA Msg2
-  uint16_t msg2_rx_frame;
-  /// Scheduled RX slot for RA Msg2
-  uint16_t msg2_rx_slot;
-  /// Random-access Group B maximum path-loss
   /// Random-access variable for backoff (frame of last change in backoff counter)
   uint32_t RA_backoff_frame;
   /// Random-access variable for backoff (subframe of last change in backoff counter)
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index 6a3f4ad90209fa2dde1fc19717c041ff0a27a51d..31fa49f20c1254eab4a7d1c73f2e4d7bde817155 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -363,7 +363,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
 
   AssertFatal(CC_id == 0,"Transmission on secondary CCs is not supported yet\n");
 
-  if (UE_mode == PRACH && prach_resources->init_msg1) {
+  if (UE_mode < PUSCH && prach_resources->init_msg1) {
 
     LOG_D(MAC, "nr_ue_get_rach, RA_active value: %d", mac->RA_active);
 
@@ -470,7 +470,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
             payload[offset + j] = 0; // mac_pdu[offset + j] = 0;
         }
       } 
-    } else { // RACH is active
+    } else if (mac->RA_window_cnt != -1) { // RACH is active
 
       ////////////////////////////////////////////////////////////////
       /////* Random Access Response reception (5.1.4 TS 38.321) */////
@@ -481,7 +481,6 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
       // - handle beam failure recovery request
       // - handle DL assignment on PDCCH for RA-RNTI
       // - handle backoff and raResponseWindow params
-      // - disabled contention resolution as OAI NSA is contention-free based
 
       // LOG_D(MAC, "[MAC][UE %d][RAPROC] frame %d, subframe %d: RA Active, window cnt %d (RA_tx_frame %d, RA_tx_subframe %d)\n",
       //   mod_id, frame, nr_tti_tx, mac->RA_window_cnt, mac->RA_tx_frame, mac->RA_tx_subframe);
@@ -494,12 +493,13 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
 
       if (mac->RA_window_cnt >= 0 && mac->RA_RAPID_found == 1) {
 
-        // mac->ra_state = WAIT_CONTENTION_RESOLUTION;
-        LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: subframe %d: RAR successfully received \n", mod_id, frame, nr_tti_tx);
+        mac->ra_state = WAIT_CONTENTION_RESOLUTION;
+        mac->RA_window_cnt = -1;
+        LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: nr_tti_tx %d: RAR successfully received \n", mod_id, frame, nr_tti_tx);
 
       } else if (mac->RA_window_cnt == 0 && !mac->RA_RAPID_found) {
 
-        LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: subframe %d: RAR reception failed \n", mod_id, frame, nr_tti_tx);
+        LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: nr_tti_tx %d: RAR reception failed \n", mod_id, frame, nr_tti_tx);
 
         mac->ra_state = RA_UE_IDLE;
         mac->RA_PREAMBLE_TRANSMISSION_COUNTER++;
@@ -578,7 +578,7 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
 
         mac->RA_window_cnt--;
 
-        LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: subframe %d: RAR reception not successful, (RA window count %d) \n",
+        LOG_I(MAC, "[MAC][UE %d][RAPROC] Frame %d: nr_tti_tx %d: RAR reception not successful, (RA window count %d) \n",
           mod_id,
           frame,
           nr_tti_tx,
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 a98a2b12113d4b542b59870d49b20584c76fb37f..e3d76c34c2f04e950a40d6cf00f88466ccf5d847 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -213,23 +213,23 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
          AssertFatal(css->monitoringSymbolsWithinSlot->buf != NULL, "css->monitoringSymbolsWithinSlot->buf is null\n");
        }
 
-      if (frame == mac->msg2_rx_frame && slot == mac->msg2_rx_slot){
-        sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
-        monitoringSymbolsWithinSlot = (css->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (css->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
-        rel15->rnti = mac->ra_rnti;
-        rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
-        rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, 275); // NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
-        rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
-        rel15->dci_length = nr_dci_size(rel15->dci_format, NR_RNTI_RA, rel15->BWPSize);
-        for (int i = 0; i < sps; i++)
+      sps = initialDownlinkBWP->genericParameters.cyclicPrefix == NULL ? 14 : 12;
+      monitoringSymbolsWithinSlot = (css->monitoringSymbolsWithinSlot->buf[0]<<(sps-8)) | (css->monitoringSymbolsWithinSlot->buf[1]>>(16-sps));
+      rel15->rnti = mac->ra_rnti;
+      rel15->BWPSize = NRRIV2BW(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
+      rel15->BWPStart = NRRIV2PRBOFFSET(bwp_Common->genericParameters.locationAndBandwidth, 275); // NRRIV2PRBOFFSET(initialDownlinkBWP->genericParameters.locationAndBandwidth, 275);
+      rel15->SubcarrierSpacing = initialDownlinkBWP->genericParameters.subcarrierSpacing;
+      rel15->dci_length = nr_dci_size(rel15->dci_format, NR_RNTI_RA, rel15->BWPSize);
+
+      for (int i = 0; i < sps; i++){
         if ((monitoringSymbolsWithinSlot >> (sps - 1 - i)) & 1) {
           rel15->coreset.StartSymbolIndex = i;
           break;
         }
-        fill_dci_search_candidates(css, rel15);
-      } else {
-        add_dci = 0;
       }
+
+      fill_dci_search_candidates(css, rel15);
+
     } else if (mac->ra_state == WAIT_CONTENTION_RESOLUTION){
 
       rel15->rnti = mac->t_crnti;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 5468a85f1c9787b53a3becdb12afa0ec6104b1ac..7f3fe9b9bd1a30e1341ee60cf36895c7870fc72b 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -933,104 +933,6 @@ NR_UE_L2_STATE_t nr_ue_scheduler(nr_downlink_indication_t *dl_info, nr_uplink_in
   return UE_CONNECTION_OK;
 }
 
-// Notes:
-// - Type1-PDCCH CSS configuration from ra-SearchSpace.
-// - Msg2 is scheduled in the mixed slot or in the last dl slot if they are allowed by the Type 1 Common Search Space configuration
-// todo:
-// - if Type1-PDCCH CSS is not configured in RRC message (Coreset and SearchSpace), UE searches in Type 0 PDCCH CSS.
-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){
-
-  uint8_t bwp_id = 1;
-  NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
-  NR_ServingCellConfig_t *scd = mac->scd;
-  NR_ServingCellConfigCommon_t *scc = mac->scc;
-  NR_BWP_Downlink_t *bwp = scd->downlinkBWP_ToAddModList->list.array[bwp_id - 1];
-  NR_SearchSpace_t *ss;
-  struct NR_PDCCH_ConfigCommon__commonSearchSpaceList *commonSearchSpaceList = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonSearchSpaceList;
-  uint8_t mu = *scc->ssbSubcarrierSpacing;
-  uint8_t response_window = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.ra_ResponseWindow;
-  uint8_t slot_window, slot_limit, frame_limit;
-  uint16_t start_next_period, monitoring_slot_period, monitoring_offset;
-
-  // number of mixed slot or of last dl slot if there is no mixed slot
-  uint16_t last_dl_slot_period = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSlots;
-  uint16_t nr_dl_symbols = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofDownlinkSymbols;
-  uint16_t nr_ul_symbols = scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSymbols;
-
-  // lenght of tdd period in slots
-  uint16_t tdd_period_slot = last_dl_slot_period + scc->tdd_UL_DL_ConfigurationCommon->pattern1.nrofUplinkSlots;
-
-  AssertFatal(commonSearchSpaceList->list.count > 0, "PDCCH common SearchSpace list has 0 elements\n");
-  
-  LOG_D(MAC, "Frame %d, Slot %d: Scheduling Msg2 reception \n", rach_frame, rach_slot);
-
-  // Common searchspace list
-  for (int i = 0; i < commonSearchSpaceList->list.count; i++) {
-    ss = commonSearchSpaceList->list.array[i];
-    if(ss->searchSpaceId == *bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->ra_SearchSpace)
-    // retrieving ra pdcch monitoring period and offset
-    find_monitoring_periodicity_offset_common(ss, &monitoring_slot_period, &monitoring_offset);
-  }
-
-  if (nr_dl_symbols == 0)
-    last_dl_slot_period--;
-  if ((nr_dl_symbols > 0) || (nr_ul_symbols > 0))
-    tdd_period_slot++;
-
-  // computing start of next period
-  start_next_period = (rach_slot - (rach_slot % tdd_period_slot) + tdd_period_slot) % nr_slots_per_frame[mu];
-  *msg2_slot = start_next_period + last_dl_slot_period; // initializing scheduling of slot to next mixed (or last dl) slot
-  *msg2_frame = (*msg2_slot > rach_slot) ? rach_frame : (rach_frame +1);
-
-  switch(response_window){
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl1:
-    slot_window = 1;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl2:
-    slot_window = 2;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl4:
-    slot_window = 4;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl8:
-    slot_window = 8;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl10:
-    slot_window = 10;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl20:
-    slot_window = 20;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl40:
-    slot_window = 40;
-    break;
-  case NR_RACH_ConfigGeneric__ra_ResponseWindow_sl80:
-    slot_window = 80;
-    break;
-  default:
-    AssertFatal(1==0,"Invalid response window value %d\n",response_window);
-  }
-  AssertFatal(slot_window<=nr_slots_per_frame[mu], "Msg2 response window needs to be lower or equal to 10ms");
-
-  // slot and frame limit to transmit msg2 according to response window
-  slot_limit = (rach_slot + slot_window)%nr_slots_per_frame[mu];
-  frame_limit = (slot_limit>(rach_slot))? rach_frame : (rach_frame +1);
-
-  // go to previous slot if the current scheduled slot is beyond the response window
-  // and if the slot is not among the PDCCH monitored ones (38.213 10.1)
-  while ((*msg2_slot > slot_limit) || ((*msg2_frame*nr_slots_per_frame[mu] + *msg2_slot - monitoring_offset) % monitoring_slot_period != 0))  {
-    if((*msg2_slot % tdd_period_slot) > 0)
-      (*msg2_slot)--;
-    else
-      AssertFatal(1 == 0, "No available DL slot to schedule reception of msg2 has been found");
-  }
-  LOG_D(MAC, "Scheduled Msg2 reception in Frame %d, Slot %d:  \n", *msg2_frame, *msg2_slot);
-}
-
 // This function schedules the PRACH according to prach_ConfigurationIndex and TS 38.211, tables 6.3.3.2.x
 // It fills the PRACH PDU per each FD occasion.
 // PRACH formats 9, 10, 11 are corresponding to dual PRACH format configurations A1/B1, A2/B2, A3/B3.
@@ -2906,10 +2808,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, nr
 	  dlsch_config_pdu_1_0->pucch_resource_id,
 	  dlsch_config_pdu_1_0->pdsch_to_harq_feedback_time_ind);
 
-    if (mac->ra_rnti == rnti)
+    if (mac->RA_window_cnt >= 0 && rnti == mac->ra_rnti){
       dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH;
-    else
+    } else {
       dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
+    }
 
     //	    dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15.N_RB_BWP = n_RB_DLBWP;
 	    
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 43f43922a8a74b2e8cf97df76149fd3375605ef0..f6b65654a9bfece0442036d375bc4871658deaf4 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -117,13 +117,6 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
 
   if (is_nr_UL_slot(mac->scc, ul_info->slot_tx) && get_softmodem_params()->do_ra){
     nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx);
-    if (mac->generate_nr_prach){
-      //uint16_t monitoring_slot_period, monitoring_offset;
-      uint16_t rach_frame = mac->scheduled_response.ul_config->sfn;
-      uint16_t rx_rach_frame = (rach_frame + mac->RA_offset) % MAX_FRAME_NUMBER; // compensate 2 frames offset delay at gNB side
-      uint16_t rach_slot  = mac->scheduled_response.ul_config->slot;
-      nr_ue_msg2_scheduler(module_id, rx_rach_frame, rach_slot, &mac->msg2_rx_frame, &mac->msg2_rx_slot);
-    }
   }
 
   switch(ret){