diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c
index 9a0e93d939d64bf61b8f35e6cb9e8886372f0b1b..3c537d08a0fb2d39c791aec4952bb287e66738c7 100644
--- a/openair1/PHY/CODING/lte_rate_matching.c
+++ b/openair1/PHY/CODING/lte_rate_matching.c
@@ -661,7 +661,8 @@ int lte_rate_matching_turbo_rx(uint32_t RTC,
   int nulled=0;
 #endif
   if (Kmimo==0 || Mdlharq==0 || C==0 || Qm==0 || Nl==0) {
-    msg("lte_rate_matching.c: invalid paramters\n");
+    msg("lte_rate_matching.c: invalid parameters (Kmimo %d, Mdlharq %d, C %d, Qm %d, Nl %d\n",
+	Kmimo,Mdlharq,C,Qm,Nl);
     return(-1);
   }
 
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index 9699226e9e259f6a48388994ee9c07589bdd9b1b..c2d47d3d68fa6067c957be7d6b40db9da1793f09 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -1098,10 +1098,13 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4; j++) //frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars[eNB_id]->rxdataF_ext[(j<<1)+i]     = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
       
-      ue_pdsch_vars[eNB_id]->rxdataF_comp     = (int **)malloc16(8*sizeof(int*));
+      ue_pdsch_vars[eNB_id]->rxdataF_comp0     = (int **)malloc16(8*sizeof(int*));
+      ue_pdsch_vars[eNB_id]->rxdataF_comp1     = (int **)malloc16(8*sizeof(int*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
-	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars[eNB_id]->rxdataF_comp[(j<<1)+i]     = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
+	for (j=0; j<4;j++){
+	  ue_pdsch_vars[eNB_id]->rxdataF_comp0[(j<<1)+i]     = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
+	  ue_pdsch_vars[eNB_id]->rxdataF_comp1[(j<<1)+i]     = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
+	}
       // printf("rxdataF_comp[0] %p\n",ue_pdsch_vars[eNB_id]->rxdataF_comp[0]);
       
       ue_pdcch_vars[eNB_id]->rxdataF_comp    = (int **)malloc16(8*sizeof(int*));
@@ -1130,15 +1133,21 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
       
       ue_pdsch_vars[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL);
             
-      ue_pdsch_vars[eNB_id]->dl_ch_mag     = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars[eNB_id]->dl_ch_mag0     = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars[eNB_id]->dl_ch_mag1     = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
-	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) 
-	  ue_pdsch_vars[eNB_id]->dl_ch_mag[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	for (j=0; j<4;j++) {
+	  ue_pdsch_vars[eNB_id]->dl_ch_mag0[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars[eNB_id]->dl_ch_mag1[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	}
 
-      ue_pdsch_vars[eNB_id]->dl_ch_magb     = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars[eNB_id]->dl_ch_magb0     = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars[eNB_id]->dl_ch_magb1     = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
-	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	for (j=0; j<4;j++) {
+	  ue_pdsch_vars[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars[eNB_id]->dl_ch_magb1[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	}
       
       ue_pdsch_vars[eNB_id]->rho     = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*));
       for (i=0;i<frame_parms->nb_antennas_rx;i++)
@@ -1206,13 +1215,13 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4; j++) //frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars_SI[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
       
-      ue_pdsch_vars_SI[eNB_id]->rxdataF_comp    = (int **)malloc16(8*sizeof(int*));
+      ue_pdsch_vars_SI[eNB_id]->rxdataF_comp0    = (int **)malloc16(8*sizeof(int*));
       
       ue_pdsch_vars_SI[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL);
       
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars_SI[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
+	  ue_pdsch_vars_SI[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
       
       ue_pdsch_vars_SI[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*));
       for (i=0;i<frame_parms->nb_antennas_rx;i++)
@@ -1228,10 +1237,10 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars_ra[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
       
-      ue_pdsch_vars_ra[eNB_id]->rxdataF_comp    = (int **)malloc16(8*sizeof(int*));
+      ue_pdsch_vars_ra[eNB_id]->rxdataF_comp0    = (int **)malloc16(8*sizeof(int*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars_ra[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
+	  ue_pdsch_vars_ra[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
       
       ue_pdsch_vars_ra[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*));
       
@@ -1250,10 +1259,10 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars_mch[eNB_id]->rxdataF_ext[(j<<1)+i] = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
       
-      ue_pdsch_vars_mch[eNB_id]->rxdataF_comp    = (int **)malloc16(8*sizeof(int*));
+      ue_pdsch_vars_mch[eNB_id]->rxdataF_comp0    = (int **)malloc16(8*sizeof(int*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars_mch[eNB_id]->rxdataF_comp[(j<<1)+i] = (int *)malloc16(sizeof(int)*(2+frame_parms->N_RB_DL*12*14));
+	  ue_pdsch_vars_mch[eNB_id]->rxdataF_comp0[(j<<1)+i] = (int *)malloc16(sizeof(int)*(2+frame_parms->N_RB_DL*12*14));
       
       ue_pdsch_vars_mch[eNB_id]->rho = (int **)malloc16(frame_parms->nb_antennas_rx*sizeof(int*));
       
@@ -1282,15 +1291,15 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars_SI[eNB_id]->dl_ch_rho_ext[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       
-      ue_pdsch_vars_SI[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars_SI[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) 
-	  ue_pdsch_vars_SI[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars_SI[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
     
-      ue_pdsch_vars_SI[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars_SI[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars_SI[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars_SI[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       ue_pdsch_vars_SI[eNB_id]->llr[0] = (short *)malloc16((8*((3*8*6144)+12))*sizeof(short));
       
       /***/
@@ -1307,15 +1316,15 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars_ra[eNB_id]->dl_ch_rho_ext[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       
-      ue_pdsch_vars_ra[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars_ra[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) 
-	  ue_pdsch_vars_ra[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars_ra[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       
-      ue_pdsch_vars_ra[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars_ra[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars_ra[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars_ra[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       //    ue_pdsch_vars_ra[eNB_id]->llr[0] = (short *)malloc16((8*((3*8*6144)+12))*sizeof(short));
       
       ue_pdsch_vars_ra[eNB_id]->llr128 = (short **)malloc16(sizeof(short **));
@@ -1332,15 +1341,15 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	  ue_pdsch_vars_mch[eNB_id]->dl_ch_rho_ext[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       
-      ue_pdsch_vars_mch[eNB_id]->dl_ch_mag = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars_mch[eNB_id]->dl_ch_mag0 = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) 
-	  ue_pdsch_vars_mch[eNB_id]->dl_ch_mag[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars_mch[eNB_id]->dl_ch_mag0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       
-      ue_pdsch_vars_mch[eNB_id]->dl_ch_magb = (int **)malloc16(8*sizeof(short*));
+      ue_pdsch_vars_mch[eNB_id]->dl_ch_magb0 = (int **)malloc16(8*sizeof(short*));
       for (i=0; i<frame_parms->nb_antennas_rx; i++)
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
-	  ue_pdsch_vars_mch[eNB_id]->dl_ch_magb[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars_mch[eNB_id]->dl_ch_magb0[(j<<1)+i] = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
       //    ue_pdsch_vars_mch[eNB_id]->llr[0] = (short *)malloc16((8*((3*8*6144)+12))*sizeof(short));
       
       ue_pdsch_vars_mch[eNB_id]->llr128 = (short **)malloc16(sizeof(short **));
@@ -1419,13 +1428,13 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 	  }
       }
 
-    ue_pdsch_vars[eNB_id]->rxdataF_comp     = (int **)malloc16(8*sizeof(int*));
+    ue_pdsch_vars[eNB_id]->rxdataF_comp0     = (int **)malloc16(8*sizeof(int*));
     ue_pdsch_vars_flp[eNB_id]->rxdataF_comp = (double **)malloc16(8*sizeof(int*));
     for (i=0; i<frame_parms->nb_antennas_rx; i++)
       {
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	  {
-	    ue_pdsch_vars[eNB_id]->rxdataF_comp[(j<<1)+i]     = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
+	    ue_pdsch_vars[eNB_id]->rxdataF_comp0[(j<<1)+i]     = (int *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
 	    ue_pdsch_vars_flp[eNB_id]->rxdataF_comp[(j<<1)+i] = (double *)malloc16(sizeof(int)*(frame_parms->N_RB_DL*12*14));
 	  }
       }
@@ -1456,23 +1465,23 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
     ue_pdsch_vars[eNB_id]->pmi_ext     = (unsigned char *)malloc16(frame_parms->N_RB_DL);
     ue_pdsch_vars_flp[eNB_id]->pmi_ext = (unsigned char *)malloc16(frame_parms->N_RB_DL);
         
-    ue_pdsch_vars[eNB_id]->dl_ch_mag     = (int **)malloc16(8*sizeof(short*));
+    ue_pdsch_vars[eNB_id]->dl_ch_mag0     = (int **)malloc16(8*sizeof(short*));
     ue_pdsch_vars_flp[eNB_id]->dl_ch_mag = (double **)malloc16(8*sizeof(double*));
     for (i=0; i<frame_parms->nb_antennas_rx; i++)
       {
 	for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++) 
 	  {
-	    ue_pdsch_vars[eNB_id]->dl_ch_mag[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	    ue_pdsch_vars[eNB_id]->dl_ch_mag0[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
 	    ue_pdsch_vars_flp[eNB_id]->dl_ch_mag[(j<<1)+i] = (double *)malloc16(7*2*sizeof(double)*(frame_parms->N_RB_DL*12));
 	  }
       }
-    ue_pdsch_vars[eNB_id]->dl_ch_magb     = (int **)malloc16(8*sizeof(short*));
+    ue_pdsch_vars[eNB_id]->dl_ch_magb0     = (int **)malloc16(8*sizeof(short*));
     ue_pdsch_vars_flp[eNB_id]->dl_ch_magb = (double **)malloc16(8*sizeof(double*));
     for (i=0; i<frame_parms->nb_antennas_rx; i++)
       {
       for (j=0; j<4;j++)//frame_parms->nb_antennas_tx; j++)
 	{
-	  ue_pdsch_vars[eNB_id]->dl_ch_magb[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
+	  ue_pdsch_vars[eNB_id]->dl_ch_magb0[(j<<1)+i]     = (int *)malloc16(7*2*sizeof(int)*(frame_parms->N_RB_DL*12));
 	  ue_pdsch_vars_flp[eNB_id]->dl_ch_magb[(j<<1)+i] = (double *)malloc16(7*2*sizeof(double)*(frame_parms->N_RB_DL*12));
 	}
       }
@@ -1504,6 +1513,10 @@ int phy_init_lte_ue(PHY_VARS_UE *phy_vars_ue,
 
   phy_vars_ue->pdsch_config_dedicated->p_a = PDSCH_ConfigDedicated__p_a_dB0; //defaul value until overwritten by RRCConnectionReconfiguration
 
+  // set channel estimation to do linear interpolation in time
+  phy_vars_ue->high_speed_flag = 1;
+  phy_vars_ue->ch_est_alpha    = 24576;
+
   init_prach_tables(839);
 
   return(0);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
index 0afc66f4872a7afccf8d4b6c23db0e71a80ce4d9..2fcec9c2565d667d195cdbc3d27529e2aed44553 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_dl_channel_estimation.c
@@ -45,7 +45,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
 
 
   int pilot[2][200] __attribute__((aligned(16)));
-  unsigned char nu,aarx,aa;
+  unsigned char nu,aarx;
   unsigned short k;
   unsigned int rb,pilot_cnt;
   short ch[2],*pil,*rxF,*dl_ch,*dl_ch_prev,*f,*f2,*fl,*f2l2,*fr,*f2r2,*f2_dc,*f_dc;
@@ -88,7 +88,10 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
 
 
   //ch_offset     = (l*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size));
-  ch_offset     = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol;
+  if (phy_vars_ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
+    ch_offset     = phy_vars_ue->lte_frame_parms.ofdm_symbol_size ;
+  else
+    ch_offset     = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol;
   symbol_offset = phy_vars_ue->lte_frame_parms.ofdm_symbol_size*symbol;
 
   k = (nu + nushift)%6;
@@ -185,9 +188,15 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
     rxF   = (short *)&rxdataF[aarx][((symbol_offset+k+phy_vars_ue->lte_frame_parms.first_carrier_offset))]; 
     dl_ch = (short *)&dl_ch_estimates[(p<<1)+aarx][ch_offset];
 
+  
     //    if (eNb_id==0)
     memset(dl_ch,0,4*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size));
+    if (phy_vars_ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
+      multadd_complex_vector_real_scalar(dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),
+					 phy_vars_ue->ch_est_alpha,dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),
+					 1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
     
+
     if ((phy_vars_ue->lte_frame_parms.N_RB_DL==6)  || 
 	(phy_vars_ue->lte_frame_parms.N_RB_DL==50) || 
 	(phy_vars_ue->lte_frame_parms.N_RB_DL==100)) {
@@ -610,75 +619,83 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
 #ifndef PERFECT_CE    
     // Temporal Interpolation
     // printf("ch_offset %d\n",ch_offset);
-    
+
     dl_ch = (short *)&dl_ch_estimates[(p<<1)+aarx][ch_offset];
-    if (symbol == 0) {
-      //      printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp);
-      //      dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
-      dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
-      
-      multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-      multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+
+    if (phy_vars_ue->high_speed_flag == 0) {
+      multadd_complex_vector_real_scalar(dl_ch,
+					 32767-phy_vars_ue->ch_est_alpha,
+					 dl_ch-(phy_vars_ue->lte_frame_parms.ofdm_symbol_size<<1),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+    }
+    else { // high_speed_flag == 1
+      if (symbol == 0) {
+	//      printf("Interpolating %d->0\n",4-phy_vars_ue->lte_frame_parms.Ncp);
+	//      dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][(4-phy_vars_ue->lte_frame_parms.Ncp)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
+	dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot3*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
+	
+	multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
       
-      multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-      multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-    } // this is 1/3,2/3 combination for pilots spaced by 3 symbols
-    else if (symbol == pilot1) {
-      dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][0];
-      if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
-	multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-            
-	multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-            
-	multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+      } // this is 1/3,2/3 combination for pilots spaced by 3 symbols
+      else if (symbol == pilot1) {
+	dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][0];
+	if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
+	  multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  
+	  multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  
+	  multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	}
+	else {
+	  multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  
+	  multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	} // pilot spacing 3 symbols (1/3,2/3 combination)        
       }
-      else {
-	multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-            
-	multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-      } // pilot spacing 3 symbols (1/3,2/3 combination)        
-    }
-    else if (symbol == pilot2) {
-      dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
-        
-      multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-      multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+      else if (symbol == pilot2) {
+	dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot1*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
         
-      multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-      multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);        
-    }
-    else { // symbol == pilot3
-      //      printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp);
-      dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
-      if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
-	multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	
-	multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
 	
-	multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);        
       }
-      else {
-	multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	
-	multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-	multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
-      } // pilot spacing 3 symbols (1/3,2/3 combination)
+      else { // symbol == pilot3
+	//      printf("Interpolating 0->%d\n",4-phy_vars_ue->lte_frame_parms.Ncp);
+	dl_ch_prev = (short *)&dl_ch_estimates[(p<<1)+aarx][pilot2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)];
+	if (phy_vars_ue->lte_frame_parms.Ncp==0) {// pilot spacing 4 symbols (1/4,1/2,3/4 combination)
+	  multadd_complex_vector_real_scalar(dl_ch_prev,24576,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,8192,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  
+	  multadd_complex_vector_real_scalar(dl_ch_prev,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,16384,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  
+	  multadd_complex_vector_real_scalar(dl_ch_prev,8192,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,24576,dl_ch_prev+(3*2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	}
+	else {
+	  multadd_complex_vector_real_scalar(dl_ch_prev,10923,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  
+	  multadd_complex_vector_real_scalar(dl_ch_prev,21845,dl_ch_prev+(2*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1),1,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	  multadd_complex_vector_real_scalar(dl_ch,10923,dl_ch_prev+(2*((phy_vars_ue->lte_frame_parms.ofdm_symbol_size)<<1)),0,phy_vars_ue->lte_frame_parms.ofdm_symbol_size);
+	} // pilot spacing 3 symbols (1/3,2/3 combination)
+      }
+    
     }
 #endif
-    
   }
 
   void (*idft)(int16_t *,int16_t *, int);
-
+  
   switch (phy_vars_ue->lte_frame_parms.log2_symbol_size) {
   case 7:
     idft = idft128;
@@ -705,7 +722,7 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
       if (phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx])
 	idft((int16_t*) &phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_offset][(p<<1)+aarx][8],
 	     (int16_t*) phy_vars_ue->lte_ue_common_vars.dl_ch_estimates_time[eNB_offset][(p<<1)+aarx],1);
-  }
+    }
   return(0); 
 }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index 58c780698244fca7556f57102c64b8cb3344fe3a..1996ad77fe51067ae99811df4bc0ee287e6e1ad2 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -254,6 +254,11 @@ uint8_t *generate_dci0(uint8_t *dci,
     dci_flip[5] = dci[2];
     dci_flip[6] = dci[1];
     dci_flip[7] = dci[0];
+#ifdef DEBUG_DCI_ENCODING
+	    msg("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n",
+		dci_flip[0],dci_flip[1],dci_flip[2],dci_flip[3],
+		dci_flip[4],dci_flip[5],dci_flip[6],dci_flip[7]);
+#endif
   }
 	
   dci_encoding(dci_flip,DCI_LENGTH,coded_bits,e,rnti);
@@ -812,6 +817,7 @@ void pdcch_extract_rbs_single(int32_t **rxdataF,
 			      int32_t **rxdataF_ext,
 			      int32_t **dl_ch_estimates_ext,
 			      uint8_t symbol,
+			      uint32_t high_speed_flag,
 			      LTE_DL_FRAME_PARMS *frame_parms) {
 
 
@@ -828,8 +834,11 @@ void pdcch_extract_rbs_single(int32_t **rxdataF,
   msg("[PHY] extract_rbs_single: symbol_mod %d\n",symbol_mod);
 #endif
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
-    
-    dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+
+    if (high_speed_flag == 1)
+      dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+    else
+      dl_ch0     = &dl_ch_estimates[aarx][5];
     dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
 
     rxF_ext   = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
@@ -1013,6 +1022,7 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
 			    int32_t **rxdataF_ext,
 			    int32_t **dl_ch_estimates_ext,
 			    uint8_t symbol,
+			    uint32_t high_speed_flag,
 			    LTE_DL_FRAME_PARMS *frame_parms) {
   
 
@@ -1025,10 +1035,16 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
-    
-    dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+
+    if (high_speed_flag==1) {
+      dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+      dl_ch1     = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+    }
+    else {
+      dl_ch0     = &dl_ch_estimates[aarx][5];
+      dl_ch1     = &dl_ch_estimates[2+aarx][5];
+    }
     dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
-    dl_ch1     = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
     dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(frame_parms->N_RB_DL*12)];
 
     //    msg("pdcch extract_rbs: rxF_ext pos %d\n",symbol*(frame_parms->N_RB_DL*12));
@@ -1524,6 +1540,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 		 uint8_t subframe,
 		 uint8_t eNB_id,
 		 MIMO_mode_t mimo_mode,
+		 uint32_t high_speed_flag,
 		 uint8_t is_secondary_ue) {
 
   uint8_t log2_maxh,aatx,aarx;
@@ -1543,6 +1560,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 				 lte_ue_pdcch_vars[eNB_id]->rxdataF_ext,
 				 lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext,
 				 s,
+				 high_speed_flag,
 				 frame_parms);
 #ifdef MU_RECEIVER
 	pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF,
@@ -1550,6 +1568,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 				 lte_ue_pdcch_vars[eNB_id_i]->rxdataF_ext,//shift by two to simulate transmission from a second antenna
 				 lte_ue_pdcch_vars[eNB_id_i]->dl_ch_estimates_ext,//shift by two to simulate transmission from a second antenna
 				 s,
+				 high_speed_flag,
 				 frame_parms);
 #endif //MU_RECEIVER
       } else if (frame_parms->nb_antennas_tx_eNB>1) {
@@ -1558,6 +1577,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 			       lte_ue_pdcch_vars[eNB_id]->rxdataF_ext,
 			       lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext,
 			       s,
+			       high_speed_flag,
 			       frame_parms);
       } else {
 	pdcch_extract_rbs_single(lte_ue_common_vars->rxdataF,
@@ -1565,6 +1585,7 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 				 lte_ue_pdcch_vars[eNB_id]->rxdataF_ext,
 				 lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext,
 				 s,
+				 high_speed_flag,
 				 frame_parms);
       }
   }
@@ -1832,13 +1853,13 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci,
 }
 
 uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
-		    uint8_t num_common_dci,
-		    DCI_ALLOC_t *dci_alloc, 
-		    uint32_t n_rnti,
-		    int16_t amp,
-		    LTE_DL_FRAME_PARMS *frame_parms,
-		    mod_sym_t **txdataF,
-		    uint32_t subframe) {
+			 uint8_t num_common_dci,
+			 DCI_ALLOC_t *dci_alloc, 
+			 uint32_t n_rnti,
+			 int16_t amp,
+			 LTE_DL_FRAME_PARMS *frame_parms,
+			 mod_sym_t **txdataF,
+			 uint32_t subframe) {
 
   uint8_t *e_ptr,num_pdcch_symbols;
   int8_t L;
@@ -2451,6 +2472,11 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,int do_common,uint
 	    dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[5];
 	    dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[6];
 	    dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[7];
+#ifdef DEBUG_DCI_DECODING
+	    msg("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n",
+		dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3],
+		dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]);
+#endif
 	  }
 	  
 	  if (crc==si_rnti) {
@@ -2540,6 +2566,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
   uint8_t format0_size_bits,format0_size_bytes;
   uint8_t format1_size_bits,format1_size_bytes;
   uint8_t format2_size_bits,format2_size_bytes;
+  uint8_t format2A_size_bits,format2A_size_bytes;
 
   switch (frame_parms->N_RB_DL) {
   case 6:
@@ -2550,13 +2577,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_1_5MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_1_5MHz_TDD_t;
       format1_size_bytes = sizeof(DCI1_1_5MHz_TDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_1_5MHz_2A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_1_5MHz_2A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_1_5MHz_4A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_1_5MHz_4A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_1_5MHz_4A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_1_5MHz_4A_TDD_t);
       }
     }
     else {
@@ -2566,13 +2597,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_1_5MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_1_5MHz_FDD_t;
       format1_size_bytes = sizeof(DCI1_1_5MHz_FDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_1_5MHz_2A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_1_5MHz_2A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_1_5MHz_4A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_1_5MHz_4A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_1_5MHz_4A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_1_5MHz_4A_FDD_t);
       }
     }
     break;
@@ -2585,13 +2620,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_5MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_5MHz_TDD_t;
       format1_size_bytes = sizeof(DCI1_5MHz_TDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_5MHz_2A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_5MHz_2A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_5MHz_2A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_5MHz_2A_TDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_5MHz_4A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_5MHz_4A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_5MHz_4A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_5MHz_4A_TDD_t);
       }
     }
     else {
@@ -2601,13 +2640,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_5MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_5MHz_FDD_t;
       format1_size_bytes = sizeof(DCI1_5MHz_FDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_5MHz_2A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_5MHz_2A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_5MHz_2A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_5MHz_2A_FDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_5MHz_4A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_5MHz_4A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_5MHz_4A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_5MHz_4A_FDD_t);
       }
     }
     break;
@@ -2619,13 +2662,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_10MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_10MHz_TDD_t;
       format1_size_bytes = sizeof(DCI1_10MHz_TDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_10MHz_2A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_10MHz_2A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_10MHz_2A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_10MHz_2A_TDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_10MHz_4A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_10MHz_4A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_10MHz_4A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_10MHz_4A_TDD_t);
       }
     }
     else {
@@ -2635,13 +2682,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_10MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_10MHz_FDD_t;
       format1_size_bytes = sizeof(DCI1_10MHz_FDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_10MHz_2A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_10MHz_2A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_10MHz_2A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_10MHz_2A_FDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_10MHz_4A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_10MHz_4A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_10MHz_4A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_10MHz_4A_FDD_t);
       }
     }
     break;
@@ -2654,13 +2705,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_20MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_20MHz_TDD_t;
       format1_size_bytes = sizeof(DCI1_20MHz_TDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_20MHz_2A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_20MHz_2A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_20MHz_2A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_20MHz_2A_TDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_20MHz_4A_TDD_t;
 	format2_size_bytes = sizeof(DCI2_20MHz_4A_TDD_t);
+	format2A_size_bits  = sizeof_DCI2A_20MHz_4A_TDD_t;
+	format2A_size_bytes = sizeof(DCI2A_20MHz_4A_TDD_t);
       }
     }
     else {
@@ -2670,13 +2725,17 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       format0_size_bytes = sizeof(DCI0_20MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_20MHz_FDD_t;
       format1_size_bytes = sizeof(DCI1_20MHz_FDD_t);
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	format2_size_bits  = sizeof_DCI2_20MHz_2A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_20MHz_2A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_20MHz_2A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_20MHz_2A_FDD_t);
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	format2_size_bits  = sizeof_DCI2_20MHz_4A_FDD_t;
 	format2_size_bytes = sizeof(DCI2_20MHz_4A_FDD_t);
+	format2A_size_bits  = sizeof_DCI2A_20MHz_4A_FDD_t;
+	format2A_size_bytes = sizeof(DCI2A_20MHz_4A_FDD_t);
       }
     }
     break;
@@ -2981,9 +3040,117 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     
     //#endif //ALL_AGGREGATION    
   }
+  else if (tmode == 3) {
+
+
+    // Now check UE_SPEC format 2A_2A search spaces at aggregation 1 
+    dci_decoding_procedure0(lte_ue_pdcch_vars,0,
+			    subframe,
+			    dci_alloc,
+			    eNB_id,
+			    frame_parms,
+			    mi,
+			    SI_RNTI,
+			    ra_rnti,
+			    0,
+			    format1A,
+			    format1A,
+			    format2A,
+			    format2A_size_bits,
+			    format2A_size_bytes,
+			    &dci_cnt,
+			    &format0_found,
+			    &format_c_found,
+			    &CCEmap0,
+			    &CCEmap1,
+			    &CCEmap2);
+    if ((CCEmap0==0xffff)|| 
+	((format0_found==1)&&(format_c_found==1)))
+      return(dci_cnt);
+    if (dci_cnt>old_dci_cnt)
+      return(dci_cnt);
+
+    // Now check UE_SPEC format 2 search spaces at aggregation 2 
+    dci_decoding_procedure0(lte_ue_pdcch_vars,0,
+			    subframe,
+			    dci_alloc,
+			    eNB_id,
+			    frame_parms,
+			    mi,
+			    SI_RNTI,
+			    ra_rnti,
+			    1,
+			    format1A,
+			    format1A,
+			    format2A,
+			    format2A_size_bits,
+			    format2A_size_bytes,
+			    &dci_cnt,
+			    &format0_found,
+			    &format_c_found,
+			    &CCEmap0,
+			    &CCEmap1,
+			    &CCEmap2);
+    if ((CCEmap0==0xffff)|| 
+	((format0_found==1)&&(format_c_found==1)))
+      return(dci_cnt);
+    if (dci_cnt>old_dci_cnt)
+      return(dci_cnt);
+
+    // Now check UE_SPEC format 2_2A search spaces at aggregation 4 
+    dci_decoding_procedure0(lte_ue_pdcch_vars,0,
+			    subframe,
+			    dci_alloc,
+			    eNB_id,
+			    frame_parms,
+			    mi,
+			    SI_RNTI,
+			    ra_rnti,
+			    2,
+			    format1A,
+			    format1A,
+			    format2A,
+			    format2A_size_bits,
+			    format2A_size_bytes,
+			    &dci_cnt,
+			    &format0_found,
+			    &format_c_found,
+			    &CCEmap0,
+			    &CCEmap1,
+			    &CCEmap2);
+    if ((CCEmap0==0xffff)|| 
+	((format0_found==1)&&(format_c_found==1)))
+      return(dci_cnt);
+    if (dci_cnt>old_dci_cnt)
+      return(dci_cnt);
+
+    //#ifdef ALL_AGGREGATION
+    // Now check UE_SPEC format 2_2A search spaces at aggregation 8 
+    dci_decoding_procedure0(lte_ue_pdcch_vars,0,
+			    subframe,
+			    dci_alloc,
+			    eNB_id,
+			    frame_parms,
+			    mi,
+			    SI_RNTI,
+			    ra_rnti,
+			    3,
+			    format1A,
+			    format1A,
+			    format2A,
+			    format2A_size_bits,
+			    format2A_size_bytes,
+			    &dci_cnt,
+			    &format0_found,
+			    &format_c_found,
+			    &CCEmap0,
+			    &CCEmap1,
+			    &CCEmap2);    
+    //#endif
+  }
   else if (tmode == 4) {
 
-    // Now check UE_SPEC format 2_2A_M10PRB search spaces at aggregation 1 
+    // Now check UE_SPEC format 2_2A search spaces at aggregation 1 
     dci_decoding_procedure0(lte_ue_pdcch_vars,0,
 			    subframe,
 			    dci_alloc,
@@ -3037,7 +3204,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     if (dci_cnt>old_dci_cnt)
       return(dci_cnt);
 
-    // Now check UE_SPEC format 2_2A_M10PRB search spaces at aggregation 4 
+    // Now check UE_SPEC format 2_2A search spaces at aggregation 4 
     dci_decoding_procedure0(lte_ue_pdcch_vars,0,
 			    subframe,
 			    dci_alloc,
@@ -3065,7 +3232,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
       return(dci_cnt);
 
     //#ifdef ALL_AGGREGATION
-    // Now check UE_SPEC format 2_2A_M10PRB search spaces at aggregation 8 
+    // Now check UE_SPEC format 2_2A search spaces at aggregation 8 
     dci_decoding_procedure0(lte_ue_pdcch_vars,0,
 			    subframe,
 			    dci_alloc,
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h
index c542b5e28a65346f66cbd096f0d76b097f37f8c7..255e7f7e8743a537c6aa4f82d29c12b6046ac3f4 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.h
+++ b/openair1/PHY/LTE_TRANSPORT/dci.h
@@ -1532,122 +1532,501 @@ typedef struct DCI2_20MHz_4A_FDD DCI2_20MHz_4A_FDD_t;
 // ********************FORMAT 2A DCIs*********************************
 // *******************************************************************
 
-/// DCI Format Type 2A (5 MHz, TDD, 2 Antenna Ports, 39 bits)
-struct __attribute__ ((__packed__)){
-  /// Resource Allocation Header
-  uint32_t rah:1;
-  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
-  uint32_t rballoc:13;
-  /// Power Control
-  uint32_t TPC:2;
-  /// Downlink Assignment Index
-  uint32_t dai:2;
-  /// HARQ Process
-  uint32_t harq_pid:4;
-  /// TB swap
-  uint32_t tb_swap:1;
-  /// Modulation and Coding Scheme and Redundancy Version 1
-  uint32_t mcs1:5;
-  /// New Data Indicator 1
-  uint32_t ndi1:1;
-  /// Redundancy version 1
-  uint32_t rv1:2;
-  /// Modulation and Coding Scheme and Redundancy Version 2
-  uint32_t mcs2:5;
-  /// New Data Indicator 2
-  uint32_t ndi2:1;
+/// DCI Format Type 2A (1.5 MHz, TDD, 2 Antenna Ports, 32 bits)
+struct DCI2A_1_5MHz_2A_TDD {
   /// Redundancy version 2
   uint32_t rv2:2;
-} DCI2A_5MHz_2A_TDD;
-#define sizeof_DCI2A_5MHz_2A_TDD_t 39
-
-/// DCI Format Type 2A (5 MHz, TDD, 4 Antenna Ports, 45 bits)
-typedef struct __attribute__ ((__packed__)){
-  /// Resource Allocation Header
-  uint32_t rah:1;
-  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
-  uint32_t rballoc:13;
-  /// Power Control
-  uint32_t TPC:2;
-  /// Downlink Assignment Index
-  uint32_t dai:2;
-  /// HARQ Process
-  uint32_t harq_pid:4;
-  /// TB swap
-  uint32_t tb_swap:1;
-  /// Modulation and Coding Scheme and Redundancy Version 1
-  uint32_t mcs1:5;
-  /// New Data Indicator 1
-  uint32_t ndi1:1;
-  /// Redundancy version 1
-  uint32_t rv1:2;
-  /// Modulation and Coding Scheme and Redundancy Version 2
-  uint32_t mcs2:5;
   /// New Data Indicator 2
   uint32_t ndi2:1;
-  /// Redundancy version 2
-  uint32_t rv2:2;
-  /// TPMI information for precoding
-  uint32_t tpmi:2;
-} DCI2A_5MHz_4A_TDD_t;
-#define sizeof_DCI2A_5MHz_4A_TDD_t 45
-
-/// DCI Format Type 2A (5 MHz, FDD, 2 Antenna Ports, 36 bits)
-struct __attribute__ ((__packed__)){
-  /// Resource Allocation Header
-  uint32_t rah:1;
-  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
-  uint32_t rballoc:13;
-  /// Power Control
-  uint32_t TPC:2;
-  /// HARQ Process
-  uint32_t harq_pid:3;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint32_t mcs2:5;
+  /// Redundancy version 1
+  uint32_t rv1:2;
+  /// New Data Indicator 1
+  uint32_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint32_t mcs1:5;
   /// TB swap
   uint32_t tb_swap:1;
+  /// HARQ Process
+  uint32_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint32_t dai:2;
+  /// Power Control
+  uint32_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint32_t rballoc:6;
+  /// Resource Allocation Header
+  uint32_t rah:1;
+} __attribute__ ((__packed__));
+
+#define sizeof_DCI2A_1_5MHz_2A_TDD_t 32
+typedef struct DCI2A_1_5MHz_2A_TDD DCI2A_1_5MHz_2A_TDD_t;
+
+/// DCI Format Type 2A (1.5 MHz, TDD, 4 Antenna Ports, 34 bits)
+struct DCI2A_1_5MHz_4A_TDD {
+  uint64_t padding:30;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
   /// Modulation and Coding Scheme and Redundancy Version 1
-  uint32_t mcs1:5;
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:6;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_1_5MHz_4A_TDD_t 34
+typedef struct DCI2A_1_5MHz_4A_TDD DCI2A_1_5MHz_4A_TDD_t;
+
+/// DCI Format Type 2A (1.5 MHz, FDD, 2 Antenna Ports, 29 bits)
+struct DCI2A_1_5MHz_2A_FDD {
+  uint32_t padding:18;
+  /// Redundancy version 2
+  uint32_t rv2:2;
+  /// New Data Indicator 2
+  uint32_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint32_t mcs2:5;
+  /// Redundancy version 1
+  uint32_t rv1:2;
   /// New Data Indicator 1
   uint32_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint32_t mcs1:5;
+  /// TB swap
+  uint32_t tb_swap:1;
+  /// HARQ Process
+  uint32_t harq_pid:3;
+  /// Power Control
+  uint32_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint32_t rballoc:6;
+  /// Resource Allocation Header
+  uint32_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_1_5MHz_2A_FDD_t 29
+typedef struct DCI2A_1_5MHz_2A_FDD DCI2A_1_5MHz_2A_FDD_t;
+
+/// DCI Format Type 2A (1.5 MHz, FDD, 4 Antenna Ports, 31 bits)
+struct DCI2A_1_5MHz_4A_FDD{
+  uint32_t padding:1;
+  /// TPMI information for precoding
+  uint32_t tpmi:2;
+  /// Redundancy version 2
+  uint32_t rv2:2;
+  /// New Data Indicator 2
+  uint32_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint32_t mcs2:5;
   /// Redundancy version 1
   uint32_t rv1:2;
+  /// New Data Indicator 1
+  uint32_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint32_t mcs1:5;
+  /// TB swap
+  uint32_t tb_swap:1;
+  /// HARQ Process
+  uint32_t harq_pid:3;
+  /// Power Control
+  uint32_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint32_t rballoc:6;
+  /// Resource Allocation Header
+  uint32_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_1_5MHz_4A_FDD_t 38
+typedef struct DCI2A_1_5MHz_4A_FDD DCI2A_1_5MHz_4A_FDD_t;
+
+/// DCI Format Type 2A (5 MHz, TDD, 2 Antenna Ports, 39 bits)
+struct DCI2A_5MHz_2A_TDD {
+  uint64_t padding:25;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
   /// Modulation and Coding Scheme and Redundancy Version 2
-  uint32_t mcs2:5;
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:13;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_5MHz_2A_TDD_t 39
+typedef struct DCI2A_5MHz_2A_TDD DCI2A_5MHz_2A_TDD_t;
+
+/// DCI Format Type 2A (5 MHz, TDD, 4 Antenna Ports, 41 bits)
+struct DCI2A_5MHz_4A_TDD {
+  uint64_t padding:23;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
   /// New Data Indicator 2
-  uint32_t ndi2:1;
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:13;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_5MHz_4A_TDD_t 41
+typedef struct DCI2A_5MHz_4A_TDD DCI2A_5MHz_4A_TDD_t;
+
+/// DCI Format Type 2A (5 MHz, FDD, 2 Antenna Ports, 36 bits)
+struct DCI2A_5MHz_2A_FDD {
+  uint64_t padding:28;
   /// Redundancy version 2
-  uint32_t rv2:2;
-} DCI2A_5MHz_2A_M10PRB_FDD;
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:3;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:13;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
 #define sizeof_DCI2A_5MHz_2A_FDD_t 36
+typedef struct DCI2A_5MHz_2A_FDD DCI2A_5MHz_2A_FDD_t;
 
-/// DCI Format Type 2A (5 MHz, TDD, 4 Antenna Ports, 38 bits)
-struct __attribute__ ((__packed__)){
-  /// Resource Allocation Header
-  uint32_t rah:1;
-  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
-  uint32_t rballoc:13;
-  /// Power Control
-  uint32_t TPC:2;
+/// DCI Format Type 2A (5 MHz, FDD, 4 Antenna Ports, 38 bits)
+struct DCI2A_5MHz_4A_FDD {
+  uint64_t padding:26;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
   /// HARQ Process
-  uint32_t harq_pid:3;
+  uint64_t harq_pid:3;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:13;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_5MHz_4A_FDD_t 38
+typedef struct DCI2A_5MHz_4A_FDD DCI2A_5MHz_4A_FDD_t;
+
+/// DCI Format Type 2A (10 MHz, TDD, 2 Antenna Ports, 39 bits)
+struct DCI2A_10MHz_2A_TDD {
+  uint64_t padding:25;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
   /// TB swap
-  uint32_t tb_swap:1;
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:17;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_10MHz_2A_TDD_t 39
+typedef struct DCI2A_10MHz_2A_TDD DCI2A_10MHz_2A_TDD_t;
+
+/// DCI Format Type 2A (10 MHz, TDD, 4 Antenna Ports, 41 bits)
+struct DCI2A_10MHz_4A_TDD{
+  uint64_t padding:23;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
   /// Modulation and Coding Scheme and Redundancy Version 1
-  uint32_t mcs1:5;
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:17;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_10MHz_4A_TDD_t 41
+typedef struct DCI2A_10MHz_4A_TDD DCI2A_10MHz_4A_TDD_t;
+
+/// DCI Format Type 2A (10 MHz, FDD, 2 Antenna Ports, 36 bits)
+struct DCI2A_10MHz_2A_FDD {
+  uint64_t padding:28;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
   /// New Data Indicator 1
-  uint32_t ndi1:1;
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:3;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:17;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_10MHz_2A_FDD_t 36
+typedef struct DCI2A_10MHz_2A_FDD DCI2A_10MHz_2A_FDD_t;
+
+/// DCI Format Type 2A (10 MHz, FDD, 4 Antenna Ports, 38 bits)
+struct DCI2A_10MHz_4A_FDD{
+  uint64_t padding:26;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
   /// Redundancy version 1
-  uint32_t rv1:2;
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:3;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:17;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_10MHz_4A_FDD_t 38
+typedef struct DCI2A_10MHz_4A_FDD DCI2A_10MHz_4A_FDD_t;
+
+/// DCI Format Type 2A (20 MHz, TDD, 2 Antenna Ports, 51 bits)
+struct DCI2A_20MHz_2A_TDD{
+  uint64_t padding:13;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
   /// Modulation and Coding Scheme and Redundancy Version 2
-  uint32_t mcs2:5;
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:25;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_20MHz_2A_TDD_t 51
+typedef struct DCI2A_20MHz_2A_TDD DCI2A_20MHz_2A_TDD_t;
+
+/// DCI Format Type 2A (20 MHz, TDD, 4 Antenna Ports, 53 bits)
+struct DCI2A_20MHz_4A_TDD{
+  uint64_t padding:11;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
   /// New Data Indicator 2
-  uint32_t ndi2:1;
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:4;
+  /// Downlink Assignment Index
+  uint64_t dai:2;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:25;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_20MHz_4A_TDD_t 53
+typedef struct DCI2A_20MHz_4A_TDD DCI2A_20MHz_4A_TDD_t;
+
+/// DCI Format Type 2A (20 MHz, FDD, 2 Antenna Ports, 48 bits)
+struct DCI2A_20MHz_2A_FDD {
+  uint64_t padding:16;
   /// Redundancy version 2
-  uint32_t rv2:2;
-  /// TPMI information for precoding
-  uint32_t tpmi:2;
-} DCI2A_5MHz_4A_FDD;
-#define sizeof_DCI2A_5MHz_4A_FDD_t 38
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:3;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:25;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_20MHz_2A_FDD_t 48
+typedef struct DCI2A_20MHz_2A_FDD DCI2A_20MHz_2A_FDD_t;
 
+/// DCI Format Type 2A (20 MHz, FDD, 4 Antenna Ports, 50 bits)
+struct DCI2A_20MHz_4A_FDD {
+  uint64_t padding:14;
+  /// TPMI information for precoding
+  uint64_t tpmi:2;
+  /// Redundancy version 2
+  uint64_t rv2:2;
+  /// New Data Indicator 2
+  uint64_t ndi2:1;
+  /// Modulation and Coding Scheme and Redundancy Version 2
+  uint64_t mcs2:5;
+  /// Redundancy version 1
+  uint64_t rv1:2;
+  /// New Data Indicator 1
+  uint64_t ndi1:1;
+  /// Modulation and Coding Scheme and Redundancy Version 1
+  uint64_t mcs1:5;
+  /// TB swap
+  uint64_t tb_swap:1;
+  /// HARQ Process
+  uint64_t harq_pid:3;
+  /// Power Control
+  uint64_t TPC:2;
+  /// RB Assignment (ceil(log2(N_RB_DL/P)) bits)
+  uint64_t rballoc:25;
+  /// Resource Allocation Header
+  uint64_t rah:1;
+} __attribute__ ((__packed__));
+#define sizeof_DCI2A_20MHz_4A_FDD_t 50
+typedef struct DCI2A_20MHz_4A_FDD DCI2A_20MHz_4A_FDD_t;
 
 // *******************************************************************
 // ********************FORMAT 2B DCIs*********************************
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 6ddc45dec2d7493a91270a2564a63ff56ebe5fe0..f8f51daaa22fc7c85d7e4b994bf1612cec9b560e 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -557,6 +557,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
   uint8_t rv=0,rv1=0,rv2=0;
   uint8_t rah=0;
   uint8_t TPC=0;
+  LTE_DL_eNB_HARQ_t *dlsch0_harq,*dlsch1_harq;
 
   //   printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu);
 
@@ -571,6 +572,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
     dlsch[0]->subframe_tx[subframe] = 1;
 
+
     switch (frame_parms->N_RB_DL) {
     case 6:
       if (frame_type == TDD) {
@@ -593,13 +595,15 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
 	//      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
       }
-      
+
+
+      dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
       if (vrb_type == 0)
-	dlsch[0]->rb_alloc[0]                       = localRIV2alloc_LUT6[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT6[rballoc];
       else
-	dlsch[0]->rb_alloc[0]                       = distRIV2alloc_LUT6[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT6[rballoc];
       
-      dlsch[0]->nb_rb                               = RIV2nb_rb_LUT6[rballoc];//NPRB;
+      dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT6[rballoc];//NPRB;
       RIV_max = RIV_max6;
 
       
@@ -626,12 +630,13 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 	//      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
       }
 
+      dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
       if (vrb_type == 0)
-	dlsch[0]->rb_alloc[0]                       = localRIV2alloc_LUT25[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT25[rballoc];
       else
-	dlsch[0]->rb_alloc[0]                       = distRIV2alloc_LUT25[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT25[rballoc];
       
-      dlsch[0]->nb_rb                               = RIV2nb_rb_LUT25[rballoc];//NPRB;
+      dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT25[rballoc];//NPRB;
       RIV_max = RIV_max25;      
       break;
     case 50:
@@ -655,15 +660,16 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 	//      printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB);
       }
 
+      dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
       if (vrb_type == 0) {
-	dlsch[0]->rb_alloc[0]                       = localRIV2alloc_LUT50_0[rballoc];
-	dlsch[0]->rb_alloc[1]                       = localRIV2alloc_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc[1]                       = localRIV2alloc_LUT50_1[rballoc];
       }
       else {
-	dlsch[0]->rb_alloc[0]                       = distRIV2alloc_LUT50_0[rballoc];
-	dlsch[0]->rb_alloc[1]                       = distRIV2alloc_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc[1]                       = distRIV2alloc_LUT50_1[rballoc];
       }
-      dlsch[0]->nb_rb                               = RIV2nb_rb_LUT50[rballoc];//NPRB;
+      dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT50[rballoc];//NPRB;
       RIV_max = RIV_max50;
       break;
     case 100:
@@ -687,18 +693,18 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
       }
 
       if (vrb_type == 0) {
-	dlsch[0]->rb_alloc[0]                       = localRIV2alloc_LUT100_0[rballoc];
-	dlsch[0]->rb_alloc[1]                       = localRIV2alloc_LUT100_1[rballoc];
-	dlsch[0]->rb_alloc[2]                       = localRIV2alloc_LUT100_2[rballoc];
-	dlsch[0]->rb_alloc[3]                       = localRIV2alloc_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc[1]                       = localRIV2alloc_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc[2]                       = localRIV2alloc_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc[3]                       = localRIV2alloc_LUT100_3[rballoc];
       }
       else {
-	dlsch[0]->rb_alloc[0]                       = distRIV2alloc_LUT100_0[rballoc];
-	dlsch[0]->rb_alloc[1]                       = distRIV2alloc_LUT100_1[rballoc];
-	dlsch[0]->rb_alloc[2]                       = distRIV2alloc_LUT100_2[rballoc];
-	dlsch[0]->rb_alloc[3]                       = distRIV2alloc_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc[1]                       = distRIV2alloc_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc[2]                       = distRIV2alloc_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc[3]                       = distRIV2alloc_LUT100_3[rballoc];
       }
-      dlsch[0]->nb_rb                               = RIV2nb_rb_LUT100[rballoc];//NPRB;
+      dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT100[rballoc];//NPRB;
       RIV_max = RIV_max100;
       break;
 
@@ -725,48 +731,48 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 	LOG_E(PHY,"ERROR: Format 1A: rb_alloc (%x) > RIV_max (%x)\n",rballoc,RIV_max);
 	return(-1);
       }
-      NPRB      = dlsch[0]->nb_rb;
+      NPRB      = dlsch0_harq->nb_rb;
       I_mcs     = get_I_TBS(mcs);
     }
 
     if (NPRB==0)
       return(-1);
 
-    //  printf("NPRB %d, nb_rb %d, ndi %d\n",NPRB,dlsch[0]->nb_rb,ndi);
-    dlsch[0]->harq_processes[harq_pid]->rvidx     = rv; 
+    //  printf("NPRB %d, nb_rb %d, ndi %d\n",NPRB,dlsch0_harq->nb_rb,ndi);
+    dlsch0_harq->rvidx     = rv; 
 
-    dlsch[0]->harq_processes[harq_pid]->Nl          = 1;
-    dlsch[0]->layer_index = 0;
-    dlsch[0]->harq_processes[harq_pid]->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+    dlsch0_harq->Nl          = 1;
+    //dlsch0_harq->layer_index = 0;
 
+    dlsch0_harq->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
     /*   
 	 if ((rnti!=si_rnti)&&(rnti!=ra_rnti)&&(rnti!=p_rnti)) {  //handle toggling for C-RNTI
-	 if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) {
+	 if (dlsch0_harq->first_tx == 1) {
 	 LOG_D(PHY,"First TX for TC-RNTI %x, clearing first_tx flag\n",rnti);
-	 dlsch[0]->harq_processes[harq_pid]->first_tx=0;
-	 dlsch[0]->harq_processes[harq_pid]->Ndi = 1;
+	 dlsch0_harq->first_tx=0;
+	 dlsch0_harq->Ndi = 1;
 	 } 
 	 else {
-	 if (ndi == dlsch[0]->harq_processes[harq_pid]->DCINdi)
-	 dlsch[0]->harq_processes[harq_pid]->Ndi         = 0;
+	 if (ndi == dlsch0_harq->DCINdi)
+	 dlsch0_harq->Ndi         = 0;
 	 else
-	 dlsch[0]->harq_processes[harq_pid]->Ndi         = 1;
+	 dlsch0_harq->Ndi         = 1;
 	 }
     
-	 dlsch[0]->harq_processes[harq_pid]->DCINdi=ndi;
+	 dlsch0_harq->DCINdi=ndi;
 	 }
 	 else {
-	 dlsch[0]->harq_processes[harq_pid]->Ndi         = 1;
+	 dlsch0_harq->Ndi         = 1;
 	 }
     */
-    dlsch[0]->dl_power_off = 1;
+    dlsch0_harq->dl_power_off = 1;
 
 
 
-    dlsch[0]->harq_processes[harq_pid]->mcs         = mcs;
-    dlsch[0]->harq_processes[harq_pid]->TBS         = TBStable[I_mcs][NPRB-1];
+    dlsch0_harq->mcs           = mcs;
+    dlsch0_harq->TBS           = TBStable[I_mcs][NPRB-1];
 
-    dlsch[0]->current_harq_pid = harq_pid;
+    dlsch[0]->current_harq_pid   = harq_pid;
     dlsch[0]->harq_ids[subframe] = harq_pid;
 
     dlsch[0]->active = 1;
@@ -775,8 +781,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch[0]->rnti = rnti;
 
     dlsch[0]->harq_ids[subframe] = harq_pid;
-    if (dlsch[0]->harq_processes[harq_pid]->round == 0)
-      dlsch[0]->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch0_harq->round == 0)
+      dlsch0_harq->status = ACTIVE;
 
     break;
   case format1:
@@ -860,30 +866,32 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
       return(-1);
     }
 
+    dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+
     // msg("DCI: Setting subframe_tx for subframe %d\n",subframe);
     dlsch[0]->subframe_tx[subframe] = 1;
 
     conv_rballoc(rah,
 		 rballoc,frame_parms->N_RB_DL,
-		 dlsch[0]->rb_alloc);
+		 dlsch0_harq->rb_alloc);
 
-    dlsch[0]->nb_rb = conv_nprb(rah,
+    dlsch0_harq->nb_rb = conv_nprb(rah,
 				rballoc,
 				frame_parms->N_RB_DL);
 
-    NPRB      = dlsch[0]->nb_rb;
+    NPRB      = dlsch0_harq->nb_rb;
 
 
     if (NPRB==0)
       return(-1);
 
 
-    dlsch[0]->harq_processes[harq_pid]->rvidx       = rv;
+    dlsch0_harq->rvidx       = rv;
 
-    dlsch[0]->harq_processes[harq_pid]->Nl          = 1;
-    dlsch[0]->layer_index = 0;
-    dlsch[0]->harq_processes[harq_pid]->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
-    dlsch[0]->dl_power_off = 1;
+    dlsch0_harq->Nl          = 1;
+    //    dlsch[0]->layer_index = 0;
+    dlsch0_harq->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+    dlsch0_harq->dl_power_off = 1;
     /*
       if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) {
       LOG_D(PHY,"First TX for C-RNTI %x, clearing first_tx flag, shouldn't happen!\n",rnti);
@@ -904,12 +912,12 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
 
 
-    if (dlsch[0]->harq_processes[harq_pid]->round == 0) {
-      dlsch[0]->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch0_harq->round == 0) {
+      dlsch0_harq->status = ACTIVE;
       //            printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
       // MCS and TBS don't change across HARQ rounds
-      dlsch[0]->harq_processes[harq_pid]->mcs         = mcs;
-      dlsch[0]->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch[0]->harq_processes[harq_pid]->mcs)][NPRB-1];
+      dlsch0_harq->mcs         = mcs;
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][NPRB-1];
 
     }
 
@@ -1159,6 +1167,9 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
       dlsch1 = dlsch[0];
     }
 
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
+
     dlsch0->subframe_tx[subframe] = 1;
 
     dlsch0->current_harq_pid = harq_pid;
@@ -1171,97 +1182,97 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     conv_rballoc(rah,
 		 rballoc,
 		 frame_parms->N_RB_DL,
-		 dlsch0->rb_alloc);
+		 dlsch0_harq->rb_alloc);
 
-    dlsch1->rb_alloc[0]                         = dlsch0->rb_alloc[0];
-    dlsch0->nb_rb                               = conv_nprb(rah,
-							    rballoc,
-							    frame_parms->N_RB_DL);
-    dlsch1->nb_rb                               = dlsch0->nb_rb;
+    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
+    dlsch0_harq->nb_rb                               = conv_nprb(rah,
+								 rballoc,
+								 frame_parms->N_RB_DL);
+    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
 
-    if (dlsch0->nb_rb == 0)
+    if (dlsch0_harq->nb_rb == 0)
       return(-1);
 
-    dlsch0->harq_processes[harq_pid]->mcs       = mcs1;
-    dlsch1->harq_processes[harq_pid]->mcs       = mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = rv1;
-    dlsch1->harq_processes[harq_pid]->rvidx     = rv2;
+    dlsch0_harq->mcs       = mcs1;
+    dlsch1_harq->mcs       = mcs2;
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
 
     // assume both TBs are active
-    dlsch0->harq_processes[harq_pid]->Nl        = 1;
-    dlsch1->harq_processes[harq_pid]->Nl        = 1;
+    dlsch0_harq->Nl        = 1;
+    dlsch1_harq->Nl        = 1;
     dlsch0->active = 1;
     dlsch1->active = 1;
 
 
     // check if either TB is disabled (see 36-213 V11.3 Section )
-    if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) {
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
       dlsch0->active = 0;
     }
-    if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) {
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
       dlsch1->active = 0;
     }
 
     if (frame_parms->nb_antennas_tx == 2) {
       if (dlsch1->active == 1) { // both TBs are active
-	dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
-	dlsch1->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch1->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+	dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
 	switch (tpmi) {
 	case 0:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING11;
-	  dlsch1->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1m1;
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,0);
-	  dlsch1->pmi_alloc                             = pmi_extend(frame_parms,1);
+	  dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
+	  dlsch1_harq->mimo_mode   = UNIFORM_PRECODING1m1;
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,0);
+	  dlsch1_harq->pmi_alloc                             = pmi_extend(frame_parms,1);
 	  break;
 	case 1:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1j;
-	  dlsch1->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1mj;
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,2);
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,3);
+	  dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
+	  dlsch1_harq->mimo_mode   = UNIFORM_PRECODING1mj;
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,2);
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,3);
 	  break;
 	case 2: // PUSCH precoding
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
-	  dlsch0->pmi_alloc                             = DL_pmi_single;
-	  dlsch1->harq_processes[harq_pid]->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
-	  dlsch1->pmi_alloc                             = DL_pmi_single;
+	  dlsch0_harq->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
+	  dlsch0_harq->pmi_alloc                             = DL_pmi_single;
+	  dlsch1_harq->mimo_mode   = DUALSTREAM_PUSCH_PRECODING;
+	  dlsch1_harq->pmi_alloc                             = DL_pmi_single;
 	  break;
 	default:
 	  break;
 	}
-	dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
-	dlsch1->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch1->harq_processes[harq_pid]->mcs)][dlsch1->nb_rb-1];
+	dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
       }
       else { // only one is active
 	switch (tpmi) {
 	case 0 :
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = ALAMOUTI;
+	  dlsch0_harq->mimo_mode   = ALAMOUTI;
 	  break;
 	case 1:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING11;
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,0);
+	  dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,0);
 	  break;
 	case 2:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1m1;
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,1);
+	  dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1m1;
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,1);
 	  break;
 	case 3:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1j;
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,2);
+	  dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,2);
 	  break;
 	case 4:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1mj;
-	  dlsch0->pmi_alloc                             = pmi_extend(frame_parms,3);
+	  dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1mj;
+	  dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,3);
 	  break;
 	case 5:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING0;
-	  dlsch0->pmi_alloc                             = DL_pmi_single;
+	  dlsch0_harq->mimo_mode   = PUSCH_PRECODING0;
+	  dlsch0_harq->pmi_alloc                             = DL_pmi_single;
 	  break;
 	case 6:
-	  dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING1;
-	  dlsch0->pmi_alloc                             = DL_pmi_single;
+	  dlsch0_harq->mimo_mode   = PUSCH_PRECODING1;
+	  dlsch0_harq->pmi_alloc                             = DL_pmi_single;
 	  break;
 	}
-	dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+	dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
       }
     }
     else if (frame_parms->nb_antennas_tx == 4) {
@@ -1269,18 +1280,404 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     }
 
     // reset HARQ process if this is the first transmission
-    if (dlsch0->harq_processes[harq_pid]->round == 0) {
-      dlsch0->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch0_harq->round == 0) {
+      dlsch0_harq->status = ACTIVE;
     }
-    if (dlsch1->harq_processes[harq_pid]->round == 0) {
-      dlsch1->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch1_harq->round == 0) {
+      dlsch1_harq->status = ACTIVE;
     }
 
     dlsch0->rnti = rnti;
     dlsch1->rnti = rnti;
 
-    dlsch0->dl_power_off = 0;
-    dlsch1->dl_power_off = 0;
+    dlsch0_harq->dl_power_off = 0;
+    dlsch1_harq->dl_power_off = 0;
+
+    break;
+
+  case format2A:
+
+    switch (frame_parms->N_RB_DL) {
+
+    case 6:
+      if (frame_parms->nb_antennas_tx == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+      }
+      break;
+    case 25:
+      if (frame_parms->nb_antennas_tx == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+      }      
+      break;
+    case 50:
+      if (frame_parms->nb_antennas_tx == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+      }
+      break;
+
+    case 100:
+      if (frame_parms->nb_antennas_tx == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  harq_pid  = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi    = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+      }
+      break;
+    }
+
+
+    if (harq_pid>=8) {
+      LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n");
+      return(-1);
+    }
+
+
+    // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
+    // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
+    if (tbswap == 0) {
+      dlsch0 = dlsch[0];
+      dlsch1 = dlsch[1];
+    }
+    else{
+      dlsch0 = dlsch[1];
+      dlsch1 = dlsch[0];
+    }
+
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
+
+    dlsch0->subframe_tx[subframe] = 1;
+
+    dlsch0->current_harq_pid = harq_pid;
+    dlsch1->current_harq_pid = harq_pid;
+    dlsch0->harq_ids[subframe] = harq_pid;
+    dlsch1->harq_ids[subframe] = harq_pid;
+    //    printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
+
+
+    conv_rballoc(rah,
+		 rballoc,
+		 frame_parms->N_RB_DL,
+		 dlsch0_harq->rb_alloc);
+
+    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
+    dlsch0_harq->nb_rb                               = conv_nprb(rah,
+								 rballoc,
+								 frame_parms->N_RB_DL);
+    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
+
+    if (dlsch0_harq->nb_rb == 0)
+      return(-1);
+
+    dlsch0_harq->mcs       = mcs1;
+    dlsch1_harq->mcs       = mcs2;
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
+
+    // assume both TBs are active
+    dlsch0_harq->Nl        = 1;
+    dlsch1_harq->Nl        = 1;
+    dlsch0->active = 1;
+    dlsch1->active = 1;
+
+
+    // check if either TB is disabled (see 36-213 V11.3 Section )
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
+      dlsch0->active = 0;
+    }
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
+      dlsch1->active = 0;
+    }
+
+    dlsch0_harq->dl_power_off = 0;
+    dlsch1_harq->dl_power_off = 0;
+
+
+    if (frame_parms->nb_antennas_tx == 2) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+      dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
+      if ((dlsch0->active==1) && (dlsch1->active==1)) {
+	dlsch0_harq->mimo_mode = LARGE_CDD;
+	dlsch1_harq->mimo_mode = LARGE_CDD;
+	dlsch0_harq->dl_power_off = 1;
+	dlsch1_harq->dl_power_off = 1;
+      }
+      else {
+	dlsch0_harq->mimo_mode   = ALAMOUTI;
+	dlsch1_harq->mimo_mode   = ALAMOUTI;
+      }
+    }
+    else if (frame_parms->nb_antennas_tx == 4) { // 4 antenna case
+      if ((dlsch0->active==1) && (dlsch1->active==1)) {
+	switch (tpmi) {
+	case 0: // one layer per transport block
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	  dlsch0_harq->dl_power_off = 1;
+	  dlsch1_harq->dl_power_off = 1;
+	  break;
+	case 1: // one-layers on TB 0, two on TB 1
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->Nl          = 2;
+	  dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
+	  dlsch0_harq->dl_power_off = 1;
+	  dlsch1_harq->dl_power_off = 1;
+	  break;
+	case 2: // two-layers on TB 0, two on TB 1
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->Nl          = 2;
+	  dlsch0_harq->dl_power_off = 1;
+	  dlsch1_harq->dl_power_off = 1;
+	  if (frame_parms->N_RB_DL <= 56) {
+	    dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
+	    dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
+	  }
+	  else {
+	    LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n");
+	  }
+	  break;
+	case 3: //
+	  LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n"); 
+	  break;
+	}
+      }
+      else if (dlsch0->active == 1) {
+	switch (tpmi) {
+	case 0: // one layer per transport block
+	  dlsch0_harq->mimo_mode   = ALAMOUTI;
+	  dlsch1_harq->mimo_mode   = ALAMOUTI;
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	  break;
+	case 1: // two-layers on TB 0
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->Nl          = 2;
+	  dlsch0_harq->dl_power_off = 1;
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
+	  break;
+	case 2: // two-layers on TB 0, two on TB 1
+	case 3: //
+	  LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); 
+	  break;
+	}
+      }
+      else if (dlsch1->active == 1) {
+	switch (tpmi) {
+	case 0: // one layer per transport block
+	  dlsch0_harq->mimo_mode   = ALAMOUTI;
+	  dlsch1_harq->mimo_mode   = ALAMOUTI;
+	  dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
+	  break;
+	case 1: // two-layers on TB 0
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->Nl          = 2;
+	  dlsch1_harq->dl_power_off = 1;
+	  dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
+	  break;
+	case 2: // two-layers on TB 0, two on TB 1
+	case 3: //
+	  LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); 
+	  break;
+	}
+      }
+    }
+    else {
+      LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx);
+    }
+  
+    // reset HARQ process if this is the first transmission
+    if ((dlsch0->active==1) && (dlsch0_harq->round == 0)) {
+      dlsch0_harq->status = ACTIVE;
+    }
+    if ((dlsch1->active==1) && (dlsch1_harq->round == 0)) {
+      dlsch1_harq->status = ACTIVE;
+    }
+
+    dlsch0->rnti = rnti;
+    dlsch1->rnti = rnti;
+
+
+    //    printf("eNB: Format 2A TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS);
 
     break;
 
@@ -1380,6 +1777,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch0 = dlsch[0];
     dlsch1 = dlsch[1];
 
+
     dlsch0->subframe_tx[subframe] = 1;
 
     dlsch0->current_harq_pid = harq_pid;
@@ -1389,45 +1787,48 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     //    printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
 
 
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
+
     conv_rballoc(rah,
 		 rballoc,
 		 frame_parms->N_RB_DL,
-		 dlsch0->rb_alloc);
-    dlsch1->rb_alloc[0]                         = dlsch0->rb_alloc[0];
+		 dlsch0_harq->rb_alloc);
+    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
 
-    dlsch0->nb_rb                               = conv_nprb(rah,
+    dlsch0_harq->nb_rb                               = conv_nprb(rah,
 							    rballoc,
 							    frame_parms->N_RB_DL);
-    dlsch1->nb_rb                               = dlsch0->nb_rb;
+    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
 
-    dlsch0->harq_processes[harq_pid]->mcs       = mcs1;
-    dlsch1->harq_processes[harq_pid]->mcs       = mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = rv1;
-    dlsch1->harq_processes[harq_pid]->rvidx     = rv2;
+    dlsch0_harq->mcs       = mcs1;
+    dlsch1_harq->mcs       = mcs2;
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
 
     // check if either TB is disabled (see 36-213 V8.6 p. 26)
 
 
-    if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0))
-      dlsch0->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
+      dlsch0_harq->status = DISABLED;
 
-    if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0))
-      dlsch1->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
+      dlsch1_harq->status = DISABLED;
 
-    dlsch0->harq_processes[harq_pid]->Nl        = 1;
+    dlsch0_harq->Nl        = 1;
 
 
-    if (dlsch0->harq_processes[harq_pid]->round == 0) {
-      dlsch0->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch0_harq->round == 0) {
+      dlsch0_harq->status = ACTIVE;
       //      printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
     }
 
-    dlsch0->harq_processes[harq_pid]->mcs         = mcs1;
-    if (dlsch0->nb_rb > 0) {
-      dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+    dlsch0_harq->mcs         = mcs1;
+    if (dlsch0_harq->nb_rb > 0) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
     }
     else {
-      dlsch0->harq_processes[harq_pid]->TBS = 0;
+      dlsch0_harq->TBS = 0;
     }
 
     dlsch0->active = 1;
@@ -1435,8 +1836,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch0->rnti = rnti;
     dlsch1->rnti = rnti;
 
-    dlsch0->dl_power_off = 1;
-    dlsch1->dl_power_off = 1;
+    dlsch0_harq->dl_power_off = 1;
+    dlsch1_harq->dl_power_off = 1;
 
     break;
 
@@ -1544,56 +1945,58 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch1->harq_ids[subframe] = harq_pid;
     //    printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
 
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
 
     conv_rballoc(rah,
 		 rballoc,
 		 frame_parms->N_RB_DL,
-		 dlsch0->rb_alloc);
-    dlsch1->rb_alloc[0]                         = dlsch0->rb_alloc[0];
+		 dlsch0_harq->rb_alloc);
+    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
 
-    dlsch0->nb_rb                               = conv_nprb(rah,
+    dlsch0_harq->nb_rb                               = conv_nprb(rah,
 							    rballoc,
 							    frame_parms->N_RB_DL);
-    dlsch1->nb_rb                               = dlsch0->nb_rb;
+    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
 
-    if (dlsch0->nb_rb == 0)
+    if (dlsch0_harq->nb_rb == 0)
       return(-1);
 
-    dlsch0->harq_processes[harq_pid]->mcs       = mcs1;
-    dlsch1->harq_processes[harq_pid]->mcs       = mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = rv1;
-    dlsch1->harq_processes[harq_pid]->rvidx     = rv2;
+    dlsch0_harq->mcs       = mcs1;
+    dlsch1_harq->mcs       = mcs2;
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
 
     // check if either TB is disabled (see 36-213 V8.6 p. 26)
 
 
-    if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) {
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
       dlsch0->active = 0;
     }
-    if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) {
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
       dlsch1->active = 0;
     }
 
 
 
-    if ((dlsch0->harq_processes[harq_pid]->round == 0) && (dlsch0->active == 1) ) {
-      dlsch0->harq_processes[harq_pid]->status      = ACTIVE;
-      dlsch0->harq_processes[harq_pid]->mcs         = mcs1;
+    if ((dlsch0_harq->round == 0) && (dlsch0->active == 1) ) {
+      dlsch0_harq->status      = ACTIVE;
+      dlsch0_harq->mcs         = mcs1;
     }
 
-    if ((dlsch1->harq_processes[harq_pid]->round == 0) && (dlsch1->active == 1) ) {
-      dlsch1->harq_processes[harq_pid]->status      = ACTIVE;
-      dlsch1->harq_processes[harq_pid]->mcs         = mcs2;
+    if ((dlsch1_harq->round == 0) && (dlsch1->active == 1) ) {
+      dlsch1_harq->status      = ACTIVE;
+      dlsch1_harq->mcs         = mcs2;
     }
 
     // check TPMI information to compute TBS
     if (frame_parms->nb_antennas_tx == 2) {
       if (dlsch1->active == 1) { // both TBs are active
-	dlsch0->harq_processes[harq_pid]->TBS           = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
-	dlsch1->harq_processes[harq_pid]->TBS           = TBStable[get_I_TBS(dlsch1->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+	dlsch0_harq->TBS           = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	dlsch1_harq->TBS           = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
       }
       else {
-	dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+	dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
       }
     }
     else if (frame_parms->nb_antennas_tx == 4) {
@@ -1603,8 +2006,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch0->rnti = rnti;
     dlsch1->rnti = rnti;
 
-    dlsch0->dl_power_off = 1;
-    dlsch1->dl_power_off = 1;
+    dlsch0_harq->dl_power_off = 1;
+    dlsch1_harq->dl_power_off = 1;
 
     break;
 
@@ -1713,45 +2116,48 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     //    printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
 
 
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
+
     conv_rballoc(rah,
 		 rballoc,
 		 frame_parms->N_RB_DL,
-		 dlsch0->rb_alloc);
-    dlsch1->rb_alloc[0]                         = dlsch0->rb_alloc[0];
+		 dlsch0_harq->rb_alloc);
+    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
 
-    dlsch0->nb_rb                               = conv_nprb(rah,
+    dlsch0_harq->nb_rb                               = conv_nprb(rah,
 							    rballoc,
 							    frame_parms->N_RB_DL);
-    dlsch1->nb_rb                               = dlsch0->nb_rb;
+    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
 
-    dlsch0->harq_processes[harq_pid]->mcs       = mcs1;
-    dlsch1->harq_processes[harq_pid]->mcs       = mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = rv1;
-    dlsch1->harq_processes[harq_pid]->rvidx     = rv2;
+    dlsch0_harq->mcs       = mcs1;
+    dlsch1_harq->mcs       = mcs2;
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
 
     // check if either TB is disabled (see 36-213 V8.6 p. 26)
 
 
-    if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0))
-      dlsch0->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
+      dlsch0_harq->status = DISABLED;
 
-    if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0))
-      dlsch1->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
+      dlsch1_harq->status = DISABLED;
 
-    dlsch0->harq_processes[harq_pid]->Nl        = 1;
+    dlsch0_harq->Nl        = 1;
 
 
-    if (dlsch0->harq_processes[harq_pid]->round == 0) {
-      dlsch0->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch0_harq->round == 0) {
+      dlsch0_harq->status = ACTIVE;
       //      printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
     }
 
-    dlsch0->harq_processes[harq_pid]->mcs         = mcs1;
-    if (dlsch0->nb_rb > 0) {
-      dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+    dlsch0_harq->mcs         = mcs1;
+    if (dlsch0_harq->nb_rb > 0) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
     }
     else {
-      dlsch0->harq_processes[harq_pid]->TBS = 0;
+      dlsch0_harq->TBS = 0;
     }
 
     dlsch0->active = 1;
@@ -1759,8 +2165,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch0->rnti = rnti;
     dlsch1->rnti = rnti;
 
-    dlsch0->dl_power_off = 1;
-    dlsch1->dl_power_off = 1;
+    dlsch0_harq->dl_power_off = 1;
+    dlsch1_harq->dl_power_off = 1;
 
     break;
 
@@ -1792,32 +2198,33 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     dlsch0->harq_ids[subframe] = harq_pid;
     //dlsch1->harq_ids[subframe] = harq_pid;
     //    printf("Setting DLSCH harq id %d to subframe %d\n",harq_pid,subframe);
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
 
     conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
 		 ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
-		 dlsch0->rb_alloc);
+		 dlsch0_harq->rb_alloc);
 		 
     //dlsch1->rb_alloc[0]                         = dlsch0->rb_alloc[0];
 
-    dlsch0->nb_rb                               = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
+    dlsch0_harq->nb_rb                               = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
 							    ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,
 							    frame_parms->N_RB_DL);
     //dlsch1->nb_rb                               = dlsch0->nb_rb;
 
-    dlsch0->harq_processes[harq_pid]->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-    //dlsch1->harq_processes[harq_pid]->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv;
-    //dlsch1->harq_processes[harq_pid]->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2;
+    dlsch0_harq->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
+    //dlsch1_harq->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2;
+    dlsch0_harq->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv;
+    //dlsch1_harq->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2;
 
     // check if either TB is disabled (see 36-213 V8.6 p. 26) --> only for format 2 and 2A
 
-    //if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0))
-    //  dlsch0->harq_processes[harq_pid]->status = DISABLED;
+    //if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0))
+    //  dlsch0_harq->status = DISABLED;
 
-    //if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0))
-    // dlsch1->harq_processes[harq_pid]->status = DISABLED;
+    //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0))
+    // dlsch1_harq->status = DISABLED;
 
-    dlsch0->harq_processes[harq_pid]->Nl        = 1;
+    dlsch0_harq->Nl        = 1;
 
     //dlsch0->layer_index                         = tbswap;
     //dlsch1->layer_index                         = 1-tbswap;
@@ -1827,30 +2234,30 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
     switch (tpmi) {
     case 0 :
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = ALAMOUTI;
+      dlsch0_harq->mimo_mode   = ALAMOUTI;
       break;
     case 1:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING11;
-      dlsch0->pmi_alloc                             = pmi_extend(frame_parms,0);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,0);
       break;
     case 2:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1m1;
-      dlsch0->pmi_alloc                             = pmi_extend(frame_parms,1);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1m1;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,1);
       break;
     case 3:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1j;
-      dlsch0->pmi_alloc                             = pmi_extend(frame_parms,2);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,2);
       break;
     case 4:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1mj;
-      dlsch0->pmi_alloc                             = pmi_extend(frame_parms,3);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1mj;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,3);
       break;
     case 5:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING0;
-      dlsch0->pmi_alloc                             = DL_pmi_single;
+      dlsch0_harq->mimo_mode   = PUSCH_PRECODING0;
+      dlsch0_harq->pmi_alloc                             = DL_pmi_single;
       break;
     case 6:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING1;
+      dlsch0_harq->mimo_mode   = PUSCH_PRECODING1;
       return(-1);
       break;
     }
@@ -1859,20 +2266,20 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
 
     if (frame_parms->mode1_flag == 1)
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = SISO;
+      dlsch0_harq->mimo_mode   = SISO;
 
-    //    dlsch0->harq_processes[harq_pid]->Ndi         = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
-    if (dlsch0->harq_processes[harq_pid]->round == 0) {
-      dlsch0->harq_processes[harq_pid]->status = ACTIVE;
+    //    dlsch0_harq->Ndi         = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
+    if (dlsch0_harq->round == 0) {
+      dlsch0_harq->status = ACTIVE;
       //      printf("Setting DLSCH process %d to ACTIVE\n",harq_pid);
     }
 
-    dlsch0->harq_processes[harq_pid]->mcs         = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-    if (dlsch0->nb_rb > 0) {
-      dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->nb_rb-1];
+    dlsch0_harq->mcs         = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
+    if (dlsch0_harq->nb_rb > 0) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
     }
     else {
-      dlsch0->harq_processes[harq_pid]->TBS = 0;
+      dlsch0_harq->TBS = 0;
     }
 
     dlsch0->active = 1;
@@ -1881,7 +2288,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
     //dlsch1->rnti = rnti;
 
     //    dlsch0->dl_power_off = 1;
-    dlsch0->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
+    dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
     //dlsch1->dl_power_off = 1;
 
     break;
@@ -1894,22 +2301,22 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
   if (dlsch0) {
     msg("dlsch0 eNB: dlsch0   %p\n",dlsch0);
     msg("dlsch0 eNB: rnti     %x\n",dlsch0->rnti);
-    msg("dlsch0 eNB: NBRB     %d\n",dlsch0->nb_rb);
-    msg("dlsch0 eNB: rballoc  %x\n",dlsch0->rb_alloc[0]);
+    msg("dlsch0 eNB: NBRB     %d\n",dlsch0_harq->nb_rb);
+    msg("dlsch0 eNB: rballoc  %x\n",dlsch0_harq->rb_alloc[0]);
     msg("dlsch0 eNB: harq_pid %d\n",harq_pid);
-    msg("dlsch0 eNB: round    %d\n",dlsch0->harq_processes[harq_pid]->round);
-    msg("dlsch0 eNB: rvidx    %d\n",dlsch0->harq_processes[harq_pid]->rvidx);
-    msg("dlsch0 eNB: TBS      %d (NPRB %d)\n",dlsch0->harq_processes[harq_pid]->TBS,NPRB);
-    msg("dlsch0 eNB: mcs      %d\n",dlsch0->harq_processes[harq_pid]->mcs);
+    msg("dlsch0 eNB: round    %d\n",dlsch0_harq->round);
+    msg("dlsch0 eNB: rvidx    %d\n",dlsch0_harq->rvidx);
+    msg("dlsch0 eNB: TBS      %d (NPRB %d)\n",dlsch0_harq->TBS,NPRB);
+    msg("dlsch0 eNB: mcs      %d\n",dlsch0_harq->mcs);
     msg("dlsch0 eNB: tpmi %d\n",tpmi);
-    msg("dlsch0 eNB: mimo_mode %d\n",dlsch0->harq_processes[harq_pid]->mimo_mode);
+    msg("dlsch0 eNB: mimo_mode %d\n",dlsch0_harq->mimo_mode);
   }
 #endif
 
   // compute DL power control parameters   
-  computeRhoA_eNB(pdsch_config_dedicated, dlsch[0]);
+  computeRhoA_eNB(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off);
   
-  computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0]);
+  computeRhoB_eNB(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off);
 
   return(0);
 }
@@ -1917,6 +2324,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
 int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) {
 
+
   switch (dci->format) {
 
   case format0:   // This is an UL SCH allocation so nothing here, inform MAC
@@ -2584,6 +2992,320 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) {
       }
     }
 
+    else 
+      LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
+    break;
+  case format2A:
+
+    if ((frame_parms->frame_type == TDD) &&
+	(frame_parms->tdd_config>0)) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	switch(frame_parms->N_RB_DL) {
+	case 6:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD 1.5 MHz), rnti %x (%x): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
+		dci->rnti,
+		((uint32_t*)&dci->dci_pdu)[0],
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_1_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap
+		);
+	  break;
+	case 25:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_5MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
+	  break;
+	case 50:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_10MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
+	  break;
+	case 100:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_20MHz_2A_TDD_t *)&dci->dci_pdu[0])->tb_swap);
+	  break;
+	default:
+	  LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
+	  DevParam (frame_parms->N_RB_DL, 0, 0);
+	  break;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
+	switch(frame_parms->N_RB_DL) {
+	case 6:
+	  LOG_D(PHY,"DCI format2A 4 antennas (TDD 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_1_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi
+		);
+	  break;
+	case 25:
+	  LOG_D(PHY,"DCI format2A 4 antennas (TDD 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_5MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
+	  break;
+	case 50:
+	  LOG_D(PHY,"DCI format2A 4 antennas (TDD 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_10MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
+	  break;
+	case 100:
+	  LOG_D(PHY,"DCI format2A 4 antennas (TDD 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, TPC %d, dai %d, tbswap %d, tpmi %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->TPC,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->dai,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_20MHz_4A_TDD_t *)&dci->dci_pdu[0])->tpmi);
+	  break;
+	default:
+	  LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
+	  DevParam (frame_parms->N_RB_DL, 0, 0);
+	  break;
+	}
+      }
+    }
+    else if (frame_parms->frame_type == FDD) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	switch(frame_parms->N_RB_DL) {
+	case 6:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD, 1.5 MHz), rnti %x (%x):  rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
+		dci->rnti,
+		((uint32_t*)&dci->dci_pdu)[0],
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_1_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	case 25:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_5MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	case 50:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD, 10 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_10MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	case 100:
+	  LOG_D(PHY,"DCI format2A 2 antennas (FDD, 20 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_20MHz_2A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	default:
+	  LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
+	  DevParam (frame_parms->N_RB_DL, 0, 0);
+	  break;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
+	switch(frame_parms->N_RB_DL) {
+	  
+	case 6:
+	  LOG_D(PHY,"DCI format2A 4 antennas (FDD, 1.5 MHz), rnti %x (%llx): rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
+		((DCI2A_1_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	case 25:
+	  LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
+		((DCI2A_5MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	case 50:
+	  LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
+		((DCI2A_10MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	case 100:
+	  LOG_D(PHY,"DCI format2A 4 antennas (FDD, 5 MHz), rnti %x (%llx): rah %d, rb_alloc %x, mcs1 %d, mcs2 %d, harq_pid %d, ndi1 %d, ndi2 %d, RV1 %d, RV2 %d, tb_swap %d, tpmi %d, TPC %d\n",
+		dci->rnti,
+		((uint64_t*)&dci->dci_pdu)[0],
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rah,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rballoc,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs1,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->mcs2,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->harq_pid,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi1,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->ndi2,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv1,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->rv2,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tb_swap,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->tpmi,
+		((DCI2A_20MHz_4A_FDD_t *)&dci->dci_pdu[0])->TPC);
+	  break;
+	default:
+	  LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL);
+	  DevParam (frame_parms->N_RB_DL, 0, 0);
+	  break;
+	}
+      }
+    }
+
     else 
       LOG_E(PHY,"Don't know how to handle TDD format 0 yet\n");
     break;
@@ -2635,6 +3357,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
   uint8_t TPC=0;
   uint8_t NPRB=0,tbswap=0,tpmi=0;
   LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL;
+  LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq;
 
 #ifdef DEBUG_DCI
   msg("dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format);
@@ -2673,6 +3396,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 
       if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){  //
 	harq_pid = 0;
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	// see 36-212 V8.6.0 p. 45
 	NPRB = (TPC&1) + 2;
       }
@@ -2682,17 +3406,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  LOG_E(PHY,"Format 1A: harq_pid > 1\n");
 	  return(-1);
 	}
-                
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	NPRB = RIV2nb_rb_LUT6[rballoc];            
-	dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
+	dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
       }
             
       if (vrb_type == 0)
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
+	dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
       else
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT6[rballoc];
+	dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT6[rballoc];
             
-      dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
+      dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
       RIV_max = RIV_max6;
             
       break;
@@ -2723,6 +3447,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	harq_pid = 0;
 	// see 36-212 V8.6.0 p. 45
 	NPRB = (TPC&1) + 2;
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
       }
       else {
                 
@@ -2730,17 +3455,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  LOG_E(PHY,"Format 1A: harq_pid > 1\n");
 	  return(-1);
 	}
-                
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	NPRB = RIV2nb_rb_LUT25[rballoc];            
-	dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
+	dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
       }
 
       if (vrb_type == 0)
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
+	dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
       else
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT25[rballoc];
+	dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT25[rballoc];
             
-      dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
+      dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
       RIV_max = RIV_max25;    
             
       break;
@@ -2768,6 +3493,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
             
       if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){  //
 	harq_pid = 0;
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	// see 36-212 V8.6.0 p. 45
 	NPRB = (TPC&1) + 2;
       }
@@ -2777,20 +3503,20 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  LOG_E(PHY,"Format 1A: harq_pid > 1\n");
 	  return(-1);
 	}
-                
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	NPRB = RIV2nb_rb_LUT50[rballoc];            
-	dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
+	dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
       }
 
       if (vrb_type == 0) {
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
       }
       else {
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc];
       }
-      dlsch[0]->harq_processes[harq_pid]->nb_rb  = RIV2nb_rb_LUT50[rballoc];//NPRB;
+      dlsch0_harq->nb_rb  = RIV2nb_rb_LUT50[rballoc];//NPRB;
       RIV_max = RIV_max50;
       break;
     case 100:
@@ -2817,6 +3543,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 
       if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){  //
 	harq_pid = 0;
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	// see 36-212 V8.6.0 p. 45
 	NPRB = (TPC&1) + 2;
 	// toggle the ndi 
@@ -2827,24 +3554,24 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  LOG_E(PHY,"Format 1A: harq_pid > 1\n");
 	  return(-1);
 	}
-                
+	dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 	NPRB = RIV2nb_rb_LUT100[rballoc];            
-	dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
+	dlsch0_harq->delta_PUCCH = delta_PUCCH_lut[TPC&3];      
       }
 
       if (vrb_type == 0) {
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc];
       }
       else {
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc];
-	dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc];
       }
-      dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB;
+      dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB;
       RIV_max = RIV_max100;
       break;
     }
@@ -2866,31 +3593,31 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 
     if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){  //
       // toggle the ndi, always toggled for si,p and ra 
-      ndi  = 1-dlsch[0]->harq_processes[harq_pid]->DCINdi;
+      ndi  = 1-dlsch0_harq->DCINdi;
     }
 
     dlsch[0]->current_harq_pid = harq_pid;
     //    msg("Format 1A: harq_pid %d\n",harq_pid);        
-    dlsch[0]->harq_processes[harq_pid]->rvidx = rv;        
-    dlsch[0]->harq_processes[harq_pid]->Nl = 1;
-    dlsch[0]->layer_index = 0;
-    dlsch[0]->harq_processes[harq_pid]->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
-    dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
-
-    LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
-	  dlsch[0]->harq_processes[harq_pid]->first_tx,dlsch[0]->harq_processes[harq_pid]->status);
-
-    if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)||  // DCI has been toggled or this is the first transmission
-	(dlsch[0]->harq_processes[harq_pid]->first_tx==1)) {
-      dlsch[0]->harq_processes[harq_pid]->round = 0;
-      if (dlsch[0]->harq_processes[harq_pid]->first_tx==1)
+    dlsch0_harq->rvidx = rv;        
+    dlsch0_harq->Nl = 1;
+    //    dlsch[0]->layer_index = 0;
+    dlsch0_harq->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI;
+    dlsch0_harq->dl_power_off = 1; //no power offset
+
+    LOG_D(PHY,"UE (%x/%d): Subframe %d Format1A DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
+	  dlsch0_harq->first_tx,dlsch0_harq->status);
+
+    if ((ndi!=dlsch0_harq->DCINdi)||  // DCI has been toggled or this is the first transmission
+	(dlsch0_harq->first_tx==1)) {
+      dlsch0_harq->round = 0;
+      if (dlsch0_harq->first_tx==1)
 	LOG_D(PHY,"[PDSCH %x/%d] Format 1A DCI First TX: Clearing flag\n");
-      dlsch[0]->harq_processes[harq_pid]->first_tx = 0;
+      dlsch0_harq->first_tx = 0;
     }
-    dlsch[0]->harq_processes[harq_pid]->DCINdi = ndi;
+    dlsch0_harq->DCINdi = ndi;
 
-    dlsch[0]->harq_processes[harq_pid]->mcs = mcs;        
-    dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(mcs)][NPRB-1];        
+    dlsch0_harq->mcs = mcs;        
+    dlsch0_harq->TBS = TBStable[get_I_TBS(mcs)][NPRB-1];        
     dlsch[0]->rnti = rnti;        
     dlsch0 = dlsch[0];
     break;
@@ -2975,18 +3702,19 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
       LOG_E(PHY,"Format 1: harq_pid >= 8\n");
       return(-1);
     }
+    dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
     dlsch[0]->current_harq_pid = harq_pid;
     dlsch[0]->harq_ack[subframe].harq_id = harq_pid;
 
-    conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch[0]->harq_processes[harq_pid]->rb_alloc);
+    conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc);
 
-    dlsch[0]->harq_processes[harq_pid]->nb_rb = conv_nprb(rah,
+    dlsch0_harq->nb_rb = conv_nprb(rah,
 							  rballoc,
 							  frame_parms->N_RB_DL);
 
-    NPRB = dlsch[0]->harq_processes[harq_pid]->nb_rb;
+    NPRB = dlsch0_harq->nb_rb;
 
-    //    printf("test PDSCH NPRB %d, rah %d, rballoc %x, rballoc2 %x\n",NPRB,rah,rballoc,dlsch[0]->harq_processes[harq_pid]->rb_alloc[0]);
+    //    printf("test PDSCH NPRB %d, rah %d, rballoc %x, rballoc2 %x\n",NPRB,rah,rballoc,dlsch0_harq->rb_alloc[0]);
 
     if (NPRB==0) {
       LOG_E(PHY,"Format 1: NPRB=0 (rballoc %x,mcs %d, frame_type %d N_RB_DL %d)\n",rballoc,mcs,frame_parms->frame_type,frame_parms->N_RB_DL);
@@ -2994,31 +3722,31 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
     }
 
     //    printf("NPRB %d\n",NPRB);
-    dlsch[0]->harq_processes[harq_pid]->delta_PUCCH     = delta_PUCCH_lut[TPC&3];      
+    dlsch0_harq->delta_PUCCH     = delta_PUCCH_lut[TPC&3];      
 
-    dlsch[0]->harq_processes[harq_pid]->rvidx     = rv;
+    dlsch0_harq->rvidx     = rv;
 
-    dlsch[0]->harq_processes[harq_pid]->Nl          = 1;
-    dlsch[0]->layer_index = 0;
-    dlsch[0]->harq_processes[harq_pid]->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
-    dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
+    dlsch0_harq->Nl          = 1;
+    //    dlsch[0]->layer_index = 0;
 
-    LOG_D(PHY,"UE (%x/%d): Subframe %d Format1 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
-	  dlsch[0]->harq_processes[harq_pid]->first_tx,dlsch[0]->harq_processes[harq_pid]->status);
+    dlsch0_harq->dl_power_off = 1; //no power offset
 
-    //    printf("Format1 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi,
-    //	  dlsch[0]->harq_processes[harq_pid]->first_tx);
+    LOG_D(PHY,"UE (%x/%d): Subframe %d Format2 DCI: ndi %d, old_ndi %d (first tx %d) harq_status %d\n",dlsch[0]->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
+	  dlsch0_harq->first_tx,dlsch0_harq->status);
+
+    //    printf("Format2 DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi,
+    //	  dlsch0_harq->first_tx);
     
-    if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)||
-	(dlsch[0]->harq_processes[harq_pid]->first_tx==1)) {
-      dlsch[0]->harq_processes[harq_pid]->round=0;
-      dlsch[0]->harq_processes[harq_pid]->status = ACTIVE;
-      dlsch[0]->harq_processes[harq_pid]->DCINdi = ndi;
-      if (dlsch[0]->harq_processes[harq_pid]->first_tx==1)
+    if ((ndi!=dlsch0_harq->DCINdi)||
+	(dlsch0_harq->first_tx==1)) {
+      dlsch0_harq->round=0;
+      dlsch0_harq->status = ACTIVE;
+      dlsch0_harq->DCINdi = ndi;
+      if (dlsch0_harq->first_tx==1)
 	LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n");
-      dlsch[0]->harq_processes[harq_pid]->first_tx = 0;
+      dlsch0_harq->first_tx = 0;
     }
-    else if (dlsch[0]->harq_processes[harq_pid]->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
+    else if (dlsch0_harq->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
       // this happens if either another harq process in the same
       // is NAK or an ACK was not received
 
@@ -3029,16 +3757,18 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
       //     printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe);
       return(0);
     }
-    dlsch[0]->harq_processes[harq_pid]->mcs         = mcs;
+    dlsch0_harq->mcs         = mcs;
 
-    dlsch[0]->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(mcs)][NPRB-1];
-    //    msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch[0]->harq_processes[harq_pid]->TBS);
+    dlsch0_harq->TBS         = TBStable[get_I_TBS(mcs)][NPRB-1];
+    //    msg("test: MCS %d, NPRB %d, TBS %d\n",mcs,NPRB,dlsch0_harq->TBS);
     dlsch[0]->current_harq_pid = harq_pid;
 
     dlsch[0]->active = 1;
 
     dlsch[0]->rnti = rnti;
 
+    dlsch0_harq->mimo_mode   = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI;
+
     dlsch0 = dlsch[0];
 
     break;
@@ -3047,7 +3777,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
     switch (frame_parms->N_RB_DL) {
 
     case 6:
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
@@ -3069,7 +3799,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  tpmi      = ((DCI2_1_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
 	}
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
@@ -3092,11 +3822,11 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	}
       }
       else {
-	LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antennas_tx);
+	LOG_E(PHY,"UE: subframe %d Format2 DCI: unsupported number of TX antennas %d\n",subframe,frame_parms->nb_antennas_tx_eNB);
       }
       break;
     case 25:
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
@@ -3120,7 +3850,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  tpmi      = ((DCI2_5MHz_2A_FDD_t *)dci_pdu)->tpmi;
 	}
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
@@ -3145,11 +3875,11 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	}
       }
       else {
-	LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+	LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB);
       }      
       break;
     case 50:
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
@@ -3173,7 +3903,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  tpmi      = ((DCI2_10MHz_2A_FDD_t *)dci_pdu)->tpmi;
 	}
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
@@ -3198,12 +3928,12 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	}
       }
       else {
-	LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+	LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB);
       }
       break;
 
     case 100:
-      if (frame_parms->nb_antennas_tx == 2) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
@@ -3227,7 +3957,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	  tpmi      = ((DCI2_20MHz_2A_FDD_t *)dci_pdu)->tpmi;
 	}
       }
-      else if (frame_parms->nb_antennas_tx == 4) {
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
 	if (frame_type == TDD) {
 	  mcs1      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
 	  mcs2      = ((DCI2_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
@@ -3252,15 +3982,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	}
       }
       else {
-	LOG_E(PHY,"UE: Format2 DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx);
+	LOG_E(PHY,"UE: Format2A DCI: unsupported number of TX antennas %d\n",frame_parms->nb_antennas_tx_eNB);
       }
       break;
     }
 
     if (harq_pid>=8) {
-      LOG_E(PHY,"Format 2_2A_M10PRB: harq_pid >= 8\n");
+      LOG_E(PHY,"Format 2_2A: harq_pid >= 8\n");
       return(-1);
     }
+
+
     dlsch[0]->current_harq_pid = harq_pid;
     dlsch[0]->harq_ack[subframe].harq_id = harq_pid;
 
@@ -3274,72 +4006,74 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
       dlsch1 = dlsch[0];
     }
 
+    dlsch0_harq = dlsch0->harq_processes[harq_pid];
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
     conv_rballoc(rah,
 		 rballoc,
 		 frame_parms->N_RB_DL,
-		 dlsch0->harq_processes[harq_pid]->rb_alloc);
-    dlsch1->harq_processes[harq_pid]->rb_alloc[0]                         = dlsch0->harq_processes[harq_pid]->rb_alloc[0];
+		 dlsch0_harq->rb_alloc);
+    dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
 
-    dlsch0->harq_processes[harq_pid]->nb_rb                               = conv_nprb(rah,
+    dlsch0_harq->nb_rb                               = conv_nprb(rah,
 										      rballoc,
 										      frame_parms->N_RB_DL);
-    dlsch1->harq_processes[harq_pid]->nb_rb                               = dlsch0->harq_processes[harq_pid]->nb_rb;
+    dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
 
-    dlsch0->harq_processes[harq_pid]->mcs       = mcs1;
+    dlsch0_harq->mcs       = mcs1;
 
-    dlsch0->harq_processes[harq_pid]->delta_PUCCH     = delta_PUCCH_lut[TPC&3];      
+    dlsch0_harq->delta_PUCCH     = delta_PUCCH_lut[TPC&3];      
     /*
-      if (dlsch0->harq_processes[harq_pid]->mcs>20) {
-      msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0->harq_processes[harq_pid]->mcs);
+      if (dlsch0_harq->mcs>20) {
+      msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
       return(-1);
       }
     */
 
-    dlsch1->harq_processes[harq_pid]->mcs       = mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = rv1;
-    dlsch1->harq_processes[harq_pid]->rvidx     = rv2;
+    dlsch1_harq->mcs       = mcs2;
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
 
     // check if either TB is disabled (see 36-213 V8.6 p. 26)
 
-    if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) {
-      dlsch0->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
+      dlsch0_harq->status = DISABLED;
     }
-    if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) {
-      dlsch1->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
+      dlsch1_harq->status = DISABLED;
     }
-    dlsch0->harq_processes[harq_pid]->Nl        = 1;
+    dlsch0_harq->Nl        = 1;
 
-    dlsch0->layer_index                         = tbswap;
-    dlsch1->layer_index                         = 1-tbswap;
+    //    dlsch0->layer_index                         = tbswap;
+    //    dlsch1->layer_index                         = 1-tbswap;
 
     switch (tpmi) {
     case 0 :
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = ALAMOUTI;
+      dlsch0_harq->mimo_mode   = ALAMOUTI;
       break;
     case 1:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING11;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc                             = pmi_extend(frame_parms,0);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,0);
       break;
     case 2:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1m1;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc                             = pmi_extend(frame_parms,1);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1m1;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,1);
       break;
     case 3:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1j;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc                             = pmi_extend(frame_parms,2);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,2);
       break;
     case 4:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1mj;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc                             = pmi_extend(frame_parms,3);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1mj;
+      dlsch0_harq->pmi_alloc                             = pmi_extend(frame_parms,3);
       break;
     case 5:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING0;
+      dlsch0_harq->mimo_mode   = PUSCH_PRECODING0;
       // pmi stored from ulsch allocation routine
-      dlsch0->harq_processes[harq_pid]->pmi_alloc                             = dlsch0->pmi_alloc;
-      //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0->harq_processes[harq_pid]->pmi_alloc));
+      dlsch0_harq->pmi_alloc                             = dlsch0->pmi_alloc;
+      //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
       break;
     case 6:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING1;
+      dlsch0_harq->mimo_mode   = PUSCH_PRECODING1;
       LOG_E(PHY,"Unsupported TPMI\n");
       return(-1);
       break;
@@ -3347,13 +4081,13 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 
 
     if (frame_parms->mode1_flag == 1)
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = SISO;
-    if (ndi1!=dlsch0->harq_processes[harq_pid]->DCINdi) {
-      dlsch0->harq_processes[harq_pid]->round = 0;
-      dlsch0->harq_processes[harq_pid]->status = ACTIVE;
-      dlsch0->harq_processes[harq_pid]->DCINdi         = ndi1;
+      dlsch0_harq->mimo_mode   = SISO;
+    if (ndi1!=dlsch0_harq->DCINdi) {
+      dlsch0_harq->round = 0;
+      dlsch0_harq->status = ACTIVE;
+      dlsch0_harq->DCINdi         = ndi1;
     }      
-    else if (dlsch0->harq_processes[harq_pid]->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
+    else if (dlsch0_harq->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
       // this happens if either another harq process in the same
       // is NAK or an ACK was not received
 
@@ -3363,39 +4097,500 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
       dlsch0->active = 0;
       return(0);
     }
-    dlsch0->harq_processes[harq_pid]->mcs         = mcs1;
-    if (dlsch0->harq_processes[harq_pid]->nb_rb>1) {
-      dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->harq_processes[harq_pid]->nb_rb-1];
+    dlsch0_harq->mcs         = mcs1;
+    if (dlsch0_harq->nb_rb>1) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
     }
     else
-      dlsch0->harq_processes[harq_pid]->TBS         =0;
+      dlsch0_harq->TBS         =0;
     /*
-      if (dlsch0->harq_processes[harq_pid]->mcs > 18)
-      printf("mcs %d, TBS %d\n",dlsch0->harq_processes[harq_pid]->mcs,dlsch0->harq_processes[harq_pid]->TBS);
+      if (dlsch0_harq->mcs > 18)
+      printf("mcs %d, TBS %d\n",dlsch0_harq->mcs,dlsch0_harq->TBS);
     */
 
-    if (dlsch1->harq_processes[harq_pid]->DCINdi != ndi2) {
-      dlsch1->harq_processes[harq_pid]->round=0;
-      dlsch1->harq_processes[harq_pid]->status = ACTIVE;
+    if (dlsch1_harq->DCINdi != ndi2) {
+      dlsch1_harq->round=0;
+      dlsch1_harq->status = ACTIVE;
     }
-    dlsch1->harq_processes[harq_pid]->DCINdi      = ndi2;
-    dlsch1->harq_processes[harq_pid]->mcs         = mcs2;
-    if (dlsch1->harq_processes[harq_pid]->nb_rb>1) {
-      dlsch1->harq_processes[harq_pid]->TBS       = TBStable[dlsch1->harq_processes[harq_pid]->mcs][dlsch1->harq_processes[harq_pid]->nb_rb-1];
+    dlsch1_harq->DCINdi      = ndi2;
+    dlsch1_harq->mcs         = mcs2;
+    if (dlsch1_harq->nb_rb>1) {
+      dlsch1_harq->TBS       = TBStable[dlsch1_harq->mcs][dlsch1_harq->nb_rb-1];
     }
     else
-      dlsch1->harq_processes[harq_pid]->TBS         = 0;
+      dlsch1_harq->TBS         = 0;
 
     dlsch0->rnti = rnti;
     dlsch1->rnti = rnti;
 
-    dlsch0->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
-    dlsch1->harq_processes[harq_pid]->dl_power_off = 1; //no power offset
+    dlsch0_harq->dl_power_off = 1; //no power offset
+    dlsch1_harq->dl_power_off = 1; //no power offset
 
     dlsch0->active = 1;
     dlsch1->active = 1;
 
     break;
+
+  case format2A:
+
+    switch (frame_parms->N_RB_DL) {
+
+    case 6:
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_1_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rv1       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_1_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
+      }
+      break;
+    case 25:
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_5MHz_4A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_5MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
+      }      
+      break;
+    case 50:
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_10MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_10MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
+      }
+      break;
+
+    case 100:
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_2A_TDD_t *)dci_pdu)->tb_swap;
+	}
+	else {
+	  mcs1      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_2A_FDD_t *)dci_pdu)->tb_swap;
+	}
+      }
+      else if (frame_parms->nb_antennas_tx_eNB == 4) {
+	if (frame_type == TDD) {
+	  mcs1      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tb_swap;
+	  tpmi      = ((DCI2A_20MHz_4A_TDD_t *)dci_pdu)->tpmi;
+	}
+	else {
+	  mcs1      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs1;
+	  mcs2      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->mcs2;
+	  rballoc   = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rballoc;
+	  rah       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rah;
+	  rv1       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv1;
+	  rv2       = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->rv2;
+	  ndi1      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->ndi1;
+	  ndi2      = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->ndi2;
+	  harq_pid  = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->harq_pid;
+	  tbswap    = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tb_swap;
+	  tpmi    = ((DCI2A_20MHz_4A_FDD_t *)dci_pdu)->tpmi;
+	}
+      }
+      else {
+	LOG_E(PHY,"eNB: subframe %d UE %x, Format2A DCI: unsupported number of TX antennas %d\n",subframe,rnti,frame_parms->nb_antennas_tx_eNB);
+      }
+      break;
+    }
+
+
+    if (harq_pid>=8) {
+      LOG_E(PHY,"ERROR: Format 2_2A: harq_pid >= 8\n");
+      return(-1);
+    }
+
+    //    printf("UE: format 2A, rballoc=%x, harq_pid= %d, mcs1=%d,mcs2=%d, rv1=%d, rv2=%d, ndi1=%d, ndi2=%d\n",rballoc, harq_pid, mcs1,mcs2,rv1,rv2,ndi1,ndi2);
+
+    // Flip the TB to codeword mapping as described in 5.3.3.1.5 of 36-212 V11.3.0
+    // note that we must set tbswap=0 in eNB scheduler if one TB is deactivated
+    if (tbswap == 0) {
+      dlsch0 = dlsch[0];
+      dlsch1 = dlsch[1];
+    }
+    else{
+      dlsch0 = dlsch[1];
+      dlsch1 = dlsch[0];
+    }
+    
+    dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+    dlsch1_harq = dlsch[1]->harq_processes[harq_pid];
+    dlsch0->current_harq_pid = harq_pid;
+    dlsch1->current_harq_pid = harq_pid;
+    dlsch0->harq_ack[subframe].harq_id = harq_pid;
+    dlsch1->harq_ack[subframe].harq_id = harq_pid;
+
+    conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc);
+
+    dlsch0_harq->nb_rb = conv_nprb(rah,
+				   rballoc,
+				   frame_parms->N_RB_DL);
+
+    dlsch1_harq->nb_rb = dlsch0_harq->nb_rb;
+
+    NPRB = dlsch0_harq->nb_rb;
+
+
+    if (NPRB==0) {
+      LOG_E(PHY,"Format 2A: NPRB=0 (rballoc %x,mcs %d, frame_type %d N_RB_DL %d)\n",rballoc,mcs,frame_parms->frame_type,frame_parms->N_RB_DL);
+      return(-1);
+    }
+
+    //    printf("NPRB %d\n",NPRB);
+    dlsch0_harq->delta_PUCCH     = delta_PUCCH_lut[TPC&3];      
+    dlsch1_harq->delta_PUCCH     = delta_PUCCH_lut[TPC&3];      
+
+    dlsch0_harq->mcs     = mcs1;
+    dlsch1_harq->mcs     = mcs2;
+
+    dlsch0_harq->rvidx     = rv1;
+    dlsch1_harq->rvidx     = rv2;
+
+
+
+    dlsch0_harq->Nl          = 1;
+    dlsch1_harq->Nl          = 1;
+    //    dlsch[0]->layer_index = 0;
+
+    dlsch0_harq->dl_power_off = 1; //no power offset
+    dlsch1_harq->dl_power_off = 1; //no power offset
+
+    dlsch0->active = dlsch1->active = 1;
+
+    // check if either TB is disabled (see 36-213 V11.3 Section )
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
+      dlsch0->active = 0;
+    }
+    if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
+      dlsch1->active = 0;
+    }
+
+
+    //    printf("Format2A DCI (UE, hard pid %d): ndi %d, old_ndi %d (first tx %d)\n",harq_pid,ndi,dlsch0_harq->DCINdi,
+    //	  dlsch0_harq->first_tx);
+    
+    if (dlsch0->active == 1) {
+      if ((ndi1!=dlsch0_harq->DCINdi)||
+	  (dlsch0_harq->first_tx==1)) {
+	dlsch0_harq->round=0;
+	dlsch0_harq->status = ACTIVE;
+	dlsch0_harq->DCINdi = ndi1;
+	if (dlsch0_harq->first_tx==1)
+	  LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX0: Clearing flag\n");
+      }
+      else if (dlsch0_harq->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
+	// this happens if either another harq process in the same
+	// is NAK or an ACK was not received
+	
+	dlsch0->harq_ack[subframe].ack              = 1;
+	dlsch0->harq_ack[subframe].harq_id          = harq_pid;
+	dlsch0->harq_ack[subframe].send_harq_status = 1;
+	dlsch0->active = 0;
+	//     printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe);
+      }
+    }
+
+    if (dlsch1->active == 1) {
+      if ((ndi2!=dlsch1_harq->DCINdi)||
+	  (dlsch1_harq->first_tx==1)) {
+	dlsch1_harq->round=0;
+	dlsch1_harq->status = ACTIVE;
+	dlsch1_harq->DCINdi = ndi2;
+	
+	if (dlsch1_harq->first_tx==1)
+	  LOG_D(PHY,"[PDSCH %x/%d] Format 2A DCI First TX1: Clearing flag\n",rnti,harq_pid);
+      }
+      else if (dlsch1_harq->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
+	// this happens if either another harq process in the same
+	// is NAK or an ACK was not received
+	
+	dlsch1->harq_ack[subframe].ack              = 1;
+	dlsch1->harq_ack[subframe].harq_id          = harq_pid;
+	dlsch1->harq_ack[subframe].send_harq_status = 1;
+	dlsch1->active = 0;
+	//     printf("Got NDI=0 for correctly decoded SDU (harq_pid %d) subframe %d\n",harq_pid,subframe);
+      }
+    }
+
+    if (frame_parms->nb_antennas_tx_eNB == 2) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+      dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch0_harq->nb_rb-1];
+      if ((dlsch0->active==1) && (dlsch1->active==1)) {
+	dlsch0_harq->mimo_mode = LARGE_CDD;
+	dlsch1_harq->mimo_mode = LARGE_CDD;
+	dlsch0_harq->dl_power_off = 0; //apply power offset
+	dlsch1_harq->dl_power_off = 0; //apply power offset
+      }
+      else {
+	dlsch0_harq->mimo_mode   = ALAMOUTI;
+	dlsch1_harq->mimo_mode   = ALAMOUTI;
+      }
+    }
+    else if (frame_parms->nb_antennas_tx_eNB == 4) { // 4 antenna case
+      if ((dlsch0->active==1) && (dlsch1->active==1)) {
+	switch (tpmi) {
+	case 0: // one layer per transport block
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->dl_power_off = 0; //apply power offset
+	  dlsch1_harq->dl_power_off = 0; //apply power offset
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	  break;
+	case 1: // one-layers on TB 0, two on TB 1
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->dl_power_off = 0; //apply power offset
+	  dlsch1_harq->dl_power_off = 0; //apply power offset
+	  dlsch1_harq->Nl          = 2;
+	  dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
+	  break;
+	case 2: // two-layers on TB 0, two on TB 1
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->Nl          = 2;
+	  dlsch0_harq->dl_power_off = 0; //apply power offset
+	  dlsch1_harq->dl_power_off = 0; //apply power offset
+	  if (frame_parms->N_RB_DL <= 56) {
+	    dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
+	    dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
+	  }
+	  else {
+	    LOG_E(PHY,"Add implementation of Table 7.1.7.2.2-1 for two-layer TBS conversion with N_RB_DL > 56\n");
+	  }
+	  break;
+	case 3: //
+	  LOG_E(PHY,"Illegal value (3) for TPMI in Format 2A DCI\n"); 
+	  break;
+	}
+      }
+      else if (dlsch0->active == 1) {
+	switch (tpmi) {
+	case 0: // one layer per transport block
+	  dlsch0_harq->mimo_mode   = ALAMOUTI;
+	  dlsch1_harq->mimo_mode   = ALAMOUTI;
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
+	  break;
+	case 1: // two-layers on TB 0
+	  dlsch0_harq->mimo_mode   = LARGE_CDD;
+	  dlsch0_harq->Nl          = 2;
+	  dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][(dlsch0_harq->nb_rb<<1)-1];
+	  break;
+	case 2: // two-layers on TB 0, two on TB 1
+	case 3: //
+	  LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); 
+	  break;
+	}
+      }
+      else if (dlsch1->active == 1) {
+	switch (tpmi) {
+	case 0: // one layer per transport block
+	  dlsch0_harq->mimo_mode   = ALAMOUTI;
+	  dlsch1_harq->mimo_mode   = ALAMOUTI;
+	  dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][dlsch1_harq->nb_rb-1];
+	  break;
+	case 1: // two-layers on TB 0
+	  dlsch1_harq->mimo_mode   = LARGE_CDD;
+	  dlsch1_harq->Nl          = 2;
+	  dlsch0_harq->dl_power_off = 1; //apply power offset
+	  dlsch1_harq->dl_power_off = 0; //apply power offset
+	  dlsch1_harq->TBS         = TBStable[get_I_TBS(dlsch1_harq->mcs)][(dlsch1_harq->nb_rb<<1)-1];
+	  break;
+	case 2: // two-layers on TB 0, two on TB 1
+	case 3: //
+	  LOG_E(PHY,"Illegal value %d for TPMI in Format 2A DCI with one transport block enabled\n",tpmi); 
+	  break;
+	}
+      }
+    }
+    else {
+      LOG_E(PHY,"Illegal number of antennas for eNB %d\n",frame_parms->nb_antennas_tx_eNB);
+    }
+     
+    //    printf("Format 2A: NPRB=%d (rballoc %x,mcs1 %d, mcs2 %d, frame_type %d N_RB_DL %d,active %d/%d)\n",NPRB,rballoc,mcs1,mcs2,frame_parms->frame_type,frame_parms->N_RB_DL,dlsch0->active,dlsch1->active);
+    //printf("UE (%x/%d): Subframe %d Format2A DCI: ndi1 %d, old_ndi1 %d, ndi2 %d, old_ndi2 %d (first tx1 %d, first tx2 %d) harq_status1 %d, harq_status2 %d\n",dlsch0->rnti,harq_pid,subframe,ndi,dlsch0_harq->DCINdi,
+    //	  dlsch0_harq->first_tx,dlsch1_harq->first_tx,dlsch0_harq->status,dlsch1_harq->status);
+  //printf("TBS0 %d, TBS1 %d\n",dlsch0_harq->TBS,dlsch1_harq->TBS);
+    
+
+    break;
+
   case format1E_2A_M10PRB:
 
     harq_pid  = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->harq_pid;
@@ -3419,41 +4614,42 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
     */
     dlsch0 = dlsch[0];
 
+    dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
     conv_rballoc(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
 		 ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,frame_parms->N_RB_DL,
-		 dlsch0->harq_processes[harq_pid]->rb_alloc);
-    //dlsch1->harq_processes[harq_pid]->rb_alloc[0]                         = dlsch0->harq_processes[harq_pid]->rb_alloc[0];
+		 dlsch0_harq->rb_alloc);
+    //dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
 
-    dlsch0->harq_processes[harq_pid]->nb_rb                               = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
+    dlsch0_harq->nb_rb                               = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah,
 										      ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc,
 										      frame_parms->N_RB_DL);
-    //dlsch1->harq_processes[harq_pid]->nb_rb                               = dlsch0->harq_processes[harq_pid]->nb_rb;
+    //dlsch1_harq->nb_rb                               = dlsch0_harq->nb_rb;
 
-    dlsch0->harq_processes[harq_pid]->mcs             = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-    dlsch0->harq_processes[harq_pid]->delta_PUCCH     = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3];      
+    dlsch0_harq->mcs             = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
+    dlsch0_harq->delta_PUCCH     = delta_PUCCH_lut[((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->TPC&3];      
 
 
 
     /*
-      if (dlsch0->harq_processes[harq_pid]->mcs>20) {
-      msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0->harq_processes[harq_pid]->mcs);
+      if (dlsch0_harq->mcs>20) {
+      msg("dci_tools.c: mcs > 20 disabled for now (asked %d)\n",dlsch0_harq->mcs);
       return(-1);
       }
     */
 
-    //dlsch1->harq_processes[harq_pid]->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2;
-    dlsch0->harq_processes[harq_pid]->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv;
-    //dlsch1->harq_processes[harq_pid]->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2;
+    //dlsch1_harq->mcs       = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2;
+    dlsch0_harq->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv;
+    //dlsch1_harq->rvidx     = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rv2;
 
     // check if either TB is disabled (see 36-213 V8.6 p. 26)
 
-    if ((dlsch0->harq_processes[harq_pid]->rvidx == 1) && (dlsch0->harq_processes[harq_pid]->mcs == 0)) {
-      dlsch0->harq_processes[harq_pid]->status = DISABLED;
+    if ((dlsch0_harq->rvidx == 1) && (dlsch0_harq->mcs == 0)) {
+      dlsch0_harq->status = DISABLED;
     }
-    //if ((dlsch1->harq_processes[harq_pid]->rvidx == 1) && (dlsch1->harq_processes[harq_pid]->mcs == 0)) {
-    //dlsch1->harq_processes[harq_pid]->status = DISABLED;
+    //if ((dlsch1_harq->rvidx == 1) && (dlsch1_harq->mcs == 0)) {
+    //dlsch1_harq->status = DISABLED;
     //}
-    dlsch0->harq_processes[harq_pid]->Nl        = 1;
+    dlsch0_harq->Nl        = 1;
 
     //dlsch0->layer_index                         = tbswap;
     //dlsch1->layer_index                         = 1-tbswap;
@@ -3465,32 +4661,32 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 
     switch (tpmi) {
     case 0 :
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = ALAMOUTI;
+      dlsch0_harq->mimo_mode   = ALAMOUTI;
       break;
     case 1:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING11;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc   = pmi_extend(frame_parms,0);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING11;
+      dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,0);
       break;
     case 2:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1m1;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc   = pmi_extend(frame_parms,1);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1m1;
+      dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,1);
       break;
     case 3:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1j;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc   = pmi_extend(frame_parms,2);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1j;
+      dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,2);
       break;
     case 4:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = UNIFORM_PRECODING1mj;
-      dlsch0->harq_processes[harq_pid]->pmi_alloc   = pmi_extend(frame_parms,3);
+      dlsch0_harq->mimo_mode   = UNIFORM_PRECODING1mj;
+      dlsch0_harq->pmi_alloc   = pmi_extend(frame_parms,3);
       break;
     case 5:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING0;
+      dlsch0_harq->mimo_mode   = PUSCH_PRECODING0;
       // pmi stored from ulsch allocation routine
-      dlsch0->harq_processes[harq_pid]->pmi_alloc                             = dlsch0->pmi_alloc;
-      //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0->harq_processes[harq_pid]->pmi_alloc));
+      dlsch0_harq->pmi_alloc                             = dlsch0->pmi_alloc;
+      //LOG_I(PHY,"XXX using PMI %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc));
      break;
     case 6:
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = PUSCH_PRECODING1;
+      dlsch0_harq->mimo_mode   = PUSCH_PRECODING1;
       LOG_E(PHY,"Unsupported TPMI\n");
       return(-1);
       break;
@@ -3498,15 +4694,15 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 
     
     if (frame_parms->mode1_flag == 1)
-      dlsch0->harq_processes[harq_pid]->mimo_mode   = SISO;
+      dlsch0_harq->mimo_mode   = SISO;
 
 
-    if (dlsch0->harq_processes[harq_pid]->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) {
+    if (dlsch0_harq->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) {
       
-      dlsch0->harq_processes[harq_pid]->round = 0;
-      dlsch0->harq_processes[harq_pid]->status = ACTIVE;
+      dlsch0_harq->round = 0;
+      dlsch0_harq->status = ACTIVE;
     }
-    else if (dlsch0->harq_processes[harq_pid]->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
+    else if (dlsch0_harq->status == SCH_IDLE) {  // we got an Ndi = 0 for a previously decoded process,
       // this happens if either another harq process in the same
       // is NAK or an ACK was not received
 
@@ -3517,21 +4713,21 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
       return(0);
     }
 
-    dlsch0->harq_processes[harq_pid]->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
-    dlsch0->harq_processes[harq_pid]->mcs    = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
-    if (dlsch0->harq_processes[harq_pid]->nb_rb>1) {
-      dlsch0->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->harq_processes[harq_pid]->nb_rb-1];
+    dlsch0_harq->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi;
+    dlsch0_harq->mcs    = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs;
+    if (dlsch0_harq->nb_rb>1) {
+      dlsch0_harq->TBS         = TBStable[get_I_TBS(dlsch0_harq->mcs)][dlsch0_harq->nb_rb-1];
     }
     else
-      dlsch0->harq_processes[harq_pid]->TBS         =0;
+      dlsch0_harq->TBS         =0;
     dlsch0->rnti = rnti;
     //dlsch1->rnti = rnti;
 
     dlsch0->active = 1;
     //dlsch1->active = 1;
 
-    dlsch0->harq_processes[harq_pid]->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
-    //dlsch1->harq_processes[harq_pid]->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
+    dlsch0_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
+    //dlsch1_harq->dl_power_off = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->dl_power_off;
 
 
     break;
@@ -3545,22 +4741,22 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 #ifdef DEBUG_DCI
   if (dlsch[0]) {
     msg("PDSCH dlsch0 UE: rnti     %x\n",dlsch[0]->rnti);
-    msg("PDSCH dlsch0 UE: NBRB     %d\n",dlsch[0]->harq_processes[harq_pid]->nb_rb);
-    msg("PDSCH dlsch0 UE: rballoc  %x\n",dlsch[0]->harq_processes[harq_pid]->rb_alloc[0]);
+    msg("PDSCH dlsch0 UE: NBRB     %d\n",dlsch0_harq->nb_rb);
+    msg("PDSCH dlsch0 UE: rballoc  %x\n",dlsch0_harq->rb_alloc[0]);
     msg("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid);
-    msg("PDSCH dlsch0 UE: DCINdi   %d\n",dlsch[0]->harq_processes[harq_pid]->DCINdi);
-    msg("PDSCH dlsch0 UE: rvidx    %d\n",dlsch[0]->harq_processes[harq_pid]->rvidx);
-    msg("PDSCH dlsch0 UE: TBS      %d\n",dlsch[0]->harq_processes[harq_pid]->TBS);
-    msg("PDSCH dlsch0 UE: mcs      %d\n",dlsch[0]->harq_processes[harq_pid]->mcs);
-    msg("PDSCH dlsch0 UE: pwr_off  %d\n",dlsch[0]->harq_processes[harq_pid]->dl_power_off);
+    msg("PDSCH dlsch0 UE: DCINdi   %d\n",dlsch0_harq->DCINdi);
+    msg("PDSCH dlsch0 UE: rvidx    %d\n",dlsch0_harq->rvidx);
+    msg("PDSCH dlsch0 UE: TBS      %d\n",dlsch0_harq->TBS);
+    msg("PDSCH dlsch0 UE: mcs      %d\n",dlsch0_harq->mcs);
+    msg("PDSCH dlsch0 UE: pwr_off  %d\n",dlsch0_harq->dl_power_off);
   }
 #endif
   dlsch[0]->active=1;
 
   // compute DL power control parameters   
-  computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch[0]->harq_processes[harq_pid]->dl_power_off);
+  computeRhoA_UE(pdsch_config_dedicated, dlsch[0],dlsch0_harq->dl_power_off);
 
-  computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch[0]->harq_processes[harq_pid]->dl_power_off);
+  computeRhoB_UE(pdsch_config_dedicated,&(frame_parms->pdsch_config_common),frame_parms->nb_antennas_tx_eNB,dlsch[0],dlsch0_harq->dl_power_off);
 
   return(0);
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index c18364686ef7922feeef6a5873ac2e5ed92934ce..ff137b7f16656f4efaf079edfe6130e1057776b8 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -109,10 +109,22 @@ typedef struct {
   uint8_t rvidx;
   /// MIMO mode for this DLSCH
   MIMO_mode_t mimo_mode;
-  /// Number of layers for this PDSCH transmission
-  uint8_t Nlayers;
-  /// First layer for this PSCH transmission
-  uint8_t first_layer;
+  /// Current RB allocation
+  uint32_t rb_alloc[4];
+  /// Current subband PMI allocation
+  uint16_t pmi_alloc;
+  /// Current subband RI allocation
+  uint32_t ri_alloc;
+  /// Current subband CQI1 allocation
+  uint32_t cqi_alloc1;
+  /// Current subband CQI2 allocation
+  uint32_t cqi_alloc2;
+  /// Current Number of RBs
+  uint16_t nb_rb;
+  /// downlink power offset field
+  uint8_t dl_power_off;
+  /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) 
+  uint8_t e[MAX_NUM_CHANNEL_BITS];
   /// Turbo-code outputs (36-212 V8.6 2009-03, p.12 
   uint8_t d[MAX_NUM_DLSCH_SEGMENTS][(96+3+(3*6144))];  
   /// Sub-block interleaver outputs (36-212 V8.6 2009-03, p.16-17)
@@ -129,8 +141,12 @@ typedef struct {
   uint32_t Kplus;                     
   /// Number of "Filler" bits (for definition see 36-212 V8.6 2009-03, p.10)
   uint32_t F;                         
-  /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17)
+  /// Number of MIMO layers (streams) (for definition see 36-212 V8.6 2009-03, p.17, TM3-4)
   uint8_t Nl;                       
+  /// Number of layers for this PDSCH transmission (TM8-10)
+  uint8_t Nlayers;
+  /// First layer for this PSCH transmission
+  uint8_t first_layer;
 } LTE_DL_eNB_HARQ_t;
 
 typedef struct {
@@ -221,34 +237,16 @@ typedef struct {
   uint8_t ra_window_size;
   /// First-round error threshold for fine-grain rate adaptation
   uint8_t error_threshold;
-  /// Current RB allocation
-  uint32_t rb_alloc[4];
-  /// Current subband PMI allocation
-  uint16_t pmi_alloc;
-  /// Current subband RI allocation
-  uint32_t ri_alloc;
-  /// Current subband CQI1 allocation
-  uint32_t cqi_alloc1;
-  /// Current subband CQI2 allocation
-  uint32_t cqi_alloc2;
-  /// Current Number of RBs
-  uint16_t nb_rb;
   /// Pointers to 8 HARQ processes for the DLSCH
   LTE_DL_eNB_HARQ_t *harq_processes[8];     
   /// Number of soft channel bits
   uint32_t G;
-  /// Layer index for this dlsch (0,1)
-  uint8_t layer_index;          
   /// Codebook index for this dlsch (0,1,2,3)
   uint8_t codebook_index;          
-  /// Concatenated "e"-sequences (for definition see 36-212 V8.6 2009-03, p.17-18) 
-  uint8_t e[MAX_NUM_CHANNEL_BITS];
   /// Maximum number of HARQ rounds (for definition see 36-212 V8.6 2009-03, p.17)             
   uint8_t Mdlharq;  
   /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
   uint8_t Kmimo;
-  /// downlink power offset field
-  uint8_t dl_power_off;
   /// amplitude of PDSCH (compared to RS) in symbols without pilots 
   int16_t sqrt_rho_a;
   /// amplitude of PDSCH (compared to RS) in symbols containing pilots
@@ -637,8 +635,6 @@ typedef struct {
   harq_status_t harq_ack[10];
   /// Pointers to up to 8 HARQ processes
   LTE_DL_UE_HARQ_t *harq_processes[8];   
-  /// Layer index for this DLSCH
-  uint8_t layer_index;              
   /// Maximum number of HARQ rounds (for definition see 36-212 V8.6 2009-03, p.17
   uint8_t Mdlharq;              
   /// MIMO transmission mode indicator for this sub-frame (for definition see 36-212 V8.6 2009-03, p.17)
@@ -650,7 +646,6 @@ typedef struct {
 typedef enum {format0,
 	      format1,
 	      format1A,
-	      format1A_RA,
 	      format1B,
 	      format1C,
 	      format1D,
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index ee57e3d659545df2d9ae08e257c81226b3faaed9..895506e53fe44d0f6391e2cb0b33b814f34d3e69 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -230,8 +230,9 @@ int dlsch_encoding(unsigned char *a,
   unsigned int G;
   unsigned int crc=1;
   unsigned short iind;
-  unsigned short nb_rb = dlsch->nb_rb;
+
   unsigned char harq_pid = dlsch->current_harq_pid;
+  unsigned short nb_rb = dlsch->harq_processes[harq_pid]->nb_rb;
   unsigned int A; 
   unsigned char mod_order;
   unsigned int Kr=0,Kr_bytes,r,r_offset=0;
@@ -243,7 +244,7 @@ int dlsch_encoding(unsigned char *a,
   // printf("Encoder: A: %d\n",A);
   mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
 
-  G = get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe);
+  G = get_G(frame_parms,nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,frame,subframe);
 
    
   //  if (dlsch->harq_processes[harq_pid]->Ndi == 1) {  // this is a new packet
@@ -353,7 +354,7 @@ int dlsch_encoding(unsigned char *a,
     r_offset += lte_rate_matching_turbo(dlsch->harq_processes[harq_pid]->RTC[r],
 					G,  //G
 					dlsch->harq_processes[harq_pid]->w[r],
-					dlsch->e+r_offset,
+					dlsch->harq_processes[harq_pid]->e+r_offset,
 					dlsch->harq_processes[harq_pid]->C, // C
 					NSOFT,                    // Nsoft,
 					dlsch->Mdlharq,
@@ -367,7 +368,7 @@ int dlsch_encoding(unsigned char *a,
     stop_meas(rm_stats);
 #ifdef DEBUG_DLSCH_CODING
     if (r==dlsch->harq_processes[harq_pid]->C-1)
-      write_output("enc_output.m","enc",dlsch->e,r_offset,1,4);
+      write_output("enc_output.m","enc",dlsch->harq_processes[harq_pid]->e,r_offset,1,4);
 #endif
   }
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
index 60088809827e5829e76af0c085b25147de57b9bd..9142f2e2943ecaa4824bebe0745e40879825d368 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
@@ -291,12 +291,13 @@ uint32_t  dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
 							       (r==0) ? harq_process->F : 0);
 
 #ifdef DEBUG_DLSCH_DECODING    
-    msg("HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, mod_order %d, nb_rb %d, Nl %d)...\n",
+    msg("HARQ_PID %d Rate Matching Segment %d (coded bits %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d)...\n",
 	harq_pid,r, G,
-	   Kr*3,
-	   get_Qm(harq_process->mcs),
-	   harq_process->nb_rb,
-	   harq_process->Nl);
+	Kr*3,
+	harq_process->TBS,
+	get_Qm(harq_process->mcs),
+	harq_process->nb_rb,
+	harq_process->Nl);
 #endif    
 
 
@@ -675,7 +676,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
 
     if (dlsch_abstraction_MIESM(phy_vars_ue->sinr_dB, 
 				phy_vars_ue->transmission_mode[eNB_id], 
-				dlsch_eNB->rb_alloc, 
+				dlsch_eNB->harq_processes[harq_pid]->rb_alloc, 
 				dlsch_eNB->harq_processes[harq_pid]->mcs,
 				PHY_vars_eNB_g[eNB_id][CC_id]->mu_mimo_mode[ue_id].dl_pow_off) == 1) {
       // reset HARQ 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index bb22990d5948b279e0b735d7445d6abf7b301216..20e83ec8a41c2ec3365bdf930af1decec9b5d72c 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -25,13 +25,13 @@
   
   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
 
- *******************************************************************************/
+*******************************************************************************/
 
 /*! \file PHY/LTE_TRANSPORT/dlsch_demodulation.c
  * \brief Top-level routines for demodulating the PDSCH physical channel from 36-211, V8.6 2009-03
  * \author R. Knopp, F. Kaltenberger,A. Bhamri, S. Aubert
  * \date 2011
- * \version 0.1
+ DEBUG * \version 0.1
  * \company Eurecom
  * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr
  * \note
@@ -66,7 +66,7 @@ __m128i zero;//,tmp_over_sqrt_10,tmp_sum_4_over_sqrt_10,tmp_sign,tmp_sign_3_over
 #endif
 
 //#define DEBUG_PHY 1
-__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,avg128D;
+
 int avg[4];
 
 // [MCS][i_mod (0,1,2) = (2,4,6)]
@@ -74,20 +74,22 @@ unsigned char offset_mumimo_llr_drange_fix=0;
 /*
 //original values from sebastion + same hand tuning
 unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{6,6,6},{6,6,6},{6,6,6},{5,5,5},{4,4,4},{1,2,4}, // QPSK
-                                               {5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM
-                                               {2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM
-*/
-/*
-//first optimization try
-unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
-*/
-//second optimization try
-/*
-unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};  w
+{5,5,4},{5,5,5},{5,5,5},{3,3,3},{2,2,2},{2,2,2},{2,2,2}, // 16-QAM
+{2,2,1},{3,3,3},{3,3,3},{3,3,1},{2,2,2},{2,2,2},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //64-QAM
 */
+ /*
+ //first optimization try
+ unsigned char offset_mumimo_llr_drange[29][3]={{7, 8, 7},{6, 6, 7},{6, 6, 7},{6, 6, 6},{5, 6, 6},{5, 5, 6},{5, 5, 6},{4, 5, 4},{4, 3, 4},{3, 2, 2},{6, 5, 5},{5, 4, 4},{5, 5, 4},{3, 3, 2},{2, 2, 1},{2, 1, 1},{2, 2, 2},{3, 3, 3},{3, 3, 2},{3, 3, 2},{3, 2, 1},{2, 2, 2},{2, 2, 2},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
+ */
+ //second optimization try
+ /*
+   unsigned char offset_mumimo_llr_drange[29][3]={{5, 8, 7},{4, 6, 8},{3, 6, 7},{7, 7, 6},{4, 7, 8},{4, 7, 4},{6, 6, 6},{3, 6, 6},{3, 6, 6},{1, 3, 4},{1, 1, 0},{3, 3, 2},{3, 4, 1},{4, 0, 1},{4, 2, 2},{3, 1, 2},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};  w
+ */
 unsigned char offset_mumimo_llr_drange[29][3]={{0, 6, 5},{0, 4, 5},{0, 4, 5},{0, 5, 4},{0, 5, 6},{0, 5, 3},{0, 4, 4},{0, 4, 4},{0, 3, 3},{0, 1, 2},{1, 1, 0},{1, 3, 2},{3, 4, 1},{2, 0, 0},{2, 2, 2},{1, 1, 1},{2, 1, 0},{2, 1, 1},{1, 0, 1},{1, 0, 1},{0, 0, 0},{1, 0, 0},{0, 0, 0},{0, 1, 0},{1, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0},{0, 0, 0}};
 
 
+extern void print_shorts(char *s,__m128i *x);
+
 int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
              PDSCH_t type,
              unsigned char eNB_id,
@@ -108,19 +110,24 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
   unsigned char aatx,aarx;    
   unsigned short nb_rb;
   int avgs, rb;  
-  
+  LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq;
+
   switch (type) {
   case SI_PDSCH:
     lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id];
     dlsch_ue          = &phy_vars_ue->dlsch_ue_SI[eNB_id];
+    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
     break;
   case RA_PDSCH:
     lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars_ra[eNB_id];
     dlsch_ue          = &phy_vars_ue->dlsch_ue_ra[eNB_id];
+    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
     break;
   case PDSCH:
     lte_ue_pdsch_vars = &phy_vars_ue->lte_ue_pdsch_vars[eNB_id];
     dlsch_ue          = phy_vars_ue->dlsch_ue[eNB_id];
+    dlsch0_harq       = dlsch_ue[0]->harq_processes[harq_pid];
+    dlsch1_harq       = dlsch_ue[1]->harq_processes[harq_pid];
     break;
 
   default:
@@ -129,7 +136,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
     return(-1);
     break;
   }
-  
+
+
   if (eNB_id > 2) {
     msg("dlsch_demodulation.c: Illegal eNB_id %d\n",eNB_id);
     return(-1);
@@ -166,17 +174,18 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 
   if (frame_parms->nb_antennas_tx_eNB>1) {
 #ifdef DEBUG_DLSCH_MOD     
-    LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc),dlsch_ue[0],dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc[0]);
+    LOG_I(PHY,"dlsch: using pmi %x (%p), rb_alloc %x\n",pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),dlsch_ue[0],dlsch0_harq->rb_alloc[0]);
 #endif
     nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
 				   lte_ue_common_vars->dl_ch_estimates[eNB_id],
 				   lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
 				   lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
-				   dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc,
+				   dlsch0_harq->pmi_alloc,
 				   lte_ue_pdsch_vars[eNB_id]->pmi_ext,
-				   dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,
+				   dlsch0_harq->rb_alloc,
 				   symbol,
 				   subframe,
+				   phy_vars_ue->high_speed_flag,
 				   frame_parms);
 
     if (dual_stream_flag==1) {
@@ -185,22 +194,24 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 				       lte_ue_common_vars->dl_ch_estimates[eNB_id_i],
 				       lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
 				       lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
-				       dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc,
+				       dlsch0_harq->pmi_alloc,
 				       lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-				       dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,
+				       dlsch0_harq->rb_alloc,
 				       symbol,
 				       subframe,
+				       phy_vars_ue->high_speed_flag,
 				       frame_parms);
       else 
 	nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
 				       lte_ue_common_vars->dl_ch_estimates[eNB_id],
 				       lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
 				       lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
-				       dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc,
+				       dlsch0_harq->pmi_alloc,
 				       lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-				       dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,
+				       dlsch0_harq->rb_alloc,
 				       symbol,
 				       subframe,
+				       phy_vars_ue->high_speed_flag,
 				       frame_parms);
     }
   } // if n_tx>1
@@ -209,11 +220,12 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 				     lte_ue_common_vars->dl_ch_estimates[eNB_id],
 				     lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
 				     lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
-				     dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc,
+				     dlsch0_harq->pmi_alloc,
 				     lte_ue_pdsch_vars[eNB_id]->pmi_ext,
-				     dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,
+				     dlsch0_harq->rb_alloc,
 				     symbol,
 				     subframe,
+				     phy_vars_ue->high_speed_flag,
 				     frame_parms);
         
     if (dual_stream_flag==1) {
@@ -222,22 +234,24 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 					 lte_ue_common_vars->dl_ch_estimates[eNB_id_i],
 					 lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
 					 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,    
-					 dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc,
+					 dlsch0_harq->pmi_alloc,
 					 lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-					 dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,
+					 dlsch0_harq->rb_alloc,
 					 symbol,
 					 subframe,
+					 phy_vars_ue->high_speed_flag,
 					 frame_parms);
       else 
 	nb_rb = dlsch_extract_rbs_single(lte_ue_common_vars->rxdataF,
 					 lte_ue_common_vars->dl_ch_estimates[eNB_id],
 					 lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
 					 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,    
-					 dlsch_ue[0]->harq_processes[harq_pid]->pmi_alloc,
+					 dlsch0_harq->pmi_alloc,
 					 lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-					 dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,
+					 dlsch0_harq->rb_alloc,
 					 symbol,
 					 subframe,
+					 phy_vars_ue->high_speed_flag,
 					 frame_parms);
     }
   } //else n_tx>1
@@ -250,10 +264,10 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
   /*
   // DL power control: Scaling of Channel estimates for PDSCH
   dlsch_scale_channel(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
-		      frame_parms,
-		      dlsch_ue,
-		      symbol,
-		      nb_rb);
+  frame_parms,
+  dlsch_ue,
+  symbol,
+  nb_rb);
   */
   if (first_symbol_flag==1) {
     dlsch_channel_level(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
@@ -276,12 +290,12 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
         
     
     lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(avgs)/2);
-        // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits
-        //      + log2_approx(frame_parms->nb_antennas_rx-1);
+    // + log2_approx(frame_parms->nb_antennas_tx_eNB-1) //-1 because log2_approx counts the number of bits
+    //      + log2_approx(frame_parms->nb_antennas_rx-1);
 
-    if ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode>=UNIFORM_PRECODING11) &&
-	(dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
-	(dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off==1)) // we are in TM 6
+    if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) &&
+	(dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
+	(dlsch0_harq->dl_power_off==1)) // we are in TM 6
       lte_ue_pdsch_vars[eNB_id]->log2_maxh++;
 
     // this version here applies the factor .5 also to the extra terms. however, it does not work so well as the one above
@@ -290,9 +304,9 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
        Nb_tx^2*Nb_rx in TM6 */
     /*
       K = frame_parms->nb_antennas_rx*frame_parms->nb_antennas_tx_eNB; //that also covers TM1 since Nb_tx=1
-      if ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode>=UNIFORM_PRECODING11) &&
-      (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
-      (dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off==1)) // we are in TM 6
+      if ((dlsch0_harq->mimo_mode>=UNIFORM_PRECODING11) &&
+      (dlsch0_harq->mimo_mode< DUALSTREAM_UNIFORM_PRECODING1) &&
+      (dlsch0_harq->dl_power_off==1)) // we are in TM 6
       K *= frame_parms->nb_antennas_tx_eNB;
 
       lte_ue_pdsch_vars[eNB_id]->log2_maxh = (log2_approx(K*avgs)/2);
@@ -300,30 +314,30 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 
 #ifdef DEBUG_PHY
     msg("[DLSCH] log2_maxh = %d (%d,%d)\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh,avg[0],avgs);
-    msg("[DLSCH] mimo_mode = %d\n", dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode);
+    msg("[DLSCH] mimo_mode = %d\n", dlsch0_harq->mimo_mode);
 #endif
   }
   aatx = frame_parms->nb_antennas_tx_eNB;
   aarx = frame_parms->nb_antennas_rx;
 
-  if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode<UNIFORM_PRECODING11) {// no precoding
+  if (dlsch0_harq->mimo_mode<LARGE_CDD) {// SISO or ALAMOUTI
 
     dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
 			       lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
-			       lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-			       lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-			       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+			       lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			       lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+			       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
 			       (aatx>1) ? lte_ue_pdsch_vars[eNB_id]->rho : NULL,
 			       frame_parms,
 			       symbol,
 			       first_symbol_flag,
-			       get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs),
+			       get_Qm(dlsch0_harq->mcs),
 			       nb_rb,
 			       lte_ue_pdsch_vars[eNB_id]->log2_maxh,
 			       phy_measurements); // log2_maxh+I0_shift
 #ifdef DEBUG_PHY
     if (symbol==5)
-      write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+      write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
 #endif
       
     if ((dual_stream_flag==1) && 
@@ -331,9 +345,9 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
       // get MF output for interfering stream
       dlsch_channel_compensation(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext,
 				 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
-				 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-				 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb,
-				 lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
+				 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+				 lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0,
+				 lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
 				 (aatx>1) ? lte_ue_pdsch_vars[eNB_id_i]->rho : NULL,
 				 frame_parms,
 				 symbol,
@@ -344,8 +358,8 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 				 phy_measurements); // log2_maxh+I0_shift
 #ifdef DEBUG_PHY
       if (symbol == 5) {
-	write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-	write_output("rxF_comp_i.m","rxF_c_i",&lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);     
+	write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+	write_output("rxF_comp_i.m","rxF_c_i",&lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);     
       }
 #endif 
 	
@@ -359,10 +373,49 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 				    lte_ue_pdsch_vars[eNB_id]->log2_maxh);
     }
   }
-  else if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding
+  else if (dlsch0_harq->mimo_mode == LARGE_CDD) {  // TM3
+    //   LOG_I(PHY,"Running PDSCH RX for TM3\n");
+    if (frame_parms->nb_antennas_tx_eNB == 2) {
+      if (first_symbol_flag==1) {
+	// effective channel of desired user is always stronger than interfering eff. channel
+	dlsch_channel_level_TM3(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, 
+				frame_parms, 
+				avg, symbol, nb_rb);
+	
+	//	msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(dlsch1_harq->mcs>>1)-1]);
+	avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(get_Qm(dlsch1_harq->mcs)>>1)-1];
+
+	lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
+	//	printf("log2_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
+      }    
+      dlsch_channel_compensation_TM3(frame_parms, 
+				     lte_ue_pdsch_vars[eNB_id],
+				     phy_measurements, 
+				     eNB_id, 
+				     symbol, 
+				     get_Qm(dlsch0_harq->mcs), 
+				     get_Qm(dlsch1_harq->mcs), 
+				     nb_rb, 
+				     lte_ue_pdsch_vars[eNB_id]->log2_maxh); 
+      // compute correlation between signal and interference channels
+      dlsch_dual_stream_correlation(frame_parms,
+				    symbol,
+				    nb_rb,
+				    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
+				    NULL,
+				    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+				    lte_ue_pdsch_vars[eNB_id]->log2_maxh);
+      //printf("TM3 log2_maxh : %d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
+
+    }
+    else {
+
+    }
+  }
+  else if (dlsch0_harq->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {// single-layer precoding, TM4 (Single-codeword)/5 (single or 2 user)/6
     //    printf("Channel compensation for precoding\n");
     //    if ((dual_stream_flag==1) && (eNB_id_i==NUMBER_OF_CONNECTED_eNB_MAX)) {
-    if ((dual_stream_flag==1) && (eNB_id_i==phy_vars_ue->n_connected_eNB)) {
+    if ((dual_stream_flag==1) && (eNB_id_i==phy_vars_ue->n_connected_eNB)) {  // TM5 two-user
 
       // Scale the channel estimates for interfering stream
 
@@ -375,16 +428,29 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
       /* compute new log2_maxh for effective channel */
       if (first_symbol_flag==1) {
 	// effective channel of desired user is always stronger than interfering eff. channel
-	dlsch_channel_level_prec(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext,	avg, symbol, nb_rb);
+	dlsch_channel_level_TM56(lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, frame_parms, lte_ue_pdsch_vars[eNB_id]->pmi_ext,	avg, symbol, nb_rb);
 	
-	//    msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1]);
-	avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch_ue[0]->harq_processes[harq_pid]->mcs][(i_mod>>1)-1];
+	//    msg("llr_offset = %d\n",offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1]);
+	avg[0] = log2_approx(avg[0]) - 13 + offset_mumimo_llr_drange[dlsch0_harq->mcs][(i_mod>>1)-1];
 
 	lte_ue_pdsch_vars[eNB_id]->log2_maxh = cmax(avg[0],0);
 	//printf("log1_maxh =%d\n",lte_ue_pdsch_vars[eNB_id]->log2_maxh);
       }      
 
-      dlsch_channel_compensation_prec(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, lte_ue_pdsch_vars[eNB_id]->dl_ch_mag, lte_ue_pdsch_vars[eNB_id]->dl_ch_magb, lte_ue_pdsch_vars[eNB_id]->rxdataF_comp, lte_ue_pdsch_vars[eNB_id]->pmi_ext, frame_parms, phy_measurements, eNB_id, symbol, get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs), nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off);
+      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext, 
+				      lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext, 
+				      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0, 
+				      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0, 
+				      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0, 
+				      lte_ue_pdsch_vars[eNB_id]->pmi_ext, 
+				      frame_parms, 
+				      phy_measurements, 
+				      eNB_id, 
+				      symbol, 
+				      get_Qm(dlsch0_harq->mcs), 
+				      nb_rb, 
+				      lte_ue_pdsch_vars[eNB_id]->log2_maxh, 
+				      dlsch0_harq->dl_power_off);
 
       // if interference source is MU interference, assume opposite precoder was used at eNB
 
@@ -409,12 +475,25 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 	
       }
 
-      dlsch_channel_compensation_prec(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag, lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb, lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp, lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, frame_parms, phy_measurements, eNB_id_i, symbol, i_mod, nb_rb, lte_ue_pdsch_vars[eNB_id]->log2_maxh, dlsch_ue[0]->harq_processes[harq_pid]->dl_power_off);
+      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id_i]->rxdataF_ext, 
+				      lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext, 
+				      lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0, 
+				      lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0, 
+				      lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0, 
+				      lte_ue_pdsch_vars[eNB_id_i]->pmi_ext, 
+				      frame_parms, 
+				      phy_measurements, 
+				      eNB_id_i, 
+				      symbol, 
+				      i_mod, 
+				      nb_rb, 
+				      lte_ue_pdsch_vars[eNB_id]->log2_maxh, 
+				      dlsch0_harq->dl_power_off);
         
 #ifdef DEBUG_PHY
       if (symbol==5) {
-	write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
-	write_output("rxF_comp_i.m","rxF_c_i",&lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);    
+	write_output("rxF_comp_d.m","rxF_c_d",&lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);
+	write_output("rxF_comp_i.m","rxF_c_i",&lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0[0][symbol*frame_parms->N_RB_DL*12],frame_parms->N_RB_DL*12,1,1);    
       }
 #endif  
 
@@ -422,17 +501,17 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 
     }
     else {
-      dlsch_channel_compensation_prec(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
+      dlsch_channel_compensation_TM56(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
 				      lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
-				      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-				      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-				      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+				      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+				      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+				      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
 				      lte_ue_pdsch_vars[eNB_id]->pmi_ext,
 				      frame_parms,
 				      phy_measurements,
 				      eNB_id,
 				      symbol,
-				      get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs),
+				      get_Qm(dlsch0_harq->mcs),
 				      nb_rb,
 				      lte_ue_pdsch_vars[eNB_id]->log2_maxh,
 				      1);
@@ -440,206 +519,258 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
   }
 
   //  printf("MRC\n");
-  if (frame_parms->nb_antennas_rx > 1)
-    dlsch_detection_mrc(frame_parms,
-			lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-			lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-			lte_ue_pdsch_vars[eNB_id]->rho,
-			lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-			lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-			lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-			lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-			lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb,
-			symbol,
-			nb_rb,
-			dual_stream_flag); 
-
-  //  printf("Combining");
-  // Single-layer transmission formats
-  if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode<DUALSTREAM_UNIFORM_PRECODING1) {
+  if (frame_parms->nb_antennas_rx > 1) {
+    if (dlsch0_harq->mimo_mode == LARGE_CDD) {
+      if (frame_parms->nb_antennas_tx_eNB == 2) {
+	dlsch_detection_mrc(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->rho,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_magb1,
+			    symbol,
+			    nb_rb,
+			    dual_stream_flag); 			    
+      }
+    }
+    else {
       
-      if ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode == SISO) ||
-          ((dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode >= UNIFORM_PRECODING11) &&
-           (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode <= PUSCH_PRECODING0))) {
-          /*
-          dlsch_siso(frame_parms,
-                     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                     lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                     symbol,
-                     nb_rb);
-          */
-      } else if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode == ALAMOUTI) {
-          
-          dlsch_alamouti(frame_parms,
-                         lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                         lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                         lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-                         symbol,
-                         nb_rb);
-          
-      } else if (dlsch_ue[0]->harq_processes[harq_pid]->mimo_mode == ANTCYCLING) {
+      dlsch_detection_mrc(frame_parms,
+			  lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			  lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			  lte_ue_pdsch_vars[eNB_id]->rho,
+			  lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			  lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			  lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+			  lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			  lte_ue_pdsch_vars[eNB_id_i]->dl_ch_magb0,
+			  symbol,
+			  nb_rb,
+			  dual_stream_flag); 
+    }
+  }
+  //  printf("Combining");
+  if ((dlsch0_harq->mimo_mode == SISO) ||
+      ((dlsch0_harq->mimo_mode >= UNIFORM_PRECODING11) &&
+       (dlsch0_harq->mimo_mode <= PUSCH_PRECODING0))) {
+
+    /*
+      dlsch_siso(frame_parms,
+      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+      lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
+      symbol,
+      nb_rb);
+    */
+  } else if (dlsch0_harq->mimo_mode == ALAMOUTI) {
+
+    dlsch_alamouti(frame_parms,
+		   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+		   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+		   lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+		   symbol,
+		   nb_rb);
           
-          dlsch_antcyc(frame_parms,
-                       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                       lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                       lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-                       symbol,
-                       nb_rb);
+  } 
           
-      } else {
-          msg("dlsch_rx: Unknown MIMO mode\n");
-          return (-1);
-      }
+  else if (dlsch0_harq->mimo_mode == LARGE_CDD) {
+	
+  }
+  else {
+    msg("dlsch_rx: Unknown MIMO mode\n");
+    return (-1);
+  }
 
-    //    printf("LLR");
-
-      switch (get_Qm(dlsch_ue[0]->harq_processes[harq_pid]->mcs)) {
-      case 2 : 
-          if (dual_stream_flag == 0)
-              dlsch_qpsk_llr(frame_parms,
-                             lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                             lte_ue_pdsch_vars[eNB_id]->llr[0],
-                             symbol,first_symbol_flag,nb_rb,
-                             adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                             lte_ue_pdsch_vars[eNB_id]->llr128);
-          else if (i_mod == 2) {
-              dlsch_qpsk_qpsk_llr(frame_parms,
-                                  lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                  lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                  lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                  lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                  symbol,first_symbol_flag,nb_rb,
-                                  adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                  lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          else if (i_mod == 4) { 
-              dlsch_qpsk_16qam_llr(frame_parms,
-                                   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                   lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                   symbol,first_symbol_flag,nb_rb,
-                                   adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                   lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          else {
-              dlsch_qpsk_64qam_llr(frame_parms,
-                                   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                   lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                   symbol,first_symbol_flag,nb_rb,
-                                   adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                   lte_ue_pdsch_vars[eNB_id]->llr128);
-
-          }          
-          break;
-      case 4 :
-          if (dual_stream_flag == 0) {
-              dlsch_16qam_llr(frame_parms,
-                              lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                              lte_ue_pdsch_vars[eNB_id]->llr[0],
-                              lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                              symbol,first_symbol_flag,nb_rb,
-                              adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,4,subframe,symbol),
-                              lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          else if (i_mod == 2) {
-              dlsch_16qam_qpsk_llr(frame_parms,
-                                   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                   lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                   symbol,first_symbol_flag,nb_rb,
-                                   adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                   lte_ue_pdsch_vars[eNB_id]->llr128);
-          } 
-          else if (i_mod == 4) {
-              dlsch_16qam_16qam_llr(frame_parms,
-                                    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                    lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                    symbol,first_symbol_flag,nb_rb,
-                                    adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                    lte_ue_pdsch_vars[eNB_id]->llr128);
-          } else {
-              dlsch_16qam_64qam_llr(frame_parms,
-                                    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                    lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                    symbol,first_symbol_flag,nb_rb,
-                                    adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                    lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          break;
-      case 6 :
-          if (dual_stream_flag == 0) {
-              dlsch_64qam_llr(frame_parms,
-                              lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                              lte_ue_pdsch_vars[eNB_id]->llr[0],
-                              lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                              lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-                              symbol,first_symbol_flag,nb_rb,
-                              adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,6,subframe,symbol),
-                              lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          else if (i_mod == 2) {              
-              dlsch_64qam_qpsk_llr(frame_parms,
-                                   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                                   lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                   lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                   symbol,first_symbol_flag,nb_rb,
-                                   adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                   lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          else if (i_mod == 4) {
-              dlsch_64qam_16qam_llr(frame_parms,
-                                    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                    lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                    symbol,first_symbol_flag,nb_rb,
-                                    adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                    lte_ue_pdsch_vars[eNB_id]->llr128);
-              
-          }
-          else {	  
-              dlsch_64qam_64qam_llr(frame_parms,
-                                    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag,
-                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
-                                    lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                    symbol,first_symbol_flag,nb_rb,
-                                    adjust_G2(frame_parms,dlsch_ue[0]->harq_processes[harq_pid]->rb_alloc,2,subframe,symbol),
-                                    lte_ue_pdsch_vars[eNB_id]->llr128);
-          }
-          break;
-      default:
-          msg("rx_dlsch.c : Unknown mod_order!!!!\n");
-          return(-1);
-          break;
+  //    printf("LLR");
+
+  switch (get_Qm(dlsch0_harq->mcs)) {
+  case 2 : 
+    if (dlsch0_harq->mimo_mode != LARGE_CDD) { 
+      if (dual_stream_flag == 0)
+	dlsch_qpsk_llr(frame_parms,
+		       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+		       lte_ue_pdsch_vars[eNB_id]->llr[0],
+		       symbol,first_symbol_flag,nb_rb,
+		       adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+		       lte_ue_pdsch_vars[eNB_id]->llr128);
+      else if (i_mod == 2) {
+	dlsch_qpsk_qpsk_llr(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->llr[0],
+			    symbol,first_symbol_flag,nb_rb,
+			    adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			    lte_ue_pdsch_vars[eNB_id]->llr128);
       }
-  } // single-layer transmission
-  else  {
-    msg("rx_dlsch.c : Dualstream not yet implemented\n");
+      else if (i_mod == 4) { 
+	dlsch_qpsk_16qam_llr(frame_parms,
+			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			     lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			     lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			     lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			     lte_ue_pdsch_vars[eNB_id]->llr[0],
+			     symbol,first_symbol_flag,nb_rb,
+			     adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			     lte_ue_pdsch_vars[eNB_id]->llr128);
+      }
+      else {
+	dlsch_qpsk_64qam_llr(frame_parms,
+			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			     lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			     lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			     lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			     lte_ue_pdsch_vars[eNB_id]->llr[0],
+			     symbol,first_symbol_flag,nb_rb,
+			     adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			     lte_ue_pdsch_vars[eNB_id]->llr128);
+	    
+      }          
+    }
+    else { // TM3
+      if (get_Qm(dlsch1_harq->mcs) == 2) {
+	/*	dlsch_qpsk_llr(frame_parms,
+		       lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+		       lte_ue_pdsch_vars[eNB_id]->llr[0],
+		       symbol,first_symbol_flag,nb_rb,
+		       adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+		       lte_ue_pdsch_vars[eNB_id]->llr128);
+	*/
+	dlsch_qpsk_qpsk_llr(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->llr[0],
+			    symbol,first_symbol_flag,nb_rb,
+			    adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			    lte_ue_pdsch_vars[eNB_id]->llr128);
+      }
+      else if (get_Qm(dlsch1_harq->mcs) == 4) { 
+	dlsch_qpsk_16qam_llr(frame_parms,
+			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1,
+			     lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
+			     lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			     lte_ue_pdsch_vars[eNB_id]->llr[0],
+			     symbol,first_symbol_flag,nb_rb,
+			     adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			     lte_ue_pdsch_vars[eNB_id]->llr128);
+      }
+      else {
+	dlsch_qpsk_64qam_llr(frame_parms,
+			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			     lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1,
+			     lte_ue_pdsch_vars[eNB_id]->dl_ch_mag1,
+			     lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			     lte_ue_pdsch_vars[eNB_id]->llr[0],
+			     symbol,first_symbol_flag,nb_rb,
+			     adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			     lte_ue_pdsch_vars[eNB_id]->llr128);
+	
+      }          
+    }
+    break;
+  case 4 :
+    if (dual_stream_flag == 0) {
+      dlsch_16qam_llr(frame_parms,
+		      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+		      lte_ue_pdsch_vars[eNB_id]->llr[0],
+		      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+		      symbol,first_symbol_flag,nb_rb,
+		      adjust_G2(frame_parms,dlsch0_harq->rb_alloc,4,subframe,symbol),
+		      lte_ue_pdsch_vars[eNB_id]->llr128);
+    }
+    else if (i_mod == 2) {
+      dlsch_16qam_qpsk_llr(frame_parms,
+			   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			   lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			   lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			   lte_ue_pdsch_vars[eNB_id]->llr[0],
+			   symbol,first_symbol_flag,nb_rb,
+			   adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			   lte_ue_pdsch_vars[eNB_id]->llr128);
+    } 
+    else if (i_mod == 4) {
+      dlsch_16qam_16qam_llr(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->llr[0],
+			    symbol,first_symbol_flag,nb_rb,
+			    adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			    lte_ue_pdsch_vars[eNB_id]->llr128);
+    } else {
+      dlsch_16qam_64qam_llr(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->llr[0],
+			    symbol,first_symbol_flag,nb_rb,
+			    adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			    lte_ue_pdsch_vars[eNB_id]->llr128);
+    }
+    break;
+  case 6 :
+    if (dual_stream_flag == 0) {
+      dlsch_64qam_llr(frame_parms,
+		      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+		      lte_ue_pdsch_vars[eNB_id]->llr[0],
+		      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+		      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+		      symbol,first_symbol_flag,nb_rb,
+		      adjust_G2(frame_parms,dlsch0_harq->rb_alloc,6,subframe,symbol),
+		      lte_ue_pdsch_vars[eNB_id]->llr128);
+    }
+    else if (i_mod == 2) {              
+      dlsch_64qam_qpsk_llr(frame_parms,
+			   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			   lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			   lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			   lte_ue_pdsch_vars[eNB_id]->llr[0],
+			   symbol,first_symbol_flag,nb_rb,
+			   adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			   lte_ue_pdsch_vars[eNB_id]->llr128);
+    }
+    else if (i_mod == 4) {
+      dlsch_64qam_16qam_llr(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->llr[0],
+			    symbol,first_symbol_flag,nb_rb,
+			    adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			    lte_ue_pdsch_vars[eNB_id]->llr128);
+	
+    }
+    else {	  
+      dlsch_64qam_64qam_llr(frame_parms,
+			    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id_i]->rxdataF_comp0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id_i]->dl_ch_mag0,
+			    lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext,
+			    lte_ue_pdsch_vars[eNB_id]->llr[0],
+			    symbol,first_symbol_flag,nb_rb,
+			    adjust_G2(frame_parms,dlsch0_harq->rb_alloc,2,subframe,symbol),
+			    lte_ue_pdsch_vars[eNB_id]->llr128);
+    }
+    break;
+  default:
+    msg("rx_dlsch.c : Unknown mod_order!!!!\n");
     return(-1);
+    break;
   }
-  
+
   return(0);    
 }
 
@@ -664,6 +795,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
   unsigned short rb;
   unsigned char aatx,aarx,symbol_mod,pilots=0;
   __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
 
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
@@ -914,7 +1046,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
   _m_empty();
 }     
 
-void prec2A_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) {
+void prec2A_TM56_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) {
   
   __m128i amp;
   amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
@@ -954,7 +1086,72 @@ void prec2A_128(unsigned char pmi,__m128i *ch0,__m128i *ch1) {
   _m_empty();
 }
 
-void dlsch_channel_compensation_prec(int **rxdataF_ext,
+// precoding is stream 0 .5(1,1)  .5(1,-1) .5(1,1)  .5(1,-1)
+//              stream 1 .5(1,-1) .5(1,1)  .5(1,-1) .5(1,1)
+// store "precoded" channel for stream 0 in ch0, stream 1 in ch1
+
+short TM3_prec[8]__attribute__((aligned(16))) = {1,1,-1,-1,1,1,-1,-1} ;
+
+void prec2A_TM3_128(__m128i *ch0,__m128i *ch1) {
+  
+  //  __m128i amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
+  
+  __m128i tmp0,tmp1;
+  
+
+  //  print_shorts("prec2A_TM3 ch0 (before):",ch0);
+  //  print_shorts("prec2A_TM3 ch1 (before):",ch1);
+
+  tmp0 = ch0[0];
+  tmp1  = _mm_sign_epi16(ch1[0],((__m128i*)&TM3_prec)[0]);
+  //  print_shorts("prec2A_TM3 ch1*s (mid):",(__m128i*)TM3_prec);
+
+  ch0[0] = _mm_adds_epi16(ch0[0],tmp1);
+  ch1[0] = _mm_subs_epi16(tmp0,tmp1);
+
+
+  //  print_shorts("prec2A_TM3 ch0 (mid):",&tmp0);
+  //  print_shorts("prec2A_TM3 ch1 (mid):",ch1);
+
+
+  ch0[0] = _mm_srai_epi16(ch0[0],1);
+  ch1[0] = _mm_srai_epi16(ch1[0],1);
+
+  //  print_shorts("prec2A_TM3 ch0 (after):",ch0);
+  //  print_shorts("prec2A_TM3 ch1 (after):",ch1);
+    
+  _mm_empty();
+  _m_empty();
+}
+
+// pmi = 0 => stream 0 (1,1), stream 1 (1,-1)
+// pmi = 1 => stream 0 (1,j), stream 2 (1,-j)
+
+void prec2A_TM4_128(int pmi,__m128i *ch0,__m128i *ch1) {
+  
+  __m128i amp;
+  amp = _mm_set1_epi16(ONE_OVER_SQRT2_Q15);
+  __m128i tmp1;
+  
+  if (pmi == 0) {
+    ch0[0] = _mm_adds_epi16(ch0[0],ch1[0]);
+    ch1[0] = _mm_subs_epi16(ch0[0],ch1[0]);
+  }
+  else {
+    tmp1   = _mm_sign_epi16(ch1[0],*(__m128i*)&conjugate[0]);
+    tmp1   = _mm_shufflelo_epi16(tmp1,_MM_SHUFFLE(2,3,0,1));
+    tmp1   = _mm_shufflehi_epi16(tmp1,_MM_SHUFFLE(2,3,0,1));
+    ch0[0] = _mm_subs_epi16(ch0[0],tmp1);
+    ch1[0] = _mm_subs_epi16(ch0[0],tmp1);
+  }
+  ch0[0] = _mm_mulhi_epi16(ch0[0],amp);
+  ch0[0] = _mm_slli_epi16(ch0[0],1);
+  ch1[0] = _mm_mulhi_epi16(ch1[0],amp);
+  ch1[0] = _mm_slli_epi16(ch1[0],1);
+
+}
+
+void dlsch_channel_compensation_TM56(int **rxdataF_ext,
                                      int **dl_ch_estimates_ext,
                                      int **dl_ch_mag,
                                      int **dl_ch_magb,
@@ -970,24 +1167,17 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
                                      unsigned char dl_power_off) {
   
   unsigned short rb,Nre;
-  __m128i *dl_ch128_0,*dl_ch128_1,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
+  __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
   unsigned char aarx=0,symbol_mod,pilots=0;
   int precoded_signal_strength=0,rx_power_correction;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
     
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
     
   if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
     pilots=1;
 
-#ifndef NEW_FFT
-  if ( (frame_parms->ofdm_symbol_size == 128) ||
-       (frame_parms->ofdm_symbol_size == 512) )
-    rx_power_correction = 2;
-  else
-    rx_power_correction = 1;
-#else
   rx_power_correction = 1;
-#endif
     
 #ifndef __SSE3__
   zero = _mm_xor_si128(zero,zero);
@@ -1006,8 +1196,8 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
     
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
         
-    dl_ch128_0          = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
-    dl_ch128_1          = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch0_128          = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch1_128          = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
         
         
     dl_ch_mag128      = (__m128i *)&dl_ch_mag[aarx][symbol*frame_parms->N_RB_DL*12];
@@ -1021,20 +1211,20 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
 #ifdef DEBUG_DLSCH_DEMOD
       printf("mode 6 prec: rb %d, pmi->%d\n",rb,pmi_ext[rb]);
 #endif            
-      prec2A_128(pmi_ext[rb],&dl_ch128_0[0],&dl_ch128_1[0]);
-      prec2A_128(pmi_ext[rb],&dl_ch128_0[1],&dl_ch128_1[1]);
+      prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[0],&dl_ch1_128[0]);
+      prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[1],&dl_ch1_128[1]);
 
       if (pilots==0) {
-	prec2A_128(pmi_ext[rb],&dl_ch128_0[2],&dl_ch128_1[2]); 
+	prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128[2],&dl_ch1_128[2]); 
       }
 
       if (mod_order>2) {  
 	// get channel amplitude if not QPSK
 	
-	mmtmpD0 = _mm_madd_epi16(dl_ch128_0[0],dl_ch128_0[0]);	
+	mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]);	
 	mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
                 
-	mmtmpD1 = _mm_madd_epi16(dl_ch128_0[1],dl_ch128_0[1]);
+	mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]);
 	mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
                 
 	mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
@@ -1052,7 +1242,7 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
 	dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1);
                 
 	if (pilots==0) {
-	  mmtmpD0 = _mm_madd_epi16(dl_ch128_0[2],dl_ch128_0[2]);
+	  mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]);
 	  mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
                     
 	  mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
@@ -1079,11 +1269,355 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
       }
 
       // MF multiply by conjugated channel
-      mmtmpD0 = _mm_madd_epi16(dl_ch128_0[0],rxdataF128[0]);
+      mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]);
+      //	print_ints("re",&mmtmpD0);
+            
+      // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+      mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
+      //	print_ints("im",&mmtmpD1);
+      mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
+      // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+      mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+      //	print_ints("re(shift)",&mmtmpD0);
+      mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+      //	print_ints("im(shift)",&mmtmpD1);
+      mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+      mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+      //       	print_ints("c0",&mmtmpD2);
+      //	print_ints("c1",&mmtmpD3);
+      rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+      //	print_shorts("rx:",rxdataF128);
+      //	print_shorts("ch:",dl_ch128);
+      //	print_shorts("pack:",rxdataF_comp128);
+            
+      // multiply by conjugated channel
+      mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]);
+      // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+      mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+      mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
+      // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+      mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+      mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+      mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+      mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+            
+      rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+      //	print_shorts("rx:",rxdataF128+1);
+      //	print_shorts("ch:",dl_ch128+1);
+      //	print_shorts("pack:",rxdataF_comp128+1);	
+            
+      if (pilots==0) {
+	// multiply by conjugated channel
+	mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]);
+	// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+	mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1));
+	mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+	mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+	mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
+	// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+	mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+	mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+	mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+	mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+                
+	rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+	//	print_shorts("rx:",rxdataF128+2);
+	//	print_shorts("ch:",dl_ch128+2);
+	//      	print_shorts("pack:",rxdataF_comp128+2);
+                
+	dl_ch0_128+=3;
+	dl_ch1_128+=3;
+	dl_ch_mag128+=3;
+	dl_ch_mag128b+=3;
+	rxdataF128+=3;
+	rxdataF_comp128+=3;
+      }
+      else {
+	dl_ch0_128+=2;
+	dl_ch1_128+=2;
+	dl_ch_mag128+=2;
+	dl_ch_mag128b+=2;
+	rxdataF128+=2;
+	rxdataF_comp128+=2;
+      }
+    }
+        
+    Nre = (pilots==0) ? 12 : 8;
+        
+    precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
+						     (nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx]));
+  } // rx_antennas
+    
+  phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot);
+	
+  //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol,
+  //	 phy_measurements->precoded_cqi_dB[eNB_id][0]);
+    
+  _mm_empty();
+  _m_empty();  
+}    
+
+void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
+				    LTE_UE_PDSCH *lte_ue_pdsch_vars,
+				    PHY_MEASUREMENTS *phy_measurements,
+				    int eNB_id,
+				    unsigned char symbol,
+				    unsigned char mod_order0,
+				    unsigned char mod_order1,
+				    unsigned short nb_rb,
+				    unsigned char output_shift) {
+  
+  unsigned short rb,Nre;
+  __m128i *dl_ch0_128,*dl_ch1_128,*dl_ch_mag0_128,*dl_ch_mag1_128,*dl_ch_mag0_128b,*dl_ch_mag1_128b,*rxdataF128,*rxdataF_comp0_128,*rxdataF_comp1_128;
+  unsigned char aarx=0,symbol_mod,pilots=0;
+  int precoded_signal_strength0=0,precoded_signal_strength1=0,rx_power_correction;
+
+  int **rxdataF_ext           = lte_ue_pdsch_vars->rxdataF_ext;
+  int **dl_ch_estimates_ext   = lte_ue_pdsch_vars->dl_ch_estimates_ext;
+  int **dl_ch_mag0            = lte_ue_pdsch_vars->dl_ch_mag0;
+  int **dl_ch_mag1            = lte_ue_pdsch_vars->dl_ch_mag1;
+  int **dl_ch_magb0           = lte_ue_pdsch_vars->dl_ch_magb0;
+  int **dl_ch_magb1           = lte_ue_pdsch_vars->dl_ch_magb1;
+  int **rxdataF_comp0         = lte_ue_pdsch_vars->rxdataF_comp0;
+  int **rxdataF_comp1         = lte_ue_pdsch_vars->rxdataF_comp1;
+  __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp0_128b,QAM_amp1_128,QAM_amp1_128b;   
+    
+
+  symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+    
+  if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
+    pilots=1;
+
+  rx_power_correction = 1;
+    
+#ifndef __SSE3__
+  zero = _mm_xor_si128(zero,zero);
+#endif
+
+  //printf("comp prec: symbol %d, pilots %d\n",symbol, pilots);
+
+  if (mod_order0 == 4) {
+    QAM_amp0_128  = _mm_set1_epi16(QAM16_n1);
+    QAM_amp0_128b = _mm_xor_si128(QAM_amp0_128b,QAM_amp0_128b);
+  }
+  else if (mod_order0 == 6) {
+    QAM_amp0_128  = _mm_set1_epi16(QAM64_n1);
+    QAM_amp0_128b = _mm_set1_epi16(QAM64_n2);
+  }
+  if (mod_order1 == 4) {
+    QAM_amp1_128  = _mm_set1_epi16(QAM16_n1);
+    QAM_amp1_128b = _mm_xor_si128(QAM_amp1_128b,QAM_amp1_128b);
+  }
+  else if (mod_order1 == 6) {
+    QAM_amp1_128  = _mm_set1_epi16(QAM64_n1);
+    QAM_amp1_128b = _mm_set1_epi16(QAM64_n2);
+  }
+    
+  for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
+        
+    dl_ch0_128          = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch1_128          = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+        
+        
+    dl_ch_mag0_128      = (__m128i *)&dl_ch_mag0[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch_mag0_128b     = (__m128i *)&dl_ch_magb0[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch_mag1_128      = (__m128i *)&dl_ch_mag1[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch_mag1_128b     = (__m128i *)&dl_ch_magb1[aarx][symbol*frame_parms->N_RB_DL*12];
+    rxdataF128          = (__m128i *)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+    rxdataF_comp0_128   = (__m128i *)&rxdataF_comp0[aarx][symbol*frame_parms->N_RB_DL*12];
+    rxdataF_comp1_128   = (__m128i *)&rxdataF_comp1[aarx][symbol*frame_parms->N_RB_DL*12];
+        
+
+    for (rb=0;rb<nb_rb;rb++) {
+      // combine TX channels using precoder from pmi
+
+      prec2A_TM3_128(&dl_ch0_128[0],&dl_ch1_128[0]);
+      prec2A_TM3_128(&dl_ch0_128[1],&dl_ch1_128[1]);
+
+      if (pilots==0) {
+	prec2A_TM3_128(&dl_ch0_128[2],&dl_ch1_128[2]); 
+      }
+
+      if (mod_order0>2) {  
+	// get channel amplitude if not QPSK
+	
+	mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],dl_ch0_128[0]);	
+	mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+                
+	mmtmpD1 = _mm_madd_epi16(dl_ch0_128[1],dl_ch0_128[1]);
+	mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+                
+	mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
+                
+	dl_ch_mag0_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
+	dl_ch_mag0_128b[0] = dl_ch_mag0_128[0];
+	dl_ch_mag0_128[0] = _mm_mulhi_epi16(dl_ch_mag0_128[0],QAM_amp0_128);
+	dl_ch_mag0_128[0] = _mm_slli_epi16(dl_ch_mag0_128[0],1);
+                
+	//	print_shorts("dl_ch_mag0_128[0]=",&dl_ch_mag0_128[0]);
+                
+	dl_ch_mag0_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
+	dl_ch_mag0_128b[1] = dl_ch_mag0_128[1];
+	dl_ch_mag0_128[1] = _mm_mulhi_epi16(dl_ch_mag0_128[1],QAM_amp0_128);
+	dl_ch_mag0_128[1] = _mm_slli_epi16(dl_ch_mag0_128[1],1);
+                
+	if (pilots==0) {
+	  mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],dl_ch0_128[2]);
+	  mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+                    
+	  mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
+                    
+	  dl_ch_mag0_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
+	  dl_ch_mag0_128b[2] = dl_ch_mag0_128[2];
+                    
+	  dl_ch_mag0_128[2] = _mm_mulhi_epi16(dl_ch_mag0_128[2],QAM_amp0_128);
+	  dl_ch_mag0_128[2] = _mm_slli_epi16(dl_ch_mag0_128[2],1);	  
+	}
+                
+	dl_ch_mag0_128b[0] = _mm_mulhi_epi16(dl_ch_mag0_128b[0],QAM_amp0_128b);
+	dl_ch_mag0_128b[0] = _mm_slli_epi16(dl_ch_mag0_128b[0],1);
+                
+	//print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]);
+                
+	dl_ch_mag0_128b[1] = _mm_mulhi_epi16(dl_ch_mag0_128b[1],QAM_amp0_128b);
+	dl_ch_mag0_128b[1] = _mm_slli_epi16(dl_ch_mag0_128b[1],1);
+                
+	if (pilots==0) {
+	  dl_ch_mag0_128b[2] = _mm_mulhi_epi16(dl_ch_mag0_128b[2],QAM_amp0_128b);
+	  dl_ch_mag0_128b[2] = _mm_slli_epi16(dl_ch_mag0_128b[2],1);	  
+	}
+      }
+
+      if (mod_order1>2) {  
+	// get channel amplitude if not QPSK
+	
+	mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],dl_ch1_128[0]);	
+	mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+                
+	mmtmpD1 = _mm_madd_epi16(dl_ch1_128[1],dl_ch1_128[1]);
+	mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+                
+	mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
+                
+	dl_ch_mag1_128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
+	dl_ch_mag1_128b[0] = dl_ch_mag1_128[0];
+	dl_ch_mag1_128[0] = _mm_mulhi_epi16(dl_ch_mag1_128[0],QAM_amp1_128);
+	dl_ch_mag1_128[0] = _mm_slli_epi16(dl_ch_mag1_128[0],1);
+                
+	//print_shorts("dl_ch_mag128[0]=",&dl_ch_mag128[0]);
+                
+	dl_ch_mag1_128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
+	dl_ch_mag1_128b[1] = dl_ch_mag1_128[1];
+	dl_ch_mag1_128[1] = _mm_mulhi_epi16(dl_ch_mag1_128[1],QAM_amp1_128);
+	dl_ch_mag1_128[1] = _mm_slli_epi16(dl_ch_mag1_128[1],1);
+                
+	if (pilots==0) {
+	  mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],dl_ch1_128[2]);
+	  mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+                    
+	  mmtmpD1 = _mm_packs_epi32(mmtmpD0,mmtmpD0);
+                    
+	  dl_ch_mag1_128[2] = _mm_unpacklo_epi16(mmtmpD1,mmtmpD1);
+	  dl_ch_mag1_128b[2] = dl_ch_mag1_128[2];
+                    
+	  dl_ch_mag1_128[2] = _mm_mulhi_epi16(dl_ch_mag1_128[2],QAM_amp1_128);
+	  dl_ch_mag1_128[2] = _mm_slli_epi16(dl_ch_mag1_128[2],1);	  
+	}
+                
+	dl_ch_mag1_128b[0] = _mm_mulhi_epi16(dl_ch_mag1_128b[0],QAM_amp1_128b);
+	dl_ch_mag1_128b[0] = _mm_slli_epi16(dl_ch_mag1_128b[0],1);
+                
+	//print_shorts("dl_ch_mag128b[0]=",&dl_ch_mag128b[0]);
+                
+	dl_ch_mag1_128b[1] = _mm_mulhi_epi16(dl_ch_mag1_128b[1],QAM_amp1_128b);
+	dl_ch_mag1_128b[1] = _mm_slli_epi16(dl_ch_mag1_128b[1],1);
+                
+	if (pilots==0) {
+	  dl_ch_mag1_128b[2] = _mm_mulhi_epi16(dl_ch_mag1_128b[2],QAM_amp1_128b);
+	  dl_ch_mag1_128b[2] = _mm_slli_epi16(dl_ch_mag1_128b[2],1);	  
+	}
+      }
+
+      // layer 0
+      // MF multiply by conjugated channel
+      mmtmpD0 = _mm_madd_epi16(dl_ch0_128[0],rxdataF128[0]);
+      //print_ints("re",&mmtmpD0);
+            
+      // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+      mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[0],_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
+      mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
+      //      print_ints("im",&mmtmpD1);
+      // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+      mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+      //      printf("Shift: %d\n",output_shift);
+      //      print_ints("re(shift)",&mmtmpD0);
+      mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+      //      print_ints("im(shift)",&mmtmpD1);
+      mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+      mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+      //      print_ints("c0",&mmtmpD2);
+      //      print_ints("c1",&mmtmpD3);
+      rxdataF_comp0_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+      //      print_shorts("rx:",rxdataF128);
+      //      print_shorts("ch:",dl_ch0_128);
+      //      print_shorts("pack:",rxdataF_comp0_128);
+            
+      // multiply by conjugated channel
+      mmtmpD0 = _mm_madd_epi16(dl_ch0_128[1],rxdataF128[1]);
+      // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+      mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[1],_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+      mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
+      // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+      mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+      mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+      mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+      mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+            
+      rxdataF_comp0_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+      //	print_shorts("rx:",rxdataF128+1);
+      //	print_shorts("ch:",dl_ch128+1);
+      //	print_shorts("pack:",rxdataF_comp128+1);	
+            
+      if (pilots==0) {
+	// multiply by conjugated channel
+	mmtmpD0 = _mm_madd_epi16(dl_ch0_128[2],rxdataF128[2]);
+	// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
+	mmtmpD1 = _mm_shufflelo_epi16(dl_ch0_128[2],_MM_SHUFFLE(2,3,0,1));
+	mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
+	mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
+	mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
+	// mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
+	mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
+	mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
+	mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
+	mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
+                
+	rxdataF_comp0_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+	//	print_shorts("rx:",rxdataF128+2);
+	//	print_shorts("ch:",dl_ch128+2);
+	//      	print_shorts("pack:",rxdataF_comp128+2);
+                
+      }
+      else {
+
+      }
+      
+      
+      // layer 1
+      // MF multiply by conjugated channel
+      mmtmpD0 = _mm_madd_epi16(dl_ch1_128[0],rxdataF128[0]);
       //	print_ints("re",&mmtmpD0);
-            
+      
       // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-      mmtmpD1 = _mm_shufflelo_epi16(dl_ch128_0[0],_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[0],_MM_SHUFFLE(2,3,0,1));
       mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
       mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
       //	print_ints("im",&mmtmpD1);
@@ -1097,15 +1631,15 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
       mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
       //       	print_ints("c0",&mmtmpD2);
       //	print_ints("c1",&mmtmpD3);
-      rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+      rxdataF_comp1_128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
       //	print_shorts("rx:",rxdataF128);
       //	print_shorts("ch:",dl_ch128);
       //	print_shorts("pack:",rxdataF_comp128);
-            
+      
       // multiply by conjugated channel
-      mmtmpD0 = _mm_madd_epi16(dl_ch128_0[1],rxdataF128[1]);
+      mmtmpD0 = _mm_madd_epi16(dl_ch1_128[1],rxdataF128[1]);
       // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-      mmtmpD1 = _mm_shufflelo_epi16(dl_ch128_0[1],_MM_SHUFFLE(2,3,0,1));
+      mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[1],_MM_SHUFFLE(2,3,0,1));
       mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
       mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
       mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
@@ -1114,17 +1648,17 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
       mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
       mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
       mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-            
-      rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+      
+      rxdataF_comp1_128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
       //	print_shorts("rx:",rxdataF128+1);
       //	print_shorts("ch:",dl_ch128+1);
       //	print_shorts("pack:",rxdataF_comp128+1);	
-            
+      
       if (pilots==0) {
 	// multiply by conjugated channel
-	mmtmpD0 = _mm_madd_epi16(dl_ch128_0[2],rxdataF128[2]);
+	mmtmpD0 = _mm_madd_epi16(dl_ch1_128[2],rxdataF128[2]);
 	// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
-	mmtmpD1 = _mm_shufflelo_epi16(dl_ch128_0[2],_MM_SHUFFLE(2,3,0,1));
+	mmtmpD1 = _mm_shufflelo_epi16(dl_ch1_128[2],_MM_SHUFFLE(2,3,0,1));
 	mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
 	mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
 	mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[2]);
@@ -1133,36 +1667,46 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
 	mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
 	mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
 	mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-                
-	rxdataF_comp128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
+	
+	rxdataF_comp1_128[2] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
 	//	print_shorts("rx:",rxdataF128+2);
 	//	print_shorts("ch:",dl_ch128+2);
 	//      	print_shorts("pack:",rxdataF_comp128+2);
-                
-	dl_ch128_0+=3;
-	dl_ch128_1+=3;
-	dl_ch_mag128+=3;
-	dl_ch_mag128b+=3;
+	
+	dl_ch0_128+=3;
+	dl_ch1_128+=3;
+	dl_ch_mag0_128+=3;
+	dl_ch_mag1_128+=3;
+	dl_ch_mag0_128b+=3;
+	dl_ch_mag1_128b+=3;
 	rxdataF128+=3;
-	rxdataF_comp128+=3;
+	rxdataF_comp0_128+=3;
+	rxdataF_comp1_128+=3;
       }
       else {
-	dl_ch128_0+=2;
-	dl_ch128_1+=2;
-	dl_ch_mag128+=2;
-	dl_ch_mag128b+=2;
+	dl_ch0_128+=2;
+	dl_ch1_128+=2;
+	dl_ch_mag0_128+=2;
+	dl_ch_mag1_128+=2;
+	dl_ch_mag0_128b+=2;
+	dl_ch_mag1_128b+=2;
 	rxdataF128+=2;
-	rxdataF_comp128+=2;
+	rxdataF_comp0_128+=2;
+	rxdataF_comp1_128+=2;
       }
-    }
-        
-    Nre = (pilots==0) ? 12 : 8;
-        
-    precoded_signal_strength += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
-						     (nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx]));
+      
+      Nre = (pilots==0) ? 12 : 8;
+      
+      precoded_signal_strength0 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*Nre],
+							(nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx]));
+      
+      precoded_signal_strength1 += ((signal_energy_nodc(&dl_ch_estimates_ext[aarx+2][symbol*frame_parms->N_RB_DL*Nre],
+							(nb_rb*Nre))*rx_power_correction) - (phy_measurements->n0_power[aarx]));
+    } // rb loop
   } // rx_antennas
-    
-  phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength,phy_measurements->n0_power_tot);
+      
+  phy_measurements->precoded_cqi_dB[eNB_id][0] = dB_fixed2(precoded_signal_strength0,phy_measurements->n0_power_tot);
+  phy_measurements->precoded_cqi_dB[eNB_id][1] = dB_fixed2(precoded_signal_strength1,phy_measurements->n0_power_tot);
 	
   //printf("eNB_id %d, symbol %d: precoded CQI %d dB\n",eNB_id,symbol,
   //	 phy_measurements->precoded_cqi_dB[eNB_id][0]);
@@ -1180,7 +1724,7 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
                                    unsigned char output_shift) {
     
   unsigned short rb;
-  __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128;
+  __m128i *dl_ch128,*dl_ch128i,*dl_ch_rho128,mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3;
   unsigned char aarx,symbol_mod,pilots=0;
     
   //    printf("dlsch_dual_stream_correlation: symbol %d\n",symbol);
@@ -1190,33 +1734,37 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
   if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
     pilots=1;
   }
-    
+  //  printf("Dual stream correlation (%p)\n",dl_ch_estimates_ext_i);
+
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
         
     dl_ch128          = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
-    dl_ch128i         = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12];
+    if (dl_ch_estimates_ext_i == NULL) // TM3/4
+      dl_ch128i         = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+    else
+      dl_ch128i         = (__m128i *)&dl_ch_estimates_ext_i[aarx][symbol*frame_parms->N_RB_DL*12];
     dl_ch_rho128      = (__m128i *)&dl_ch_rho_ext[aarx][symbol*frame_parms->N_RB_DL*12];
         
         
     for (rb=0;rb<nb_rb;rb++) {
       // multiply by conjugated channel
       mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128i[0]);
-      //	print_ints("re",&mmtmpD0);
+      //      print_ints("re",&mmtmpD0);
       // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
       mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1));
       mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
       mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
-      //	print_ints("im",&mmtmpD1);
       mmtmpD1 = _mm_madd_epi16(mmtmpD1,dl_ch128i[0]);
+      //      print_ints("im",&mmtmpD1);
       // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
       mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-      //	print_ints("re(shift)",&mmtmpD0);
+      //      print_ints("re(shift)",&mmtmpD0);
       mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-      //	print_ints("im(shift)",&mmtmpD1);
+      //      print_ints("im(shift)",&mmtmpD1);
       mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
       mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-      //       	print_ints("c0",&mmtmpD2);
-      //	print_ints("c1",&mmtmpD3);
+      //      print_ints("c0",&mmtmpD2);
+      //      print_ints("c1",&mmtmpD3);
       dl_ch_rho128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);      
             
       // multiply by conjugated channel
@@ -1304,6 +1852,8 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
       rho128_0 = (__m128i *) &rho[0][symbol*frame_parms->N_RB_DL*12];
       rho128_1 = (__m128i *) &rho[1][symbol*frame_parms->N_RB_DL*12];
       for (i=0;i<nb_rb*3;i++) {
+	//	print_shorts("mrc rho0:",&rho128_0[i]);
+	//	print_shorts("mrc rho1:",&rho128_1[i]);
 	rho128_0[i] = _mm_adds_epi16(_mm_srai_epi16(rho128_0[i],1),_mm_srai_epi16(rho128_1[i],1));
       }
     }
@@ -1390,8 +1940,8 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
 
   short rb;
   unsigned char aatx,aarx,nre=12,symbol_mod;
-  __m128i *dl_ch128;
-  
+  __m128i *dl_ch128,avg128D;
+
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
   for (aatx=0;aatx<frame_parms->nb_antennas_tx_eNB;aatx++)
@@ -1443,7 +1993,81 @@ void dlsch_channel_level(int **dl_ch_estimates_ext,
 }
 
 //compute average channel_level of effective (precoded) channel
-void dlsch_channel_level_prec(int **dl_ch_estimates_ext,
+void dlsch_channel_level_TM3(int **dl_ch_estimates_ext,
+			     LTE_DL_FRAME_PARMS *frame_parms,
+			     int *avg,
+			     uint8_t symbol,
+			     unsigned short nb_rb){
+
+  short rb;
+  unsigned char aarx,nre=12,symbol_mod;
+  __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D;
+
+  symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
+
+  //clear average level
+  avg128D = _mm_xor_si128(avg128D,avg128D);
+  avg[0] = 0;
+  avg[1] = 0;
+  // 5 is always a symbol with no pilots for both normal and extended prefix
+
+  if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0))
+    nre=8;
+  else if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==1))
+    nre=10;
+  else
+    nre=12;
+
+  for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
+    dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+
+    for (rb=0;rb<nb_rb;rb++) {
+
+      dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]);
+      dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]);
+
+      prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+      //      mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);          
+      avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
+
+      dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]);
+      dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]);          
+
+      prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+      //      mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);          
+      avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
+
+      if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) {
+	dl_ch0_128+=2;	
+	dl_ch1_128+=2;
+      }
+      else {
+	dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]);
+	dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]);          
+
+	prec2A_TM3_128(&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+	//	mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
+	avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
+
+	dl_ch0_128+=3;	
+	dl_ch1_128+=3;
+      }          
+    }
+    avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) + 
+      (((int*)&avg128D)[1])/(nb_rb*nre) + 
+      (((int*)&avg128D)[2])/(nb_rb*nre) + 
+      (((int*)&avg128D)[3])/(nb_rb*nre);
+  }
+  // choose maximum of the 2 effective channels
+  avg[0] = cmax(avg[0],avg[1]);
+
+  _mm_empty();
+  _m_empty();
+}
+
+//compute average channel_level of effective (precoded) channel
+void dlsch_channel_level_TM56(int **dl_ch_estimates_ext,
                               LTE_DL_FRAME_PARMS *frame_parms,
                               unsigned char *pmi_ext,
                               int *avg,
@@ -1452,7 +2076,7 @@ void dlsch_channel_level_prec(int **dl_ch_estimates_ext,
 
   short rb;
   unsigned char aarx,nre=12,symbol_mod;
-  __m128i *dl_ch128_0,*dl_ch128_1, dl_ch128_0_tmp, dl_ch128_1_tmp;
+  __m128i *dl_ch0_128,*dl_ch1_128, dl_ch0_128_tmp, dl_ch1_128_tmp,avg128D;
 
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
 
@@ -1470,39 +2094,39 @@ void dlsch_channel_level_prec(int **dl_ch_estimates_ext,
     nre=12;
 
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
-    dl_ch128_0 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
-    dl_ch128_1 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch0_128 = (__m128i *)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
+    dl_ch1_128 = (__m128i *)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
 
     for (rb=0;rb<nb_rb;rb++) {
 
-      dl_ch128_0_tmp = _mm_load_si128(&dl_ch128_0[0]);
-      dl_ch128_1_tmp = _mm_load_si128(&dl_ch128_1[0]);
+      dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[0]);
+      dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[0]);
 
-      prec2A_128(pmi_ext[rb],&dl_ch128_0_tmp,&dl_ch128_1_tmp);
-      mmtmpD0 = _mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp);          
-      avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp));
+      prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+      //      mmtmpD0 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);          
+      avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
 
-      dl_ch128_0_tmp = _mm_load_si128(&dl_ch128_0[1]);
-      dl_ch128_1_tmp = _mm_load_si128(&dl_ch128_1[1]);          
+      dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[1]);
+      dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[1]);          
 
-      prec2A_128(pmi_ext[rb],&dl_ch128_0_tmp,&dl_ch128_1_tmp);
-      mmtmpD1 = _mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp);          
-      avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp));
+      prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+      //      mmtmpD1 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);          
+      avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
 
       if (((symbol_mod == 0) || (symbol_mod == (frame_parms->Ncp-1)))&&(frame_parms->mode1_flag==0)) {
-	dl_ch128_0+=2;	
-	dl_ch128_1+=2;
+	dl_ch0_128+=2;	
+	dl_ch1_128+=2;
       }
       else {
-	dl_ch128_0_tmp = _mm_load_si128(&dl_ch128_0[2]);
-	dl_ch128_1_tmp = _mm_load_si128(&dl_ch128_1[2]);          
+	dl_ch0_128_tmp = _mm_load_si128(&dl_ch0_128[2]);
+	dl_ch1_128_tmp = _mm_load_si128(&dl_ch1_128[2]);          
 
-	prec2A_128(pmi_ext[rb],&dl_ch128_0_tmp,&dl_ch128_1_tmp);
-	mmtmpD2 = _mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp);
-	avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch128_0_tmp,dl_ch128_0_tmp));
+	prec2A_TM56_128(pmi_ext[rb],&dl_ch0_128_tmp,&dl_ch1_128_tmp);
+	//	mmtmpD2 = _mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp);
+	avg128D = _mm_add_epi32(avg128D,_mm_madd_epi16(dl_ch0_128_tmp,dl_ch0_128_tmp));
 
-	dl_ch128_0+=3;	
-	dl_ch128_1+=3;
+	dl_ch0_128+=3;	
+	dl_ch1_128+=3;
       }          
     }
     avg[aarx] = (((int*)&avg128D)[0])/(nb_rb*nre) + 
@@ -1642,6 +2266,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
                                         unsigned int *rb_alloc,
                                         unsigned char symbol,
                                         unsigned char subframe,
+					uint32_t high_speed_flag,
                                         LTE_DL_FRAME_PARMS *frame_parms) {
 
 
@@ -1672,16 +2297,16 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
     poffset=3;
 
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
-    
-    dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+
+    if (high_speed_flag == 1)
+      dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+    else
+      dl_ch0     = &dl_ch_estimates[aarx][5];
     dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
 
     rxF_ext   = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
-#ifndef NEW_FFT   
-    rxF       = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
     rxF       = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))];
-#endif   
+
     if ((frame_parms->N_RB_DL&1) == 0)  // even number of RBs
       for (rb=0;rb<frame_parms->N_RB_DL;rb++) {
 	
@@ -1698,11 +2323,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	
 	// For second half of RBs skip DC carrier
 	if (rb==(frame_parms->N_RB_DL>>1)) {
-#ifndef NEW_FFT
-	  rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	  rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
 	  //dl_ch0++; 
 	}
 	
@@ -1710,20 +2331,17 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	  *pmi_ext = (pmi>>((rb>>2)<<1))&3;
 	  memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
 	  /*	  	  
-		  printf("rb %d\n",rb);
-		  for (i=0;i<12;i++)
-		  printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]);
-		  printf("\n");
+			  printf("rb %d\n",rb);
+			  for (i=0;i<12;i++)
+			  printf("(%d %d)",((short *)dl_ch0)[i<<1],((short*)dl_ch0)[1+(i<<1)]);
+			  printf("\n");
 	  */
 	  if (pilots==0) {
 	    for (i=0;i<12;i++) {
-#ifndef NEW_FFT
-	      rxF_ext[i]=rxF[i<<1];
-#else
 	      rxF_ext[i]=rxF[i];
-#endif	     /* 
-	      printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),
-	      ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/
+	      /* 
+		 printf("%d : (%d,%d)\n",(rxF+i-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))]),
+		 ((short*)&rxF[i])[0],((short*)&rxF[i])[1]);*/
 	    }
 	    dl_ch0_ext+=12;
 	    rxF_ext+=12;
@@ -1733,11 +2351,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    for (i=0;i<12;i++) {
 	      if ((i!=(frame_parms->nushift+poffset)) &&
 		  (i!=((frame_parms->nushift+poffset+6)%12))) {
-#ifndef NEW_FFT
-		rxF_ext[j]=rxF[i<<1];
-#else
 		rxF_ext[j]=rxF[i];
-#endif
 		//		  		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		dl_ch0_ext[j++]=dl_ch0[i];
 		
@@ -1749,11 +2363,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	  nb_rb++;
 	}
 	dl_ch0+=12;
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
 
       }
     else {  // Odd number of RBs
@@ -1836,33 +2446,21 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    if (skip_half==1) {
 	      memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
 		rxF_ext[i]=rxF[i];
-#endif
 	      dl_ch0_ext+=6;
 	      rxF_ext+=6;
 	    }
 	    else if (skip_half==2) {
 	      memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[(i+6)<<1];
-#else
 		rxF_ext[i]=rxF[(i+6)];
-#endif
 	      dl_ch0_ext+=6;
 	      rxF_ext+=6;
 	    }
 	    else {
 	      memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
 	      for (i=0;i<12;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
 		rxF_ext[i]=rxF[i];
-#endif
 	      dl_ch0_ext+=12;
 	      rxF_ext+=12;
 	    }
@@ -1873,11 +2471,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    if (skip_half==1) {
 	      for (i=0;i<6;i++) {
 		if (i!=((frame_parms->nushift+poffset)%6)) {
-#ifdef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //		  		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j++]=dl_ch0[i];
 		}
@@ -1888,11 +2482,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    else if (skip_half==2) {
 	      for (i=0;i<6;i++) {
 		if (i!=((frame_parms->nushift+poffset)%6)) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[(i+6)<<1];
-#else
 		  rxF_ext[j]=rxF[(i+6)];
-#endif
 		  //		  		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j++]=dl_ch0[i+6];
 		}
@@ -1904,11 +2494,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	      for (i=0;i<12;i++) {
 		if ((i!=(frame_parms->nushift+poffset)) &&
 		    (i!=((frame_parms->nushift+poffset+6)%12))) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //		  		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j++]=dl_ch0[i];
 		  
@@ -1920,11 +2506,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	  }
 	}	    
 	dl_ch0+=12;
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
       } // first half loop
 
 
@@ -1971,24 +2553,12 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	if (pilots==0) {
 	  for (i=0;i<6;i++) {
 	    dl_ch0_ext[i]=dl_ch0[i];
-#ifndef NEW_FFT
-	    rxF_ext[i]=rxF[i<<1];
-#else
 	    rxF_ext[i]=rxF[i];
-#endif
 	  }
-#ifndef NEW_FFT
-	  rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	  rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
 	  for (;i<12;i++) {
 	    dl_ch0_ext[i]=dl_ch0[i];
-#ifndef NEW_FFT
-	    rxF_ext[i]=rxF[(1+i-6)<<1];
-#else
 	    rxF_ext[i]=rxF[(1+i-6)];
-#endif
 	  }
 	  dl_ch0_ext+=12;
 	  rxF_ext+=12;
@@ -1998,27 +2568,15 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	  for (i=0;i<6;i++) {
 	    if (i!=((frame_parms->nushift+poffset)%6)) {
 	      dl_ch0_ext[j]=dl_ch0[i];
-#ifndef NEW_FFT
-	      rxF_ext[j++]=rxF[i<<1];
-#else
 	      rxF_ext[j++]=rxF[i];
-#endif
 	      //	           	      printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
 	    }
 	  }
-#ifndef NEW_FFT
-	  rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	  rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
 	  for (;i<12;i++) {
 	    if (i!=((frame_parms->nushift+6+poffset)%12)) {
 	      dl_ch0_ext[j]=dl_ch0[i];
-#ifndef NEW_FFT
-	      rxF_ext[j++]=rxF[(1+i-6)<<1];
-#else
 	      rxF_ext[j++]=rxF[(1+i-6)];
-#endif
 	      //	            	      printf("**extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
 	    }
 	  }
@@ -2027,18 +2585,10 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	} // symbol_mod==0
       } // rballoc==1
       else {
-#ifndef NEW_FFT
-	rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
       }
       dl_ch0+=12;
-#ifndef NEW_FFT
-      rxF+=14;
-#else
       rxF+=7;
-#endif
       rb++;
       
       for (;rb<frame_parms->N_RB_DL;rb++) {
@@ -2113,11 +2663,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    if (skip_half==1) {
 	      memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
-	      rxF_ext[i]=rxF[i];
-#endif
+		rxF_ext[i]=rxF[i];
 	      dl_ch0_ext+=6;
 	      rxF_ext+=6;
 
@@ -2125,11 +2671,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    else if (skip_half==2) {
 	      memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[(i+6)<<1];
-#else
-	      rxF_ext[i]=rxF[(i+6)];
-#endif
+		rxF_ext[i]=rxF[(i+6)];
 	      dl_ch0_ext+=6;
 	      rxF_ext+=6;
 
@@ -2137,11 +2679,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    else {
 	      memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
 	      for (i=0;i<12;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
-	      rxF_ext[i]=rxF[i];
-#endif
+		rxF_ext[i]=rxF[i];
 	      dl_ch0_ext+=12;
 	      rxF_ext+=12;
 	    }
@@ -2152,11 +2690,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    if (skip_half==1) {
 	      for (i=0;i<6;i++) {
 		if (i!=((frame_parms->nushift+poffset)%6)) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j++]=dl_ch0[i];
 		}
@@ -2167,11 +2701,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	    else if (skip_half==2) {
 	      for (i=0;i<6;i++) {
 		if (i!=((frame_parms->nushift+poffset)%6)) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[(i+6)<<1];
-#else
 		  rxF_ext[j]=rxF[(i+6)];
-#endif
 		  //		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j++]=dl_ch0[i+6];
 		}
@@ -2183,11 +2713,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	      for (i=0;i<12;i++) {
 		if ((i!=(frame_parms->nushift+poffset)) &&
 		    (i!=((frame_parms->nushift+poffset+6)%12))) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //		  printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j++]=dl_ch0[i];
 		}
@@ -2198,12 +2724,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
 	  } // pilots=0
 	}
 	dl_ch0+=12;
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
-
       }
     }
   }
@@ -2223,6 +2744,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
                                       unsigned int *rb_alloc,
                                       unsigned char symbol,
                                       unsigned char subframe,
+				      uint32_t high_speed_flag,
                                       LTE_DL_FRAME_PARMS *frame_parms) {
     
 
@@ -2251,20 +2773,21 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
   }
 
   for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++) {
-    
-    dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+
+    if (high_speed_flag==1) {
+      dl_ch0     = &dl_ch_estimates[aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+      dl_ch1     = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
+    }
+    else {
+      dl_ch0     = &dl_ch_estimates[aarx][5];
+      dl_ch1     = &dl_ch_estimates[2+aarx][5];
+    }
     dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
-    dl_ch1     = &dl_ch_estimates[2+aarx][5+(symbol*(frame_parms->ofdm_symbol_size))];
     dl_ch1_ext = &dl_ch_estimates_ext[2+aarx][symbol*(frame_parms->N_RB_DL*12)];
     pmi_loc = pmi_ext;
 
     rxF_ext   = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
-
-#ifndef NEW_FFT    
-    rxF       = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
     rxF       = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
 
     if ((frame_parms->N_RB_DL&1) == 0)  // even number of RBs
       for (rb=0;rb<frame_parms->N_RB_DL;rb++) {
@@ -2282,11 +2805,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	
 	// For second half of RBs skip DC carrier
 	if (rb==(frame_parms->N_RB_DL>>1)) {
-#ifndef NEW_FFT
-	  rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	  rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
 	  //dl_ch0++;
 	  //dl_ch1++;
 	}
@@ -2361,11 +2880,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      printf("\n");*/
 	    
 	    for (i=0;i<12;i++) {
-#ifndef NEW_FFT
-	      rxF_ext[i]=rxF[i<<1];
-#else
 	      rxF_ext[i]=rxF[i];
-#endif
 	      //	      printf("%d : (%d,%d)\n",(rxF+(2*i)-&rxdataF[(aatx<<1)+aarx][( (symbol*(frame_parms->ofdm_symbol_size)))*2])/2,
 	      //     ((short*)&rxF[i<<1])[0],((short*)&rxF[i<<1])[0]);
 	    }
@@ -2381,11 +2896,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		  (i!=frame_parms->nushift+3) &&
 		  (i!=frame_parms->nushift+6) &&
 		  (i!=((frame_parms->nushift+9)%12))) {
-#ifndef NEW_FFT
-		rxF_ext[j]=rxF[i<<1];
-#else
 		rxF_ext[j]=rxF[i];
-#endif
 		//	      printf("extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		dl_ch0_ext[j]=dl_ch0[i];
 		dl_ch1_ext[j++]=dl_ch1[i];
@@ -2399,12 +2910,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	}
 	dl_ch0+=12;
 	dl_ch1+=12;
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
-
       }
     else {  // Odd number of RBs
       for (rb=0;rb<frame_parms->N_RB_DL>>1;rb++) {
@@ -2484,11 +2990,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
 	      memcpy(dl_ch1_ext,dl_ch1,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
-	      rxF_ext[i]=rxF[i];
-#endif
+		rxF_ext[i]=rxF[i];
 	      dl_ch0_ext+=6;
 	      dl_ch1_ext+=6;
 	      rxF_ext+=6;
@@ -2497,11 +2999,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
 	      memcpy(dl_ch1_ext,dl_ch1+6,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[(i+6)<<1];
-#else
-	      rxF_ext[i]=rxF[(i+6)];
-#endif
+		rxF_ext[i]=rxF[(i+6)];
 	      dl_ch0_ext+=6;
 	      dl_ch1_ext+=6;
 	      rxF_ext+=6;
@@ -2510,11 +3008,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
 	      memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
 	      for (i=0;i<12;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
-	      rxF_ext[i]=rxF[i];
-#endif
+		rxF_ext[i]=rxF[i];
 	      dl_ch0_ext+=12;
 	      dl_ch1_ext+=12;
 	      rxF_ext+=12;
@@ -2526,11 +3020,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      for (i=0;i<6;i++) {
  		if ((i!=frame_parms->nushift) &&
 		    (i!=((frame_parms->nushift+3)%6))) {
-#ifndef NEW_FFT		  
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //	  printf("(pilots,skip1)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j]=dl_ch0[i];
 		  dl_ch1_ext[j++]=dl_ch1[i];
@@ -2544,11 +3034,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      for (i=0;i<6;i++) {
  		if ((i!=frame_parms->nushift) &&
 		    (i!=((frame_parms->nushift+3)%6))) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[(i+6)<<1];
-#else
 		  rxF_ext[j]=rxF[(i+6)];
-#endif
 		  //	      printf("(pilots,skip2)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j]=dl_ch0[i+6];
 		  dl_ch1_ext[j++]=dl_ch1[i+6];
@@ -2565,11 +3051,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		    (i!=frame_parms->nushift+3) &&
 		    (i!=frame_parms->nushift+6) &&
 		    (i!=((frame_parms->nushift+9)%12))) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //	  printf("(pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  
 		  dl_ch0_ext[j]  =dl_ch0[i];
@@ -2589,11 +3071,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
       
 	dl_ch0+=12;
 	dl_ch1+=12;
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
       }
     
     
@@ -2647,25 +3125,13 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	  for (i=0;i<6;i++) {
 	    dl_ch0_ext[i]=dl_ch0[i];
 	    dl_ch1_ext[i]=dl_ch1[i];
-#ifndef NEW_FFT
-	    rxF_ext[i]=rxF[i<<1];
-#else
 	    rxF_ext[i]=rxF[i];
-#endif
 	  }
-#ifndef NEW_FFT
-	  rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	  rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
 	  for (;i<12;i++) {
 	    dl_ch0_ext[i]=dl_ch0[i];
 	    dl_ch1_ext[i]=dl_ch1[i];
-#ifndef NEW_FFT
-	    rxF_ext[i]=rxF[(1+i-6)<<1];
-#else
 	    rxF_ext[i]=rxF[(1+i-6)];
-#endif
 	  }
 	  dl_ch0_ext+=12;
 	  dl_ch1_ext+=12;
@@ -2678,55 +3144,34 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		(i!=((frame_parms->nushift+3)%6))){
 	      dl_ch0_ext[j]=dl_ch0[i];
 	      dl_ch1_ext[j]=dl_ch1[i];
-#ifndef NEW_FFT
-	      rxF_ext[j++]=rxF[i<<1];
-#else
 	      rxF_ext[j++]=rxF[i];
-#endif
 	      //     	      printf("(pilots center)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
 	      //	      printf("extract rb %d, re %d => ch0 (%d,%d) ch1 (%d,%d)\n",rb,i,
 	      //		     *(short *)&dl_ch0_ext[j-1],*(1+(short*)&dl_ch0_ext[j-1]),
 	      //		     *(short *)&dl_ch1_ext[j-1],*(1+(short*)&dl_ch1_ext[j-1]));
 	    }
-      }
-#ifndef NEW_FFT
-	    rxF       = &rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)*2];
-#else
-	    rxF       = &rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)];
-#endif
-
-	    for (;i<12;i++) {
-	      if ((i!=((frame_parms->nushift+6)%12)) &&
-		  (i!=((frame_parms->nushift+9)%12))){
-		dl_ch0_ext[j]=dl_ch0[i];
-		dl_ch1_ext[j]=dl_ch1[i];
-#ifndef NEW_FFT
-		rxF_ext[j++]=rxF[(1+i-6)<<1];
-#else
-		rxF_ext[j++]=rxF[(1+i-6)];
-#endif
-		//     	      printf("(pilots center )extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j-1],*(1+(short*)&rxF_ext[j-1]));
-	      }
+	  }
+	  rxF       = &rxdataF[aarx][symbol*(frame_parms->ofdm_symbol_size)];
+	  
+	  for (;i<12;i++) {
+	    if ((i!=((frame_parms->nushift+6)%12)) &&
+		(i!=((frame_parms->nushift+9)%12))){
+	      dl_ch0_ext[j]=dl_ch0[i];
+	      dl_ch1_ext[j]=dl_ch1[i];
+	      rxF_ext[j++]=rxF[(1+i-6)];
 	    }
-	    dl_ch0_ext+=8;
-	    dl_ch1_ext+=8;
-	    rxF_ext+=8; 
 	  }
+	  dl_ch0_ext+=8;
+	  dl_ch1_ext+=8;
+	  rxF_ext+=8; 
+	}
       }
       else {
-#ifndef NEW_FFT
-	rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
       }
       dl_ch0+=12;
       dl_ch1+=12;
-#ifndef NEW_FFT
-      rxF+=14;
-#else
       rxF+=7;
-#endif
       rb++;
       
       for (;rb<frame_parms->N_RB_DL;rb++) {
@@ -2806,11 +3251,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
 	      memcpy(dl_ch1_ext,dl_ch1,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
-	      rxF_ext[i]=rxF[i];
-#endif
+		rxF_ext[i]=rxF[i];
 	      dl_ch0_ext+=6;
 	      dl_ch1_ext+=6;
 	      rxF_ext+=6;
@@ -2820,11 +3261,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0+6,6*sizeof(int));
 	      memcpy(dl_ch1_ext,dl_ch1+6,6*sizeof(int));
 	      for (i=0;i<6;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[(i+6)<<1];
-#else
-	      rxF_ext[i]=rxF[(i+6)];
-#endif
+		rxF_ext[i]=rxF[(i+6)];
 	      dl_ch0_ext+=6;
 	      dl_ch1_ext+=6;
 	      rxF_ext+=6;
@@ -2834,11 +3271,8 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
 	      memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
 	      for (i=0;i<12;i++)
-#ifndef NEW_FFT
-		rxF_ext[i]=rxF[i<<1];
-#else
-	      rxF_ext[i]=rxF[i];
-#endif
+		rxF_ext[i]=rxF[i];
+
 	      dl_ch0_ext+=12;
 	      dl_ch1_ext+=12;
 	      rxF_ext+=12;
@@ -2850,11 +3284,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      for (i=0;i<6;i++) {
 		if ((i!=(frame_parms->nushift)) &&
 		    (i!=((frame_parms->nushift+3)%6))){
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //  		  printf("(skip1,pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j]=dl_ch0[i];
 		  dl_ch1_ext[j++]=dl_ch1[i];
@@ -2868,11 +3298,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	      for (i=0;i<6;i++) {
 		if ((i!=(frame_parms->nushift))  &&
 		    (i!=((frame_parms->nushift+3)%6))){
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[(i+6)<<1];
-#else
 		  rxF_ext[j]=rxF[(i+6)];
-#endif
 		  //  		  printf("(skip2,pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j]=dl_ch0[i+6];
 		  dl_ch1_ext[j++]=dl_ch1[i+6];
@@ -2888,11 +3314,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 		    (i!=frame_parms->nushift+3) &&
 		    (i!=frame_parms->nushift+6) &&
 		    (i!=((frame_parms->nushift+9)%12))) {
-#ifndef NEW_FFT
-		  rxF_ext[j]=rxF[i<<1];
-#else
 		  rxF_ext[j]=rxF[i];
-#endif
 		  //	printf("(pilots)extract rb %d, re %d => (%d,%d)\n",rb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
 		  dl_ch0_ext[j]=dl_ch0[i];
 		  dl_ch1_ext[j++]=dl_ch1[i];
@@ -2910,11 +3332,7 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 	}
 	dl_ch0+=12;
 	dl_ch1+=12;
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
       }
     }
   }
@@ -2941,27 +3359,59 @@ void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per
   sprintf(fname,"dlsch%d_rxF_ext0.m",eNB_id);
   sprintf(vname,"dl%d_rxF_ext0",eNB_id);
   write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[0],12*N_RB_DL*nsymb,1,1);
+  if (phy_vars_ue->lte_frame_parms.nb_antennas_rx >1) {
+    sprintf(fname,"dlsch%d_rxF_ext1.m",eNB_id);
+    sprintf(vname,"dl%d_rxF_ext1",eNB_id);
+    write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_ext[1],12*N_RB_DL*nsymb,1,1);
+  }
   sprintf(fname,"dlsch%d_ch_ext00.m",eNB_id);
   sprintf(vname,"dl%d_ch_ext00",eNB_id);
   write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[0],12*N_RB_DL*nsymb,1,1);
+  if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) {
+    sprintf(fname,"dlsch%d_ch_ext01.m",eNB_id);
+    sprintf(vname,"dl%d_ch_ext01",eNB_id);
+    write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
+  }
+  if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) {
+    sprintf(fname,"dlsch%d_ch_ext10.m",eNB_id);
+    sprintf(vname,"dl%d_ch_ext10",eNB_id);
+    write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
+    if (phy_vars_ue->lte_frame_parms.nb_antennas_rx == 2) {
+      sprintf(fname,"dlsch%d_ch_ext11.m",eNB_id);
+      sprintf(vname,"dl%d_ch_ext11",eNB_id);
+      write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
+  }
+  }
   /*
     write_output("dlsch%d_ch_ext01.m","dl01_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[1],12*N_RB_DL*nsymb,1,1);
     write_output("dlsch%d_ch_ext10.m","dl10_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[2],12*N_RB_DL*nsymb,1,1);
     write_output("dlsch%d_ch_ext11.m","dl11_ch0_ext",lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext[3],12*N_RB_DL*nsymb,1,1);
-    write_output("dlsch%d_rho.m","dl_rho",lte_ue_pdsch_vars[eNB_id]->rho[0],12*N_RB_DL*nsymb,1,1);
   */
+  sprintf(fname,"dlsch%d_rho.m",eNB_id);
+  sprintf(vname,"dl_rho%d",eNB_id);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_rho_ext[0],12*N_RB_DL*nsymb,1,1);
+
   sprintf(fname,"dlsch%d_rxF_comp0.m",eNB_id);
   sprintf(vname,"dl%d_rxF_comp0",eNB_id);
-  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0],12*N_RB_DL*nsymb,1,1);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb,1,1);
+
+  if (phy_vars_ue->lte_frame_parms.nb_antennas_tx_eNB == 2) {
+    sprintf(fname,"dlsch%d_rxF_comp1.m",eNB_id);
+    sprintf(vname,"dl%d_rxF_comp1",eNB_id);
+    write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[0],12*N_RB_DL*nsymb,1,1);
+  }
+
   sprintf(fname,"dlsch%d_rxF_llr.m",eNB_id);
   sprintf(vname,"dl%d_llr",eNB_id);
   write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],coded_bits_per_codeword,1,0);
   sprintf(fname,"dlsch%d_mag1.m",eNB_id);
   sprintf(vname,"dl%d_mag1",eNB_id);
-  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag[0],12*N_RB_DL*nsymb,1,1);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb,1,1);
   sprintf(fname,"dlsch%d_mag2.m",eNB_id);
   sprintf(vname,"dl%d_mag2",eNB_id);
-  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb[0],12*N_RB_DL*nsymb,1,1);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb,1,1);
+
+  printf("log2_maxh = %d\n",phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->log2_maxh);
 }
 #endif
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
index 8dfc3ad4e032978c7b85f3d8c353e57b158d9a9e..ba83156742309f1f02b79b7c23ab539d19491aaf 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_llr_computation.c
@@ -1063,7 +1063,7 @@ length = number of resource elements
     
         xmm0 = _mm_xor_si128(xmm0,xmm0); // ZERO
     
-        // 1 term for nominator of LLR
+        // 1 term for numerator of LLR
         xmm3 = _mm_subs_epi16(y1r_over2,rho_rpi);
         A = _mm_abs_epi16(xmm3); // A = |y1r/2 - rho/sqrt(8)|
         xmm2 = _mm_adds_epi16(A,y0i_over2); // = |y1r/2 - rho/sqrt(8)| + y0i/2
@@ -1071,7 +1071,7 @@ length = number of resource elements
         B = _mm_abs_epi16(xmm3); // B = |y1i/2 - rho*/sqrt(8)|
         logmax_num_re0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2
 
-        // 2 term for nominator of LLR        
+        // 2 term for numerator of LLR        
         xmm3 = _mm_subs_epi16(y1r_over2,rho_rmi); 
         C = _mm_abs_epi16(xmm3); // C = |y1r/2 - rho*/4|
         xmm2 = _mm_subs_epi16(C,y0i_over2); // = |y1r/2 - rho*/4| - y0i/2
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
index 0375f277953ec3786066cf5aa07b4112a3b5613a..12271d13f1677ea73589fa8b68e68ad1168d8be7 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c
@@ -131,25 +131,39 @@ void layer1prec2A(int32_t *antenna0_sample, int32_t *antenna1_sample, uint8_t pr
   ((int16_t *)antenna1_sample)[1] = (int16_t)((((int16_t *)antenna1_sample)[1]*ONE_OVER_SQRT2_Q15)>>15);  */
 } 
 
-int allocate_REs_in_RB(mod_sym_t **txdataF,
+int allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
+		       mod_sym_t **txdataF,
 		       uint32_t *jj,
+		       uint32_t *jj2,
 		       uint16_t re_offset,
 		       uint32_t symbol_offset,
-		       uint8_t *output,
-		       MIMO_mode_t mimo_mode,
-		       uint8_t nu,
+		       LTE_DL_eNB_HARQ_t *dlsch0_harq,
+		       LTE_DL_eNB_HARQ_t *dlsch1_harq,
 		       uint8_t pilots,
-		       uint8_t mod_order,
-		       uint8_t precoder_index,
 		       int16_t amp,
-		       int16_t *qam_table_s,
+		       uint8_t precoder_index,
+		       int16_t *qam_table_s0,
+		       int16_t *qam_table_s1,
 		       uint32_t *re_allocated,
 		       uint8_t skip_dc,
-		       uint8_t skip_half,
-		       uint8_t use2ndpilots,
-		       uint8_t Nlayers,
-		       uint8_t first_layer,
-		       LTE_DL_FRAME_PARMS *frame_parms) {
+		       uint8_t skip_half) {
+
+
+  uint8_t *x0             = dlsch0_harq->e;
+  MIMO_mode_t mimo_mode   = dlsch0_harq->mimo_mode;
+
+  int first_layer0        = dlsch0_harq->first_layer;
+  int Nlayers0            = dlsch0_harq->Nlayers; 
+  uint8_t mod_order0      = get_Qm(dlsch0_harq->mcs);
+
+
+  uint8_t *x1;
+  int Nlayers1;
+  int first_layer1;
+  uint8_t mod_order1;
+
+
+  int use2ndpilots = (frame_parms->mode1_flag==1)?1:0;
 
   uint32_t tti_offset,aa;
   uint8_t re;
@@ -157,13 +171,36 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
   uint8_t qam64_table_offset_im = 0;
   uint8_t qam16_table_offset_re = 0;
   uint8_t qam16_table_offset_im = 0;
+  uint8_t qam64_table_offset_re0 = 0;
+  uint8_t qam64_table_offset_im0 = 0;
+  uint8_t qam16_table_offset_re0 = 0;
+  uint8_t qam16_table_offset_im0 = 0;
+  uint8_t qam64_table_offset_re1 = 0;
+  uint8_t qam64_table_offset_im1 = 0;
+  uint8_t qam16_table_offset_re1 = 0;
+  uint8_t qam16_table_offset_im1 = 0;
+  int16_t xx0_re,xx1_re;
+  int16_t xx0_im,xx1_im;
+
   int16_t gain_lin_QPSK;//,gain_lin_16QAM1,gain_lin_16QAM2;
   int16_t re_off=re_offset;
-  gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15);  
+
   uint8_t first_re,last_re;
   int32_t tmp_sample1,tmp_sample2;
   int16_t tmp_amp=amp;
   uint8_t layer;
+  int s=1;
+
+  gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15);
+  //  if (mimo_mode == LARGE_CDD) gain_lin_QPSK>>=1;
+
+  if (dlsch1_harq) {
+    x1             = dlsch1_harq->e;
+    Nlayers1       = dlsch1_harq->Nlayers; 
+    first_layer1   = dlsch1_harq->first_layer;
+    mod_order1     = get_Qm(dlsch1_harq->mcs);
+
+  }
   /*
   switch (mod_order) {
   case 2:
@@ -186,7 +223,7 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 */
 
 #ifdef DEBUG_DLSCH_MODULATION
-  printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d, nu %d\n",mod_order,symbol_offset,re_offset,skip_dc,skip_half,*jj, output[*jj], output[1+*jj],nu);
+  printf("allocate_re (mod %d): symbol_offset %d re_offset %d (%d,%d), jj %d -> %d,%d\n",mod_order0,symbol_offset,re_offset,skip_dc,skip_half,*jj, x0[*jj], x0[1+*jj]);
 #endif
 
   first_re=0;
@@ -198,7 +235,8 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
     first_re=6;
   
   for (re=first_re;re<last_re;re++) {
-    
+
+
     if ((skip_dc == 1) && (re==6))
       re_off=re_off - frame_parms->ofdm_symbol_size+1;
     
@@ -212,15 +250,15 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
       
       if (mimo_mode == SISO) {  //SISO mapping
 	*re_allocated = *re_allocated + 1;	
-	switch (mod_order) {
+	switch (mod_order0) {
 	case 2:  //QPSK
-	  //	  printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+	  //printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
 	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-	    ((int16_t*)&txdataF[aa][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
+	    ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
 	  }
 	  *jj = *jj + 1;
 	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-	    ((int16_t*)&txdataF[aa][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
+	    ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
 	  }
 	  *jj = *jj + 1;
 	  
@@ -231,24 +269,24 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  
 	  qam16_table_offset_re = 0;
 	  qam16_table_offset_im = 0;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=2;
 	  *jj=*jj+1;
 	  
 	  
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
 	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-	    ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam16_table_offset_re];
-	    ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam16_table_offset_im];
+	    ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam16_table_offset_re];
+	    ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam16_table_offset_im];
 	    //	    ((int16_t *)&txdataF[aa][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
 	    //	    ((int16_t *)&txdataF[aa][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
 	  }
@@ -261,28 +299,28 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  qam64_table_offset_re = 0;
 	  qam64_table_offset_im = 0;
 	  
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
 	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-	    ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
-	    ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
+	    ((int16_t *)&txdataF[aa][tti_offset])[0]+=qam_table_s0[qam64_table_offset_re];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
+	    ((int16_t *)&txdataF[aa][tti_offset])[1]+=qam_table_s0[qam64_table_offset_im];//(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
 	  }
 	  break;
 	  
@@ -294,29 +332,29 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
           // normalization for 2 tx antennas
 	amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15);
 
-	switch (mod_order) {
+	switch (mod_order0) {
 	case 2:  //QPSK
 	  
 	  // first antenna position n -> x0
 	  
-	  ((int16_t*)&tmp_sample1)[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	  ((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
 	  *jj=*jj+1;
-	  ((int16_t*)&tmp_sample1)[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	  ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
 	  *jj=*jj+1;
 	  
 	  // second antenna position n -> -x1*
 	  
-	  ((int16_t*)&tmp_sample2)[0] = (output[*jj]==1) ? (gain_lin_QPSK) : -gain_lin_QPSK;
+	  ((int16_t*)&tmp_sample2)[0] = (x0[*jj]==1) ? (gain_lin_QPSK) : -gain_lin_QPSK;
 	  *jj=*jj+1;
-	  ((int16_t*)&tmp_sample2)[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	  ((int16_t*)&tmp_sample2)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
 	  *jj=*jj+1;
 	  
       // normalization for 2 tx antennas
-      ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15);
+	  ((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15);
 	  ((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15);
-      ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
-      ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
-
+	  ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
+	  ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
+	  
 	  break;
 	  
 	case 4:  //16QAM
@@ -325,18 +363,18 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  
 	  qam16_table_offset_re = 0;
 	  qam16_table_offset_im = 0;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=2;
 	  *jj=*jj+1;
 	  
 	  
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
@@ -347,18 +385,18 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  
 	  qam16_table_offset_re = 0;
 	  qam16_table_offset_im = 0;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=2;
 	  *jj=*jj+1;
 	  
 	  
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
@@ -373,22 +411,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  qam64_table_offset_re = 0;
 	  qam64_table_offset_im = 0;
 
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
@@ -399,22 +437,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  // Antenna 1 => -x1*
 	  qam64_table_offset_re = 0;
 	  qam64_table_offset_im = 0;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
@@ -437,84 +475,181 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  ((int16_t *)&txdataF[1][tti_offset+2])[1] += -((int16_t *)&txdataF[0][tti_offset])[1];
 	}
       }
-      else if (mimo_mode == ANTCYCLING ) {
-	*re_allocated = *re_allocated + 1;	
-	switch (mod_order) {
-	case 2:  //QPSK
-	  
-	  ((int16_t*)&txdataF[re&1][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
-	  *jj = *jj + 1;
-	  ((int16_t*)&txdataF[re&1][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
-	  *jj = *jj + 1;
-	  break;
-	  
-	case 4:  //16QAM
-	  
-	  qam16_table_offset_re = 0;
-	  qam16_table_offset_im = 0;
+      else if (mimo_mode == LARGE_CDD) {
 
-	  if (output[*jj] == 1)
-	    qam16_table_offset_re+=2;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam16_table_offset_im+=2;
-	  *jj=*jj+1;
-	  
-	  
-	  if (output[*jj] == 1)
-	    qam16_table_offset_re+=1;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam16_table_offset_im+=1;
-	  *jj=*jj+1;
-	  
-	  ((int16_t *)&txdataF[re&1][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
-	  ((int16_t *)&txdataF[re&1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
-	  
-	  
-	  break;
-	  
-	case 6:  //64QAM
-	  
-	  qam64_table_offset_re = 0;
-	  qam64_table_offset_im = 0;
+	*re_allocated = *re_allocated + 1;
 
-	  if (output[*jj] == 1)
-	    qam64_table_offset_re+=4;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam64_table_offset_im+=4;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam64_table_offset_re+=2;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam64_table_offset_im+=2;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam64_table_offset_re+=1;
-	  *jj=*jj+1;
-	  if (output[*jj] == 1)
-	    qam64_table_offset_im+=1;
-	  *jj=*jj+1;
-	  
-	  ((int16_t *)&txdataF[re&1][tti_offset])[0]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_re])>>15);
-	  ((int16_t *)&txdataF[re&1][tti_offset])[1]+=(int16_t)(((int32_t)amp*qam64_table[qam64_table_offset_im])>>15);
-	  
+	if (frame_parms->nb_antennas_tx == 2) {
+	  switch (mod_order0) {
+	  default:
+	    LOG_E(PHY,"Unknown mod_order0 %d\n",mod_order0);
+	    xx0_re=xx0_im=0;
+	    break;
+	  case 2:  //QPSK
+	    //	  printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+	    xx0_re = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	    *jj = *jj + 1;
+	    xx0_im = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	    *jj = *jj + 1;
+	    
+
+
+	    // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+	    break;
+	    
+	  case 4:  //16QAM
+	    
+	    qam16_table_offset_re0 = 0;
+	    qam16_table_offset_im0 = 0;
+	    if (x0[*jj] == 1)
+	      qam16_table_offset_re0+=2;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam16_table_offset_im0+=2;
+	    *jj=*jj+1;
+	    
+	    if (x0[*jj] == 1)
+	      qam16_table_offset_re0+=1;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam16_table_offset_im0+=1;
+	    *jj=*jj+1;
+	    
+	    xx0_re = qam_table_s0[qam16_table_offset_re0];
+	    xx0_im = qam_table_s0[qam16_table_offset_im0];
+
+	    break;
+	    
+	  case 6:  //64QAM
+	    
+	    
+	    qam64_table_offset_re0 = 0;
+	    qam64_table_offset_im0 = 0;
+	    
+	    if (x0[*jj] == 1)
+	      qam64_table_offset_re0+=4;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam64_table_offset_im0+=4;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam64_table_offset_re0+=2;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam64_table_offset_im0+=2;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam64_table_offset_re0+=1;
+	    *jj=*jj+1;
+	    if (x0[*jj] == 1)
+	      qam64_table_offset_im0+=1;
+	    *jj=*jj+1;
+
+	    xx0_re = qam_table_s0[qam16_table_offset_re0];
+	    xx0_im = qam_table_s0[qam16_table_offset_im0];
+
+
+	    break;
+	    
+	  }
+	  switch (mod_order1) {
+	  default:
+	    LOG_E(PHY,"Unknown mod_order1 %d\n",mod_order1);
+	    xx1_re=xx1_im=0;
+	    break;
+	  case 2:  //QPSK
+	    //	  printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+	    xx1_re = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; 
+	    *jj2 = *jj2 + 1;
+	    xx1_im = (x1[*jj2]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; 
+	    *jj2 = *jj2 + 1;
+	    // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+	    break;
+	    
+	  case 4:  //16QAM
+	    
+	    qam16_table_offset_re1 = 0;
+	    qam16_table_offset_im1 = 0;
+	    if (x1[*jj2] == 1)
+	      qam16_table_offset_re1+=2;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam16_table_offset_im1+=2;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam16_table_offset_re1+=1;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam16_table_offset_im1+=1;
+	    *jj2 = *jj2 + 1;
+
+	    xx1_re = qam_table_s1[qam16_table_offset_re1];
+	    xx1_im = qam_table_s1[qam16_table_offset_im1];
+
+	    break;
+	    
+	  case 6:  //64QAM
+	    
+	    qam64_table_offset_re1 = 0;
+	    qam64_table_offset_im1 = 0;
+	    
+	    if (x1[*jj2] == 1)
+	      qam64_table_offset_re0+=4;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam64_table_offset_im1+=4;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam64_table_offset_re1+=2;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam64_table_offset_im1+=2;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam64_table_offset_re1+=1;
+	    *jj2 = *jj2 + 1;
+	    if (x1[*jj2] == 1)
+	      qam64_table_offset_im1+=1;
+	    *jj2 = *jj2 + 1;
+
+	    xx1_re = qam_table_s1[qam16_table_offset_re1];
+	    xx1_im = qam_table_s1[qam16_table_offset_im1];
+
+
+	    break;
+	    
+	  }
+
+	  // This implements the Large CDD precoding for 2 TX antennas
+	  // -  -        -    -  -         -  -     -  -  -       -              -
+	  //| y0 |      | 1  0 || 1    0    || 1   1 || x0 |     |        x0 + x1 |
+	  //| y1 | = .5 | 0  1 || 0  (-1)^i || 1  -1 || x1 | = .5| (-1)^i(x0 - x1)|
+	  // -  -        -    -  -         -  -     -  -  -       - 
+	  // Note: Factor .5 is accounted for in amplitude when calling this function
+	  ((int16_t *)&txdataF[0][tti_offset])[0]+=((xx0_re+xx1_re)>>1);
+	  ((int16_t *)&txdataF[1][tti_offset])[0]+=(s*((xx0_re-xx1_re)>>1));
+	  ((int16_t *)&txdataF[0][tti_offset])[1]+=((xx0_im+xx1_im)>>1);
+	  ((int16_t *)&txdataF[1][tti_offset])[1]+=(s*((xx0_im-xx1_im)>>1));
+	  /*
+	  printf("CDD: xx0 (%d,%d), xx1(%d,%d), s(%d), txF[0] (%d,%d), txF[1] (%d,%d)\n",
+		 xx0_re,xx0_im,xx1_re,xx1_im, s, ((int16_t *)&txdataF[0][tti_offset])[0],((int16_t *)&txdataF[0][tti_offset])[1],
+		 ((int16_t *)&txdataF[1][tti_offset])[0],((int16_t *)&txdataF[1][tti_offset])[1]);
+	  */
+	  // s alternates +1/-1 for each RE
+	  s = -s;
 	}
       }
-       
       else if ((mimo_mode >= UNIFORM_PRECODING11)&&(mimo_mode <= PUSCH_PRECODING1)) {
 	// this is for transmission modes 4-6 (1 layer)
 	*re_allocated = *re_allocated + 1;	         
 	amp = (int16_t)(((int32_t)tmp_amp*ONE_OVER_SQRT2_Q15)>>15);
 
-	switch (mod_order) {
+	switch (mod_order0) {
 	case 2:  //QPSK
 
-	  ((int16_t*)&tmp_sample1)[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	  ((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
 	  *jj = *jj + 1;
-	  ((int16_t*)&tmp_sample1)[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	  ((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
 	  *jj = *jj + 1;
 
       // normalization for 2 tx antennas
@@ -523,8 +658,8 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 
 	  if (frame_parms->nb_antennas_tx == 2) {
 	    layer1prec2A(&tmp_sample1,&tmp_sample2,precoder_index);
-        ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
-        ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
+	    ((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
+	    ((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
 	  }
 
 	  break;
@@ -534,18 +669,18 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  qam16_table_offset_re = 0;
 	  qam16_table_offset_im = 0;
 
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=2;
 	  *jj=*jj+1;
 	  
 	  
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam16_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
@@ -568,22 +703,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	  
 	  qam64_table_offset_re = 0;
 	  qam64_table_offset_im = 0;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=4;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=2;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_re+=1;
 	  *jj=*jj+1;
-	  if (output[*jj] == 1)
+	  if (x0[*jj] == 1)
 	    qam64_table_offset_im+=1;
 	  *jj=*jj+1;
 	  
@@ -614,15 +749,14 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
     
       if (mimo_mode >= TM8) { //TM8,TM9,TM10
 
-	if (is_not_UEspecRS(first_layer,re)) {	  	  	
-	  switch (mod_order) {
+	if (is_not_UEspecRS(first_layer0,re)) {	  	  	
+	  switch (mod_order0) {
 	  case 2:  //QPSK
 	    //	  printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
-	    for (layer=first_layer;layer<=(first_layer+Nlayers);layer++) {
-	      
-	      ((int16_t*)&txdataF[layer][tti_offset])[0] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
+	    for (layer=first_layer0;layer<=(first_layer0+Nlayers0);layer++) {
+	      ((int16_t*)&txdataF[layer][tti_offset])[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
 	      *jj = *jj + 1;
-	      ((int16_t*)&txdataF[layer][tti_offset])[1] = (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
+	      ((int16_t*)&txdataF[layer][tti_offset])[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
 	      *jj = *jj + 1;
 	    }
 	    break;
@@ -631,25 +765,22 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	    if (is_not_UEspecRS(layer,re)) {	  	  
 	      qam16_table_offset_re = 0;
 	      qam16_table_offset_im = 0;
-	      if (output[*jj] == 1)
+	      if (x0[*jj] == 1)
 		qam16_table_offset_re+=2;
-	      *jj=*jj+1;
-	      if (output[*jj] == 1)
+	      *jj = *jj + 1;
+	      if (x0[*jj] == 1)
 		qam16_table_offset_im+=2;
-	      *jj=*jj+1;
-	      
-	      
-	      if (output[*jj] == 1)
+	      *jj = *jj + 1;
+	      if (x0[*jj] == 1)
 		qam16_table_offset_re+=1;
-	      *jj=*jj+1;
-	      if (output[*jj] == 1)
+	      *jj = *jj + 1;
+	      if (x0[*jj] == 1)
 		qam16_table_offset_im+=1;
-	      *jj=*jj+1;
-	      
-	    
-	      for (layer=first_layer;layer<=(first_layer+Nlayers);layer++) {
-		((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s[qam16_table_offset_re];
-		((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s[qam16_table_offset_im];
+	      *jj = *jj + 1;
+
+	      for (layer=first_layer0;layer<=(first_layer0+Nlayers0);layer++) {
+		((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s0[qam16_table_offset_re];
+		((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s0[qam16_table_offset_im];
 	      }
 	    }
 	    break;
@@ -660,28 +791,28 @@ int allocate_REs_in_RB(mod_sym_t **txdataF,
 	    qam64_table_offset_re = 0;
 	    qam64_table_offset_im = 0;
 	    
-	    if (output[*jj] == 1)
+	    if (x0[*jj] == 1)
 	      qam64_table_offset_re+=4;
-	    *jj=*jj+1;
-	    if (output[*jj] == 1)
+	    *jj = *jj + 1;
+	    if (x0[*jj] == 1)
 	      qam64_table_offset_im+=4;
-	    *jj=*jj+1;
-	    if (output[*jj] == 1)
+	    *jj = *jj + 1;
+	    if (x0[*jj] == 1)
 	      qam64_table_offset_re+=2;
-	    *jj=*jj+1;
-	    if (output[*jj] == 1)
+	    *jj = *jj + 1;
+	    if (x0[*jj] == 1)
 	      qam64_table_offset_im+=2;
-	    *jj=*jj+1;
-	    if (output[*jj] == 1)
+	    *jj = *jj + 1;
+	    if (x0[*jj] == 1)
 	      qam64_table_offset_re+=1;
-	    *jj=*jj+1;
-	    if (output[*jj] == 1)
+	    *jj = *jj + 1;
+	    if (x0[*jj] == 1)
 	      qam64_table_offset_im+=1;
-	    *jj=*jj+1;
-	    
-	    for (layer=first_layer;layer<=(first_layer+Nlayers);layer++) {
-	      ((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s[qam64_table_offset_re];
-	      ((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s[qam64_table_offset_im];
+	    *jj = *jj + 1;
+
+	    for (layer=first_layer0;layer<=(first_layer0+Nlayers0);layer++) {
+	      ((int16_t*)&txdataF[layer][tti_offset])[0] = qam_table_s0[qam64_table_offset_re];
+	      ((int16_t*)&txdataF[layer][tti_offset])[1] = qam_table_s0[qam64_table_offset_im];
 	    }	  
 	    break;
 	    
@@ -704,7 +835,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
 			   uint32_t *jj,
 			   uint16_t re_offset,
 			   uint32_t symbol_offset,
-			   uint8_t *output,
+			   uint8_t *x0,
 			   uint8_t l,
 			   uint8_t mod_order,
 			   int16_t amp,
@@ -725,7 +856,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
   uint8_t first_re,last_re;
   int inc;
 #ifdef DEBUG_DLSCH_MODULATION
-  printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, output[*jj], output[1+*jj]);
+  printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj]);
 #endif
 
   last_re=12;
@@ -754,10 +885,10 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
     case 2:  //QPSK
       //      printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
       for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
-	((int16_t*)&txdataF[aa][tti_offset])[0] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
+	((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
 	  *jj = *jj + 1;
 	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
-	    ((int16_t*)&txdataF[aa][tti_offset])[1] += (output[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
+	    ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
 	  *jj = *jj + 1;
 	  
 	  //  printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
@@ -767,18 +898,18 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
       
       qam16_table_offset_re = 0;
       qam16_table_offset_im = 0;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam16_table_offset_re+=2;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam16_table_offset_im+=2;
       *jj=*jj+1;
       
       
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam16_table_offset_re+=1;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam16_table_offset_im+=1;
       *jj=*jj+1;
       
@@ -797,22 +928,22 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
       qam64_table_offset_re = 0;
       qam64_table_offset_im = 0;
       
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam64_table_offset_re+=4;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam64_table_offset_im+=4;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam64_table_offset_re+=2;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam64_table_offset_im+=2;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam64_table_offset_re+=1;
       *jj=*jj+1;
-      if (output[*jj] == 1)
+      if (x0[*jj] == 1)
 	qam64_table_offset_im+=1;
       *jj=*jj+1;
       
@@ -827,7 +958,11 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF,
   return(0);
 }
 
-uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode,uint32_t pmi_alloc,uint16_t rb) {
+uint8_t get_pmi(uint8_t N_RB_DL,LTE_DL_eNB_HARQ_t *dlsch_harq,uint16_t rb) {
+
+
+  MIMO_mode_t mode   = dlsch_harq->mimo_mode;
+  uint32_t pmi_alloc = dlsch_harq->pmi_alloc;
 
   //  printf("Getting pmi for RB %d => %d\n",rb,(pmi_alloc>>((rb>>2)<<1))&3);
   switch (N_RB_DL) {
@@ -837,6 +972,7 @@ uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode,uint32_t pmi_alloc,uint16_t rb)
     else
       return((pmi_alloc>>rb)&1);    
     break;
+  default:
   case 25:  // 4 PRBs per subband
     if (mode <= PUSCH_PRECODING1)
       return((pmi_alloc>>((rb>>2)<<1))&3);
@@ -855,8 +991,6 @@ uint8_t get_pmi(uint8_t N_RB_DL,MIMO_mode_t mode,uint32_t pmi_alloc,uint16_t rb)
     else
       return((pmi_alloc>>(rb>>3))&1);    
     break;
-  default:
-    break;
   }
 }
 
@@ -866,49 +1000,81 @@ int dlsch_modulation(mod_sym_t **txdataF,
 		     uint32_t subframe_offset,
 		     LTE_DL_FRAME_PARMS *frame_parms,
 		     uint8_t num_pdcch_symbols,
-		     LTE_eNB_DLSCH_t *dlsch){
+		     LTE_eNB_DLSCH_t *dlsch0,
+		     LTE_eNB_DLSCH_t *dlsch1){
 
   uint8_t nsymb;
-  uint8_t harq_pid = dlsch->current_harq_pid;
-  uint32_t i,jj,re_allocated,symbol_offset;
+  uint8_t harq_pid = dlsch0->current_harq_pid;
+  LTE_DL_eNB_HARQ_t *dlsch0_harq = dlsch0->harq_processes[harq_pid];
+  LTE_DL_eNB_HARQ_t *dlsch1_harq; //= dlsch1->harq_processes[harq_pid];
+  uint32_t i,jj,jj2,re_allocated,symbol_offset;
   uint16_t l,rb,re_offset;
   uint32_t rb_alloc_ind;
-  uint32_t *rb_alloc = dlsch->rb_alloc;
+  uint32_t *rb_alloc = dlsch0_harq->rb_alloc;
   uint8_t pilots=0;
   uint8_t skip_dc,skip_half;
-  uint8_t mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
+  uint8_t mod_order0 = get_Qm(dlsch0_harq->mcs);
+  uint8_t mod_order1;
   int16_t amp_rho_a, amp_rho_b;
-  int16_t qam16_table_a[4],qam64_table_a[8],qam16_table_b[4],qam64_table_b[8];
-  int16_t *qam_table_s;
+  int16_t qam16_table_a0[4],qam64_table_a0[8],qam16_table_b0[4],qam64_table_b0[8];
+  int16_t qam16_table_a1[4],qam64_table_a1[8],qam16_table_b1[4],qam64_table_b1[8];
+  int16_t *qam_table_s0,*qam_table_s1;
 #ifdef DEBUG_DLSCH_MODULATION
-  uint8_t Nl = dlsch->harq_processes[harq_pid]->Nl;
+  uint8_t Nl0 = dlsch0_harq->Nl;
+  uint8_t Nl1;
 #endif
+
+  if (dlsch1) {
+    dlsch1_harq = dlsch1->harq_processes[harq_pid];
+    mod_order1 = get_Qm(dlsch1_harq->mcs);
+#ifdef DEBUG_DLSCH_MODULATION
+    Nl1 = dlsch1_harq->Nl;
+#endif
+  }
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_IN);
 
   nsymb = (frame_parms->Ncp==0) ? 14:12;
   
-  amp_rho_a = (int16_t)(((int32_t)amp*dlsch->sqrt_rho_a)>>13);
-  amp_rho_b = (int16_t)(((int32_t)amp*dlsch->sqrt_rho_b)>>13);
+  amp_rho_a = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_a)>>13);
+  amp_rho_b = (int16_t)(((int32_t)amp*dlsch0->sqrt_rho_b)>>13);
 
-  if (mod_order == 4)
+  if (mod_order0 == 4)
     for (i=0;i<4;i++) {
-      qam16_table_a[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15);
-      qam16_table_b[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15);
+      qam16_table_a0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15);
+      qam16_table_b0[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15);
     }
-  else if (mod_order == 6)
+  else if (mod_order0 == 6)
     for (i=0;i<8;i++) {
-      qam64_table_a[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_a)>>15);
-      qam64_table_b[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15);
+      qam64_table_a0[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_a)>>15);
+      qam64_table_b0[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15);
+    } 
+
+  if (mod_order1 == 4)
+    for (i=0;i<4;i++) {
+      qam16_table_a1[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_a)>>15);
+      qam16_table_b1[i] = (int16_t)(((int32_t)qam16_table[i]*amp_rho_b)>>15);
+    }
+  else if (mod_order0 == 6)
+    for (i=0;i<8;i++) {
+      qam64_table_a1[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_a)>>15);
+      qam64_table_b1[i] = (int16_t)(((int32_t)qam64_table[i]*amp_rho_b)>>15);
     } 
   //Modulation mapping (difference w.r.t. LTE specs)
   
-  jj=0;
+  jj=0;jj2=0;
   re_allocated=0;
   //  printf("num_pdcch_symbols %d, nsymb %d\n",num_pdcch_symbols,nsymb);
   for (l=num_pdcch_symbols;l<nsymb;l++) {
     
 #ifdef DEBUG_DLSCH_MODULATION
-    msg("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc %x, mod %d, nu %d, rb_alloc[0] %d) in %d\n",harq_pid,dlsch->harq_processes[harq_pid]->mimo_mode,pmi2hex_2Ar1(dlsch->pmi_alloc),mod_order, dlsch->layer_index, rb_alloc[0], l);
+    msg("Generating DLSCH (harq_pid %d,mimo %d, pmi_alloc0 %llx, mod0 %d, mod1 %d, rb_alloc[0] %d) in %d\n",
+	harq_pid,
+	dlsch0_harq->mimo_mode,
+	pmi2hex_2Ar1(dlsch0_harq->pmi_alloc),
+	mod_order0, 
+	mod_order1, 
+	rb_alloc[0], 
+	l);
 #endif    
 
     if (frame_parms->Ncp==0) { // normal prefix
@@ -1060,39 +1226,50 @@ int dlsch_modulation(mod_sym_t **txdataF,
 	  }
 	}
 	
-	if (dlsch->layer_index>1) {
-	  msg("layer_index %d: re_offset %d, symbol %d offset %d\n",dlsch->layer_index,re_offset,l,symbol_offset); 
+	if (dlsch0_harq->Nlayers>1) {
+	  msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); 
 	  return(-1);
 	}
-	if (mod_order == 4)
-	  qam_table_s = ((pilots) ? qam16_table_b : qam16_table_a);
-	else if (mod_order == 6)
-	  qam_table_s = ((pilots) ? qam64_table_b : qam64_table_a);
+	if (dlsch1) {
+	  if (dlsch1_harq->Nlayers>1) {
+	    msg("Nlayers %d: re_offset %d, symbol %d offset %d\n",dlsch0_harq->Nlayers,re_offset,l,symbol_offset); 
+	    return(-1);
+	  }
+	}
+	if (mod_order0 == 4)
+	  qam_table_s0 = ((pilots) ? qam16_table_b0 : qam16_table_a0);
+	else if (mod_order0 == 6)
+	  qam_table_s0 = ((pilots) ? qam64_table_b0 : qam64_table_a0);
+	else
+	  qam_table_s0 = NULL;
+
+	if (mod_order1 == 4)
+	  qam_table_s1 = ((pilots) ? qam16_table_b1 : qam16_table_a1);
+	else if (mod_order1 == 6)
+	  qam_table_s1 = ((pilots) ? qam64_table_b1 : qam64_table_a1);
 	else
-	  qam_table_s = NULL;
+	  qam_table_s1 = NULL;
 
 	if (rb_alloc_ind > 0)
         {
-	  //	  printf("Allocated rb %d, subframe_offset %d, symbol_offset %d, re_offset %d\n",rb,subframe_offset,symbol_offset,re_offset);
-	  allocate_REs_in_RB(txdataF,
+	  //	  printf("Allocated rb %d, subframe_offset %d, symbol_offset %d, re_offset %d, jj %d\n",rb,subframe_offset,symbol_offset,re_offset,jj);
+	  allocate_REs_in_RB(frame_parms,
+			     txdataF,
 			     &jj,
+			     &jj2,
 			     re_offset,
 			     symbol_offset,
-			     dlsch->e,
-			     dlsch->harq_processes[harq_pid]->mimo_mode,
-			     dlsch->layer_index,
+			     dlsch0->harq_processes[harq_pid],
+			     (dlsch1==NULL) ? NULL : dlsch1->harq_processes[harq_pid],
 			     pilots,
-			     mod_order,
-			     get_pmi(frame_parms->N_RB_DL,dlsch->harq_processes[harq_pid]->mimo_mode,dlsch->pmi_alloc,rb),
 			     ((pilots) ? amp_rho_b : amp_rho_a),
-			     qam_table_s,
+			     get_pmi(frame_parms->N_RB_DL,dlsch0->harq_processes[harq_pid],rb),
+			     qam_table_s0,
+			     qam_table_s1,
 			     &re_allocated,
 			     skip_dc,
-			     skip_half,
-			     (frame_parms->mode1_flag==1)?1:0,
-			     dlsch->harq_processes[harq_pid]->Nlayers, 
-			     dlsch->harq_processes[harq_pid]->first_layer, 
-			     frame_parms);
+			     skip_half);
+
       }
 	re_offset+=12; // go to next RB
 	
@@ -1111,7 +1288,7 @@ int dlsch_modulation(mod_sym_t **txdataF,
 
 
 #ifdef DEBUG_DLSCH_MODULATION
-  msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->nb_rb,dlsch->rb_alloc,mod_order,Nl,2,0,subframe_offset));
+  msg("generate_dlsch : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch0_harq->nb_rb,dlsch0_harq->rb_alloc,mod_order0,Nl0,2,0,subframe_offset));
 #endif
   
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_MODULATION, VCD_FUNCTION_OUT);
@@ -1181,7 +1358,7 @@ int mch_modulation(mod_sym_t **txdataF,
 			     &jj,
 			     re_offset,
 			     symbol_offset,
-			     dlsch->e,
+			     dlsch->harq_processes[0]->e,
 			     l,
 			     mod_order,
 			     amp,
@@ -1208,7 +1385,7 @@ int mch_modulation(mod_sym_t **txdataF,
 
 
 #ifdef DEBUG_DLSCH_MODULATION
-  msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->nb_rb,dlsch->rb_alloc,mod_order,1,2,0,subframe_offset));
+  msg("generate_dlsch(MCH) : jj = %d,re_allocated = %d (G %d)\n",jj,re_allocated,get_G(frame_parms,dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->rb_alloc,mod_order,1,2,0,subframe_offset));
 #endif
     
     return (re_allocated);
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
index a65e3068772dd40a9c942675e44c6b2c5e8e93ef..44abc063ba8bff86525cdd3c77e5e45e02dddcab 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c
@@ -58,7 +58,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
   int i,j,k=0;
   //  uint8_t reset;
   uint32_t x1, x2, s=0;
-  uint8_t *e=dlsch->e;
+  uint8_t *e=dlsch->harq_processes[dlsch->current_harq_pid]->e;
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_IN);
 
diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
index 334dda1ae45583d6701a3fffe142ec80ecb4ac70..4419e549e43946cbebfc3e4fc1df1e1f26823999 100644
--- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
@@ -48,7 +48,7 @@
 #include "gain_control.h"
 #endif
 
-//#define DEBUG_INITIAL_SYNCH
+#define DEBUG_INITIAL_SYNCH
 
 int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) {
 
@@ -111,6 +111,7 @@ int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) {
 			  frame_parms,
 			  0,
 			  SISO,
+			  phy_vars_ue->high_speed_flag,
 			  frame_mod4);
     if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
       pbch_decoded = 1;
@@ -122,6 +123,7 @@ int pbch_detection(PHY_VARS_UE *phy_vars_ue, runmode_t mode) {
 			  frame_parms,
 			  0,
 			  ALAMOUTI,
+			  phy_vars_ue->high_speed_flag,
 			  frame_mod4);
     if ((pbch_tx_ant>0) && (pbch_tx_ant<=2)) {
       pbch_decoded = 1;
diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c
index 9aaf3a4f842baae36ddd1dc4d39e0f94270fd08c..920ab5b90c54ea634b03197fc35f9025bd25804b 100755
--- a/openair1/PHY/LTE_TRANSPORT/pbch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pbch.c
@@ -70,6 +70,98 @@ extern __m128i zero;
 
 #define PBCH_A 24
 
+int allocate_pbch_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
+			    mod_sym_t **txdataF,
+			    uint32_t *jj,
+			    uint16_t re_offset,
+			    uint32_t symbol_offset,
+			    uint8_t *x0,
+			    uint8_t pilots,
+			    int16_t amp,
+			    uint32_t *re_allocated) {
+
+  MIMO_mode_t mimo_mode   = (frame_parms->mode1_flag==1)?SISO:ALAMOUTI;
+
+
+  uint32_t tti_offset,aa;
+  uint8_t re;
+  int16_t gain_lin_QPSK;
+  int16_t re_off=re_offset;
+
+  uint8_t first_re,last_re;
+  int32_t tmp_sample1,tmp_sample2;
+
+  gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15);
+
+  first_re=0;
+  last_re=12;
+
+  for (re=first_re;re<last_re;re++) {
+    
+    tti_offset = symbol_offset + re_off + re;
+    
+    // check that RE is not from Cell-specific RS
+
+    if (is_not_pilot(pilots,re,frame_parms->nushift,0)==1) { 
+      //      printf("re %d (jj %d)\n",re,*jj);
+      if (mimo_mode == SISO) {  //SISO mapping
+	*re_allocated = *re_allocated + 1;	
+	//	  printf("%d(%d) : %d,%d => ",tti_offset,*jj,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]);
+	for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+	  ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i
+	}
+	*jj = *jj + 1;
+	for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+	  ((int16_t*)&txdataF[aa][tti_offset])[1] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //Q //b_{i+1}
+	}
+	*jj = *jj + 1;
+      }
+      else if (mimo_mode == ALAMOUTI){
+	*re_allocated = *re_allocated + 1;	
+
+	((int16_t*)&tmp_sample1)[0] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	*jj=*jj+1;
+	((int16_t*)&tmp_sample1)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	*jj=*jj+1;
+
+	// second antenna position n -> -x1*
+	
+	((int16_t*)&tmp_sample2)[0] = (x0[*jj]==1) ? (gain_lin_QPSK) : -gain_lin_QPSK;
+	*jj=*jj+1;
+	((int16_t*)&tmp_sample2)[1] = (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK;
+	*jj=*jj+1;
+	
+	// normalization for 2 tx antennas
+	((int16_t*)&txdataF[0][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*ONE_OVER_SQRT2_Q15)>>15);
+	((int16_t*)&txdataF[0][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample1)[1]*ONE_OVER_SQRT2_Q15)>>15);
+	((int16_t*)&txdataF[1][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample2)[0]*ONE_OVER_SQRT2_Q15)>>15);
+	((int16_t*)&txdataF[1][tti_offset])[1] += (int16_t)((((int16_t*)&tmp_sample2)[1]*ONE_OVER_SQRT2_Q15)>>15);
+	
+	// fill in the rest of the ALAMOUTI precoding
+	if (is_not_pilot(pilots,re + 1,frame_parms->nushift,0)==1) {
+	  ((int16_t *)&txdataF[0][tti_offset+1])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1
+	  ((int16_t *)&txdataF[0][tti_offset+1])[1] += ((int16_t *)&txdataF[1][tti_offset])[1];
+	  ((int16_t *)&txdataF[1][tti_offset+1])[0] += ((int16_t *)&txdataF[0][tti_offset])[0];  //x0*
+	  ((int16_t *)&txdataF[1][tti_offset+1])[1] += -((int16_t *)&txdataF[0][tti_offset])[1];
+	}
+	else {
+	  ((int16_t *)&txdataF[0][tti_offset+2])[0] += -((int16_t *)&txdataF[1][tti_offset])[0]; //x1
+	  ((int16_t *)&txdataF[0][tti_offset+2])[1] += ((int16_t *)&txdataF[1][tti_offset])[1];
+	  ((int16_t *)&txdataF[1][tti_offset+2])[0] += ((int16_t *)&txdataF[0][tti_offset])[0];  //x0*
+	  ((int16_t *)&txdataF[1][tti_offset+2])[1] += -((int16_t *)&txdataF[0][tti_offset])[1];
+	}
+	re++;  // adjacent carriers are taken care of by precoding
+	*re_allocated = *re_allocated + 1;
+	if (is_not_pilot(pilots,re,frame_parms->nushift,0)==0) { // skip pilots
+	  re++;  
+	  *re_allocated = *re_allocated + 1;
+	}
+      }
+    }
+  }
+  return(0);
+}
+ 
 //uint8_t pbch_d[96+(3*(16+PBCH_A))], pbch_w[3*3*(16+PBCH_A)],pbch_e[1920];  //one bit per byte
 int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
 		  mod_sym_t **txdataF,
@@ -260,62 +352,51 @@ int generate_pbch(LTE_eNB_PBCH *eNB_pbch,
 #endif
 
     
-#ifdef IFFT_FPGA
-    re_offset = frame_parms->N_RB_DL*12-3*12;
-    symbol_offset = frame_parms->N_RB_DL*12*l;
-#else
     re_offset = frame_parms->ofdm_symbol_size-3*12;
     symbol_offset = frame_parms->ofdm_symbol_size*l;
-#endif
     
     for (rb=0;rb<6;rb++) {
 
 #ifdef DEBUG_PBCH
       msg("RB %d, jj %d, re_offset %d, symbol_offset %d, pilots %d, nushift %d\n",rb,jj,re_offset, symbol_offset, pilots,frame_parms->nushift);
 #endif
-      allocate_REs_in_RB(txdataF,
-			 &jj,
-			 re_offset,
-			 symbol_offset,
-			 &eNB_pbch->pbch_e[frame_mod4*(pbch_E>>2)],
-			 (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI,
-			 0,
-			 pilots,
-			 2,
-			 0,
+      allocate_pbch_REs_in_RB(frame_parms,
+			      txdataF,
+			      &jj,
+			      re_offset,
+			      symbol_offset,
+			      &eNB_pbch->pbch_e[frame_mod4*(pbch_E>>2)],
+			      pilots,
 #ifdef INTERFERENCE_MITIGATION
-			 (pilots_2==1)?(amp/3):amp,
+			      (pilots_2==1)?(amp/3):amp,
 #else
-			 amp,
+			      amp,
 #endif
-			 NULL,
-			 &re_allocated,
-			 0,
-			 0,
-			 0,
-			 1,
-			 0,
-			 frame_parms);
+			      &re_allocated);
       
       re_offset+=12; // go to next RB
       
       // check if we crossed the symbol boundary and skip DC
-#ifdef IFFT_FPGA
-      if (re_offset >= frame_parms->N_RB_DL*12) 
-	re_offset = 0;
-#else
+
       if (re_offset >= frame_parms->ofdm_symbol_size)
 	re_offset=1;
-#endif
     }
     
     //    }
   }
 #ifdef DEBUG_PBCH
-  msg("[PBCH] txdataF=\n");
-  for (i=0;i<frame_parms->ofdm_symbol_size;i++) 
-    msg("%d=>(%d,%d)\n",i,((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0],
-	((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]);
+  printf("[PBCH] txdataF=\n");
+  for (i=0;i<frame_parms->ofdm_symbol_size;i++) { 
+    printf("%d=>(%d,%d)",i,((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0],
+	   ((short*)&txdataF[0][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]);
+    if (frame_parms->mode1_flag==0) {
+      printf("(%d,%d)\n",((short*)&txdataF[1][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[0],
+	     ((short*)&txdataF[1][frame_parms->ofdm_symbol_size*(nsymb>>1)+i])[1]);
+    }
+    else {
+      printf("\n");
+    }
+  }
 #endif
   
   
@@ -332,11 +413,12 @@ int32_t generate_pbch_emul(PHY_VARS_eNB *phy_vars_eNB,uint8_t *pbch_pdu) {
 }
 
 uint16_t pbch_extract(int **rxdataF,
-		 int **dl_ch_estimates,
-		 int **rxdataF_ext,
-		 int **dl_ch_estimates_ext,
-		 uint32_t symbol,
-		 LTE_DL_FRAME_PARMS *frame_parms) {
+		      int **dl_ch_estimates,
+		      int **rxdataF_ext,
+		      int **dl_ch_estimates_ext,
+		      uint32_t symbol,
+		      uint32_t high_speed_flag,
+		      LTE_DL_FRAME_PARMS *frame_parms) {
   
 
   uint16_t rb,nb_rb=6;
@@ -356,21 +438,14 @@ uint16_t pbch_extract(int **rxdataF,
 	   (rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2,
 	   LTE_CE_OFFSET+ch_offset+(symbol_mod*(frame_parms->ofdm_symbol_size)));
     */
-#ifndef NEW_FFT
-    rxF        = &rxdataF[aarx][(rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
+
     rxF        = &rxdataF[aarx][(rx_offset + (symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
     rxF_ext    = &rxdataF_ext[aarx][symbol_mod*(6*12)];
 
     for (rb=0; rb<nb_rb; rb++) {
       // skip DC carrier
       if (rb==3) {
-#ifndef NEW_FFT
-	rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))*2];
-#else
 	rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
-#endif
       }
       if ((symbol_mod==0) || (symbol_mod==1)) {
 	j=0;
@@ -379,39 +454,26 @@ uint16_t pbch_extract(int **rxdataF,
 	      (i!=(nushiftmod3+3)) && 
 	      (i!=(nushiftmod3+6)) && 
 	      (i!=(nushiftmod3+9))) {
-#ifndef NEW_FFT
-	    rxF_ext[j++]=rxF[i<<1];
-#else
 	    rxF_ext[j++]=rxF[i];
-#endif
 	  }
 	}
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
 	rxF_ext+=8;
       }
       else {
 	for (i=0;i<12;i++) {
-#ifndef NEW_FFT
-	  rxF_ext[i]=rxF[i<<1];
-#else
 	  rxF_ext[i]=rxF[i];
-#endif
 	}
-#ifndef NEW_FFT
-	rxF+=24;
-#else
 	rxF+=12;
-#endif
 	rxF_ext+=12;
       }
     }
 
     for (aatx=0;aatx<4;aatx++) {//frame_parms->nb_antennas_tx_eNB;aatx++) {
-      dl_ch0     = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset+(symbol*(frame_parms->ofdm_symbol_size))];
+      if (high_speed_flag == 1)
+	dl_ch0     = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset+(symbol*(frame_parms->ofdm_symbol_size))];
+      else
+	dl_ch0     = &dl_ch_estimates[(aatx<<1)+aarx][LTE_CE_OFFSET+ch_offset];
       dl_ch0_ext = &dl_ch_estimates_ext[(aatx<<1)+aarx][symbol_mod*(6*12)];
 
       for (rb=0; rb<nb_rb; rb++) {
@@ -737,11 +799,12 @@ static int8_t pbch_w_rx[3*3*(16+PBCH_A)],pbch_d_rx[96+(3*(16+PBCH_A))];
 
 
 uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
-	    LTE_UE_PBCH *lte_ue_pbch_vars,
-	    LTE_DL_FRAME_PARMS *frame_parms,
-	    uint8_t eNB_id,
-	    MIMO_mode_t mimo_mode,
-	    uint8_t frame_mod4) {
+		 LTE_UE_PBCH *lte_ue_pbch_vars,
+		 LTE_DL_FRAME_PARMS *frame_parms,
+		 uint8_t eNB_id,
+		 MIMO_mode_t mimo_mode,
+		 uint32_t high_speed_flag,
+		 uint8_t frame_mod4) {
 
   uint8_t log2_maxh;//,aatx,aarx;
   int max_h=0;
@@ -778,6 +841,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
 		 lte_ue_pbch_vars->rxdataF_ext,
 		 lte_ue_pbch_vars->dl_ch_estimates_ext,
 		 symbol,
+		 high_speed_flag,
 		 frame_parms);
 #ifdef DEBUG_PBCH    
     msg("[PHY] PBCH Symbol %d\n",symbol);
@@ -811,7 +875,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
       //	msg("[PBCH][RX] Alamouti receiver not yet implemented!\n");
       //	return(-1);
     }
-    else if ((mimo_mode != ANTCYCLING) && (mimo_mode != SISO)) {
+    else if (mimo_mode != SISO) {
       msg("[PBCH][RX] Unsupported MIMO mode\n");
       return(-1);
     }
@@ -911,7 +975,7 @@ uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
 		 uint8_t eNB_id,
 		 uint8_t pbch_phase) {
 
-  double bler=0.0, x=0.0;
+  double bler=0.0;//, x=0.0;
   double sinr=0.0;
   uint16_t nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL;
   int16_t f;
diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c
index d906b8ec823a0cb0c085b6b2c7cd2ccaef9876de..f1a79190f99fe5343c388cadc3b42b2b3b3e8fe2 100644
--- a/openair1/PHY/LTE_TRANSPORT/pmch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pmch.c
@@ -75,16 +75,16 @@ void dump_mch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_co
   */
   sprintf(fname,"mch_rxF_comp0.m");
   sprintf(vname,"pmch_rxF_comp0");
-  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp[0],12*N_RB_DL*nsymb_pmch,1,1);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->rxdataF_comp0[0],12*N_RB_DL*nsymb_pmch,1,1);
   sprintf(fname,"mch_rxF_llr.m");
   sprintf(vname,"pmch_llr");
   write_output(fname,vname, phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->llr[0],coded_bits_per_codeword,1,0);
   sprintf(fname,"mch_mag1.m");
   sprintf(vname,"pmch_mag1");
-  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag[0],12*N_RB_DL*nsymb_pmch,1,1);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_mag0[0],12*N_RB_DL*nsymb_pmch,1,1);
   sprintf(fname,"mch_mag2.m");
   sprintf(vname,"pmch_mag2");
-  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb[0],12*N_RB_DL*nsymb_pmch,1,1);
+  write_output(fname,vname,phy_vars_ue->lte_ue_pdsch_vars_MCH[eNB_id]->dl_ch_magb0[0],12*N_RB_DL*nsymb_pmch,1,1);
 
   write_output("mch00_ch0.m","pmch00_ch0",
 	       &(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]),
@@ -186,24 +186,24 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx, in
   dlsch->harq_processes[0]->Nl    = 1;
   dlsch->harq_processes[0]->TBS   = TBStable[get_I_TBS(dlsch->harq_processes[0]->mcs)][frame_parms->N_RB_DL-1];
   dlsch->current_harq_pid = 0;
-  dlsch->nb_rb = frame_parms->N_RB_DL;
+  dlsch->harq_processes[0]->nb_rb = frame_parms->N_RB_DL;
 
   switch(frame_parms->N_RB_DL) {
   case 6:
-    dlsch->rb_alloc[0] = 0x3f;
+    dlsch->harq_processes[0]->rb_alloc[0] = 0x3f;
     break;
   case 25:
-    dlsch->rb_alloc[0] = 0x1ffffff;
+    dlsch->harq_processes[0]->rb_alloc[0] = 0x1ffffff;
     break;
   case 50:
-    dlsch->rb_alloc[0] = 0xffffffff;
-    dlsch->rb_alloc[1] = 0x3ffff;
+    dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc[1] = 0x3ffff;
     break;
   case 100:
-    dlsch->rb_alloc[0] = 0xffffffff;
-    dlsch->rb_alloc[1] = 0xffffffff;
-    dlsch->rb_alloc[2] = 0xffffffff;
-    dlsch->rb_alloc[3] = 0xf;
+    dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc[1] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc[2] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc[3] = 0xf;
     break;
   }
 
@@ -277,7 +277,7 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN
   }else {
     G = get_G(&phy_vars_eNB->lte_frame_parms,
 	      phy_vars_eNB->lte_frame_parms.N_RB_DL,
-	      phy_vars_eNB->dlsch_eNB_MCH->rb_alloc,
+	      phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->rb_alloc,
 	      get_Qm(phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->mcs),1,
 	      2,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
     
@@ -820,9 +820,9 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue,
 
   mch_channel_compensation(lte_ue_pdsch_vars[eNB_id]->rxdataF_ext,
 			   lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
-			   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-			   lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
-			   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+			   lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+			   lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
+			   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
 			   frame_parms,
 			   symbol,
 			   get_Qm(dlsch_ue[0]->harq_processes[0]->mcs),
@@ -831,33 +831,33 @@ int rx_pmch(PHY_VARS_UE *phy_vars_ue,
 
   if (frame_parms->nb_antennas_rx > 1)
     mch_detection_mrc(frame_parms,
-		      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
-		      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-		      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
+		      lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
+		      lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+		      lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
 		      symbol);
 
     switch (get_Qm(dlsch_ue[0]->harq_processes[0]->mcs)) {
     case 2 : 
       mch_qpsk_llr(frame_parms,
-		   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+		   lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
 		   lte_ue_pdsch_vars[eNB_id]->llr[0],
 		   symbol,
 		   lte_ue_pdsch_vars[eNB_id]->llr128);
       break;
     case 4:
       mch_16qam_llr(frame_parms,
-		    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+		    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
 		    lte_ue_pdsch_vars[eNB_id]->llr[0],
-		    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
+		    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
 		    symbol,
 		    lte_ue_pdsch_vars[eNB_id]->llr128);
       break;
     case 6:
       mch_64qam_llr(frame_parms,
-		    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp,
+		    lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0,
 		    lte_ue_pdsch_vars[eNB_id]->llr[0],
-		    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag,
-		    lte_ue_pdsch_vars[eNB_id]->dl_ch_magb,
+		    lte_ue_pdsch_vars[eNB_id]->dl_ch_mag0,
+		    lte_ue_pdsch_vars[eNB_id]->dl_ch_magb0,
 		    symbol,
 		    lte_ue_pdsch_vars[eNB_id]->llr128);
       break;
diff --git a/openair1/PHY/LTE_TRANSPORT/power_control.c b/openair1/PHY/LTE_TRANSPORT/power_control.c
index ad45ee8ade9c9e62dde7d836f756622405f76420..5f7ffe1e2f35567dd612ac026525987afe74a31e 100644
--- a/openair1/PHY/LTE_TRANSPORT/power_control.c
+++ b/openair1/PHY/LTE_TRANSPORT/power_control.c
@@ -46,13 +46,13 @@ double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated) {
 } 
 
 double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,  
-                       LTE_eNB_DLSCH_t *dlsch_eNB ){		    	
+                       LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off){		    	
   double rho_a_dB;
   double sqrt_rho_a_lin;
 
   rho_a_dB = pa_values[ pdsch_config_dedicated->p_a];
 	
-  if(!dlsch_eNB->dl_power_off) 
+  if(!dl_power_off) 
     rho_a_dB-=10*log10(2);
 	
   sqrt_rho_a_lin= pow(10,(0.05*rho_a_dB));	
@@ -69,12 +69,13 @@ double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,
 double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED  *pdsch_config_dedicated,
                        PDSCH_CONFIG_COMMON *pdsch_config_common,
                        uint8_t n_antenna_port,
-                       LTE_eNB_DLSCH_t *dlsch_eNB){
+                       LTE_eNB_DLSCH_t *dlsch_eNB,
+		       int dl_power_off){
 
   double rho_a_dB, rho_b_dB;
   double sqrt_rho_b_lin;
 	
-  rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB);
+  rho_a_dB= computeRhoA_eNB(pdsch_config_dedicated,dlsch_eNB,dl_power_off);
 	
   if(n_antenna_port>1)
     rho_b_dB= ratioPB[1][pdsch_config_common->p_b] + rho_a_dB;
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index b3eb129364ad7416950100e18aea7873769af788..d297d4623e390aaae73ee4ee59c9368de903ab33 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -128,65 +128,56 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB,
 
 /** \fn allocate_REs_in_RB(mod_sym_t **txdataF,
     uint32_t *jj,
+    uint32_t *jj2,
     uint16_t re_offset,
     uint32_t symbol_offset,
-    uint8_t *output,
-    MIMO_mode_t mimo_mode,
-    uint8_t nu,
+    LTE_DL_eNB_HARQ_t *dlsch0_harq,
+    LTE_DL_eNB_HARQ_t *dlsch1_harq,
     uint8_t pilots,
-    uint8_t mod_order,
-    uint8_t precoder_index,
     int16_t amp,
     int16_t *qam_table_s,
     uint32_t *re_allocated,
     uint8_t skip_dc,
     uint8_t skip_half,
     uint8_t use2ndpilots,
-    uint8_t Nlayers,
-    uint8_t firstlayer,
     LTE_DL_FRAME_PARMS *frame_parms);
 
     \brief Fills RB with data
     \param txdataF pointer to output data (frequency domain signal)
-    \param jj index to output
+    \param jj index to output (from CW 1)
+    \param jj index to output (from CW 2)
     \param re_offset index of the first RE of the RB
     \param symbol_offset index to the OFDM symbol
-    \param output output of the channel coder, one bit per byte
-    \param mimo_mode MIMO mode
-    \param nu Layer index
+    \param dlsch0_harq Pointer to Transport block 0 HARQ structure
+    \param dlsch0_harq Pointer to Transport block 1 HARQ structure
     \param pilots =1 if symbol_offset is an OFDM symbol that contains pilots, 0 otherwise
-    \param mod_order 2=QPSK, 4=16QAM, 6=64QAM
-    \param precoder_index 36-211 W precoder column (1 layer) or matrix (2 layer) selection index
     \param amp Amplitude for symbols
-    \param qam_table_s pointer to scaled QAM table (by rho_a or rho_b)
+    \param qam_table_s0 pointer to scaled QAM table for Transport Block 0 (by rho_a or rho_b)
+    \param qam_table_s1 pointer to scaled QAM table for Transport Block 1 (by rho_a or rho_b)
     \param re_allocated pointer to allocation counter
     \param skip_dc offset for positive RBs
     \param skip_half indicate that first or second half of RB must be skipped for PBCH/PSS/SSS
     \param use2ndpilots Set to use the pilots from antenna port 1 for PDSCH
-    \param Nlayers Number of layers for this codeword
-    \param firstlayer Index of first layer (minus 7, i.e. 0..7 <-> p=7,...,14
     \param frame_parms Frame parameter descriptor
 */
 
-int32_t allocate_REs_in_RB(mod_sym_t **txdataF,
+int32_t allocate_REs_in_RB(LTE_DL_FRAME_PARMS *frame_parms,
+			   mod_sym_t **txdataF,
 			   uint32_t *jj,
+			   uint32_t *jj2,
 			   uint16_t re_offset,
 			   uint32_t symbol_offset,
-			   uint8_t *output,
-			   MIMO_mode_t mimo_mode,
-			   uint8_t nu,
+			   LTE_DL_eNB_HARQ_t *dlsch0_harq,
+			   LTE_DL_eNB_HARQ_t *dlsch1_harq,
 			   uint8_t pilots,
-			   uint8_t mod_order,
-			   uint8_t precoder_index,
 			   int16_t amp,
-			   int16_t *qam_table_s,
+			   uint8_t precoder_index,
+			   int16_t *qam_table_s0,
+			   int16_t *qam_table_s1,
 			   uint32_t *re_allocated,
 			   uint8_t skip_dc,
-			   uint8_t skip_half,
-			   uint8_t use2ndpilots,
-			   uint8_t Nlayers,
-			   uint8_t firstlayer,
-			   LTE_DL_FRAME_PARMS *frame_parms);
+			   uint8_t skip_half);
+
 
 /** \fn int32_t dlsch_modulation(mod_sym_t **txdataF,
     int16_t amp,
@@ -201,15 +192,17 @@ int32_t allocate_REs_in_RB(mod_sym_t **txdataF,
     @param sub_frame_offset Offset of this subframe in units of subframes (usually 0)
     @param frame_parms Pointer to frame descriptor
     @param num_pdcch_symbols Number of PDCCH symbols in this subframe
-    @param dlsch Pointer to DLSCH descriptor for this allocation
+    @param dlsch0 Pointer to Transport Block 0 DLSCH descriptor for this allocation
+    @param dlsch1 Pointer to Transport Block 0 DLSCH descriptor for this allocation
 
 */ 
 int32_t dlsch_modulation(mod_sym_t **txdataF,
-		     int16_t amp,
-		     uint32_t sub_frame_offset,
-		     LTE_DL_FRAME_PARMS *frame_parms,
-		     uint8_t num_pdcch_symbols,
-		     LTE_eNB_DLSCH_t *dlsch);
+			 int16_t amp,
+			 uint32_t sub_frame_offset,
+			 LTE_DL_FRAME_PARMS *frame_parms,
+			 uint8_t num_pdcch_symbols,
+			 LTE_eNB_DLSCH_t *dlsch0,
+			 LTE_eNB_DLSCH_t *dlsch1);
 /*
   \brief This function is the top-level routine for generation of the sub-frame signal (frequency-domain) for MCH.  
   @param txdataF Table of pointers for frequency-domain TX signals
@@ -861,6 +854,7 @@ void dlsch_detection_mrc(LTE_DL_FRAME_PARMS *frame_parms,
     @param rb_alloc RB allocation vector
     @param symbol Symbol to extract
     @param subframe Subframe number
+    @param high_speed_flag
     @param frame_parms Pointer to frame descriptor
 */
 uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
@@ -872,6 +866,7 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
 				  uint32_t *rb_alloc,
 				  uint8_t symbol,
 				  uint8_t subframe,
+				  uint32_t high_speed_flag,
 				  LTE_DL_FRAME_PARMS *frame_parms);
 
 /** \fn dlsch_extract_rbs_dual(int32_t **rxdataF,
@@ -894,6 +889,7 @@ uint16_t dlsch_extract_rbs_single(int32_t **rxdataF,
     @param rb_alloc RB allocation vector
     @param symbol Symbol to extract
     @param subframe Subframe index
+    @param high_speed_flag
     @param frame_parms Pointer to frame descriptor
 */
 uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
@@ -905,6 +901,7 @@ uint16_t dlsch_extract_rbs_dual(int32_t **rxdataF,
 				uint32_t *rb_alloc,
 				uint8_t symbol,
 				uint8_t subframe,
+				uint32_t high_speed_flag,
 				LTE_DL_FRAME_PARMS *frame_parms);
 
 /** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation.  In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
@@ -944,7 +941,7 @@ void dlsch_dual_stream_correlation(LTE_DL_FRAME_PARMS *frame_parms,
                                    int **dl_ch_rho_ext,
                                    unsigned char output_shift);
 
-void dlsch_channel_compensation_prec(int **rxdataF_ext,
+void dlsch_channel_compensation_TM56(int **rxdataF_ext,
 				     int **dl_ch_estimates_ext,
 				     int **dl_ch_mag,
 				     int **dl_ch_magb,
@@ -959,6 +956,17 @@ void dlsch_channel_compensation_prec(int **rxdataF_ext,
 				     unsigned char output_shift,
 				     unsigned char dl_power_off);
 
+void dlsch_channel_compensation_TM3(LTE_DL_FRAME_PARMS *frame_parms,
+				    LTE_UE_PDSCH *lte_ue_pdsch_vars,
+				    PHY_MEASUREMENTS *phy_measurements,
+				    int eNB_id,
+				    unsigned char symbol,
+				    unsigned char mod_order0,
+				    unsigned char mod_order1,
+				    unsigned short nb_rb,
+				    unsigned char output_shift);
+
+
 /** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
     @param dl_ch_estimates_ext Channel estimates in allocated RBs
     @param frame_parms Pointer to frame descriptor
@@ -972,7 +980,13 @@ void dlsch_channel_level(int32_t **dl_ch_estimates_ext,
 			 uint8_t pilots_flag,
 			 uint16_t nb_rb);
 
-void dlsch_channel_level_prec(int32_t **dl_ch_estimates_ext,
+void dlsch_channel_level_TM3(int **dl_ch_estimates_ext,
+			     LTE_DL_FRAME_PARMS *frame_parms,
+			     int *avg,
+			     uint8_t symbol,
+			     unsigned short nb_rb);
+
+void dlsch_channel_level_TM56(int32_t **dl_ch_estimates_ext,
                               LTE_DL_FRAME_PARMS *frame_parms,
                               unsigned char *pmi_ext,
                               int32_t *avg,
@@ -1045,12 +1059,13 @@ int32_t rx_pdsch(PHY_VARS_UE *phy_vars_ue,
 	     uint8_t harq_pid);
 
 int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
-	     LTE_UE_PDCCH **lte_ue_pdcch_vars,
-	     LTE_DL_FRAME_PARMS *frame_parms,
-	     uint8_t subframe,
-	     uint8_t eNB_id,
-	     MIMO_mode_t mimo_mode,
-	     uint8_t is_secondary_ue);
+		 LTE_UE_PDCCH **lte_ue_pdcch_vars,
+		 LTE_DL_FRAME_PARMS *frame_parms,
+		 uint8_t subframe,
+		 uint8_t eNB_id,
+		 MIMO_mode_t mimo_mode,
+		 uint32_t high_speed_flag,
+		 uint8_t is_secondary_ue);
 /*! \brief Performs detection of SSS to find cell ID and other framing parameters (FDD/TDD, normal/extended prefix)
   @param phy_vars_ue Pointer to UE variables
   @param tot_metric Pointer to variable containing maximum metric under framing hypothesis (to be compared to other hypotheses
@@ -1069,6 +1084,7 @@ uint16_t rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
 		 LTE_DL_FRAME_PARMS *frame_parms,
 		 uint8_t eNB_id,
 		 MIMO_mode_t mimo_mode,
+		 uint32_t high_speed_flag,
 		 uint8_t frame_mod4);
 
 uint16_t rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
@@ -1144,12 +1160,12 @@ uint16_t extract_crc(uint8_t *dci,uint8_t DCI_LENGTH);
   \param stream0_out pointer to output stream
   \param rho01 pointer to correlation matrix
   \param length*/ 
-void qpsk_qpsk_prec(short *stream0_in,
-		    short *stream1_in,
-		    short *stream0_out,
-		    short *rho01,
-		    int length
-		    );
+void qpsk_qpsk_TM3456(short *stream0_in,
+		      short *stream1_in,
+		      short *stream0_out,
+		      short *rho01,
+		      int length
+		      );
 
 /** \brief Attempt decoding of a particular DCI with given length and format.
     @param DCI_LENGTH length of DCI in bits
@@ -1710,10 +1726,7 @@ void init_prach_tables(int N_ZC);
 */
 int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parms);
  
-//ICIC algos
-uint8_t Get_SB_size(uint8_t n_rb_dl);
-//end ALU's algo
-
+uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots);
 
 uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB,
 				    LTE_DL_FRAME_PARMS *lte_frame_parms,
@@ -1725,12 +1738,13 @@ uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB,
 double get_pa_dB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated);
 
 double computeRhoA_eNB(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,  
-                       LTE_eNB_DLSCH_t *dlsch_eNB );
+                       LTE_eNB_DLSCH_t *dlsch_eNB,
+		       int dl_power_off);
 
 double computeRhoB_eNB(PDSCH_CONFIG_DEDICATED  *pdsch_config_dedicated,
                        PDSCH_CONFIG_COMMON *pdsch_config_common,
                        uint8_t n_antenna_port,
-                       LTE_eNB_DLSCH_t *dlsch_eNB);
+                       LTE_eNB_DLSCH_t *dlsch_eNB,int dl_power_off);
 
 double computeRhoA_UE(PDSCH_CONFIG_DEDICATED *pdsch_config_dedicated,  
                       LTE_UE_DLSCH_t *dlsch_ue,
diff --git a/openair1/PHY/LTE_TRANSPORT/uci_tools.c b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
index 9530a956d1a588e03f1d6c863450410702d44b1e..39e703c093f76b2bca3e684f54320b91056602aa 100644
--- a/openair1/PHY/LTE_TRANSPORT/uci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/uci_tools.c
@@ -44,7 +44,7 @@
 #ifdef DEBUG_UCI_TOOLS
 #include "PHY/vars.h"
 #endif
-//#define DEBUG_UCI
+#define DEBUG_UCI
 
 uint64_t pmi2hex_2Ar1(uint32_t pmi) {
 
diff --git a/openair1/PHY/LTE_TRANSPORT/vars.h b/openair1/PHY/LTE_TRANSPORT/vars.h
index 37966ec07e76cb56d496f82fe771c360f6fbf649..21e413f2ce16b9e108c79ac347a9b6afe653aaeb 100644
--- a/openair1/PHY/LTE_TRANSPORT/vars.h
+++ b/openair1/PHY/LTE_TRANSPORT/vars.h
@@ -76,9 +76,8 @@ unsigned char cs_ack_extended[4] = {1,2,6,7};
 
 //unsigned short scfdma_amps[25] = {0,5120,3620,2956,2560,2290,2090,1935,1810,1706,1619,1544,1478,1420,1368,1322,1280,1242,1207,1175,1145,1117,1092,1068,1045,1024};
 
-char dci_format_strings[15][13] = {"0","1","1A","1B","1C","1D",
-				   "2_2A_L10PRB","2_2A_M10PRB","2_4A_L10PRB","2_4A_M10PRB",
-				   "2A_2A_L10PRB","2A_2A_M10PRB","2A_4A_L10PRB","2A_4A_M10PRB",
+char dci_format_strings[15][13] = {"0","1","1A","1B","1C","1D","1E_2A_M10PRB",
+				   "2","2A","2B","2C","2D",
 				   "3"};
 
 uint8_t wACK[5][4] = {{1,1,1,1},{1,0,1,0},{1,1,0,0},{1,0,0,1},{0,0,0,0}};
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index 716271fc3bd80f74cb05cf6cbf94d0042be1a246..0455e9904597d501c8f4d6514bbe69b791d2bc70 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -498,7 +498,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
     pdcch_comp = (int16_t*) phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0];
     pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0]; // stream 0
     //    pdsch_llr = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars_SI[eNB_id]->llr[0]; // stream 0
-    pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp[0];
+    pdsch_comp = (int16_t*) phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->rxdataF_comp0[0];
     
     // Received signal in time domain of receive antenna 0
     if (rxsig_t != NULL) { 
@@ -633,22 +633,22 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
 
     // PDSCH LLRs
     if (pdsch_llr != NULL) {
-        for (i=0; i<coded_bits_per_codeword; i++) {
-            llr[i] = (float) pdsch_llr[i];
+        for (i=0; i<coded_bits_per_codeword/4; i++) {
+            llr[i] = (float) pdsch_llr[4*i];
             bit[i] = (float) i;
         }
 
-        fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword);        
-        fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword,"","","");
+        fl_set_xyplot_xbounds(form->pdsch_llr,0,coded_bits_per_codeword/4);        
+        fl_set_xyplot_data(form->pdsch_llr,bit,llr,coded_bits_per_codeword/4,"","","");
     }
     
     // PDSCH I/Q of MF Output
     if (pdsch_comp!=NULL) {
         ind=0;
         for (k=0; k<frame_parms->symbols_per_tti; k++) {
-            for (i=0; i<12*frame_parms->N_RB_DL; i++) {
-                I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+2*i];
-                Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+2*i+1];
+            for (i=0; i<12*frame_parms->N_RB_DL/2; i++) {
+                I[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i];
+                Q[ind] = pdsch_comp[(2*frame_parms->N_RB_DL*12*k)+4*i+1];
                 ind++;
             }
         }
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 245c8d0d203715bde96013efe78b56af8f193e5e..dc98c0ff72709441d959fb61d23f03dc5c0d6c55 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -425,6 +425,9 @@ typedef struct
   
   uint32_t X_u[64][839];
 
+  uint32_t high_speed_flag;
+  int16_t ch_est_alpha;
+
   char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX];
 
   unsigned char ulsch_ue_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX];
diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h
index e8b2ffd0da0118ac4191482c697ccabce2941784..a9ebbe0518d4766e7aac8126bab780dd70ef1b2b 100644
--- a/openair1/PHY/impl_defs_lte.h
+++ b/openair1/PHY/impl_defs_lte.h
@@ -527,7 +527,7 @@ typedef struct {
 typedef enum {
   SISO=0,
   ALAMOUTI=1,
-  ANTCYCLING=2,
+  LARGE_CDD=2,
   UNIFORM_PRECODING11=3,
   UNIFORM_PRECODING1m1=4,
   UNIFORM_PRECODING1j=5,
@@ -630,17 +630,23 @@ typedef struct {
   /// Received frequency-domain signal after extraction
   int32_t **rxdataF_ext;
   /// Received frequency-domain signal after extraction and channel compensation
-  int32_t **rxdataF_comp;
+  int32_t **rxdataF_comp0;
+  /// Received frequency-domain signal after extraction and channel compensation
+  int32_t **rxdataF_comp1;
   /// Downlink channel estimates extracted in PRBS
   int32_t **dl_ch_estimates_ext;
   /// Downlink cross-correlation of MIMO channel estimates (unquantized PMI) extracted in PRBS
   int32_t **dl_ch_rho_ext;
   /// Downlink PMIs extracted in PRBS and grouped in subbands
   uint8_t *pmi_ext;
-  /// Magnitude of Downlink Channel (16QAM level/First 64QAM level)
-  int32_t **dl_ch_mag;
-  /// Magnitude of Downlink Channel (2nd 64QAM level)
-  int32_t **dl_ch_magb;
+  /// Magnitude of Downlink Channel first layer (16QAM level/First 64QAM level)
+  int32_t **dl_ch_mag0;
+  /// Magnitude of Downlink Channel second layer (16QAM level/First 64QAM level)
+  int32_t **dl_ch_mag1;
+  /// Magnitude of Downlink Channel, first layer (2nd 64QAM level)
+  int32_t **dl_ch_magb0;
+  /// Magnitude of Downlink Channel second layer (2nd 64QAM level)
+  int32_t **dl_ch_magb1;
   /// Cross-correlation of two eNB signals
   int32_t **rho;
   /// never used... always send dl_ch_rho_ext instead...
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index be9b619b862f4737978068c3016e5226d1ca85f2..66857b9dc13bf1dc714ad64bb2da4b4630d9c2da 100755
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -406,7 +406,7 @@ typedef struct
   //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
   int            rx_correlation_dB[NUMBER_OF_CONNECTED_eNB_MAX][2];         
 
-  /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (4,5,6), up to 4 spatial streams)
+  /// Wideband CQI (sum of all RX antennas, in dB, for precoded transmission modes (3,4,5,6), up to 4 spatial streams)
   int            precoded_cqi_dB[NUMBER_OF_CONNECTED_eNB_MAX+1][4];                               
   /// Subband CQI per RX antenna (= SINR)
   int            subband_cqi[NUMBER_OF_CONNECTED_eNB_MAX][NB_ANTENNAS_RX][NUMBER_OF_SUBBANDS_MAX];  
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index dc55a084d4f95eabfa390b8151538b818d43833e..72472178b5d38d82bc80ba4c9ce4c8f32aca466d 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1789,8 +1789,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 		       0,
 		       phy_vars_eNB->dlsch_eNB_SI,
 		       get_G(&phy_vars_eNB->lte_frame_parms,
-			     phy_vars_eNB->dlsch_eNB_SI->nb_rb,
-			     phy_vars_eNB->dlsch_eNB_SI->rb_alloc,
+			     phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->nb_rb,
+			     phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc,
 			     get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs),
 			     1,
 			     num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
@@ -1805,7 +1805,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 				      subframe,
 				      &phy_vars_eNB->lte_frame_parms,
 				      num_pdcch_symbols,
-				      phy_vars_eNB->dlsch_eNB_SI);
+				      phy_vars_eNB->dlsch_eNB_SI,
+				      (LTE_eNB_DLSCH_t *)NULL);
       stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
     } 
 #ifdef PHY_ABSTRACTION
@@ -1917,8 +1918,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 			 0,
 			 phy_vars_eNB->dlsch_eNB_ra,
 			 get_G(&phy_vars_eNB->lte_frame_parms,
-			       phy_vars_eNB->dlsch_eNB_ra->nb_rb,
-			       phy_vars_eNB->dlsch_eNB_ra->rb_alloc,
+			       phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->nb_rb,
+			       phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc,
 			       get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs),
 			       1,
 			       num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
@@ -1930,7 +1931,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 					subframe,
 					&phy_vars_eNB->lte_frame_parms,
 					num_pdcch_symbols,
-					phy_vars_eNB->dlsch_eNB_ra);
+					phy_vars_eNB->dlsch_eNB_ra,
+					(LTE_eNB_DLSCH_t *)NULL);
       }
 #ifdef PHY_ABSTRACTION
       else {
@@ -1967,14 +1969,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 	    phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid,
 	    phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length,
 	    get_G(&phy_vars_eNB->lte_frame_parms,
-		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb,
-		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc,
+		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
+		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
 		  get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
 		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
 		  num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb,
+	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
 	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs,
-	    pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->pmi_alloc),
+	    pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc),
 	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx,
 	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round);
 #endif
@@ -2042,8 +2044,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 			 0,
 			 phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
 			 get_G(&phy_vars_eNB->lte_frame_parms,
-			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb,
-			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc,
+			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
+			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
 			       get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
 			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
 			       num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
@@ -2066,7 +2068,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 					subframe,
 					&phy_vars_eNB->lte_frame_parms,
 					num_pdcch_symbols,
-					phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]);
+					phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
+					phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]);
       
 	stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
       }
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index f885fbf1eb8c4834193056509adf33c9a90260ed..2ddbab1a497842d2bf92888064398c738607dc96 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -163,11 +163,11 @@ void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t
     write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1);
     write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1);
   */
-  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp[0],300*12,1,1);
+  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars[0]->rxdataF_comp0[0],300*12,1,1);
   write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars[0]->llr[0],coded_bits_per_codeword,1,0);
   
-  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag,300*12,1,1);
-  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb,300*12,1,1);
+  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_mag0,300*12,1,1);
+  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars[0]->dl_ch_magb0,300*12,1,1);
 }
 
 void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
@@ -198,11 +198,11 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
     write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1);
     write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1);
   */
-  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp[0],300*nsymb,1,1);
+  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->rxdataF_comp0[0],300*nsymb,1,1);
   write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_SI[0]->llr[0],coded_bits_per_codeword,1,0);
   
-  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag,300*nsymb,1,1);
-  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb,300*nsymb,1,1);
+  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_mag0,300*nsymb,1,1);
+  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_SI[0]->dl_ch_magb0,300*nsymb,1,1);
   exit(-1);
 }
 
@@ -251,11 +251,11 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe) {
     write_output("dlsch11_ch0_ext.m","dl11_ch0_ext",lte_ue_pdsch_vars[0]->dl_ch_estimates_ext[3],300*12,1,1);
     write_output("dlsch_rho.m","dl_rho",lte_ue_pdsch_vars[0]->rho[0],300*12,1,1);
   */
-  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp[0],300*nsymb,1,1);
+  write_output("dlsch_rxF_comp0.m","dlsch0_rxF_comp0", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->rxdataF_comp0[0],300*nsymb,1,1);
   write_output("dlsch_rxF_llr.m","dlsch_llr", phy_vars_ue->lte_ue_pdsch_vars_ra[0]->llr[0],coded_bits_per_codeword,1,0);
   
-  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag,300*nsymb,1,1);
-  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb,300*nsymb,1,1);
+  write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1);
+  write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1);
 }
 #endif
 
@@ -1187,7 +1187,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 #endif //else EXMIMO
 
 	start_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
-	for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) {
+	for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
 	    if (frame_parms->Ncp == 1) 
 	      PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
 #ifdef EXMIMO
@@ -1711,6 +1711,7 @@ void lte_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 			    &phy_vars_ue->lte_frame_parms,
 			    eNB_id,
 			    phy_vars_ue->lte_frame_parms.mode1_flag==1?SISO:ALAMOUTI,
+			    phy_vars_ue->high_speed_flag,
 			    pbch_phase);
 
 
@@ -1893,6 +1894,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 	     subframe_rx,
 	     eNB_id,
 	     (phy_vars_ue->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
+	     phy_vars_ue->high_speed_flag,
 	     phy_vars_ue->is_secondary_ue);
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT);
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN);
@@ -2056,8 +2058,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 	return(-1);
       }
 #endif
-      
-
+       
+      //      dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
       if (generate_ue_dlsch_params_from_dci(subframe_rx,
 					    (void *)&dci_alloc_rx[i].dci_pdu,
 					    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
@@ -2558,7 +2560,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 		phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
 	    
 	    //	    if (abstraction_flag ==0 )
-	    //	      dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
+	    //dump_dlsch(phy_vars_ue,eNB_id,subframe_prev,harq_pid);
+	    //mac_xface->macphy_exit("");
 #endif
 	  }
 	  else {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index e5cfb6ba0db430d701f4cab98fc8b5bf8a294b44..66e5c25d149ec2e3b6fbc3f81184ac244f652b9c 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -165,11 +165,19 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi
   generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
   
   // DL power control init
-  PHY_vars_eNB->pdsch_config_dedicated->p_a  = 4; // 4 = 0dB
-  ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = (lte_frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
+  if (transmission_mode == 1) { 
+    PHY_vars_eNB->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 0;
+    PHY_vars_UE->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 0; 
+  }
+  else {(lte_frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
+    PHY_vars_eNB->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((PHY_vars_eNB->lte_frame_parms).pdsch_config_common).p_b = 1;
+    PHY_vars_UE->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = 1;
+  }
 
-  PHY_vars_UE->pdsch_config_dedicated->p_a  = 4; // 4 = 0dB
-  ((PHY_vars_UE->lte_frame_parms).pdsch_config_common).p_b = (lte_frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
 
   printf("Done lte_param_init\n");
 
@@ -232,11 +240,11 @@ int main(int argc, char **argv) {
   double forgetting_factor=0.0; //in [0,1] 0 means a new channel every time, 1 means keep the same channel
   double iqim=0.0;
 
-  uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx=1,n_rx=1;
+  uint8_t extended_prefix_flag=0,transmission_mode=1,n_tx=1,n_rx=2;
   uint16_t Nid_cell=0;
 
   int eNB_id = 0, eNB_id_i = 1;
-  unsigned char mcs=0,mcs1=0,mcs2=0,mcs_i=0,dual_stream_UE = 0,awgn_flag=0,round,dci_flag=0;
+  unsigned char mcs1=0,mcs2=0,mcs_i=0,dual_stream_UE = 0,awgn_flag=0,round,dci_flag=0;
   unsigned char i_mod = 2;
   unsigned short NB_RB;
   unsigned char Ns,l,m;
@@ -247,8 +255,8 @@ int main(int argc, char **argv) {
   SCM_t channel_model=Rayleigh1;
   //  unsigned char *input_data,*decoded_output;
 
-  unsigned char *input_buffer[2];
-  unsigned short input_buffer_length;
+  unsigned char *input_buffer0[2],*input_buffer1[2];
+  unsigned short input_buffer_length0,input_buffer_length1;
   unsigned int ret;
   unsigned int coded_bits_per_codeword=0,nsymb,dci_cnt,tbs=0;
  
@@ -325,6 +333,9 @@ int main(int argc, char **argv) {
 
   double effective_rate=0.0;
   char channel_model_input[10]="I";
+
+  int TB0_active = 1;
+
   opp_enabled=1; // to enable the time meas
 
   cpu_freq_GHz = (double)get_cpu_freq_GHz();
@@ -341,7 +352,7 @@ int main(int argc, char **argv) {
   snr0 = 0;
   num_layers = 1;
 
-  while ((c = getopt (argc, argv, "hadpDe:m:n:o:s:f:t:c:g:r:F:x:y:z:MN:I:i:O:R:S:C:T:b:u:v:w:B:PLl:")) != -1) {
+  while ((c = getopt (argc, argv, "hadpDe:m:n:o:s:f:t:c:g:r:F:x:y:z:AM:N:I:i:O:R:S:C:T:b:u:v:w:B:PLl:")) != -1) {
     switch (c)
       {
       case 'a':
@@ -358,7 +369,10 @@ int main(int argc, char **argv) {
 	dci_flag = 1;
 	break;
       case 'm':
-	mcs = atoi(optarg);
+	mcs1 = atoi(optarg);
+	break;
+      case 'M':
+	mcs2 = atoi(optarg);
 	break;
       case 't':
 	mcs_i = atoi(optarg);
@@ -392,7 +406,7 @@ int main(int argc, char **argv) {
       case 'f':
 	input_snr_step= atof(optarg);
 	break;
-      case 'M':
+      case 'A':
 	abstx = 1;
 	break;
       case 'N':
@@ -458,6 +472,7 @@ int main(int argc, char **argv) {
 	transmission_mode=atoi(optarg);
 	if ((transmission_mode!=1) &&
 	    (transmission_mode!=2) &&
+	    (transmission_mode!=3) &&
 	    (transmission_mode!=5) &&
 	    (transmission_mode!=6)) {
 	  msg("Unsupported transmission mode %d\n",transmission_mode);
@@ -534,11 +549,12 @@ int main(int argc, char **argv) {
 	break;
       case 'h':
       default:
-	printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]);
+	printf("%s -h(elp) -a(wgn on) -d(ci decoding on) -p(extended prefix on) -m mcs1 -M mcs2 -n n_frames -s snr0 -x transmission mode (1,2,5,6) -y TXant -z RXant -I trch_file\n",argv[0]);
 	printf("-h This message\n");
 	printf("-a Use AWGN channel and not multipath\n");
 	printf("-c Number of PDCCH symbols\n");
-	printf("-m MCS\n");
+	printf("-m MCS1 for TB 1\n");
+	printf("-M MCS2 for TB 2\n");
 	printf("-d Transmit the DCI and compute its error statistics and the overall throughput\n");
 	printf("-p Use extended prefix mode\n");
 	printf("-n Number of frames to simulate\n");
@@ -590,6 +606,9 @@ int main(int argc, char **argv) {
 
   NB_RB=conv_nprb(0,DLSCH_RB_ALLOC,N_RB_DL);
 
+  if ((transmission_mode > 1) && (n_tx != 2))
+    printf("n_tx must be >1 for transmission_mode %d\n",transmission_mode);
+
 #ifdef XFORMS
   fl_initialize (&argc, argv, NULL, 0, 0);
   form_ue = create_lte_phy_scope_ue();
@@ -613,7 +632,8 @@ int main(int argc, char **argv) {
 
   eNB_id_i = PHY_vars_UE->n_connected_eNB;
   
-  printf("Setting mcs = %d\n",mcs);
+  printf("Setting mcs1 = %d\n",mcs1);
+  printf("Setting mcs2 = %d\n",mcs2);
   printf("NPRB = %d\n",NB_RB);
   printf("n_frames = %d\n",n_frames);
   printf("Transmission mode %d with %dx%d antenna configuration, Extended Prefix %d\n",transmission_mode,n_tx,n_rx,extended_prefix_flag);
@@ -647,9 +667,9 @@ int main(int argc, char **argv) {
 	 SCM_A, SCM_B, SCM_C, SCM_D, EPA, EVA, ETU, Rayleigh8, Rayleigh1, Rayleigh1_corr, Rayleigh1_anticorr, Rice1, Rice8);
   
   if(transmission_mode==5)
-    sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,channel_model,n_rx,mcs,mcs_i,dual_stream_UE,i_mod);
+    sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d_mcsi%d_u%d_imod%d.csv",transmission_mode,channel_model,n_rx,mcs1,mcs_i,dual_stream_UE,i_mod);
   else
-    sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d.csv",transmission_mode,channel_model,n_rx,mcs);
+    sprintf(bler_fname,"bler_tx%d_chan%d_nrx%d_mcs%d.csv",transmission_mode,channel_model,n_rx,mcs1);
   
   bler_fd = fopen(bler_fname,"w");
   fprintf(bler_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n");
@@ -662,16 +682,16 @@ int main(int argc, char **argv) {
     char dirname[FILENAME_MAX];
     sprintf(dirname, "%s/SIMU/USER/pre-ci-logs-%s", getenv("OPENAIR_TARGETS"),hostname ); 
     sprintf(time_meas_fname,"%s/time_meas_prb%d_mcs%d_anttx%d_antrx%d_pdcch%d_channel%s_tx%d.csv",
-	    dirname,N_RB_DL,mcs,n_tx,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode);
+	    dirname,N_RB_DL,mcs1,n_tx,n_rx,num_pdcch_symbols,channel_model_input,transmission_mode);
     mkdir(dirname,0777); 
     time_meas_fd = fopen(time_meas_fname,"w");
   }
   
   if(abstx){
     // CSV file 
-    sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d.m",transmission_mode,dual_stream_UE,mcs,channel_model,n_frames,num_rounds);
+    sprintf(csv_fname,"dataout_tx%d_u2%d_mcs%d_chan%d_nsimus%d_R%d.m",transmission_mode,dual_stream_UE,mcs1,channel_model,n_frames,num_rounds);
     csv_fd = fopen(csv_fname,"w");
-    fprintf(csv_fd,"data_all%d=[",mcs);
+    fprintf(csv_fd,"data_all%d=[",mcs1);
   }
 
   /*
@@ -807,7 +827,7 @@ int main(int argc, char **argv) {
   DLSCH_alloc_pdu2_1E[0].dai              = 0;
   DLSCH_alloc_pdu2_1E[0].harq_pid         = 0;
   //DLSCH_alloc_pdu2_1E[0].tb_swap          = 0;
-  DLSCH_alloc_pdu2_1E[0].mcs             = mcs;  
+  DLSCH_alloc_pdu2_1E[0].mcs             = mcs1;  
   DLSCH_alloc_pdu2_1E[0].ndi             = 1;
   DLSCH_alloc_pdu2_1E[0].rv              = 0;
   // Forget second codeword
@@ -834,7 +854,7 @@ int main(int argc, char **argv) {
 				   forgetting_factor,
 				   rx_sample_offset,
 				   0);
-  if(abstx==1 && num_rounds>1){
+  if(num_rounds>1){
     for(n=1;n<4;n++)
       eNB2UE[n] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
 				       PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
@@ -916,7 +936,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -928,7 +948,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -940,7 +960,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_10MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -950,7 +970,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_20MHz_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      dci_length = sizeof_DCI1_20MHz_TDD_t;
@@ -967,7 +987,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
 	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -978,7 +998,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
 	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -989,7 +1009,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
 	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1000,7 +1020,7 @@ int main(int argc, char **argv) {
 	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
 	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
 	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 1;
 	      ((DCI1_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1042,7 +1062,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1055,7 +1075,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 1;
 	      break;
@@ -1068,7 +1088,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1079,7 +1099,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
@@ -1097,7 +1117,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1109,7 +1129,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1121,7 +1141,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1133,7 +1153,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1147,24 +1167,319 @@ int main(int argc, char **argv) {
 	  dci_alloc[num_dci].nCCE       = 0;
 	  dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);	
 
-	    printf("Generating dlsch params for user %d\n",k);
-	    generate_eNB_dlsch_params_from_dci(0,
-					       &DLSCH_alloc_pdu_1[0],
-					       SI_RNTI,
-					       format1A,
-					       PHY_vars_eNB->dlsch_eNB[0],
-					       &PHY_vars_eNB->lte_frame_parms,
-					       PHY_vars_eNB->pdsch_config_dedicated,
-					       SI_RNTI,
-					       0,
-					       P_RNTI,
-					       PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+	  printf("Generating dlsch params for user %d\n",k);
+	  generate_eNB_dlsch_params_from_dci(0,
+					     &DLSCH_alloc_pdu_1[0],
+					     SI_RNTI,
+					     format1A,
+					     PHY_vars_eNB->dlsch_eNB[0],
+					     &PHY_vars_eNB->lte_frame_parms,
+					     PHY_vars_eNB->pdsch_config_dedicated,
+					     SI_RNTI,
+					     0,
+					     P_RNTI,
+					     PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
 	  
 	  num_common_dci++;
 	  num_dci++;
+	  
+	}
+	break;
+      case 3:
+	if (common_flag == 0) {
+	  
+	  if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) {
+
+	    if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+	      
+	      switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+	      case 6:
+		dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t;
+		dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t);
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      case 25:
+		dci_length = sizeof_DCI2A_5MHz_2A_TDD_t;
+		dci_length_bytes = sizeof(DCI2A_5MHz_2A_TDD_t);
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah              = 0;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      case 50:
+		dci_length = sizeof_DCI2A_10MHz_2A_TDD_t;
+		dci_length_bytes = sizeof(DCI2A_10MHz_2A_TDD_t);
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah              = 0;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      case 100:
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rah              = 0;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		dci_length = sizeof_DCI2A_20MHz_2A_TDD_t;
+		dci_length_bytes = sizeof(DCI2A_20MHz_2A_TDD_t);
+		break;
+	      }
+	    }
+	  
+	    else {
+	      switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+	      case 6:
+		dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t;
+		dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t);
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      case 25:
+		dci_length = sizeof_DCI2A_5MHz_2A_FDD_t;
+		dci_length_bytes = sizeof(DCI2A_5MHz_2A_FDD_t);
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah              = 0;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      case 50:
+		dci_length = sizeof_DCI2A_10MHz_2A_FDD_t;
+		dci_length_bytes = sizeof(DCI2A_10MHz_2A_FDD_t);
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah              = 0;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      case 100:
+		dci_length = sizeof_DCI2A_20MHz_2A_FDD_t;
+		dci_length_bytes = sizeof(DCI2A_20MHz_2A_FDD_t);
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rah              = 0;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = DLSCH_RB_ALLOC;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = 0;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs1             = mcs1;  
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi1             = 1;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv1              = 0;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs2             = mcs2;  
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi2             = 1;
+		((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv2              = 0;
+		break;
+	      }	  
+	    }
+	  }
+	  else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) {
 
+	  }
+      
+	  memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+	  dci_alloc[num_dci].dci_length = dci_length;
+	  dci_alloc[num_dci].L          = 1;
+	  dci_alloc[num_dci].rnti       = n_rnti+k;
+	  dci_alloc[num_dci].format     = format2A;
+	  dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);	
+	  
+	  printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A);
+	  generate_eNB_dlsch_params_from_dci(0,
+					     &DLSCH_alloc_pdu_1[0],
+					     n_rnti+k,
+					     format2A,
+					     PHY_vars_eNB->dlsch_eNB[0],
+					     &PHY_vars_eNB->lte_frame_parms,
+					     PHY_vars_eNB->pdsch_config_dedicated,
+					     SI_RNTI,
+					     0,
+					     P_RNTI,
+					     PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+	  
+	  num_dci++;
+	  num_ue_spec_dci++;
 	}
+	else {
+	  if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+	    
+	    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+	    case 6:
+	      dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
+	      dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      break;
+	    case 25:
+	      dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+	      dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,3);
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 1;
+	      break;
+	    case 50:
+	      dci_length = sizeof_DCI1A_10MHz_TDD_1_6_t;
+	      dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      break;
+	    case 100:
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
+	      dci_length_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
+	      break;
+	    }
+	  }
+	  else {
+	    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+	    case 6:
+	      dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
+	      dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      break;
+	    case 25:
+	      dci_length = sizeof_DCI1A_5MHz_FDD_t;
+	      dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      break;
+	    case 50:
+	      dci_length = sizeof_DCI1A_10MHz_FDD_t;
+	      dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      break;
+	    case 100:
+	      dci_length = sizeof_DCI1A_20MHz_FDD_t;
+	      dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
+	      break;
+	    }	  
+	  }
+	  memcpy(&dci_alloc[num_dci].dci_pdu[0],&DLSCH_alloc_pdu_1[k],dci_length_bytes);
+	  dci_alloc[num_dci].dci_length = dci_length;
+	  dci_alloc[num_dci].L          = 1;
+	  dci_alloc[num_dci].rnti       = SI_RNTI;
+	  dci_alloc[num_dci].format     = format1A;
+	  dci_alloc[num_dci].nCCE       = 0;
+	  dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);	
+	  
+	  printf("Generating dlsch params for user %d\n",k);
+	  generate_eNB_dlsch_params_from_dci(0,
+					     &DLSCH_alloc_pdu_1[0],
+					     SI_RNTI,
+					     format1A,
+					     PHY_vars_eNB->dlsch_eNB[0],
+					     &PHY_vars_eNB->lte_frame_parms,
+					     PHY_vars_eNB->pdsch_config_dedicated,
+					     SI_RNTI,
+					     0,
+					     P_RNTI,
+					     PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+	  
+	  num_common_dci++;
+	  num_dci++;
+	  
+	}
+	printf("Generated DCI format 2A (Transmission Mode 3)\n");
 	break;
+
       case 4:
 	if (common_flag == 0) {
 	  
@@ -1303,14 +1618,14 @@ int main(int argc, char **argv) {
 	  dci_alloc[num_dci].dci_length = dci_length;
 	  dci_alloc[num_dci].L          = 1;
 	  dci_alloc[num_dci].rnti       = n_rnti+k;
-	  dci_alloc[num_dci].format     = format1;
+	  dci_alloc[num_dci].format     = format2;
 	  dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);	
 	  
 	  printf("Generating dlsch params for user %d\n",k);
 	  generate_eNB_dlsch_params_from_dci(0,
 					     &DLSCH_alloc_pdu_1[0],
 					     n_rnti+k,
-					     format1,
+					     format2,
 					     PHY_vars_eNB->dlsch_eNB[0],
 					     &PHY_vars_eNB->lte_frame_parms,
 					     PHY_vars_eNB->pdsch_config_dedicated,
@@ -1335,7 +1650,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1348,7 +1663,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 1;
 	      break;
@@ -1361,7 +1676,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1372,7 +1687,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      dci_length = sizeof_DCI1A_20MHz_TDD_1_6_t;
@@ -1390,7 +1705,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1402,7 +1717,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1414,7 +1729,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1426,7 +1741,7 @@ int main(int argc, char **argv) {
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,4);
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
-	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs;  
+	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;  
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->ndi             = 0;
 	      ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rv              = 0;
 	      break;
@@ -1520,27 +1835,33 @@ int main(int argc, char **argv) {
     
     for (k=0;k<n_users;k++) {
 
-      input_buffer_length = PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->TBS/8;
-      input_buffer[k] = (unsigned char *)malloc(input_buffer_length+4);
-      memset(input_buffer[k],0,input_buffer_length+4);
+      input_buffer_length0 = PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->TBS/8;
+      input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4);
+      memset(input_buffer0[k],0,input_buffer_length0+4);
+      input_buffer_length1 = PHY_vars_eNB->dlsch_eNB[k][1]->harq_processes[0]->TBS/8;
+      input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4);
+      memset(input_buffer1[k],0,input_buffer_length1+4);
 
       if (input_trch_file==0) {
-	for (i=0;i<input_buffer_length;i++) {
-	  input_buffer[k][i]= (unsigned char)(taus()&0xff);
+	for (i=0;i<input_buffer_length0;i++) {
+	  input_buffer0[k][i]= (unsigned char)(taus()&0xff);
+	}
+	for (i=0;i<input_buffer_length1;i++) {
+	  input_buffer1[k][i]= (unsigned char)(taus()&0xff);
 	}
       }
       
       else {
 	i=0;
-	while ((!feof(input_trch_fd)) && (i<input_buffer_length<<3)) {
+	while ((!feof(input_trch_fd)) && (i<input_buffer_length0<<3)) {
 	  ret=fscanf(input_trch_fd,"%s",input_trch_val);
 	  if (input_trch_val[0] == '1')
-	    input_buffer[k][i>>3]+=(1<<(7-(i&7)));
+	    input_buffer0[k][i>>3]+=(1<<(7-(i&7)));
 	  if (i<16)
 	    printf("input_trch_val %d : %c\n",i,input_trch_val[0]);
 	  i++;
 	  if (((i%8) == 0) && (i<17))
-	    printf("%x\n",input_buffer[k][(i-1)>>3]);
+	    printf("%x\n",input_buffer0[k][(i-1)>>3]);
 	}
 	printf("Read in %d bits\n",i);
       }
@@ -1549,8 +1870,8 @@ int main(int argc, char **argv) {
 
   // this is for user 0 only
   coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-				  PHY_vars_eNB->dlsch_eNB[0][0]->nb_rb,
-				  PHY_vars_eNB->dlsch_eNB[0][0]->rb_alloc,
+				  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb,
+				  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rb_alloc,
 				  get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
 				  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl,
 				  num_pdcch_symbols,
@@ -1560,6 +1881,9 @@ int main(int argc, char **argv) {
   printf("uncoded_ber_bit=%p\n",uncoded_ber_bit);
 
   snr_step = input_snr_step;
+  PHY_vars_UE->high_speed_flag = 1;
+  PHY_vars_UE->ch_est_alpha=0;
+
   for (ch_realization=0;ch_realization<n_ch_rlz;ch_realization++){
     if(abstx){
       printf("**********************Channel Realization Index = %d **************************\n", ch_realization);
@@ -1649,6 +1973,8 @@ int main(int argc, char **argv) {
 	    if (common_flag == 0) {
 	      
 	      if (round == 0) {   // First round
+		TB0_active = 1;
+	
 		PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3;
 		if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
 		  
@@ -1678,6 +2004,38 @@ int main(int argc, char **argv) {
 		      break;
 		    }
 		    break;
+		  case 3:
+		    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+		    case 6:
+		      ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t));
+		      break;
+		    case 25:
+		      ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t));
+		      break;
+		    case 50:
+		      ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t));
+		      break;
+		    case 100:
+		      ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t));
+		      break;
+		    }
+		    break;
 		  case 5:
 		    DLSCH_alloc_pdu2_1E[0].ndi             = trials&1;
 		    DLSCH_alloc_pdu2_1E[0].rv              = 0;
@@ -1712,6 +2070,38 @@ int main(int argc, char **argv) {
 		      break;
 		    }
 		    break;
+		  case 3:
+		    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+		    case 6:
+		      ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t));
+		      break;
+		    case 25:
+		      ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t));
+		      break;
+		    case 50:
+		      ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t));
+		      break;
+		    case 100:
+		      ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+		      ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
+		      ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+		      ((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = 0;
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t));
+		      break;
+		    }
+		    break;
 		  case 5:
 		    DLSCH_alloc_pdu2_1E[0].ndi             = trials&1;
 		    DLSCH_alloc_pdu2_1E[0].rv              = 0;
@@ -1753,6 +2143,70 @@ int main(int argc, char **argv) {
 		      break;
 		    }
 		    break;
+		  case 3:
+		    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+		    case 6:
+		      if (TB0_active==1) {
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_TDD_t));
+		      break;
+		    case 25:
+		      if (TB0_active==1) {
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_TDD_t));
+		      break;
+		    case 50:
+		      if (TB0_active==1) {
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_10MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_TDD_t));
+		      break;
+		    case 100:
+		      if (TB0_active==1) {
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_20MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_TDD_t));
+		      break;
+		    }
+		    break;
 		  case 5:
 		    DLSCH_alloc_pdu2_1E[0].ndi             = trials&1;
 		    DLSCH_alloc_pdu2_1E[0].rv              = round&3;
@@ -1787,6 +2241,70 @@ int main(int argc, char **argv) {
 		      break;
 		    }
 		    break;
+		  case 3:
+		    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+		    case 6:
+		      if (TB0_active==1) {
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_1_5MHz_2A_FDD_t));
+		      break;
+		    case 25:
+		      if (TB0_active==1) {
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_5MHz_2A_FDD_t));
+		      break;
+		    case 50:
+		      if (TB0_active==1) {
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_10MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_10MHz_2A_FDD_t));
+		      break;
+		    case 100:
+		      if (TB0_active==1) {
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = round&3;
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      else {  // deactivate TB0
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->mcs1             = 0;
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 1;
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi2             = trials&1;
+			((DCI2A_20MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv2              = round&3;
+		      }
+		      memcpy(&dci_alloc[0].dci_pdu[0],&DLSCH_alloc_pdu_1[0],sizeof(DCI2A_20MHz_2A_FDD_t));
+		      break;
+		    }
+		    break;
 		  case 5:
 		    DLSCH_alloc_pdu2_1E[0].ndi             = trials&1;
 		    DLSCH_alloc_pdu2_1E[0].rv              = round&3;
@@ -1814,8 +2332,8 @@ int main(int argc, char **argv) {
 	    for (k=0;k<n_users;k++) {
 
 	      coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-					      PHY_vars_eNB->dlsch_eNB[k][0]->nb_rb,
-					      PHY_vars_eNB->dlsch_eNB[k][0]->rb_alloc,
+					      PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->nb_rb,
+					      PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->rb_alloc,
 					      get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs),
 					      PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->Nl,
 					      num_pdcch_symbols,
@@ -1839,10 +2357,10 @@ int main(int argc, char **argv) {
 
 	      // use the PMI from previous trial
 	      if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
-		PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL);
-		PHY_vars_UE->dlsch_ue[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL);
+		PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL);
+		PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL);
 		if (n_users>1) 
-                  PHY_vars_eNB->dlsch_eNB[1][0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc ^ 0x1555); 
+                  PHY_vars_eNB->dlsch_eNB[1][0]->harq_processes[0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555); 
 		/*
 		  if ((trials<10) && (round==0)) {
 		  printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc),pmi_feedback);
@@ -1854,7 +2372,7 @@ int main(int argc, char **argv) {
 
 
 	      start_meas(&PHY_vars_eNB->dlsch_encoding_stats);	      
-	      if (dlsch_encoding(input_buffer[k],
+	      if (dlsch_encoding(input_buffer0[k],
 				 &PHY_vars_eNB->lte_frame_parms,
 				 num_pdcch_symbols,
 				 PHY_vars_eNB->dlsch_eNB[k][0],
@@ -1864,6 +2382,18 @@ int main(int argc, char **argv) {
 				 &PHY_vars_eNB->dlsch_interleaving_stats
 				 )<0)
 		exit(-1);
+	      if (transmission_mode == 3) {
+		if (dlsch_encoding(input_buffer1[k],
+				   &PHY_vars_eNB->lte_frame_parms,
+				   num_pdcch_symbols,
+				   PHY_vars_eNB->dlsch_eNB[k][1],
+				   0,subframe,
+				   &PHY_vars_eNB->dlsch_rate_matching_stats,
+				   &PHY_vars_eNB->dlsch_turbo_encoding_stats,
+				   &PHY_vars_eNB->dlsch_interleaving_stats
+				   )<0)
+		  exit(-1);
+	      }
 	      stop_meas(&PHY_vars_eNB->dlsch_encoding_stats);  
 
 	      PHY_vars_eNB->dlsch_eNB[k][0]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI;	  
@@ -1895,19 +2425,13 @@ int main(int argc, char **argv) {
 					      subframe,
 					      &PHY_vars_eNB->lte_frame_parms,
 					      num_pdcch_symbols,
-					      PHY_vars_eNB->dlsch_eNB[k][0]);
+					      PHY_vars_eNB->dlsch_eNB[k][0],
+					      PHY_vars_eNB->dlsch_eNB[k][1]);
 	      stop_meas(&PHY_vars_eNB->dlsch_modulation_stats);	      
 	      /*
 	      if (trials==0 && round==0)
 		printf("RE count %d\n",re_allocated);
 	      */
-	      if (num_layers>1)
-		re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
-						AMP,
-						subframe,
-						&PHY_vars_eNB->lte_frame_parms,
-						num_pdcch_symbols,
-						PHY_vars_eNB->dlsch_eNB[k][1]);
 	    } //n_users
 
 	    
@@ -2242,6 +2766,7 @@ int main(int argc, char **argv) {
 			   subframe,
 			   0,
 			   (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
+			   PHY_vars_UE->high_speed_flag,
 			   0);
 		  stop_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats);
 		  // overwrite number of pdcch symbols
@@ -2270,7 +2795,7 @@ int main(int argc, char **argv) {
 		  }
 		
 		  for (i=0;i<dci_cnt;i++) {
-		    //printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti);
+		    //		    printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti);
 		    PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->first_tx=1;
 		    if ((dci_alloc_rx[i].rnti == n_rnti) && 
 			(generate_ue_dlsch_params_from_dci(0,
@@ -2294,9 +2819,9 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 		      /*
 			rate = (double)dlsch_tbs25[get_I_TBS(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs)][PHY_vars_UE->dlsch_ue[0][0]->nb_rb-1]/(coded_bits_per_codeword);
 			rate*=get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs);
-
-			printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS);
 		      */
+			printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS);
+
 		      dlsch_active = 1;
 		    }
 		    else {
@@ -2321,6 +2846,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 
 		  PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti;
 		  PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
+		  PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx=1;
 		  switch (transmission_mode) {
 		  case 1:
 		  case 2:
@@ -2335,6 +2861,19 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 						      0,
 						      P_RNTI);
 		    break;
+		  case 3:
+		    PHY_vars_UE->dlsch_ue[0][1]->harq_processes[0]->first_tx=1;
+		    generate_ue_dlsch_params_from_dci(0,
+						      &DLSCH_alloc_pdu_1[0],
+						      (common_flag==0)? C_RNTI : SI_RNTI,
+						      (common_flag==0)? format2A : format1A,
+						      PHY_vars_UE->dlsch_ue[0],
+						      &PHY_vars_UE->lte_frame_parms,
+						      PHY_vars_UE->pdsch_config_dedicated,
+						      SI_RNTI,
+						      0,
+						      P_RNTI);
+		    break;
 		  case 4:
 		    generate_ue_dlsch_params_from_dci(0,
 						      &DLSCH_alloc_pdu_1[0],
@@ -2483,8 +3022,8 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 		    
 		    //pdsch_vars
 		    dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword);
-		    dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword);
-		    write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->e,coded_bits_per_codeword,1,4);
+		    //dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword);
+		    write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
 
 		    //pdcch_vars
 		    write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1);
@@ -2513,8 +3052,8 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 
 	  PHY_vars_UE->dlsch_ue[0][0]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
 	  coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-					  PHY_vars_eNB->dlsch_eNB[0][0]->nb_rb,
-					  PHY_vars_eNB->dlsch_eNB[0][0]->rb_alloc,
+					  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb,
+					  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rb_alloc,
 					  get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
 					  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl,
 					  num_pdcch_symbols,
@@ -2525,7 +3064,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 	  // calculate uncoded BLER
 	  uncoded_ber=0;
 	  for (i=0;i<coded_bits_per_codeword;i++) 
-	    if (PHY_vars_eNB->dlsch_eNB[0][0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) {
+	    if (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) {
 	      uncoded_ber_bit[i] = 1;
 	      uncoded_ber++;
 	    }
@@ -2570,7 +3109,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 	      printf("No DLSCH errors found,uncoded ber %f\n",uncoded_ber);
 
 	    PHY_vars_UE->total_TBS[eNB_id] =  PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->TBS;
-
+	    TB0_active = 0;
 	  }	
 	  else {
 	    errs[round]++;
@@ -2618,7 +3157,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 	      
 	      //pdsch_vars
 	      dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword);
-	      write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->e,coded_bits_per_codeword,1,4);
+	      write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
 	      write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
 	      write_output("dlsch_eNB_w.m","w",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
 	      write_output("dlsch_UE_w.m","w",PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
@@ -2744,22 +3283,41 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 	       (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials,
 	       PHY_vars_UE->dlsch_tc_intl2_stats.trials);
       }
-       
-      fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
-	      SNR,
-	      mcs,
-	      PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-	      rate,
-	      errs[0],
-	      round_trials[0],
-	      errs[1],
-	      round_trials[1],
-	      errs[2],
-	      round_trials[2],
-	      errs[3],
-	      round_trials[3],
-	      dci_errors);
 
+      if ((transmission_mode != 3) && (transmission_mode != 4)) {
+	fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
+		SNR,
+		mcs1,
+		PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		rate,
+		errs[0],
+		round_trials[0],
+		errs[1],
+		round_trials[1],
+		errs[2],
+		round_trials[2],
+		errs[3],
+		round_trials[3],
+		dci_errors);
+      }
+      else {
+	fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
+		SNR,
+		mcs1,mcs2,
+		PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS,
+		rate,
+		errs[0],
+		round_trials[0],
+		errs[1],
+		round_trials[1],
+		errs[2],
+		round_trials[2],
+		errs[3],
+		round_trials[3],
+		dci_errors);
+      }
+   
 
       if(abstx){ //ABSTRACTION         
 	blerr[0] = (double)errs[0]/(round_trials[0]);
@@ -2776,48 +3334,94 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
       
       if ( (test_perf != 0) && (100 * effective_rate > test_perf )) {
 	fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n");
-  	fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
-	      SNR,
-	      mcs,
-	      PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-	      rate,
-	      errs[0],
-	      round_trials[0],
-	      errs[1],
-	      round_trials[1],
-	      errs[2],
-	      round_trials[2],
-	      errs[3],
-	      round_trials[3],
-	      dci_errors);
-
-	fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
-	fprintf(time_meas_fd,"%f;%d;%d;%f(%2.1f%%,%f);%f;%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%d/%d;%e;%f(%f);\n",
-		SNR,
-		mcs,
-		PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-		rate*effective_rate,
-		100*effective_rate,
-		rate,
-		(double)avg_iter/iter_trials,
-		errs[0],
-		round_trials[0],
-		errs[1],
-		round_trials[1],
-		errs[2],
-		round_trials[2],
-		errs[3],
-		round_trials[3],
-		(double)errs[0]/(round_trials[0]),
-		(double)errs[1]/(round_trials[0]),
-		(double)errs[2]/(round_trials[0]),
-		(double)errs[3]/(round_trials[0]),
-		dci_errors,
-		round_trials[0],
-		(double)dci_errors/(round_trials[0]),
-		(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-		(1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
-
+	if ((transmission_mode != 3) && (transmission_mode != 4)) {
+	  fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
+		  SNR,
+		  mcs1,
+		  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		  rate,
+		  errs[0],
+		  round_trials[0],
+		  errs[1],
+		  round_trials[1],
+		  errs[2],
+		  round_trials[2],
+		  errs[3],
+		  round_trials[3],
+		  dci_errors);
+
+	  fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
+	  fprintf(time_meas_fd,"%f;%d;%d;%f(%2.1f%%,%f);%f;%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%d/%d;%e;%f(%f);\n",
+		  SNR,
+		  mcs1,
+		  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		  rate*effective_rate,
+		  100*effective_rate,
+		  rate,
+		  (double)avg_iter/iter_trials,
+		  errs[0],
+		  round_trials[0],
+		  errs[1],
+		  round_trials[1],
+		  errs[2],
+		  round_trials[2],
+		  errs[3],
+		  round_trials[3],
+		  (double)errs[0]/(round_trials[0]),
+		  (double)errs[1]/(round_trials[0]),
+		  (double)errs[2]/(round_trials[0]),
+		  (double)errs[3]/(round_trials[0]),
+		  dci_errors,
+		  round_trials[0],
+		  (double)dci_errors/(round_trials[0]),
+		  (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		  (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
+	}
+	else {
+	  fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
+		  SNR,
+		  mcs1,mcs2,
+		  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		  PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS,
+		  rate,
+		  errs[0],
+		  round_trials[0],
+		  errs[1],
+		  round_trials[1],
+		  errs[2],
+		  round_trials[2],
+		  errs[3],
+		  round_trials[3],
+		  dci_errors);
+	  
+	  fprintf(time_meas_fd,"SNR; MCS; TBS; rate; DL_DECOD_ITER; err0; trials0; err1; trials1; err2; trials2; err3; trials3; PE; dci_err;PE;ND;\n");
+	  fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f(%2.1f%%,%f);%f;%d;%d;%d;%d;%d;%d;%d;%d;(%e,%e,%e,%e);%d/%d;%e;%f(%f);\n",
+		  SNR,
+		  mcs1,mcs2,
+		  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		  PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS,
+		  rate*effective_rate,
+		  100*effective_rate,
+		  rate,
+		  (double)avg_iter/iter_trials,
+		  errs[0],
+		  round_trials[0],
+		  errs[1],
+		  round_trials[1],
+		  errs[2],
+		  round_trials[2],
+		  errs[3],
+		  round_trials[3],
+		  (double)errs[0]/(round_trials[0]),
+		  (double)errs[1]/(round_trials[0]),
+		  (double)errs[2]/(round_trials[0]),
+		  (double)errs[3]/(round_trials[0]),
+		  dci_errors,
+		  round_trials[0],
+		  (double)dci_errors/(round_trials[0]),
+		  (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/(double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+		  (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
+	}
 	fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR; DL_DECOD(%d);\n",
 		PHY_vars_eNB->phy_proc_tx.trials,
 		PHY_vars_eNB->ofdm_mod_stats.trials,
@@ -2845,7 +3449,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 		get_time_meas_us(&PHY_vars_UE->dlsch_decoding_stats)
 		);
 	/*	
-	fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
+		fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
 		PHY_vars_eNB->phy_proc_tx.trials,
 		PHY_vars_eNB->ofdm_mod_stats.trials,
 		PHY_vars_eNB->dlsch_modulation_stats.trials,
@@ -2857,19 +3461,19 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
 		PHY_vars_UE->dlsch_llr_stats.trials,
 		PHY_vars_UE->dlsch_unscrambling_stats.trials,
 		PHY_vars_UE->dlsch_decoding_stats.trials);
-	*/
-	printf("[passed] effective rate : %f  (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate );
-	break;
-      } else if (test_perf !=0 ){
-	printf("[continue] effective rate : %f  (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate);
-      }
+	  */
+	  printf("[passed] effective rate : %f  (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate );
+	  break;
+	} else if (test_perf !=0 ){
+	  printf("[continue] effective rate : %f  (%2.1f%%,%f)): increase snr \n",rate*effective_rate, 100*effective_rate, rate);
+	}
+	
+	if (((double)errs[0]/(round_trials[0]))<1e-2) 
+	  break;
+      }// SNR
       
-      if (((double)errs[0]/(round_trials[0]))<1e-2) 
-	break;
-    }// SNR
-  
-  
-  } //ch_realization
+      
+    } //ch_realization
   
   
   fclose(bler_fd);
@@ -2891,8 +3495,10 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
     free(uncoded_ber_bit);
   uncoded_ber_bit = NULL;  
   for (k=0;k<n_users;k++) {
-    free(input_buffer[k]);
-    input_buffer[k]=NULL;
+    free(input_buffer0[k]);
+    free(input_buffer1[k]);
+    input_buffer0[k]=NULL;
+    input_buffer1[k]=NULL;
   }
   printf("Freeing dlsch structures\n");
   for (i=0;i<2;i++) {
@@ -2917,7 +3523,7 @@ PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
   
   //  lte_sync_time_free();
   
-  printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0]));
+  //  printf("[MUMIMO] mcs %d, mcsi %d, offset %d, bler %f\n",mcs,mcs_i,offset_mumimo_llr_drange_fix,((double)errs[0])/((double)round_trials[0]));
 
   return(0);
 }
diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c
index 15c0581b73f54fbff30f18b7d395763dfdb13182..ecda10fccd6df3d8ff03812471f6d79af1b246cd 100644
--- a/openair1/SIMULATION/LTE_PHY/pbchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c
@@ -991,6 +991,7 @@ int main(int argc, char **argv) {
 				    &PHY_vars_UE->lte_frame_parms,
 				    0,
 				    SISO,
+				    PHY_vars_UE->high_speed_flag,
 				    frame_mod4);
 	      if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) {
 		PHY_vars_UE->lte_frame_parms.mode1_flag = 1;
@@ -1004,6 +1005,7 @@ int main(int argc, char **argv) {
 				    &PHY_vars_eNb->lte_frame_parms,
 				    0,
 				    ALAMOUTI,
+				    PHY_vars_UE->high_speed_flag,
 				    frame_mod4);
 	      if ((pbch_tx_ant>0) && (pbch_tx_ant<4)) {
 		PHY_vars_UE->lte_frame_parms.mode1_flag = 0;