diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 1afb0d6c4381a6c3da289c0151de29c4412b92b8..3f721288b498f4e727e4427f6d2f0bcda7880d20 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -665,7 +665,7 @@ typedef struct {
     /// mcs from last UL scheduling
     uint8_t mcs_UL[8];
     /// TBS from last UL scheduling
-    uint8_t TBS_UL[8];
+    int TBS_UL[8];
     /// Flag to indicate UL has been scheduled at least once
     boolean_t ul_active;
     /// Flag to indicate UE has been configured (ACK from RRCConnectionSetup received)
@@ -720,9 +720,6 @@ typedef struct {
 
     // Logical channel info for link with RLC
 
-    /// Last received UE BSR info for each logical channel group id
-    uint8_t bsr_info[MAX_NUM_LCGID];
-
     /// LCGID mapping
     long lcgidmap[11];
 
@@ -749,8 +746,6 @@ typedef struct {
     /// size of remaining size to send for the downlink head SDU
     uint32_t dl_buffer_head_sdu_remaining_size_to_send[MAX_NUM_LCID];
 
-    /// total uplink buffer size 
-    uint32_t ul_total_buffer;
     /// uplink buffer creation time for each LCID
     uint32_t ul_buffer_creation_time[MAX_NUM_LCGID];
     /// maximum uplink buffer creation time across all the LCIDs
@@ -758,6 +753,11 @@ typedef struct {
     /// uplink buffer size per LCID
     uint32_t ul_buffer_info[MAX_NUM_LCGID];
 
+    /// uplink bytes that are currently scheduled
+    int scheduled_ul_bytes;
+    /// estimation of the UL buffer size
+    int estimated_ul_buffer;
+
     /// UE tx power
     int32_t ue_tx_power;
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index 4c0cabef5fa4febbae13928d8126f0e7961dcf26..1dc5db35ed3373d7a808296468cf02d9a82285ed 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -2139,14 +2139,15 @@ UE_is_to_be_scheduled(module_id_t module_idP, int CC_id, uint8_t UE_id)
   LOG_D(MAC, "[eNB %d][PUSCH] Checking UL requirements UE %d/%x\n",
 	module_idP, UE_id, UE_RNTI(module_idP, UE_id));
 
-  if ((UE_template->bsr_info[LCGID0] > 0) || (UE_template->bsr_info[LCGID1] > 0) || (UE_template->bsr_info[LCGID2] > 0) || (UE_template->bsr_info[LCGID3] > 0) || (UE_template->ul_SR > 0) ||	// uplink scheduling request
+  if ((UE_template->scheduled_ul_bytes < UE_template->estimated_ul_buffer) ||
+      (UE_template->ul_SR > 0) ||	// uplink scheduling request
       ((UE_sched_ctl->ul_inactivity_timer > 20) && (UE_sched_ctl->ul_scheduled == 0)) ||	// every 2 frames when RRC_CONNECTED
       ((UE_sched_ctl->ul_inactivity_timer > 10) && (UE_sched_ctl->ul_scheduled == 0) && (mac_eNB_get_rrc_status(module_idP, UE_RNTI(module_idP, UE_id)) < RRC_CONNECTED)))	// every Frame when not RRC_CONNECTED
     {
       LOG_D(MAC,
-	    "[eNB %d][PUSCH] UE %d/%x should be scheduled (BSR0 %d,SR %d)\n",
+	    "[eNB %d][PUSCH] UE %d/%x should be scheduled (BSR0 estimated size %d, SR %d)\n",
 	    module_idP, UE_id, UE_RNTI(module_idP, UE_id),
-	    UE_template->bsr_info[LCGID0], UE_template->ul_SR);
+	    UE_template->ul_buffer_info[LCGID0], UE_template->ul_SR);
       return (1);
     } else {
     return (0);
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 5cdd9d87713c33f41e3b4f9655b0a2d9e8abcdbe..7fe5e8ab901fadd778294cab7b1a40479d237318 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -96,10 +96,10 @@ rx_sdu(const module_id_t enb_mod_idP,
   eNB_MAC_INST *mac = RC.mac[enb_mod_idP];
   int harq_pid =
     subframe2harqpid(&mac->common_channels[CC_idP], frameP, subframeP);
+  int lcgid_updated[4] = {0, 0, 0, 0};
 
   UE_list_t *UE_list = &mac->UE_list;
   int crnti_rx = 0;
-  int old_buffer_info;
   RA_t *ra =
     (RA_t *) & RC.mac[enb_mod_idP]->common_channels[CC_idP].ra[0];
   int first_rb = 0;
@@ -149,6 +149,11 @@ rx_sdu(const module_id_t enb_mod_idP,
 			       subframeP, UE_RNTI(enb_mod_idP,
 						  UE_id));
       }
+
+      /* update scheduled bytes */
+      UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes -= UE_list->UE_template[CC_idP][UE_id].TBS_UL[harq_pid];
+      if (UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes < 0)
+        UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes = 0;
     } else {		// we've got an error
       LOG_D(MAC,
 	    "[eNB %d][PUSCH %d] CC_id %d ULSCH in error in round %d, ul_cqi %d\n",
@@ -162,6 +167,11 @@ rx_sdu(const module_id_t enb_mod_idP,
 	UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid] = 0;
 	if (UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors++ == 10)
 	  UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 1;
+
+        /* update scheduled bytes */
+        UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes -= UE_list->UE_template[CC_idP][UE_id].TBS_UL[harq_pid];
+        if (UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes < 0)
+          UE_list->UE_template[CC_idP][UE_id].scheduled_ul_bytes = 0;
       } else
 	UE_list->UE_sched_ctrl[UE_id].round_UL[CC_idP][harq_pid]++;
       return;
@@ -306,14 +316,19 @@ rx_sdu(const module_id_t enb_mod_idP,
 		enb_mod_idP, CC_idP, rx_ces[i], lcgid,
 		payload_ptr[0] & 0x3f);
 	if (UE_id != -1) {
+          int bsr = payload_ptr[0] & 0x3f;
 
-	  UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
+          lcgid_updated[lcgid] = 1;
 
-	  // update buffer info
+          // update buffer info
+          UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid] = BSR_TABLE[bsr];
 
-	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid] = BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid]];
-
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid];
+          UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer =
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[0] +
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[1] +
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[2] +
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[3];
+          //UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer += UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer / 4;
 
 	  RC.eNB[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP * 10) + subframeP] = (payload_ptr[0] & 0x3f);
 	  if (UE_id == UE_list->head)
@@ -325,12 +340,10 @@ rx_sdu(const module_id_t enb_mod_idP,
 	  }
 	  if (mac_eNB_get_rrc_status(enb_mod_idP,UE_RNTI(enb_mod_idP, UE_id)) < RRC_CONNECTED)
 	    LOG_D(MAC,
-		  "[eNB %d] CC_id %d MAC CE_LCID %d : ul_total_buffer = %d (lcg increment %d)\n",
+		  "[eNB %d] CC_id %d MAC CE_LCID %d : estimated_ul_buffer = %d (lcg increment %d)\n",
 		  enb_mod_idP, CC_idP, rx_ces[i],
-		  UE_list->UE_template[CC_idP][UE_id].
-		  ul_total_buffer,
-		  UE_list->UE_template[CC_idP][UE_id].
-		  ul_buffer_info[lcgid]);
+		  UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer,
+		  UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]);
 	} else {
 
 	}
@@ -340,87 +353,66 @@ rx_sdu(const module_id_t enb_mod_idP,
 
     case LONG_BSR:
       if (UE_id != -1) {
-	UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2);
-	UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] = ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4);
-	UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] = ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6);
-	UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F);
-
-	// update buffer info
-	old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0];
-	UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0] = BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0]];
-
-	UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0];
-	if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
-	else
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
-
-	old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1];
-	UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1] = BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1]];
-	UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1];
-	if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info) UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -=
-	    old_buffer_info;
-	else
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
-
-	old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2];
-	UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2] = BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2]];
-	UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2];
-	if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >=  old_buffer_info)
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
-	else
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
-
-	old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3];
-	UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3] = BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3]];
-	UE_list->UE_template[CC_idP][UE_id].ul_total_buffer += UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3];
-	if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info)
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info;
-	else
-	  UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0;
-
-	LOG_D(MAC,
-	      "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = "
-	      "%u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP, CC_idP,
-	      rx_ces[i],
-	      UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0],
-	      UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1],
-	      UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2],
-	      UE_list->UE_template[CC_idP][UE_id].
-	      bsr_info[LCGID3]);
-	if (crnti_rx == 1)
-	  LOG_D(MAC,
-		"[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = "
-		"%u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP,
-		CC_idP, rx_ces[i],
-		UE_list->UE_template[CC_idP][UE_id].
-		bsr_info[LCGID0],
-		UE_list->UE_template[CC_idP][UE_id].
-		bsr_info[LCGID1],
-		UE_list->UE_template[CC_idP][UE_id].
-		bsr_info[LCGID2],
-		UE_list->UE_template[CC_idP][UE_id].
-		bsr_info[LCGID3]);
-
-	if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID0] == 0) {
+        int bsr0 = (payload_ptr[0] & 0xFC) >> 2;
+        int bsr1 = ((payload_ptr[0] & 0x03) << 4) | ((payload_ptr[1] & 0xF0) >> 4);
+        int bsr2 = ((payload_ptr[1] & 0x0F) << 2) | ((payload_ptr[2] & 0xC0) >> 6);
+        int bsr3 = payload_ptr[2] & 0x3F;
+
+        lcgid_updated[0] = 1;
+        lcgid_updated[1] = 1;
+        lcgid_updated[2] = 1;
+        lcgid_updated[3] = 1;
+
+        // update buffer info
+        UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0] = BSR_TABLE[bsr0];
+        UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1] = BSR_TABLE[bsr1];
+        UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2] = BSR_TABLE[bsr2];
+        UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3] = BSR_TABLE[bsr3];
+
+        UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer =
+            UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[0] +
+            UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[1] +
+            UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[2] +
+            UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[3];
+        //UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer += UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer / 4;
+
+        LOG_D(MAC,
+              "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR. Size is LCGID0 = %u LCGID1 = "
+              "%u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP, CC_idP,
+              rx_ces[i],
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0],
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1],
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2],
+              UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]);
+        if (crnti_rx == 1)
+          LOG_D(MAC,
+                "[eNB %d] CC_id %d MAC CE_LCID %d: Received long BSR. Size is LCGID0 = %u LCGID1 = "
+                "%u LCGID2 = %u LCGID3 = %u\n", enb_mod_idP,
+                CC_idP, rx_ces[i],
+                UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0],
+                UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1],
+                UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2],
+                UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3]);
+
+	if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID0] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0] = 0;
 	} else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID0] = frameP;
 	}
 
-	if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID1] == 0) {
+	if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID1] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID1] = 0;
 	} else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID1] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID1] = frameP;
 	}
 
-	if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID2] == 0) {
+	if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID2] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID2] = 0;
 	} else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID2] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID2] = frameP;
 	}
 
-	if (UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] == 0) {
+	if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[LCGID3] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID3] = 0;
 	} else if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID3] == 0) {
 	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_creation_time[LCGID3] = frameP;
@@ -554,11 +546,20 @@ rx_sdu(const module_id_t enb_mod_idP,
 #endif
 
       if (UE_id != -1) {
-	// adjust buffer occupancy of the correponding logical channel group
-	if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i])
-	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i];
-	else
-	  UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0;
+        if (lcgid_updated[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] == 0) {
+	  // adjust buffer occupancy of the correponding logical channel group
+	  if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i])
+	    UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i];
+	  else
+	    UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0;
+
+          UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer =
+          UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[0] +
+          UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[1] +
+          UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[2] +
+          UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[3];
+          //UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer += UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer / 4;
+        }
 
 	LOG_D(MAC,
 	      "[eNB %d] CC_id %d Frame %d : ULSCH -> UL-DCCH, received %d bytes form UE %d on LCID %d \n",
@@ -606,10 +607,20 @@ rx_sdu(const module_id_t enb_mod_idP,
 		ul_buffer_info[UE_list->UE_template[CC_idP]
 			       [UE_id].lcgidmap[rx_lcids[i]]]);
 
-	  if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i])
-	    UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i];
-	  else
-	    UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0;
+          if (lcgid_updated[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] == 0) {
+	    if (UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] >= rx_lengths[i])
+	      UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] -= rx_lengths[i];
+	    else
+	      UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[UE_list->UE_template[CC_idP][UE_id].lcgidmap[rx_lcids[i]]] = 0;
+
+            UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer =
+               UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[0] +
+               UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[1] +
+               UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[2] +
+               UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[3];
+            //UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer += UE_list->UE_template[CC_idP][UE_id].estimated_ul_buffer / 4;
+          }
+
 	  if ((rx_lengths[i] < SCH_PAYLOAD_SIZE_MAX) && (rx_lengths[i] > 0)) {	// MAX SIZE OF transport block
 	    mac_rlc_data_ind(enb_mod_idP, current_rnti, enb_mod_idP, frameP, ENB_FLAG_YES, MBMS_FLAG_NO, rx_lcids[i], (char *) payload_ptr, rx_lengths[i], 1, NULL);	//(unsigned int*)crc_status);
 
@@ -1073,10 +1084,7 @@ schedule_ulsch_rnti(module_id_t module_idP,
 	    module_idP, frameP, subframeP, sched_frame, sched_subframeP, harq_pid, UE_id, rnti,
 	    CC_id, aggregation, N_RB_UL);
 
-      RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP *
-							10) +
-						       subframeP] =
-	UE_template->ul_total_buffer;
+      RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP * 10) + subframeP] = UE_template->estimated_ul_buffer;
       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO,RC.eNB[module_idP][CC_id]->pusch_stats_BO[UE_id][(frameP *
 							   10) +
 							  subframeP]);
@@ -1203,18 +1211,17 @@ schedule_ulsch_rnti(module_id_t module_idP,
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED,
 						      UE_sched_ctrl->ul_scheduled);
 
-	    // adjust total UL buffer status by TBS, wait for UL sdus to do final update
+	    // adjust scheduled UL bytes by TBS, wait for UL sdus to do final update
 	    LOG_D(MAC,
-		  "[eNB %d] CC_id %d UE %d/%x : adjusting ul_total_buffer, old %d, TBS %d\n",
+		  "[eNB %d] CC_id %d UE %d/%x : adjusting scheduled_ul_bytes, old %d, TBS %d\n",
 		  module_idP, CC_id, UE_id, rnti,
-		  UE_template->ul_total_buffer,
+		  UE_template->scheduled_ul_bytes,
 		  UE_template->TBS_UL[harq_pid]);
-	    if (UE_template->ul_total_buffer > UE_template->TBS_UL[harq_pid])
-	      UE_template->ul_total_buffer -= UE_template->TBS_UL[harq_pid];
-	    else
-	      UE_template->ul_total_buffer = 0;
-	    LOG_D(MAC, "ul_total_buffer, new %d\n",
-		  UE_template->ul_total_buffer);
+
+            UE_template->scheduled_ul_bytes += UE_template->TBS_UL[harq_pid];
+
+            LOG_D(MAC, "scheduled_ul_bytes, new %d\n", UE_template->scheduled_ul_bytes);
+
 	    // Cyclic shift for DM RS
 	    cshift = 0;	// values from 0 to 7 can be used for mapping the cyclic shift (36.211 , Table 5.5.2.1.1-1)
 	    // save it for a potential retransmission
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index ff8939d82bba3fd9fa23d5310bcb3d614d7bde8d..0d6a6ec3882530d7d4caca0d3ec91d1d240e5a21 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -1590,9 +1590,11 @@ assign_max_mcs_min_rb(module_id_t module_idP, int frameP,
 		to_prb(RC.mac[module_idP]->common_channels[CC_id].
 		       ul_Bandwidth);
 	    // if this UE has UL traffic
-	    if (UE_template->ul_total_buffer > 0) {
-
+            int bytes_to_schedule = UE_template->estimated_ul_buffer - UE_template->scheduled_ul_bytes;
+            if (bytes_to_schedule < 0) bytes_to_schedule = 0;
+            int bits_to_schedule = bytes_to_schedule * 8;
 
+	    if (bits_to_schedule > 0) {
 		tbs = get_TBS_UL(mcs, 3) << 3;	// 1 or 2 PRB with cqi enabled does not work well!
 		rb_table_index = 2;
 
@@ -1602,7 +1604,7 @@ assign_max_mcs_min_rb(module_id_t module_idP, int frameP,
 					 Ncp, 0);
 
 		while ((((UE_template->phr_info - tx_power) < 0)
-			|| (tbs > UE_template->ul_total_buffer))
+			|| (tbs > bits_to_schedule))
 		       && (mcs > 3)) {
 		    // LOG_I(MAC,"UE_template->phr_info %d tx_power %d mcs %d\n", UE_template->phr_info,tx_power, mcs);
 		    mcs--;
@@ -1610,7 +1612,7 @@ assign_max_mcs_min_rb(module_id_t module_idP, int frameP,
 		    tx_power = estimate_ue_tx_power(tbs, rb_table[rb_table_index], 0, Ncp, 0);	// fixme: set use_srs
 		}
 
-		while ((tbs < UE_template->ul_total_buffer) &&
+		while ((tbs < bits_to_schedule) &&
 		       (rb_table[rb_table_index] <
 			(N_RB_UL - first_rb[CC_id]))
 		       && ((UE_template->phr_info - tx_power) > 0)
@@ -1700,11 +1702,14 @@ static int ue_ul_compare(const void *_a, const void *_b, void *_params)
 	UE_list->UE_template[pCCid2][UE_id2].ul_buffer_info[LCGID0])
 	return 1;
 
-    if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer >
-	UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer)
+    int bytes_to_schedule1 = UE_list->UE_template[pCCid1][UE_id1].estimated_ul_buffer - UE_list->UE_template[pCCid1][UE_id1].scheduled_ul_bytes;
+    if (bytes_to_schedule1 < 0) bytes_to_schedule1 = 0;
+    int bytes_to_schedule2 = UE_list->UE_template[pCCid2][UE_id2].estimated_ul_buffer - UE_list->UE_template[pCCid2][UE_id2].scheduled_ul_bytes;
+    if (bytes_to_schedule2 < 0) bytes_to_schedule2 = 0;
+
+    if (bytes_to_schedule1 > bytes_to_schedule2)
 	return -1;
-    if (UE_list->UE_template[pCCid1][UE_id1].ul_total_buffer <
-	UE_list->UE_template[pCCid2][UE_id2].ul_total_buffer)
+    if (bytes_to_schedule1 < bytes_to_schedule2)
 	return 1;
 
     if (UE_list->UE_template[pCCid1][UE_id1].pre_assigned_mcs_ul >
diff --git a/openair2/LAYER2/openair2_proc.c b/openair2/LAYER2/openair2_proc.c
index 34c06a9c538cd968d835210210353015920c0be2..f66d1142abf5c668f240de1fcda9bc2aa65337ff 100644
--- a/openair2/LAYER2/openair2_proc.c
+++ b/openair2/LAYER2/openair2_proc.c
@@ -217,11 +217,11 @@ int dump_eNB_l2_stats(char *buffer, int length)
                        UE_list->eNB_UE_stats[CC_id][UE_id].num_errors_rx);
 
         len+= sprintf(&buffer[len],"[MAC] Received PHR PH = %d (db)\n", UE_list->UE_template[CC_id][UE_id].phr_info);
-        len+= sprintf(&buffer[len],"[MAC] Received BSR LCGID[0][1][2][3] = %u %u %u %u\n",
-                      UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID0],
-                      UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID1],
-                      UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID2],
-                      UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID3]
+        len+= sprintf(&buffer[len],"[MAC] Estimated size LCGID[0][1][2][3] = %u %u %u %u\n",
+                      UE_list->UE_template[CC_id][UE_id].ul_buffer_info[LCGID0],
+                      UE_list->UE_template[CC_id][UE_id].ul_buffer_info[LCGID1],
+                      UE_list->UE_template[CC_id][UE_id].ul_buffer_info[LCGID2],
+                      UE_list->UE_template[CC_id][UE_id].ul_buffer_info[LCGID3]
                      );
       }