diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 405bb6ca95a1d9d38c13313b0d83523ca2eb0bfe..078b4fde24914972b40a9fcbb8e96b9c8477170f 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -742,6 +742,7 @@ typedef struct {
   uint16_t      ta_timer;
   int16_t       ta_update;
   int32_t       context_active_timer;
+  int32_t       cqi_req_timer;
   int32_t       ul_inactivity_timer;
   int32_t       ul_failure_timer;
   int32_t       ra_pdcch_order_sent;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index dbc094034b73d9da1c8e05928783bb4fdc08bd49..5f68448e6b5ccd9eedb2fb11d7e4011ee52127b0 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -127,6 +127,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
 
     // increment this, it is cleared when we receive an sdu
     eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].ul_inactivity_timer++;
+
+    eNB_mac_inst[module_idP].UE_list.UE_sched_ctrl[i].cqi_req_timer++;
     
     if (mac_xface->get_eNB_UE_stats(module_idP, CC_id, rnti)==NULL) {
       //      mac_remove_ue(module_idP, i, frameP, subframeP);
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 150071163915f7333fbbb908802ac37cfbbc04d5..69539261013dc1df6414c27bb1d6503c6f5d0c21 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -873,7 +873,14 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
           UE_template->ul_SR = 0;
           aggregation = process_ue_cqi(module_idP,UE_id); // =2 by default!!
           status = mac_eNB_get_rrc_status(module_idP,rnti);
-          cqi_req = (status < RRC_CONNECTED)? 0:1;
+	  if (status < RRC_CONNECTED)
+	    cqi_req = 0;
+	  else if (UE_list->UE_sched_ctrl[UE_id].cqi_req_timer>30) {
+	    cqi_req = 1;
+	    UE_list->UE_sched_ctrl[UE_id].cqi_req_timer=0;
+	  }
+	  else
+	    cqi_req = 0;
 
           //power control
           //compute the expected ULSCH RX power (for the stats)
@@ -918,7 +925,9 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 	    UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power;
 	    UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul;
             mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
-
+	    if ((cqi_req==1) && (mcs==20)) {
+		mcs=19;
+	    }
             if (UE_template->pre_allocated_rb_table_index_ul >=0) {
               rb_table_index=UE_template->pre_allocated_rb_table_index_ul;
             } else {
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 691542e277833824ac3dab84bc504b36612727b0..aa0c440c20c85ae3cca7e95f3d93a3204124228c 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -318,7 +318,7 @@ static LTE_DL_FRAME_PARMS      *frame_parms[MAX_NUM_CCs];
 
 int multi_thread=1;
 uint32_t target_dl_mcs = 28; //maximum allowed mcs
-uint32_t target_ul_mcs = 19;
+uint32_t target_ul_mcs = 20;
 uint32_t timing_advance = 0;
 uint8_t exit_missed_slots=1;
 uint64_t num_missed_slots=0; // counter for the number of missed slots