diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index be2d03d0dbc331f25a7e05f87b5ef22fbee67817..70a06d472745b17c3a10393fcadcf955d8767be7 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -1089,6 +1089,11 @@ int nr_srs_channel_estimation(PHY_VARS_gNB *gNB,
   LOG_I(NR_PHY,"signal_power = %u\n", *signal_power);
 #endif
 
+  if (*signal_power == 0) {
+    LOG_W(NR_PHY, "Received SRS signal power is 0\n");
+    return -1;
+  }
+
   // Compute noise power
 
   uint8_t signal_power_bits = log2_approx(*signal_power);
diff --git a/openair1/PHY/NR_TRANSPORT/srs_rx.c b/openair1/PHY/NR_TRANSPORT/srs_rx.c
index 2d7aefdee082b5b6baeb03e104de8a828aaf791f..ffcd7362f3661ca443a5dea01ccdb9c6c51fa223 100644
--- a/openair1/PHY/NR_TRANSPORT/srs_rx.c
+++ b/openair1/PHY/NR_TRANSPORT/srs_rx.c
@@ -113,6 +113,7 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
   uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size;
 
   int32_t *rx_signal;
+  bool no_srs_signal = true;
   for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++) {
 
     memset(srs_received_signal[ant], 0, frame_parms->ofdm_symbol_size*sizeof(int32_t));
@@ -121,6 +122,10 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
     for(int sc_idx = 0; sc_idx < nr_srs_info->sc_list_length; sc_idx++) {
       srs_received_signal[ant][nr_srs_info->sc_list[sc_idx]] = rx_signal[nr_srs_info->sc_list[sc_idx]];
 
+      if (rx_signal[nr_srs_info->sc_list[sc_idx]] != 0) {
+        no_srs_signal = false;
+      }
+
 #ifdef SRS_DEBUG
       uint64_t subcarrier_offset = frame_parms->first_carrier_offset + srs_pdu->bwp_start*12;
       int subcarrier_log = nr_srs_info->sc_list[sc_idx]-subcarrier_offset;
@@ -140,5 +145,11 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
 #endif
     }
   }
-  return 0;
+
+  if (no_srs_signal) {
+    LOG_W(NR_PHY, "No SRS signal\n");
+    return -1;
+  } else {
+    return 0;
+  }
 }
\ No newline at end of file
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 84370f2509a6fd10e8a4416d4c52ccc4edfc8c97..a8e5f84d9c0bb460778d8ff52a54467d782a33c9 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -636,7 +636,8 @@ void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
 int fill_srs_reported_symbol_list(nfapi_nr_srs_indication_reported_symbol_t* reported_symbol_list,
                                   nfapi_nr_srs_pdu_t *srs_pdu,
                                   int N_RB_UL,
-                                  const int8_t *snr_per_rb) {
+                                  const int8_t *snr_per_rb,
+                                  int srs_est) {
 
   reported_symbol_list->num_rbs = srs_bandwidth_config[srs_pdu->config_index][srs_pdu->bandwidth_index][0];
 
@@ -645,10 +646,12 @@ int fill_srs_reported_symbol_list(nfapi_nr_srs_indication_reported_symbol_t* rep
   }
 
   for(int rb = 0; rb < reported_symbol_list->num_rbs; rb++) {
-    if (snr_per_rb[rb] < -64) {
+    if (srs_est<0) {
+      reported_symbol_list->rb_list[rb].rb_snr = 0xFF;
+    } else if (snr_per_rb[rb] < -64) {
       reported_symbol_list->rb_list[rb].rb_snr = 0;
     } else if (snr_per_rb[rb] > 63) {
-      reported_symbol_list->rb_list[rb].rb_snr = 255;
+      reported_symbol_list->rb_list[rb].rb_snr = 0xFE;
     } else {
       reported_symbol_list->rb_list[rb].rb_snr = (snr_per_rb[rb] + 64)<<1;
     }
@@ -858,20 +861,22 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
           generate_srs_nr(srs_pdu, &gNB->frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx);
         }
 
-        nr_get_srs_signal(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], gNB->nr_srs_info[i]->srs_received_signal);
-
-        nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu,
-                                  gNB->nr_srs_info[i],
-                                  gNB->nr_srs_info[i]->srs_generated_signal,
-                                  gNB->nr_srs_info[i]->srs_received_signal,
-                                  gNB->nr_srs_info[i]->srs_estimated_channel_freq,
-                                  gNB->nr_srs_info[i]->srs_estimated_channel_time,
-                                  gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted,
-                                  gNB->nr_srs_info[i]->signal_power,
-                                  gNB->nr_srs_info[i]->noise_power_per_rb,
-                                  gNB->nr_srs_info[i]->noise_power,
-                                  gNB->nr_srs_info[i]->snr_per_rb,
-                                  gNB->nr_srs_info[i]->snr);
+        int srs_est = nr_get_srs_signal(gNB,frame_rx,slot_rx,srs_pdu, gNB->nr_srs_info[i], gNB->nr_srs_info[i]->srs_received_signal);
+
+        if (srs_est >= 0) {
+          nr_srs_channel_estimation(gNB,frame_rx,slot_rx,srs_pdu,
+                                    gNB->nr_srs_info[i],
+                                    gNB->nr_srs_info[i]->srs_generated_signal,
+                                    gNB->nr_srs_info[i]->srs_received_signal,
+                                    gNB->nr_srs_info[i]->srs_estimated_channel_freq,
+                                    gNB->nr_srs_info[i]->srs_estimated_channel_time,
+                                    gNB->nr_srs_info[i]->srs_estimated_channel_time_shifted,
+                                    gNB->nr_srs_info[i]->signal_power,
+                                    gNB->nr_srs_info[i]->noise_power_per_rb,
+                                    gNB->nr_srs_info[i]->noise_power,
+                                    gNB->nr_srs_info[i]->snr_per_rb,
+                                    gNB->nr_srs_info[i]->snr);
+        }
 
         T(T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE, T_INT(0), T_INT(srs_pdu->rnti), T_INT(frame_rx), T_INT(0), T_INT(0),
           T_BUFFER(gNB->nr_srs_info[i]->srs_estimated_channel_freq[0], gNB->frame_parms.ofdm_symbol_size*sizeof(int32_t)));
@@ -887,7 +892,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
         gNB->srs_pdu_list[num_srs].rnti = srs_pdu->rnti;
         gNB->srs_pdu_list[num_srs].timing_advance = nr_est_timing_advance_srs(&gNB->frame_parms, gNB->nr_srs_info[i]->srs_estimated_channel_time);
         gNB->srs_pdu_list[num_srs].num_symbols = 1<<srs_pdu->num_symbols;
-        gNB->srs_pdu_list[num_srs].wide_band_snr = (*gNB->nr_srs_info[i]->snr + 64)<<1;
+        gNB->srs_pdu_list[num_srs].wide_band_snr = srs_est >= 0 ? (*gNB->nr_srs_info[i]->snr + 64)<<1 : 0xFF; // 0xFF will be set if this field is invalid
         gNB->srs_pdu_list[num_srs].num_reported_symbols = 1<<srs_pdu->num_symbols;
         if(!gNB->srs_pdu_list[num_srs].reported_symbol_list) {
           gNB->srs_pdu_list[num_srs].reported_symbol_list = (nfapi_nr_srs_indication_reported_symbol_t*) calloc(1, gNB->srs_pdu_list[num_srs].num_reported_symbols*sizeof(nfapi_nr_srs_indication_reported_symbol_t));
@@ -895,7 +900,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
         fill_srs_reported_symbol_list(&gNB->srs_pdu_list[num_srs].reported_symbol_list[0],
                                       srs_pdu,
                                       gNB->frame_parms.N_RB_UL,
-                                      gNB->nr_srs_info[i]->snr_per_rb);
+                                      gNB->nr_srs_info[i]->snr_per_rb,
+                                      srs_est);
 
         gNB->UL_INFO.srs_ind.number_of_pdus += 1;
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
index 8680cc25d138ca77dbd277707408223796254651..35b2c4b1674f5cb4f2f8c102a8eceaed6c480766 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
@@ -125,7 +125,8 @@ void nr_schedule_srs(int module_id, frame_t frame) {
     sched_ctrl->sched_srs.slot = -1;
     sched_ctrl->sched_srs.srs_scheduled = false;
 
-    if(!UE_info->Msg4_ACKed[UE_id] || sched_ctrl->rrc_processing_timer > 0) {
+    if((sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) ||
+       !UE_info->Msg4_ACKed[UE_id] || sched_ctrl->rrc_processing_timer > 0) {
       continue;
     }