diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index bda156fcdff54f4ccbe49d536212a641f74a5d9d..b169cec4f0637f368c33cae3a0242644be1919a5 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -478,6 +478,8 @@ typedef struct{
   uint8_t oldNDI_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)
+  boolean_t configured;
 
   // PHY interface info
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index 1833858c1de5f35397e2e8dc2e351102f8c5d033..28b5ff76207ca19465fad2790b718d2eea51304b 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -484,56 +484,3 @@ void cancel_ra_proc(module_id_t module_idP, int CC_id, frame_t frameP, rnti_t rn
   }
 }
 
-void terminate_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP,rnti_t rnti,unsigned char *msg3, uint16_t msg3_len) {
-
-  unsigned char rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr;
-  unsigned char rx_lcids[NB_RB_MAX];
-  uint16_t rx_lengths[NB_RB_MAX];
-  int8_t UE_id;
-  RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].common_channels[CC_id].RA_template[0];
-
-  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, Received msg3 %x.%x.%x.%x.%x.%x, Terminating RA procedure for UE rnti %x\n",
-	module_idP,frameP,
-	msg3[3],msg3[4],msg3[5],msg3[6],msg3[7], msg3[8], rnti);
-
-  for (i=0;i<NB_RA_PROC_MAX;i++) {
-    LOG_D(MAC,"[RAPROC] Checking proc %d : rnti (%x, %x), active %d\n",i,
-          RA_template[i].rnti, rnti,
-          RA_template[i].RA_active);
-    if ((RA_template[i].rnti==rnti) &&
-	(RA_template[i].RA_active==TRUE)) {
-
-      payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len);
-      LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n",
-	    module_idP,frameP,rx_lengths[0],payload_ptr-msg3);
-      if (/*(num_ce == 0) &&*/ (num_sdu==1) && (rx_lcids[0] == CCCH)) { // This is an RRCConnectionRequest/Restablishment
-	memcpy(&RA_template[i].cont_res_id[0],payload_ptr,6);
-	LOG_D(MAC,"[eNB %d][RAPROC] Frame %d Received CCCH: length %d, offset %d\n",
-	      module_idP,frameP,rx_lengths[0],payload_ptr-msg3);
-	UE_id=add_new_ue(module_idP,CC_id,RA_template[i].rnti);
-	if (UE_id==-1) {
-	  mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n");
-	}
-	else {
-	  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Added user with rnti %x => UE %d\n",
-		module_idP,frameP,RA_template[i].rnti,UE_id);
-	}
-
-	if (Is_rrc_registered == 1)
-	  mac_rrc_data_ind(module_idP,frameP,CCCH,(uint8_t *)payload_ptr,rx_lengths[0],1,module_idP,0);
-	// add_user.  This is needed to have the rnti for configuring UE (PHY). The UE is removed if RRC
-	// doesn't provide a CCCH SDU
-
-      }
-      else if (num_ce >0) {  // handle msg3 which is not RRCConnectionRequest
-	//	process_ra_message(msg3,num_ce,rx_lcids,rx_ces);
-      }
-
-      RA_template[i].generate_Msg4 = 1;
-      RA_template[i].wait_ack_Msg4 = 0;
-
-      return;
-    } // if process is active
-
-  } // loop on RA processes
-}
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index fcbc6d8930d7d70c3ed20637416c5e32f84be78b..ec43348c90ef556e8b151b27501ff8b43ceb8c89 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -164,7 +164,7 @@ unsigned char generate_dlsch_header(unsigned char *mac_header,
     last_size=1;
     //    msg("last_size %d,mac_header_ptr %p\n",last_size,mac_header_ptr);
     ((TIMING_ADVANCE_CMD *)ce_ptr)->R=0;
-    ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=timing_advance_cmd&0x3f;
+    ((TIMING_ADVANCE_CMD *)ce_ptr)->TA=(timing_advance_cmd+31)&0x3f;
     LOG_I(MAC,"timing advance =%d (%d)\n",timing_advance_cmd,((TIMING_ADVANCE_CMD *)ce_ptr)->TA);
     ce_ptr+=sizeof(TIMING_ADVANCE_CMD);
     //msg("offset %d\n",ce_ptr-mac_header_control_elements);
@@ -290,6 +290,82 @@ unsigned char generate_dlsch_header(unsigned char *mac_header,
 
 }
 
+void set_ul_DAI(int module_idP,int UE_idP, int CC_idP,  int frameP, int subframeP, LTE_DL_FRAME_PARMS  *frame_parms[MAX_NUM_CCs]) {
+ 
+  eNB_MAC_INST         *eNB      = &eNB_mac_inst[module_idP];
+  UE_list_t            *UE_list  = &eNB->UE_list;
+  unsigned char         DAI;
+ 
+  if (frame_parms[CC_idP]->frame_type == TDD) {
+    DAI = (UE_list->UE_template[CC_idP][UE_idP].DAI-1)&3;
+    LOG_D(MAC,"[eNB %d] Frame %d, subframe %d: DAI %d for UE %d\n",module_idP,frameP,subframeP,DAI,UE_idP);
+    // Save DAI for Format 0 DCI
+    
+    switch (frame_parms[CC_idP]->tdd_config) {
+    case 0:
+      //      if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6))
+      break;
+    case 1:
+      switch (subframeP) {
+      case 1:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI;
+	break;
+      case 4:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[8] = DAI;
+	break;
+      case 6:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI;
+	break;
+      case 9:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI;
+	break;
+      }
+    case 2:
+      //      if ((subframeP==3)||(subframeP==8))
+      //	UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
+      break;
+    case 3:
+      //if ((subframeP==6)||(subframeP==8)||(subframeP==0)) {
+      //  LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1);
+      //  UE_list->UE_template[CC_idP][UE_idP].DAI_ul[((subframeP+8)%10)>>1] = DAI;
+      //}
+     switch (subframeP) {
+      case 5:
+      case 6:
+      case 1:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI;
+	break;
+      case 7:
+      case 8:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[3] = DAI;
+	break;
+      case 9:
+      case 0:
+	UE_list->UE_template[CC_idP][UE_idP].DAI_ul[4] = DAI;
+	break;
+      default:
+	break;
+      }
+      
+      break;
+    case 4:
+      //      if ((subframeP==8)||(subframeP==9))
+      //	UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
+      break;
+    case 5:
+      //      if (subframeP==8)
+      //	UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
+      break;
+    case 6:
+      //      if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9))
+      //	UE_list->UE_template[CC_idP][UE_idP].DAI_ul = DAI;
+      break;
+    default:
+      break;
+    }
+  }
+}
+
 
 void schedule_ue_spec(module_id_t   module_idP,
                       frame_t       frameP,
@@ -393,6 +469,18 @@ void schedule_ue_spec(module_id_t   module_idP,
 	// else
 	//	break;
       }
+ 
+      if (frame_parms[CC_id]->frame_type == TDD)  {
+	set_ue_dai (subframeP,
+		    frame_parms[CC_id]->tdd_config,
+		    UE_id,
+		    CC_id,
+		    UE_list);
+	// update UL DAI after DLSCH scheduling
+	set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
+
+      }
+
       if (continue_flag == 1 ){
 	add_ue_dlsch_info(module_idP,
 			  CC_id,
@@ -401,13 +489,7 @@ void schedule_ue_spec(module_id_t   module_idP,
 			  S_DL_NONE);
 	continue;
       }
-      if (frame_parms[CC_id]->frame_type == TDD) 
-	set_ue_dai (subframeP,
-		    frame_parms[CC_id]->tdd_config,
-		    UE_id,
-		    CC_id,
-		    UE_list);
-      
+     
       nb_available_rb = pre_nb_available_rbs[CC_id][UE_id];
       UE_list->eNB_UE_stats[CC_id][UE_id].crnti= rnti;
       UE_list->eNB_UE_stats[CC_id][UE_id].rrc_status=mac_get_rrc_status(module_idP,1,UE_id);
@@ -1064,54 +1146,7 @@ void schedule_ue_spec(module_id_t   module_idP,
 	}
       }
       if (frame_parms[CC_id]->frame_type == TDD) {
-	DAI = (UE_list->UE_template[CC_id][UE_id].DAI-1)&3;
-	LOG_D(MAC,"[eNB %d] Frame %d: DAI %d for UE %d\n",module_idP,frameP,DAI,UE_id);
-	// Save DAI for Format 0 DCI
-
-	switch (frame_parms[CC_id]->tdd_config) {
-	case 0:
-	  //      if ((subframeP==0)||(subframeP==1)||(subframeP==5)||(subframeP==6))
-	  break;
-	case 1:
-	  switch (subframeP) {
-	  case 1:
-	    UE_list->UE_template[CC_id][UE_id].DAI_ul[7] = DAI;
-	    break;
-	  case 4:
-	    UE_list->UE_template[CC_id][UE_id].DAI_ul[8] = DAI;
-	    break;
-	  case 6:
-	    UE_list->UE_template[CC_id][UE_id].DAI_ul[2] = DAI;
-	    break;
-	  case 9:
-	    UE_list->UE_template[CC_id][UE_id].DAI_ul[3] = DAI;
-	    break;
-	  }
-	case 2:
-	  //      if ((subframeP==3)||(subframeP==8))
-	  //	UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI;
-	  break;
-	case 3:
-	  if ((subframeP==6)||(subframeP==8)||(subframeP==0)) {
-	    LOG_D(MAC,"schedule_ue_spec: setting UL DAI to %d for subframeP %d => %d\n",DAI,subframeP, ((subframeP+8)%10)>>1);
-	    UE_list->UE_template[CC_id][UE_id].DAI_ul[((subframeP+8)%10)>>1] = DAI;
-	  }
-	  break;
-	case 4:
-	  //      if ((subframeP==8)||(subframeP==9))
-	  //	UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI;
-	  break;
-	case 5:
-	  //      if (subframeP==8)
-	  //	UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI;
-	  break;
-	case 6:
-	  //      if ((subframeP==1)||(subframeP==4)||(subframeP==6)||(subframeP==9))
-	  //	UE_list->UE_template[CC_id][UE_id].DAI_ul = DAI;
-	  break;
-	default:
-	  break;
-	}
+	set_ul_DAI(module_idP,UE_id,CC_id,frameP,subframeP,frame_parms);
       }
     }
   }
@@ -1701,6 +1736,9 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP
 	    LOG_I(MAC,"[eNB %d][RAPROC] Frame %d, subframeP %d : Msg4 acknowledged\n",module_idP,frameP,subframeP);
 	    RA_template->wait_ack_Msg4=0;
 	    RA_template->RA_active=FALSE;
+ 	    UE_id = find_UE_id(module_idP,RA_template->rnti);
+ 	    eNB_mac_inst[module_idP].UE_list.UE_template[UE_PCCID(module_idP,UE_id)][UE_id].configured=TRUE;
+
 	  }
 	}
       }
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index b0ddf15097cb7c2d4fa37779d31cc68b9e914eba..f6bd3adeb9995fef938efdb73510e784b3aff064 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -203,7 +203,7 @@ void dump_ue_list(UE_list_t *listP) {
   }
 }
 
-int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) {
+int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP) {
   int UE_id;
   int j;
 
@@ -218,18 +218,19 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP) {
     UE_list->next[UE_id] = UE_list->head;
     UE_list->head = UE_id;
  
-    UE_list->UE_template[cc_idP][UE_id].rnti = rntiP;
-    UE_list->numactiveCCs[UE_id]             = 1;
-    UE_list->numactiveULCCs[UE_id]           = 1;
-    UE_list->pCC_id[UE_id]                   = cc_idP;
-    UE_list->ordered_CCids[0][UE_id]         = cc_idP;
-    UE_list->ordered_ULCCids[0][UE_id]       = cc_idP;
+    UE_list->UE_template[cc_idP][UE_id].rnti       = rntiP;
+    UE_list->UE_template[cc_idP][UE_id].configured = FALSE;
+    UE_list->numactiveCCs[UE_id]                   = 1;
+    UE_list->numactiveULCCs[UE_id]                 = 1;
+    UE_list->pCC_id[UE_id]                         = cc_idP;
+    UE_list->ordered_CCids[0][UE_id]               = cc_idP;
+    UE_list->ordered_ULCCids[0][UE_id]             = cc_idP;
     UE_list->num_UEs++;
-    UE_list->active[UE_id]                   = TRUE;
+    UE_list->active[UE_id]                         = TRUE;
 
     for (j=0;j<8;j++) {
       UE_list->UE_template[cc_idP][UE_id].oldNDI[j]    = (j==0)?1:0;   // 1 because first transmission is with format1A (Msg4) for harq_pid 0 
-      UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = 0;
+      UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = (j==harq_pidP)?0:1; // 1st transmission is with Msg3;
     }
     eNB_ulsch_info[mod_idP][UE_id].status = S_UL_WAITING;
     eNB_dlsch_info[mod_idP][UE_id].status = S_UL_WAITING;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index b30be0cbe1fef3c6cc424fca8456a2101115ca4c..3f95f52de577002a7a19863e8f6e9ca5b359e029 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -73,7 +73,7 @@
 // This table holds the allowable PRB sizes for ULSCH transmissions
 uint8_t rb_table[33] = {1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,50,54,60,72,75,80,81,90,96,100};
 
-void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_t *sdu, uint16_t sdu_len) {
+void rx_sdu(module_id_t enb_mod_idP,int CC_idP,frame_t frameP,rnti_t rntiP,uint8_t *sduP, uint16_t sdu_lenP,int harq_pidP) {
 
   unsigned char  rx_ces[MAX_NUM_CE],num_ce,num_sdu,i,*payload_ptr;
   unsigned char  rx_lcids[NB_RB_MAX];
@@ -91,7 +91,7 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,1);
 
   LOG_D(MAC,"[eNB %d] Received ULSCH sdu from PHY (rnti %x, UE_id %d), parsing header\n",enb_mod_idP,rntiP,UE_id);
-  payload_ptr = parse_ulsch_header(sdu,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_len);
+  payload_ptr = parse_ulsch_header(sduP,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,sdu_lenP);
 
   // control element
   for (i=0;i<num_ce;i++) {
@@ -99,8 +99,8 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
     switch (rx_ces[i]) { // implement and process BSR + CRNTI +
     case POWER_HEADROOM:
       if (UE_id != UE_INDEX_INVALID ){
-	UE_list->UE_template[CC_id][UE_id].phr_info =  (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET;
-	LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received PHR PH = %d (db)\n", rx_ces[i], UE_list->UE_template[CC_id][UE_id].phr_info);
+	UE_list->UE_template[CC_idP][UE_id].phr_info =  (payload_ptr[0] & 0x3f) - PHR_MAPPING_OFFSET;
+	LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received PHR PH = %d (db)\n", rx_ces[i], UE_list->UE_template[CC_idP][UE_id].phr_info);
       }
       payload_ptr+=sizeof(POWER_HEADROOM_CMD);
       break;
@@ -115,25 +115,25 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
 	lcgid = (payload_ptr[0] >> 6);
 	LOG_D(MAC, "[eNB] MAC CE_LCID %d : Received short BSR LCGID = %u bsr = %d\n",
 	      rx_ces[i], lcgid, payload_ptr[0] & 0x3f);
-	UE_list->UE_template[CC_id][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
+	UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f);
       }
       payload_ptr += 1;//sizeof(SHORT_BSR); // fixme
     } break;
     case LONG_BSR:
       if (UE_id  != UE_INDEX_INVALID ){
-	UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID0] = ((payload_ptr[0] & 0xFC) >> 2);
-	UE_list->UE_template[CC_id][UE_id].bsr_info[LCGID1] =
+	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_id][UE_id].bsr_info[LCGID2] =
+	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_id][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F);
+	UE_list->UE_template[CC_idP][UE_id].bsr_info[LCGID3] = (payload_ptr[2] & 0x3F);
 	LOG_D(MAC, "[eNB] MAC CE_LCID %d: Received long BSR LCGID0 = %u LCGID1 = "
 	      "%u LCGID2 = %u LCGID3 = %u\n",
 	      rx_ces[i],
-	      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]);
+	      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]);
       }
       payload_ptr += 3;////sizeof(LONG_BSR);
       break;
@@ -154,26 +154,26 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
 
       for (ii=0;ii<NB_RA_PROC_MAX;ii++) {
 	LOG_D(MAC,"[RAPROC] Checking proc %d : rnti (%x, %x), active %d\n",ii,
-	      eNB->common_channels[CC_id].RA_template[ii].rnti, rntiP,
-	      eNB->common_channels[CC_id].RA_template[ii].RA_active);
+	      eNB->common_channels[CC_idP].RA_template[ii].rnti, rntiP,
+	      eNB->common_channels[CC_idP].RA_template[ii].RA_active);
 	
-	if ((eNB->common_channels[CC_id].RA_template[ii].rnti==rntiP) &&
-	    (eNB->common_channels[CC_id].RA_template[ii].RA_active==TRUE)) {
+	if ((eNB->common_channels[CC_idP].RA_template[ii].rnti==rntiP) &&
+	    (eNB->common_channels[CC_idP].RA_template[ii].RA_active==TRUE)) {
 	  
           //payload_ptr = parse_ulsch_header(msg3,&num_ce,&num_sdu,rx_ces,rx_lcids,rx_lengths,msg3_len);
 	  
 	  if (UE_id < 0) {
-	    memcpy(&eNB->common_channels[CC_id].RA_template[ii].cont_res_id[0],payload_ptr,6);
+	    memcpy(&eNB->common_channels[CC_idP].RA_template[ii].cont_res_id[0],payload_ptr,6);
 	    LOG_I(MAC,"[eNB %d][RAPROC] Frame %d CCCH: Received RRCConnectionRequest: length %d, offset %d\n",
-                  enb_mod_idP,frameP,rx_lengths[ii],payload_ptr-sdu);
-	    if ((UE_id=add_new_ue(enb_mod_idP,CC_id,eNB->common_channels[CC_id].RA_template[ii].rnti)) == -1 )
+                  enb_mod_idP,frameP,rx_lengths[ii],payload_ptr-sduP);
+	    if ((UE_id=add_new_ue(enb_mod_idP,CC_idP,eNB->common_channels[CC_idP].RA_template[ii].rnti,harq_pidP)) == -1 )
 	      mac_xface->macphy_exit("[MAC][eNB] Max user count reached\n");
 	    else 
 	      LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Added user with rnti %x => UE %d\n",
-		    enb_mod_idP,frameP,eNB->common_channels[CC_id].RA_template[ii].rnti,UE_id);
+		    enb_mod_idP,frameP,eNB->common_channels[CC_idP].RA_template[ii].rnti,UE_id);
 	  } else {
 	    LOG_I(MAC,"[eNB %d][RAPROC] Frame %d CCCH: Received RRCConnectionReestablishment from UE %d: length %d, offset %d\n",
-		  enb_mod_idP,frameP,UE_id,rx_lengths[ii],payload_ptr-sdu);
+		  enb_mod_idP,frameP,UE_id,rx_lengths[ii],payload_ptr-sduP);
 	  }
 	  
 	  if (Is_rrc_registered == 1)
@@ -184,8 +184,8 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
 	    //	process_ra_message(msg3,num_ce,rx_lcids,rx_ces);
 	  }
 	  
-	  eNB->common_channels[CC_id].RA_template[ii].generate_Msg4 = 1;
-	  eNB->common_channels[CC_id].RA_template[ii].wait_ack_Msg4 = 0;
+	  eNB->common_channels[CC_idP].RA_template[ii].generate_Msg4 = 1;
+	  eNB->common_channels[CC_idP].RA_template[ii].wait_ack_Msg4 = 0;
 	  
 	  
 	} // if process is active
@@ -195,10 +195,10 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
       break;
     case  DCCH : 
     case DCCH1 :
-      //      if(eNB_mac_inst[module_idP][CC_id].Dcch_lchan[UE_id].Active==1){
+      //      if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){
       
 #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-      LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sdu));
+      LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP));
       for (j=0;j<32;j++)
 	LOG_T(MAC,"%x ",payload_ptr[j]);
       LOG_T(MAC,"\n");
@@ -215,17 +215,17 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
 			 rx_lengths[i],
 			 1,
 			 NULL);//(unsigned int*)crc_status);
-	UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
-	UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
+	UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
+	UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
 	
       }
       //      }
       break;
     case DTCH: // default DRB 
-      //      if(eNB_mac_inst[module_idP][CC_id].Dcch_lchan[UE_id].Active==1){
+      //      if(eNB_mac_inst[module_idP][CC_idP].Dcch_lchan[UE_id].Active==1){
 	
 #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
-      LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sdu));
+      LOG_T(MAC,"offset: %d\n",(unsigned char)((unsigned char*)payload_ptr-sduP));
       for (j=0;j<32;j++)
 	LOG_T(MAC,"%x ",payload_ptr[j]);
       LOG_T(MAC,"\n");
@@ -241,14 +241,14 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
 			 rx_lengths[i],
 			 1,
 			 NULL);//(unsigned int*)crc_status);
-	UE_list->eNB_UE_stats[CC_id][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
-	UE_list->eNB_UE_stats[CC_id][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
+	UE_list->eNB_UE_stats[CC_idP][UE_id].num_pdu_rx[rx_lcids[i]]+=1;
+	UE_list->eNB_UE_stats[CC_idP][UE_id].num_bytes_rx[rx_lcids[i]]+=rx_lengths[i];
 	  
       }
       //      }
       break;
     default :  //if (rx_lcids[i] >= DTCH) {
-      UE_list->eNB_UE_stats[CC_id][UE_id].num_errors_rx+=1;
+      UE_list->eNB_UE_stats[CC_idP][UE_id].num_errors_rx+=1;
       LOG_E(MAC,"[eNB %d] received unsupported or unknown LCID %d from UE %d ", rx_lcids[i], UE_id);
       break;
     }
@@ -256,8 +256,8 @@ void rx_sdu(module_id_t enb_mod_idP,int CC_id,frame_t frameP,rnti_t rntiP,uint8_
     
   }
 
-  UE_list->eNB_UE_stats[CC_id][UE_id].total_pdu_bytes_rx+=sdu_len;
-  UE_list->eNB_UE_stats[CC_id][UE_id].total_num_pdus_rx+=1;
+  UE_list->eNB_UE_stats[CC_idP][UE_id].total_pdu_bytes_rx+=sdu_lenP;
+  UE_list->eNB_UE_stats[CC_idP][UE_id].total_num_pdus_rx+=1;
   
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,0);
   stop_meas(&eNB->rx_ulsch_sdu);
@@ -499,7 +499,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
   UE_list_t         *UE_list=&eNB->UE_list;
   UE_TEMPLATE       *UE_template;
 
-  int rvidx_tab[4] = {0,3,1,2};
+  int rvidx_tab[4] = {0,2,3,1};
 
 
   // loop over all active UEs
@@ -571,8 +571,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 		UE_template->oldNDI_UL[harq_pid]=ndi;
 		mcs = openair_daq_vars.target_ue_ul_mcs;
 	      }
-
-	      LOG_D(MAC,"[eNB %d] ULSCH scheduler: Ndi %d, mcs %d\n",module_idP,ndi,mcs);
+              LOG_D(MAC,"[eNB %d] ULSCH scheduler: harq_pid %d, Ndi %d, mcs %d\n",module_idP,harq_pid,ndi,mcs);
 
 	      /*	      if((cooperation_flag > 0) && (UE_id == 1)) { // Allocation on same set of RBs
 		// RIV:resource indication value // function in openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -623,11 +622,13 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 		}
 		//rb_table_index = 8;
 
-		LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n",
-		      module_idP,harq_pid,rnti,frameP,subframeP,mcs,
-		      *first_rb,rb_table[rb_table_index],
-		      rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]),
-		      harq_pid);
+		LOG_I(MAC,"[eNB %d][PUSCH %d/%x] Frame %d subframeP %d Scheduled UE (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d,DAI %d)\n",
+                      module_idP,harq_pid,rnti,frameP,subframeP,mcs,
+                      *first_rb,rb_table[rb_table_index],
+                      rb_table_index,mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]),
+                      harq_pid,
+                      UE_template->DAI_ul[sched_subframe]);
+
 
 		rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,
 						*first_rb,
diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c
index ad0a8811b16b18bb21789dbe6459dc8d1df48e32..ecedc90f74ae89fa2e7e7cf8411d8abc3107294a 100644
--- a/openair2/LAYER2/MAC/main.c
+++ b/openair2/LAYER2/MAC/main.c
@@ -417,7 +417,6 @@ int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_
   mac_xface->eNB_dlsch_ulsch_scheduler = eNB_dlsch_ulsch_scheduler;
   mac_xface->get_dci_sdu               = get_dci_sdu;
   mac_xface->fill_rar                  = fill_rar;
-  mac_xface->terminate_ra_proc         = terminate_ra_proc;
   mac_xface->initiate_ra_proc          = initiate_ra_proc;
   mac_xface->cancel_ra_proc            = cancel_ra_proc;
   mac_xface->SR_indication             = SR_indication;
diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h
index ab98bfd6b39779215cd2d7f33904c84bd7a73196..279a11bfa01a29e113ffea0c380a5c7cbe53aaad 100644
--- a/openair2/LAYER2/MAC/proto.h
+++ b/openair2/LAYER2/MAC/proto.h
@@ -258,13 +258,6 @@ uint16_t  fill_rar(module_id_t module_idP,
 		   uint16_t N_RB_UL,
 		   uint8_t input_buffer_length);
 
-/* \brief This function indicates the end of RA procedure and provides the l3msg received on ULSCH.
-@param Mod_id Instance ID of eNB
-@param rnti RNTI of UE transmitting l3msg
-@param l3msg Pointer to received l3msg
-*/
-void terminate_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, rnti_t rnti, uint8_t *l3msg, uint16_t l3msg_len);
-
 /* \brief Function to indicate a failed RA response.  It removes all temporary variables related to the initial connection of a UE
 @param Mod_id Instance ID of eNB
 @param preamble_index index of the received RA request.
@@ -275,8 +268,9 @@ void cancel_ra_proc(module_id_t module_idP,int CC_id,frame_t frameP, uint16_t pr
 @param Mod_id Instance ID of eNB
 @param rnti RNTI of UE transmitting the SR
 @param sdu Pointer to received SDU
+@param harq_pid Index of harq process corresponding to this sdu
 */
-void rx_sdu(module_id_t module_idP, int CC_id,frame_t frameP, rnti_t rnti, uint8_t *sdu, uint16_t sdu_len);
+void rx_sdu(module_id_t module_idP, int CC_id,frame_t frameP, rnti_t rnti, uint8_t *sdu, uint16_t sdu_len, int harq_pid);
 
 /* \brief Function to indicate a scheduled schduling request (SR) was received by eNB.
 @param Mod_id Instance ID of eNB
@@ -476,7 +470,7 @@ uint8_t *parse_ulsch_header(uint8_t *mac_header,
 
 int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, uint8_t cba_group_active, uint8_t HO_active);
 int mac_init(void);
-int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti);
+int add_new_ue(module_id_t Mod_id, int CC_id, rnti_t rnti,int harq_pid);
 int mac_remove_ue(module_id_t Mod_id, int UE_id);
 
 void swap_UEs(UE_list_t *listP,int nodeiP, int nodejP);
diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h
index d1d27478c595e9b4288fc3f15c2ebdba048118f1..27bc59d1f5235417cb330bdf8edecd05748716f0 100755
--- a/openair2/PHY_INTERFACE/defs.h
+++ b/openair2/PHY_INTERFACE/defs.h
@@ -75,9 +75,6 @@ typedef struct
     /// Fill random access response sdu, passing timing advance
     uint16_t (*fill_rar)(module_id_t Mod_id,int CC_id,frame_t frameP,uint8_t *dlsch_buffer,uint16_t N_RB_UL, uint8_t input_buffer_length);
 
-    /// Terminate the RA procedure upon reception of l3msg on ulsch
-    void (*terminate_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t UE_id, uint8_t *l3msg, uint16_t l3msg_len);
-
     /// Initiate the RA procedure upon reception (hypothetical) of a valid preamble
     void (*initiate_ra_proc)(module_id_t Mod_id,int CC_id,frame_t frameP,uint16_t preamble,int16_t timing_offset,uint8_t sect_id,sub_frame_t subframe,uint8_t f_id);
 
@@ -91,7 +88,7 @@ typedef struct
     uint8_t* (*get_dlsch_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti,uint8_t TB_index);
 
     /// Send ULSCH sdu to MAC for given rnti
-    void (*rx_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti, uint8_t *sdu,uint16_t sdu_len);
+    void (*rx_sdu)(module_id_t Mod_id,int CC_id,frame_t frameP,rnti_t rnti, uint8_t *sdu,uint16_t sdu_len, int harq_pid);
 
     /// Indicate failure to synch to external source
     void (*mrbch_phy_sync_failure) (module_id_t Mod_id,frame_t frameP, uint8_t free_eNB_index);