diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 1d0c3eea2988e7af38b25380aecfecb3d368acef..195285b1877495444444061bdd7efa5bab6a4f1d 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -1390,7 +1390,6 @@ void *ru_thread( void *param ) {
       if (ru->feprx) {
         ru->feprx(ru,proc->tti_rx);
         //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
-      if (initial_wait == 0 && proc->frame_rx == 127 ) {LOG_M("rxdata.m","rxs",ru->common.rxdata[0],fp->samples_per_frame,1,1); LOG_M("rxdataF.m","rxsF",RC.gNB[0]->common_vars.rxdataF[0],fp->symbols_per_slot*fp->ofdm_symbol_size,1,1); exit(-1);}
         LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
 /*
         LOG_D(PHY,"Copying rxdataF from RU to gNB\n");
diff --git a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
index 020117adba6a495f9941a39eee38f5aee291bb0b..157c9533d007a6c4c9011d6d99cee5af308a7eb7 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
@@ -73,8 +73,9 @@ void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) {
 
     int min_I0=1000,max_I0=0;
     int amin=0,amax=0;
+    fprintf(fd,"Blacklisted PRBs %d/%d\n",gNB->num_ulprbbl,gNB->frame_parms.N_RB_UL);
     for (int i=0; i<gNB->frame_parms.N_RB_UL; i++) {
-      if (i==(gNB->frame_parms.N_RB_UL>>1) - 1) i+=2;
+      if (gNB->ulprbbl[i] > 0) continue;
 
       if (gNB->measurements.n0_subband_power_tot_dB[i]<min_I0) {min_I0 = gNB->measurements.n0_subband_power_tot_dB[i]; amin=i;}
 
@@ -82,7 +83,8 @@ void dump_nr_I0_stats(FILE *fd,PHY_VARS_gNB *gNB) {
     }
 
     for (int i=0; i<gNB->frame_parms.N_RB_UL; i++) {
-     fprintf(fd,"%2d.",gNB->measurements.n0_subband_power_tot_dB[i]-gNB->measurements.n0_subband_power_avg_dB);
+     if (gNB->ulprbbl[i] ==0) fprintf(fd,"%2d.",gNB->measurements.n0_subband_power_tot_dB[i]-gNB->measurements.n0_subband_power_avg_dB);
+     else fprintf(fd,"X ."); 
      if (i%25 == 24) fprintf(fd,"\n");
     }
     fprintf(fd,"\n");
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 9a1ba7e7805e4a92d0c46ec7cb56d67dd559cb28..55a60f7a1b6a5fd2e5f55abd0a9e5341e133f468 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -855,6 +855,8 @@ typedef struct PHY_VARS_gNB_s {
   int pusch_thres;
   int prach_thres;
   uint64_t bad_pucch;
+  int num_ulprbbl;
+  int ulprbbl[275];
   /*
   time_stats_t phy_proc;
   */
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index bc22a3602e0e1f4d5ae2d37b85325fa80bcbe968..f4a98cef64cd22d12f7f73ae9e450211aaf5658a 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -539,11 +539,18 @@ void nr_fill_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,
 void fill_ul_rb_mask(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
 
   int rb2, rb, nb_rb;
+  int prbpos=0;
   if (1/*(gNB->gNB_config.tdd_table.max_tdd_periodicity_list[slot_rx].max_num_of_symbol_per_slot_list[symbol].slot_config.value==1*/){
     nb_rb = 0;
     for (int symbol=0;symbol<14;symbol++)
-      for (int m=0;m<9;m++) gNB->rb_mask_ul[symbol][m] = 0;
-
+      for (int m=0;m<9;m++) {
+        gNB->rb_mask_ul[symbol][m] = 0;
+        for (int i=0;i<32;i++) {
+          prbpos = (m*32)+i;
+          if (prbpos>gNB->frame_parms.N_RB_UL) break;
+          gNB->rb_mask_ul[symbol][m] |= (gNB->ulprbbl[prbpos]>0 ? 1 : 0)<<i;
+        }
+      }
     for (int i=0;i<NUMBER_OF_NR_PUCCH_MAX;i++){
       NR_gNB_PUCCH_t *pucch = gNB->pucch[i];
       if (pucch) {
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 209cdd255dca697aface5b4a6a9bded002e0954a..8d15fc34456f720e59e04b9d2c8080890ee5f708 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -549,6 +549,31 @@ void RCconfig_nr_flexran()
 
 void RCconfig_NR_L1(void) {
   int j;
+  paramdef_t GNBSParams[] = GNBSPARAMS_DESC;
+  ////////// Identification parameters
+  paramdef_t GNBParams[]  = GNBPARAMS_DESC;
+
+  paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST,NULL,0};
+
+  config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL); 
+  int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
+  AssertFatal (num_gnbs > 0,"Failed to parse config file no gnbs %s \n",GNB_CONFIG_STRING_ACTIVE_GNBS);
+  
+  config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL); 
+  char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; 
+  if (ulprbbl) LOG_I(NR_PHY,"PRB blacklist %s\n",ulprbbl);
+  char *pt = strtok(ulprbbl,",");
+  int prbbl[275];
+  int num_prbbl=0;
+  memset(prbbl,0,275*sizeof(int));
+
+  while (pt) {
+    prbbl[atoi(pt)] = 1;
+    LOG_I(NR_PHY,"Blacklisting prb %d\n",atoi(pt));
+    pt = strtok(NULL,",");
+    num_prbbl++;
+  }
+
   paramdef_t L1_Params[] = L1PARAMS_DESC;
   paramlist_def_t L1_ParamList = {CONFIG_STRING_L1_LIST,NULL,0};
 
@@ -577,6 +602,9 @@ void RCconfig_NR_L1(void) {
       RC.gNB[j]->pucch0_thres       = *(L1_ParamList.paramarray[j][L1_PUCCH0_DTX_THRESHOLD].uptr);
       RC.gNB[j]->prach_thres        = *(L1_ParamList.paramarray[j][L1_PRACH_DTX_THRESHOLD].uptr);
       RC.gNB[j]->pusch_thres        = *(L1_ParamList.paramarray[j][L1_PUSCH_DTX_THRESHOLD].uptr);
+      RC.gNB[j]->num_ulprbbl        = num_prbbl;
+      LOG_I(NR_PHY,"Copying %d blacklisted PRB to L1 context\n",num_prbbl);
+      memcpy(RC.gNB[j]->ulprbbl,prbbl,275*sizeof(int));
       if(strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "local_mac") == 0) {
         //sf_ahead = 2; // Need 4 subframe gap between RX and TX
       }else if (strcmp(*(L1_ParamList.paramarray[j][L1_TRANSPORT_N_PREFERENCE_IDX].strptr), "nfapi") == 0) {
@@ -633,9 +661,32 @@ void RCconfig_NR_L1(void) {
 void RCconfig_nr_macrlc() {
   int               j;
 
+
+  paramdef_t GNBSParams[] = GNBSPARAMS_DESC;
+  ////////// Identification parameters
+  paramdef_t GNBParams[]  = GNBPARAMS_DESC;
+
+  paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST,NULL,0};
+
+  config_get( GNBSParams,sizeof(GNBSParams)/sizeof(paramdef_t),NULL); 
+  int num_gnbs = GNBSParams[GNB_ACTIVE_GNBS_IDX].numelt;
+  AssertFatal (num_gnbs > 0,"Failed to parse config file no gnbs %s \n",GNB_CONFIG_STRING_ACTIVE_GNBS);
+  
+  config_getlist( &GNBParamList,GNBParams,sizeof(GNBParams)/sizeof(paramdef_t),NULL); 
+  char *ulprbbl = *GNBParamList.paramarray[0][GNB_ULPRBBLACKLIST_IDX].strptr; 
+  char *pt = strtok(ulprbbl,",");
+  int prbbl[275];
+  int num_prbbl=0;
+  int prb;
+  memset(prbbl,0,275*sizeof(int));
+  while (pt) {
+    prb=atoi(pt); 
+    prbbl[prb] = 1;
+    pt = strtok(NULL,",");
+    num_prbbl++;
+  }
   paramdef_t MacRLC_Params[] = MACRLCPARAMS_DESC;
   paramlist_def_t MacRLC_ParamList = {CONFIG_STRING_MACRLC_LIST,NULL,0};
-
   config_getlist( &MacRLC_ParamList,MacRLC_Params,sizeof(MacRLC_Params)/sizeof(paramdef_t), NULL);    
   
   if ( MacRLC_ParamList.numelt > 0) {
@@ -702,6 +753,8 @@ void RCconfig_nr_macrlc() {
         AssertFatal(1==0,"MACRLC %d: %s unknown southbound midhaul\n",j,*(MacRLC_ParamList.paramarray[j][MACRLC_TRANSPORT_S_PREFERENCE_IDX].strptr));
       } 
       RC.nrmac[j]->ulsch_max_slots_inactivity = *(MacRLC_ParamList.paramarray[j][MACRLC_ULSCH_MAX_SLOTS_INACTIVITY].uptr);
+      RC.nrmac[j]->num_ulprbbl = num_prbbl;
+      memcpy(RC.nrmac[j]->ulprbbl,prbbl,num_prbbl*sizeof(prbbl[0]));
     }//  for (j=0;j<RC.nb_nr_macrlc_inst;j++)
   }else {// MacRLC_ParamList.numelt > 0
     LOG_E(PHY,"No %s configuration found\n", CONFIG_STRING_MACRLC_LIST);
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 380c6890a559209977cfe07983b82e7b05c5192a..4618c009b43c41fe89d759b294a9f1eadc08aa46 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -120,7 +120,7 @@ typedef enum {
 #define GNB_CONFIG_STRING_DOCSIRS                       "do_CSIRS"
 #define GNB_CONFIG_STRING_NRCELLID                      "nr_cellid"
 #define GNB_CONFIG_STRING_MINRXTXTIMEPDSCH              "min_rxtxtime_pdsch"
-
+#define GNB_CONFIG_STRING_ULPRBBLACKLIST                "ul_prbblacklist"
 /*-----------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            cell configuration parameters                                                                */
 /*   optname                                   helpstr   paramflags    XXXptr        defXXXval                   type           numelt     */
@@ -146,7 +146,8 @@ typedef enum {
 {GNB_CONFIG_STRING_SIB1TDA,                      NULL,   0,            iptr:NULL,   defintval:0,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_DOCSIRS,                      NULL,   0,            iptr:NULL,   defintval:0,                 TYPE_INT,       0},  \
 {GNB_CONFIG_STRING_NRCELLID,                     NULL,   0,            u64ptr:NULL, defint64val:1,               TYPE_UINT64,    0},  \
-{GNB_CONFIG_STRING_MINRXTXTIMEPDSCH,             NULL,   0,            iptr:NULL,   defintval:2,                 TYPE_INT,       0}   \
+{GNB_CONFIG_STRING_MINRXTXTIMEPDSCH,             NULL,   0,            iptr:NULL,   defintval:2,                 TYPE_INT,       0},  \
+{GNB_CONFIG_STRING_ULPRBBLACKLIST,               NULL,   0,            strptr:NULL, defstrval:"",                 TYPE_STRING,   0}   \
 }															     	
 
 #define GNB_GNB_ID_IDX                  0
@@ -170,6 +171,7 @@ typedef enum {
 #define GNB_DO_CSIRS_IDX                18
 #define GNB_NRCELLID_IDX                19
 #define GNB_MINRXTXTIMEPDSCH_IDX        20
+#define GNB_ULPRBBLACKLIST_IDX          21
 
 #define TRACKING_AREA_CODE_OKRANGE {0x0001,0xFFFD}
 #define GNBPARAMS_CHECK {                                         \
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 1a3b6547278641bbda174429b815d3841bed45f6..4adbb70dafb00d5a6cdda062ab57a58eca8ddb94 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -683,6 +683,8 @@ typedef struct gNB_MAC_INST_s {
   /// current PDU index (BCH,DLSCH)
   uint16_t pdu_index[NFAPI_CC_MAX];
 
+  int num_ulprbbl;
+  int ulprbbl[275];
   /// NFAPI Config Request Structure
   nfapi_nr_config_request_scf_t     config[NFAPI_CC_MAX];
   /// NFAPI DL Config Request Structure
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 6cd7c4029f3e124931ddc086efef1d16bee4502c..7bccf66c5c77ee865fe7aec9d0d1eb181ec82ad9 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -679,44 +679,17 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
 
 #if defined(__x86_64__) || defined(__i386__)
 #ifdef __AVX2__
-      __m256i mean=_mm256_setzero_si256();
-      int16_t mean16[2];
 
-      for (int j=0; j<nsamps2<<1; j++) {
-        mean=_mm256_add_epi32(mean,_mm256_cvtepi16_epi32(((__m128i*)buff_tmp[i])[j]));        
-      }
-      mean16[0] =(int16_t)((_mm256_extract_epi32(mean,0) + _mm256_extract_epi32(mean,2) + _mm256_extract_epi32(mean,4) + _mm256_extract_epi32(mean,6))/nsamps);
-      mean16[1] =(int16_t)((_mm256_extract_epi32(mean,1) + _mm256_extract_epi32(mean,3) + _mm256_extract_epi32(mean,5) + _mm256_extract_epi32(mean,7))/nsamps);
-/*
-      LOG_I(PHY,"mean16[0] %d mean16[1] %d (%d,%d,%d,%d,%d,%d,%d,%d)\n",mean16[0],mean16[1],
-            _mm256_extract_epi32(mean,0),
-            _mm256_extract_epi32(mean,1),
-            _mm256_extract_epi32(mean,2),
-            _mm256_extract_epi32(mean,3),
-            _mm256_extract_epi32(mean,4),
-            _mm256_extract_epi32(mean,5),
-            _mm256_extract_epi32(mean,6),
-            _mm256_extract_epi32(mean,7)); */
       if ((((uintptr_t) buff[i])&0x1F)==0) {
-        mean = _mm256_set1_epi32(*(uint32_t*)mean16);// FK: in some cases the buffer might not be 32 byte aligned, so we cannot use avx2
-
         for (int j=0; j<nsamps2; j++) 
-           ((__m256i *)buff[i])[j] = _mm256_srai_epi16(_mm256_subs_epi16(buff_tmp[i][j],mean),rxshift);
+           ((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],rxshift);
       } else {
-        __m128i mean128 = _mm_set1_epi32(*(uint32_t*)mean16);
         for (int j=0; j<(nsamps2<<1); j++) 
-          ((__m128i *)buff[i])[j]  = _mm_srai_epi16(_mm_subs_epi16(((__m128i *)buff_tmp[i])[j],mean128),rxshift);
+          ((__m128i *)buff[i])[j]  = _mm_srai_epi16(((__m128i *)buff_tmp[i])[j],rxshift);
       }
 #else    
-      __m128i mean=mm_setzero_si128();
-      for (int j=0; j<nsamps2<<1; j++) {
-        mean=_mm_adds_epi32(mean,_mm_cvtepi16_epi32(((__m64*)buff_tmp[i])[j]));        
-      }
-      mean16[0] =(int16_t)(( _mm_extract_epi32(mean,0) + _mm_extract_epi32(mean,2))/nsamps);
-      mean16[1] =(int16_t)(( _mm_extract_epi32(mean,1) + _mm_extract_epi32(mean,3))/nsamps);
-      mean = _mm_set1_epi32(*(uint32_t*)mean16);
       for (int j=0; j<nsamps2; j++) 
-        ((__m128i *)buff[i])[j] = _mm_srai_epi16(_mm_subs_epi16(buff_tmp[i][j],mean),rxshift);
+        ((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],rxshift);
 #endif
 #elif defined(__arm__)
       for (int j=0; j<nsamps2; j++)