diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index ad8409de69db0484f684c48ed49236a01adf42ff..f0fbcf21166f7e2a465109eeb70bf7466d7515c7 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -367,12 +367,18 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
       NR_RA_t *ra = &RC.nrmac[Mod_idP]->common_channels[CC_id].ra[0];
       ra->state = RA_IDLE;
       ra->secondaryCellGroup = secondaryCellGroup;
-      ra->crnti = rnti;
-      uint8_t num_preamble = secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list.count;
-      ra->preambles.num_preambles = num_preamble;
-      ra->preambles.preamble_list = (uint8_t *) malloc(num_preamble*sizeof(uint8_t));
-      for (int i = 0; i < num_preamble; i++)
-        ra->preambles.preamble_list[i] = secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra->resources.choice.ssb->ssb_ResourceList.list.array[i]->ra_PreambleIndex;
+      if (secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated!=NULL) {
+        if (secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra != NULL) {
+          ra->cfra = true;
+          ra->rnti = rnti;
+          struct NR_CFRA cfra = *secondaryCellGroup->spCellConfig->reconfigurationWithSync->rach_ConfigDedicated->choice.uplink->cfra;
+          uint8_t num_preamble = cfra.resources.choice.ssb->ssb_ResourceList.list.count;
+          ra->preambles.num_preambles = num_preamble;
+          ra->preambles.preamble_list = (uint8_t *) malloc(num_preamble*sizeof(uint8_t));
+          for (int i = 0; i < num_preamble; i++)
+            ra->preambles.preamble_list[i] = cfra.resources.choice.ssb->ssb_ResourceList.list.array[i]->ra_PreambleIndex;
+        }
+      }
       LOG_I(PHY,"Added new RA process for UE RNTI %04x with initial secondaryCellGroup\n", rnti);
     } else { // secondaryCellGroup has been updated
       const int UE_id = find_nr_UE_id(Mod_idP,rnti);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 413727b9cb89c35f2e6c4e971b2c15d9633d7a8c..3e901329e77ad55de78b8f13f9417b68c4a03cf1 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -308,16 +308,17 @@ void nr_initiate_ra_proc(module_id_t module_idP,
 
     LOG_D(MAC, "%s() Msg2[%04d%d] SFN/SF:%04d%d\n", __FUNCTION__, ra->Msg2_frame, ra->Msg2_slot, frameP, slotP);
 
-    do {
-      ra->rnti = (taus() % 65518) + 1;
-      loop++;
-    }
-    while (loop != 100 && !(find_nr_UE_id(module_idP, ra->rnti) == -1 && ra->rnti >= 1 && ra->rnti <= 65519));
-    if (loop == 100) {
-      LOG_E(MAC,"%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
-      abort();
+    if (!ra->cfra) {
+      do {
+        ra->rnti = (taus() % 65518) + 1;
+        loop++;
+      }
+      while (loop != 100 && !(find_nr_UE_id(module_idP, ra->rnti) == -1 && ra->rnti >= 1 && ra->rnti <= 65519));
+      if (loop == 100) {
+        LOG_E(MAC,"%s:%d:%s: [RAPROC] initialisation random access aborted\n", __FILE__, __LINE__, __FUNCTION__);
+        abort();
+      }
     }
-
     ra->RA_rnti = ra_rnti;
     ra->preamble_index = preamble_index;
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 5f9d5d8a1058a8745621ed9d6fd73a51316ba65c..181d5a09a7c3c333a3e1be466c49b08d98eda808 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -864,7 +864,8 @@ void schedule_fapi_ul_pdu(int Mod_idP,
    * conditions might exclude each other and never be true */
   const int slot_idx = (slotP + K2) % num_slots_per_tdd;
   if (is_xlsch_in_slot(ulsch_in_slot_bitmap, slot_idx)
-        && (!get_softmodem_params()->phy_test || slot_idx == 8)) {
+      && (!get_softmodem_params()->phy_test || slot_idx == 8)) {
+
     nfapi_nr_ul_dci_request_t *UL_dci_req = &RC.nrmac[Mod_idP]->UL_dci_req[0];
     UL_dci_req->SFN = frameP;
     UL_dci_req->Slot = slotP;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index a686215fd58640484d26deabd48206427430fc09..3b71be87646bd42bce4bea8e0b355dc97534d0e9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -1684,6 +1684,7 @@ void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti)
   NR_UE_info_t *UE_info = &RC.nrmac[mod_id]->UE_info;
 
   for (i = 0; i < MAX_MOBILES_PER_GNB; i++) {
+
     if (UE_info->active[i] != TRUE)
       continue;
     if (UE_info->rnti[i] != rnti)
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index a3dc3872c4a2e3a6847b30bde27f4d061d5b9506..d1f5b190442ba7dc8e66e8b8f890258bd0c7f9fe 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -322,6 +322,41 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
   UE_info = &gNB_mac->UE_info;
   int target_snrx10 = gNB_mac->pusch_target_snrx10;
 
+  NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[0];
+
+  // random access pusch with TC-RNTI
+  if (ra->state == WAIT_Msg3) {
+    if (sduP != NULL) { // if the CRC passed
+
+      if (ra->rnti != current_rnti) {
+        LOG_E(MAC,
+              "expected TC-RNTI %04x to match current RNTI %04x\n",
+              ra->rnti,
+              current_rnti);
+        return;
+      }
+      free(ra->preambles.preamble_list);
+      ra->state = RA_IDLE;
+      LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti);
+      const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->rnti);
+      UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
+      struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
+      AssertFatal(bwpList->list.count == 1,
+                  "downlinkBWP_ToAddModList has %d BWP!\n",
+                  bwpList->list.count);
+      const int bwp_id = 1;
+      UE_info->UE_sched_ctrl[UE_id].active_bwp = bwpList->list.array[bwp_id - 1];
+      LOG_I(MAC,
+            "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
+            "adding UE MAC Context UE_id %d/RNTI %04x\n",
+            gnb_mod_idP,
+            current_rnti,
+            UE_id,
+            ra->rnti);
+    }
+    return;
+  }
+
   if (UE_id != -1) {
     UE_scheduling_control = &(UE_info->UE_sched_ctrl[UE_id]);
 
@@ -366,44 +401,5 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
 
     }
   }
-  else if (sduP != NULL) { // if the CRC passed
-    // random access pusch with TC-RNTI
-    NR_RA_t *ra = &gNB_mac->common_channels[CC_idP].ra[0];
-    if (ra->state != WAIT_Msg3) {
-      LOG_E(MAC,
-            "expected RA state WAIT_Msg3/%d (but is %d) for RA-RNTI %04x\n",
-            WAIT_Msg3,
-            ra->state,
-            ra->rnti);
-      return;
-    }
-    if (ra->rnti != current_rnti) {
-      LOG_E(MAC,
-            "expected RA-RNTI %04x (C-RNTI %04x) to match current RNTI %04x\n",
-            ra->rnti,
-            ra->crnti,
-            current_rnti);
-      return;
-    }
-    free(ra->preambles.preamble_list);
-    ra->state = RA_IDLE;
-    LOG_I(MAC, "reset RA state information for RA-RNTI %04x\n", ra->rnti);
-    const int UE_id = add_new_nr_ue(gnb_mod_idP, ra->crnti);
-    UE_info->secondaryCellGroup[UE_id] = ra->secondaryCellGroup;
-    struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList =
-        ra->secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList;
-    AssertFatal(bwpList->list.count == 1,
-                "downlinkBWP_ToAddModList has %d BWP!\n",
-                bwpList->list.count);
-    const int bwp_id = 1;
-    UE_info->UE_sched_ctrl[UE_id].active_bwp = bwpList->list.array[bwp_id - 1];
-    LOG_W(MAC,
-          "[gNB %d][RAPROC] PUSCH with TC_RNTI %x received correctly, "
-          "adding UE MAC Context UE_id %d/RNTI %04x\n",
-          gnb_mod_idP,
-          current_rnti,
-          UE_id,
-          ra->crnti);
-  }
 }
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 0ed64a962129fd549e5fd6ad93605447906659e7..937726f0a2a2e4e16b1f440456550f7775a033b9 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -152,6 +152,8 @@ typedef struct {
   NR_preamble_ue_t preambles;
   /// NSA: the UEs C-RNTI to use
   rnti_t crnti;
+  /// CFRA flag
+  bool cfra;
 } NR_RA_t;
 
 /*! \brief gNB common channels */