diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 4c17ee3a0fb9c73e3b57e08792a5d93efc4aadc9..7ada7fd53784759b58ed6f89491b82e916f98cf0 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -681,7 +681,31 @@ void nr_generate_Msg2(module_id_t module_idP,
 	  dci_pdu_rel15[0].mcs,
 	  dci_pdu_rel15[0].tb_scaling);
 
-    nr_configure_pdcch(nr_mac, pdcch_pdu_rel15, RA_rnti, 0, ss, scc, bwp);
+    uint8_t nr_of_candidates, aggregation_level;
+    find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
+    NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 0 /* common */);
+    int CCEIndex = allocate_nr_CCEs(
+        nr_mac,
+        bwp,
+        coreset,
+        aggregation_level,
+        ss->searchSpaceType->present - 1, // 0 common, 1 ue-specific
+        UE_id,
+        0); // m
+
+    if (CCEIndex < 0) {
+      LOG_E(MAC, "%s(): cannot find free CCE for UE %d!\n", __func__, UE_id);
+      return;
+    }
+    nr_configure_pdcch(nr_mac,
+                       pdcch_pdu_rel15,
+                       RA_rnti,
+                       ss,
+                       coreset,
+                       scc,
+                       bwp,
+                       aggregation_level,
+                       CCEIndex);
 
     LOG_I(MAC, "Frame %d: Subframe %d : Adding common DL DCI for RA_RNTI %x\n", frameP, slotP, RA_rnti);
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index c739cef04fb39340b14cf8d0385c6d7684baa710..206cf544de93d280db18822e6299460ad35c85b3 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -447,18 +447,37 @@ void nr_schedule_ue_spec(module_id_t module_id,
         rlc_status.bytes_in_buffer);
 
   /* PREPROCESSOR */
-  /* Find PUCCH occasion */
-  int pucch_sched;
-  nr_update_pucch_scheduling(module_id, UE_id, frame, slot, num_slots_per_tdd, &pucch_sched);
-  NR_sched_pucch *pucch = &UE_list->UE_sched_ctrl[UE_id].sched_pucch[pucch_sched];
-
-  /* BWP and following: for MCS calculation, possibly based on CQI and RLC ind */
+  /* BWP */
   const int bwp_id = 1;
   NR_CellGroupConfig_t *secondaryCellGroup = UE_list->secondaryCellGroup[UE_id];
   AssertFatal(secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count == 1,
               "downlinkBWP_ToAddModList has %d BWP!\n",
               secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count);
   NR_BWP_Downlink_t *bwp = secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id - 1];
+
+  const int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
+  NR_SearchSpace_t *ss = get_searchspace(bwp, target_ss);
+
+  /* Find a free CCE */
+  uint8_t nr_of_candidates, aggregation_level;
+  find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
+  NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
+  int CCEIndex = allocate_nr_CCEs(gNB_mac,
+                                  bwp,
+                                  coreset,
+                                  aggregation_level,
+                                  ss->searchSpaceType->present - 1,
+                                  UE_id,
+                                  0); // m
+  if (CCEIndex < 0) {
+    LOG_E(MAC, "%s(): could not find CCE for UE %d\n", __func__, UE_id);
+    return;
+  }
+  /* Find PUCCH occasion */
+  int pucch_sched;
+  nr_update_pucch_scheduling(module_id, UE_id, frame, slot, num_slots_per_tdd, &pucch_sched);
+  NR_sched_pucch *pucch = &UE_list->UE_sched_ctrl[UE_id].sched_pucch[pucch_sched];
+
   const uint16_t bwpSize = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
 
   const uint8_t mcs = 9;
@@ -601,6 +620,8 @@ void nr_schedule_ue_spec(module_id_t module_id,
   nr_fill_nfapi_dl_pdu(module_id,
                        UE_id,
                        bwp_id,
+                       ss,
+                       coreset,
                        dl_req,
                        pucch,
                        nrOfLayers,
@@ -615,7 +636,9 @@ void nr_schedule_ue_spec(module_id_t module_id,
                        TBS,
                        time_domain_assignment,
                        startSymbolIndex,
-                       nrOfSymbols);
+                       nrOfSymbols,
+                       aggregation_level,
+                       CCEIndex);
 
   nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[gNB_mac->TX_req[CC_id].Number_of_PDUs];
   configure_fapi_dl_Tx(module_id,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 069e6cf486ef51d3130d2efbd1f4caa7da479a67..a34d004c41438b293c802e310881d47ec5372b73 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -414,18 +414,31 @@ int configure_fapi_dl_pdu_phytest(int Mod_idP,
   }
   AssertFatal(found==1,"Couldn't find an adequate searchspace\n");
 
-  int ret = nr_configure_pdcch(nr_mac,
-                               pdcch_pdu_rel15,
-                               UE_list->rnti[UE_id],
-		               1, // ue-specific
-		               ss,
-		               scc,
-		               bwp);
-  if (ret < 0) {
-   LOG_I(MAC,"CCE list not empty, couldn't schedule PDSCH\n");
-   free(dci_pdu_rel15);
-   return (0);
+  uint8_t nr_of_candidates, aggregation_level;
+  find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
+  NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
+  int CCEIndex = allocate_nr_CCEs(
+      nr_mac,
+      bwp,
+      coreset,
+      aggregation_level,
+      ss->searchSpaceType->present - 1, // 0 common, 1 ue-specific
+      UE_id,
+      0); // m
+  if (CCEIndex < 0) {
+    LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PDSCH\n", __func__);
+    free(dci_pdu_rel15);
+    return 0;
   }
+  nr_configure_pdcch(nr_mac,
+                     pdcch_pdu_rel15,
+                     UE_list->rnti[UE_id],
+                     ss,
+                     coreset,
+                     scc,
+                     bwp,
+                     aggregation_level,
+                     CCEIndex);
 
   int dci_formats[2];
   int rnti_types[2];
@@ -1098,20 +1111,33 @@ void schedule_fapi_ul_pdu(int Mod_idP,
 
     LOG_D(MAC,"Configuring ULDCI/PDCCH in %d.%d\n", frameP,slotP);
 
-    int ret = nr_configure_pdcch(nr_mac,
-                                 pdcch_pdu_rel15,
-                                 UE_list->rnti[UE_id],
-                                 1, // ue-specific,
-                                 ss,
-		                 scc,
-		                 bwp);
-
-    if (ret < 0) {
-      LOG_I(MAC,"CCE list not empty, couldn't schedule PUSCH\n");
+    uint8_t nr_of_candidates, aggregation_level;
+    find_aggregation_candidates(&aggregation_level, &nr_of_candidates, ss);
+    NR_ControlResourceSet_t *coreset = get_coreset(bwp, ss, 1 /* dedicated */);
+    int CCEIndex = allocate_nr_CCEs(
+        nr_mac,
+        bwp,
+        coreset,
+        aggregation_level,
+        ss->searchSpaceType->present - 1, // 0 common, 1 ue-specific
+        UE_id,
+        0); // m
+    if (CCEIndex < 0) {
+      LOG_E(MAC, "%s(): CCE list not empty, couldn't schedule PUSCH\n", __func__);
       pusch_sched->active = false;
       return;
     }
     else {
+      nr_configure_pdcch(nr_mac,
+                         pdcch_pdu_rel15,
+                         UE_list->rnti[UE_id],
+                         ss,
+                         coreset,
+                         scc,
+                         bwp,
+                         aggregation_level,
+                         CCEIndex);
+
       dci_pdu_rel15_t *dci_pdu_rel15 = calloc(MAX_DCI_CORESET,sizeof(dci_pdu_rel15_t));
       config_uldci(ubwp,pusch_pdu,pdcch_pdu_rel15,&dci_pdu_rel15[0],dci_formats,rnti_types,time_domain_assignment,UE_list->UE_sched_ctrl[UE_id].tpc0,n_ubwp,bwp_id);
       fill_dci_pdu_rel15(scc,secondaryCellGroup,pdcch_pdu_rel15,dci_pdu_rel15,dci_formats,rnti_types,pusch_pdu->bwp_size,bwp_id);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 72e2affdc81ee9f84a003c5cc374218c38fa5d7c..77d4b3be1bd21967f11d3165c93496524387276d 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -127,37 +127,65 @@ static inline uint8_t get_max_cces(uint8_t scs) {
   return (nr_max_number_of_cces_per_slot[scs]);
 } 
 
+NR_ControlResourceSet_t *get_coreset(NR_BWP_Downlink_t *bwp,
+                                     NR_SearchSpace_t *ss,
+                                     int ss_type) {
+  NR_ControlResourceSetId_t coreset_id = *ss->controlResourceSetId;
+  if (ss_type == 0) { // common search space
+    AssertFatal(coreset_id != 0, "coreset0 currently not supported\n");
+    NR_ControlResourceSet_t *coreset = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
+    AssertFatal(coreset_id == coreset->controlResourceSetId,
+                "ID of common ss coreset does not correspond to id set in the "
+                "search space\n");
+    return coreset;
+  } else {
+    const int n = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.count;
+    for (int i = 0; i < n; i++) {
+      NR_ControlResourceSet_t *coreset =
+          bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[i];
+      if (coreset_id == coreset->controlResourceSetId) {
+        return coreset;
+      }
+    }
+    AssertFatal(0, "Couldn't find coreset with id %ld\n", coreset_id);
+  }
+}
+
+NR_SearchSpace_t *get_searchspace(
+    NR_BWP_Downlink_t *bwp,
+    NR_SearchSpace__searchSpaceType_PR target_ss) {
+  DevAssert(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList);
+  DevAssert(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count > 0);
+
+  const int n = bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;
+  for (int i=0;i<n;i++) {
+    NR_SearchSpace_t *ss = bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
+    AssertFatal(ss->controlResourceSetId != NULL, "ss->controlResourceSetId is null\n");
+    AssertFatal(ss->searchSpaceType != NULL, "ss->searchSpaceType is null\n");
+    if (ss->searchSpaceType->present == target_ss) {
+      return ss;
+    }
+  }
+  AssertFatal(0, "Couldn't find an adequate searchspace\n");
+}
+
 int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
-		     int bwp_id,
-		     int list_id,
-		     int aggregation,
-		     int search_space, // 0 common, 1 ue-specific
-		     int UE_id,
-		     int m) {
+                     NR_BWP_Downlink_t *bwp,
+                     NR_ControlResourceSet_t *coreset,
+                     int aggregation,
+                     int search_space, // 0 common, 1 ue-specific
+                     int UE_id,
+                     int m) {
   // uncomment these when we allocate for common search space
   //  NR_COMMON_channels_t                *cc      = nr_mac->common_channels;
   //  NR_ServingCellConfigCommon_t        *scc     = cc->ServingCellConfigCommon;
 
   NR_UE_list_t *UE_list = &nr_mac->UE_list;
 
-  NR_BWP_Downlink_t *bwp;
-  NR_CellGroupConfig_t *secondaryCellGroup;
-
-  NR_ControlResourceSet_t *coreset;
-
   AssertFatal(UE_list->active[UE_id] >=0,"UE_id %d is not active\n",UE_id);
-  secondaryCellGroup = UE_list->secondaryCellGroup[UE_id];
-  bwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1];
-
-  if (search_space == 1) {
-    coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[list_id];
-  }
-  else {
-    coreset = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
-  }
 
   int coreset_id = coreset->controlResourceSetId;
-  int *cce_list = nr_mac->cce_list[bwp_id][coreset_id];
+  int *cce_list = nr_mac->cce_list[bwp->bwp_Id][coreset_id];
 
   int n_rb=0;
   for (int i=0;i<6;i++)
@@ -410,6 +438,8 @@ void nr_configure_css_dci_initial(nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
 void nr_fill_nfapi_dl_pdu(int Mod_idP,
                           int UE_id,
                           int bwp_id,
+                          NR_SearchSpace_t *ss,
+                          NR_ControlResourceSet_t *coreset,
                           nfapi_nr_dl_tti_request_body_t *dl_req,
                           NR_sched_pucch *pucch_sched,
                           int nrOfLayers,
@@ -424,7 +454,9 @@ void nr_fill_nfapi_dl_pdu(int Mod_idP,
                           uint32_t TBS,
                           int time_domain_assignment,
                           int StartSymbolIndex,
-                          int NrOfSymbols) {
+                          int NrOfSymbols,
+                          uint8_t aggregation_level,
+                          int CCEIndex) {
   gNB_MAC_INST                        *nr_mac  = RC.nrmac[Mod_idP];
   NR_COMMON_channels_t                *cc      = nr_mac->common_channels;
   NR_ServingCellConfigCommon_t        *scc     = cc->ServingCellConfigCommon;
@@ -561,37 +593,15 @@ void nr_fill_nfapi_dl_pdu(int Mod_idP,
         dci_pdu_rel15[0].ndi,
         dci_pdu_rel15[0].rv);
 
-  NR_SearchSpace_t *ss;
-  int target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
-
-  AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList!=NULL,"searchPsacesToAddModList is null\n");
-  AssertFatal(bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count>0,
-              "searchPsacesToAddModList is empty\n");
-
-  int found=0;
-
-  for (int i=0;i<bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.count;i++) {
-    ss=bwp->bwp_Dedicated->pdcch_Config->choice.setup->searchSpacesToAddModList->list.array[i];
-    AssertFatal(ss->controlResourceSetId != NULL,"ss->controlResourceSetId is null\n");
-    AssertFatal(ss->searchSpaceType != NULL,"ss->searchSpaceType is null\n");
-    if (ss->searchSpaceType->present == target_ss) {
-      found=1;
-      break;
-    }
-  }
-  AssertFatal(found==1,"Couldn't find an adequate searchspace\n");
-
-  int ret = nr_configure_pdcch(nr_mac,
-                               pdcch_pdu_rel15,
-                               UE_list->rnti[UE_id],
-                               1, // ue-specific
-                               ss,
-                               scc,
-                               bwp);
-  if (ret < 0) {
-   LOG_I(MAC,"CCE list not empty, couldn't schedule PDSCH\n");
-   return 0;
-  }
+  nr_configure_pdcch(nr_mac,
+                     pdcch_pdu_rel15,
+                     UE_list->rnti[UE_id],
+                     ss,
+                     coreset,
+                     scc,
+                     bwp,
+                     aggregation_level,
+                     CCEIndex);
 
   int dci_formats[2];
   int rnti_types[2];
@@ -643,44 +653,16 @@ void nr_fill_nfapi_dl_pdu(int Mod_idP,
         TBS);
 }
 
-int nr_configure_pdcch(gNB_MAC_INST *nr_mac,
-                       nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
-                       uint16_t rnti,
-                       int ss_type,
-                       NR_SearchSpace_t *ss,
-                       NR_ServingCellConfigCommon_t *scc,
-                       NR_BWP_Downlink_t *bwp){
-
-  int CCEIndex = -1;
-  int cid = 0;
-  NR_ControlResourceSet_t *coreset = NULL;
-
+void nr_configure_pdcch(gNB_MAC_INST *nr_mac,
+                        nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
+                        uint16_t rnti,
+                        NR_SearchSpace_t *ss,
+                        NR_ControlResourceSet_t *coreset,
+                        NR_ServingCellConfigCommon_t *scc,
+                        NR_BWP_Downlink_t *bwp,
+                        uint8_t aggregation_level,
+                        int CCEIndex) {
   if (bwp) { // This is not the InitialBWP
-    NR_ControlResourceSet_t *temp_coreset;
-    NR_ControlResourceSetId_t coresetid = *ss->controlResourceSetId;
-    if (ss_type == 0) { // common search space
-      if (coresetid == 0){
-        AssertFatal(1==0,"coreset0 currently not supported\n");
-      }
-      else {
-        coreset = bwp->bwp_Common->pdcch_ConfigCommon->choice.setup->commonControlResourceSet;
-        AssertFatal(coresetid==coreset->controlResourceSetId,"ID of common ss coreset does not correspond to id set in the search space\n");
-      }
-    }
-    else {
-      int n_list = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.count;
-      for (int i=0; i<n_list; i++) {
-        temp_coreset = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[i];
-        if (coresetid==temp_coreset->controlResourceSetId) {
-          coreset = temp_coreset;
-          cid = i;
-          break;
-        }
-      }
-      if(coreset==NULL)
-        AssertFatal(1==0,"Couldn't find coreset with id %ld\n",coresetid);
-    }
-    
     pdcch_pdu->BWPSize  = NRRIV2BW(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
     pdcch_pdu->BWPStart = NRRIV2PRBOFFSET(bwp->bwp_Common->genericParameters.locationAndBandwidth,275);
     pdcch_pdu->SubcarrierSpacing = bwp->bwp_Common->genericParameters.subcarrierSpacing;
@@ -743,22 +725,6 @@ int nr_configure_pdcch(gNB_MAC_INST *nr_mac,
       pdcch_pdu->dci_pdu.ScramblingRNTI[pdcch_pdu->numDlDci]=0;
     }
 
-    uint8_t nr_of_candidates,aggregation_level;
-    find_aggregation_candidates(&aggregation_level,
-                               &nr_of_candidates,
-                               ss);
-
-    CCEIndex = allocate_nr_CCEs(nr_mac,
-                                1, // bwp_id
-                                cid,
-                                aggregation_level,
-                                ss->searchSpaceType->present-1, // search_space, 0 common, 1 ue-specific
-                                0, // UE-id
-                                0); // m
-
-    if (CCEIndex<0)
-     return (CCEIndex);
-
     pdcch_pdu->dci_pdu.AggregationLevel[pdcch_pdu->numDlDci] = aggregation_level;
     pdcch_pdu->dci_pdu.CceIndex[pdcch_pdu->numDlDci] = CCEIndex;
 
@@ -767,7 +733,6 @@ int nr_configure_pdcch(gNB_MAC_INST *nr_mac,
 
     pdcch_pdu->dci_pdu.powerControlOffsetSS[pdcch_pdu->numDlDci]=1;
     pdcch_pdu->numDlDci++;
-    return (0);
   }
   else { // this is for InitialBWP
     AssertFatal(1==0,"Fill in InitialBWP PDCCH configuration\n");
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 76ec3c677257a0041056ab645d30b11f4b2664cf..a67e2d3912a602a9711ff56cbeabe80a15c394cc 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -132,6 +132,8 @@ void nr_schedule_css_dlsch_phytest(module_id_t   module_idP,
 void nr_fill_nfapi_dl_pdu(int Mod_id,
                           int UE_id,
                           int bwp_id,
+                          NR_SearchSpace_t *ss,
+                          NR_ControlResourceSet_t *coreset,
                           nfapi_nr_dl_tti_request_body_t *dl_req,
                           NR_sched_pucch *pucch_sched,
                           int nrOfLayers,
@@ -146,7 +148,9 @@ void nr_fill_nfapi_dl_pdu(int Mod_id,
                           uint32_t tbs,
                           int time_domain_assignment,
                           int StartSymbolIndex,
-                          int NrOfSymbols);
+                          int NrOfSymbols,
+                          uint8_t aggregation_level,
+                          int CCEIndex);
 
 int configure_fapi_dl_pdu_phytest(int Mod_id,
                                   nfapi_nr_dl_tti_request_body_t *dl_req,
@@ -233,13 +237,15 @@ void find_search_space(int ss_type,
                        NR_BWP_Downlink_t *bwp,
                        NR_SearchSpace_t *ss);
 
-int nr_configure_pdcch(gNB_MAC_INST *nr_mac,
-                       nfapi_nr_dl_tti_pdcch_pdu_rel15_t* pdcch_pdu,
-                       uint16_t rnti,
-                       int ss_type,
-                       NR_SearchSpace_t *ss,
-                       NR_ServingCellConfigCommon_t *scc,
-                       NR_BWP_Downlink_t *bwp);
+void nr_configure_pdcch(gNB_MAC_INST *nr_mac,
+                        nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu,
+                        uint16_t rnti,
+                        NR_SearchSpace_t *ss,
+                        NR_ControlResourceSet_t *coreset,
+                        NR_ServingCellConfigCommon_t *scc,
+                        NR_BWP_Downlink_t *bwp,
+                        uint8_t aggregation_level,
+                        int CCEIndex);
 
 void fill_dci_pdu_rel15(NR_ServingCellConfigCommon_t *scc,
                         NR_CellGroupConfig_t *secondaryCellGroup,
@@ -255,6 +261,16 @@ void prepare_dci(NR_CellGroupConfig_t *secondaryCellGroup,
                  nr_dci_format_t format,
                  int bwp_id);
 
+/* find coreset within the search space */
+NR_ControlResourceSet_t *get_coreset(NR_BWP_Downlink_t *bwp,
+                                     NR_SearchSpace_t *ss,
+                                     int ss_type);
+
+/* find a search space within a BWP */
+NR_SearchSpace_t *get_searchspace(
+    NR_BWP_Downlink_t *bwp,
+    NR_SearchSpace__searchSpaceType_PR target_ss);
+
 void find_aggregation_candidates(uint8_t *aggregation_level,
                                  uint8_t *nr_of_candidates,
                                  NR_SearchSpace_t *ss);
@@ -290,13 +306,12 @@ int add_new_nr_ue(module_id_t mod_idP, rnti_t rntiP);
 void mac_remove_nr_ue(module_id_t mod_id, rnti_t rnti);
 
 int allocate_nr_CCEs(gNB_MAC_INST *nr_mac,
-                     int bwp_id,
-                     int coreset_id,
+                     NR_BWP_Downlink_t *bwp,
+                     NR_ControlResourceSet_t *coreset,
                      int aggregation,
                      int search_space, // 0 common, 1 ue-specific
                      int UE_id,
-                     int m
-                     );
+                     int m);
 
 int get_dlscs(nfapi_nr_config_request_t *cfg);