diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
index d5b1ce6af67eccabdec65c155161ea0bef39d29e..282739e31597782fd46a1e5e50f154d01c801708 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_interface.h
@@ -2218,6 +2218,7 @@ typedef struct {
 	uint8_t dl_assignment_index;
 	uint32_t tpc_bitmap;
 	uint16_t transmission_power;
+	uint8_t harq_pid;
 } nfapi_hi_dci0_dci_pdu_rel8_t;
 #define NFAPI_HI_DCI0_REQUEST_DCI_PDU_REL8_TAG 0x2020
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 722341ea658246ef83aa745af9b187efd2b2eff0..9f75a87b50299e9e7494c0e1fea95dc4d3202f5f 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -2565,6 +2565,8 @@ void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
 
   uint32_t ndi     = pdu->dci_pdu_rel8.new_data_indication_1;
 
+  uint16_t UE_id   = -1;
+
 #ifdef T_TRACER
   T(T_ENB_PHY_ULSCH_UE_DCI, T_INT(eNB->Mod_id), T_INT(frame), T_INT(subframe),
     T_INT(pdu->dci_pdu_rel8.rnti), T_INT(((frame*10+subframe+4) % 8) /* TODO: correct harq pid */),
@@ -2710,6 +2712,13 @@ void fill_dci0(PHY_VARS_eNB *eNB,int frame,int subframe,eNB_rxtx_proc_t *proc,
     DevParam (frame_parms->N_RB_DL, 0, 0);
     break;
   }
+
+  if(frame_parms->frame_type == TDD){
+     UE_id = find_ulsch(pdu->dci_pdu_rel8.rnti, eNB,SEARCH_EXIST_OR_FREE);
+     if(UE_id != -1){
+       eNB->ulsch[UE_id]->harq_processes[pdu->dci_pdu_rel8.harq_pid]->V_UL_DAI = dai +1;
+     }
+  }
 }
 
 void fill_ulsch(PHY_VARS_eNB *eNB,int UE_id,nfapi_ul_config_ulsch_pdu *ulsch_pdu,int frame,int subframe)
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index bed93bbde5752e55d3d0096ae5cc00a0f42e361d..bb73f8c8bbd8cdaf992c98bd31c832d08632ff52 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -338,6 +338,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP,
 
 	case 1:
 	    switch (subframeP) {
+	    case 0:
 	    case 1:
 		UE_list->UE_template[CC_idP][UE_idP].DAI_ul[7] = DAI;
 		break;
@@ -346,6 +347,7 @@ set_ul_DAI(int module_idP, int UE_idP, int CC_idP, int frameP,
 		UE_list->UE_template[CC_idP][UE_idP].DAI_ul[8] = DAI;
 		break;
 
+	    case 5:
 	    case 6:
 		UE_list->UE_template[CC_idP][UE_idP].DAI_ul[2] = DAI;
 		break;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index ab3f32c83cc7956ffbb535954d15592d1c025b57..2c0524bcb23ce9822f9b5f8f0a0996a288cf1435 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -1097,10 +1097,25 @@ schedule_ulsch(module_id_t module_idP, frame_t frameP,
     for (i=0; i<NB_RA_PROC_MAX; i++) {
       if ((cc->ra[i].state == WAITMSG3) &&(cc->ra[i].Msg3_subframe == sched_subframe)) {  
         ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].ue_priority = SCH_UL_MSG3;
-        if(frame_parms->N_RB_UL == 25){
-          ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 1;
-        }else{
-          ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 2;
+        if (cc->tdd_Config == NULL) {
+            if(frame_parms->N_RB_UL == 25){
+              ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 1;
+            }else{
+              ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 2;
+            }
+        } else {
+            switch(frame_parms->N_RB_UL){
+            case 25:
+            default:
+              ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 1;
+              break;
+            case 50:
+              ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 2;
+              break;
+            case 100:
+              ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].start_rb = 3;
+              break;
+            }
         }
         ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].nb_rb = 1;
         ulsch_ue_select[CC_id].list[ulsch_ue_select[CC_id].ue_num].UE_id = -1;
@@ -1696,25 +1711,62 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
     // This is the actual CC_id in the list
     N_RB_UL      = to_prb(cc->mib->message.dl_Bandwidth);
     //leave out first RB for PUCCH
-    if(N_RB_UL == 25){
-      first_rb[CC_id] = 1;
-    }else{
-      first_rb[CC_id] = 2;
+    if (cc->tdd_Config == NULL) {
+        if(N_RB_UL == 25){
+          first_rb[CC_id] = 1;
+        }else{
+          first_rb[CC_id] = 2;
+        }
+    }else {
+        switch(N_RB_UL){
+        case 25:
+        default:
+            first_rb[CC_id] = 1;
+          break;
+        case 50:
+            first_rb[CC_id] = 2;
+          break;
+        case 100:
+            first_rb[CC_id] = 3;
+          break;
+        }
     }
     for ( ulsch_ue_num = 0; ulsch_ue_num < ulsch_ue_select[CC_id].ue_num; ulsch_ue_num++ ) {
       UE_id = ulsch_ue_select[CC_id].list[ulsch_ue_num].UE_id;
       /* be sure that there are some free RBs */
-      if(N_RB_UL == 25){
-        if (first_rb[CC_id] >= N_RB_UL-1) {
-          LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
-                 module_idP,frameP,subframeP,UE_id,rnti,CC_id);
-          break;
-        }
-      }else{
-          if (first_rb[CC_id] >= N_RB_UL-2) {
-            LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
-                   module_idP,frameP,subframeP,UE_id,rnti,CC_id);
-            break;
+      if (cc->tdd_Config == NULL){
+          if(N_RB_UL == 25){
+            if (first_rb[CC_id] >= N_RB_UL-1) {
+              LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
+                     module_idP,frameP,subframeP,UE_id,rnti,CC_id);
+              break;
+            }
+          }else{
+              if (first_rb[CC_id] >= N_RB_UL-2) {
+                LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: dropping, not enough RBs\n",
+                       module_idP,frameP,subframeP,UE_id,rnti,CC_id);
+                break;
+              }
+          }
+      } else {
+          if(N_RB_UL == 25){
+            if (first_rb[CC_id] >= N_RB_UL-1) {
+              LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d N_RB_UL %d first_rb %d: dropping, not enough RBs\n",
+                       module_idP,frameP,subframeP,UE_id,rnti,CC_id, N_RB_UL, first_rb);
+              break;
+            }
+          }else if(N_RB_UL == 50){
+              if (first_rb[CC_id] >= N_RB_UL-2) {
+                LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d N_RB_UL %d first_rb %d: dropping, not enough RBs\n",
+                         module_idP,frameP,subframeP,UE_id,rnti,CC_id, N_RB_UL, first_rb);
+                break;
+              }
+          }else if(N_RB_UL == 100){
+              if (first_rb[CC_id] >= N_RB_UL-3) {
+                LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d N_RB_UL %d first_rb %d: dropping, not enough RBs\n",
+                       module_idP,frameP,subframeP,UE_id,rnti,CC_id, N_RB_UL, first_rb);
+                break;
+              }
           }
       }
       //MSG3
@@ -1857,6 +1909,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
             hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tpc                               = tpc;
             hi_dci0_pdu->dci_pdu.dci_pdu_rel8.cqi_csi_request                   = cqi_req;
             hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index               = UE_template->DAI_ul[sched_subframeP];
+            hi_dci0_pdu->dci_pdu.dci_pdu_rel8.harq_pid                          = harq_pid;
 
             hi_dci0_req->number_of_dci++;
 
@@ -1971,6 +2024,7 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
             hi_dci0_pdu->dci_pdu.dci_pdu_rel8.tpc                               = tpc;
             hi_dci0_pdu->dci_pdu.dci_pdu_rel8.cqi_csi_request                   = cqi_req;
             hi_dci0_pdu->dci_pdu.dci_pdu_rel8.dl_assignment_index               = UE_template->DAI_ul[sched_subframeP];
+            hi_dci0_pdu->dci_pdu.dci_pdu_rel8.harq_pid                          = harq_pid;
 
             hi_dci0_req->number_of_dci++;
             // fill in NAK information
diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c
index 94d8c17f0a640d5e26acab1be46e965588a8b170..724b30a3d194c2feb50aa7d9621f3a7da0c24bbc 100644
--- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c
@@ -1267,6 +1267,10 @@ do_RRCConnectionSetup(
 
   RRCConnectionSetup_t* rrcConnectionSetup = NULL;
 
+#ifdef UE_EXPANSION
+  LTE_DL_FRAME_PARMS *frame_parms = &RC.eNB[ctxt_pP->module_id][CC_id]->frame_parms;
+#endif
+
   memset((void *)&dl_ccch_msg,0,sizeof(DL_CCCH_Message_t));
   dl_ccch_msg.message.present           = DL_CCCH_MessageType_PR_c1;
   dl_ccch_msg.message.choice.c1.present = DL_CCCH_MessageType__c1_PR_rrcConnectionSetup;
@@ -1533,7 +1537,28 @@ do_RRCConnectionSetup(
 
   physicalConfigDedicated2->schedulingRequestConfig->present = SchedulingRequestConfig_PR_setup;
 #ifdef UE_EXPANSION
-  physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 31 - ue_context_pP->local_uid/10;//ue_context_pP->local_uid;
+  if (carrier->sib1->tdd_Config == NULL) {
+    physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 31 - ue_context_pP->local_uid/10;//ue_context_pP->local_uid;
+  } else {
+      switch (carrier->sib1->tdd_Config->subframeAssignment) {
+      case 1:
+          switch(frame_parms->N_RB_UL){
+          case 25:
+              physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 15 - ue_context_pP->local_uid/4;
+              break;
+          case 50:
+              physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 31 - ue_context_pP->local_uid/4;
+              break;
+          case 100:
+              physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 63 - ue_context_pP->local_uid/4;
+              break;
+          }
+          break;
+      default:
+          physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 71 - ue_context_pP->local_uid/10;//ue_context_pP->local_uid;
+          break;
+      }
+  }
 #else
   physicalConfigDedicated2->schedulingRequestConfig->choice.setup.sr_PUCCH_ResourceIndex = 71 - ue_context_pP->local_uid/10;//ue_context_pP->local_uid;
 #endif