diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 2c7aa12864002cdcfff42addbcad4f5c7d3d23f5..eea548774a6a936d7fe3e41ccef0d992597f6ce7 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -134,7 +134,7 @@ else (CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7l")
     set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -mavx2")
   endif()
   if (CPUINFO MATCHES "sse4_2")
-    set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.2")
+    set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.2 -mavx2")
   endif()
   if (CPUINFO MATCHES "sse4_1")
     set(C_FLAGS_PROCESSOR "${C_FLAGS_PROCESSOR} -msse4.1")
@@ -386,7 +386,7 @@ elseif (${RF_BOARD} STREQUAL "ETHERNET")
   set(HW_SOURCE ${HW_SOURCE}
     ${OPENAIR_TARGETS}/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
     )
-  set(LOWLATENCY True)
+  set(LOWLATENCY False)
   
 elseif (${RF_BOARD} STREQUAL "CPRIGW")
   set(HW_SOURCE ${HW_SOURCE}
diff --git a/cmake_targets/autotests/test.0103/CMakeLists.txt b/cmake_targets/autotests/test.0103/CMakeLists.txt
index bd69420cbc78edef26cdeda81c8c461d35f6c708..b47c34c9bb69016e8fa32967462d545426575ef9 100644
--- a/cmake_targets/autotests/test.0103/CMakeLists.txt
+++ b/cmake_targets/autotests/test.0103/CMakeLists.txt
@@ -42,7 +42,7 @@ set ( NAS_BUILT_IN_EPC False )
 set ( NAS_BUILT_IN_UE False )
 set ( NAS_MME False )
 set ( NAS_NETLINK False )
-set ( NAS_UE True )
+set ( NAS_UE False )
 set ( NB_ANTENNAS_RX 2 )
 set ( NB_ANTENNAS_TX 2 )
 set ( NB_ANTENNAS_TXRX 2 )
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index 1f4dddd0a7f6ab77ca5ab110d87e2df2693c1c4b..711c2c68ff6ca31114bf43f2dce9f85c9cfcbb50 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -86,7 +86,7 @@ uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t
        (mprime == pcfich_reg[2]) ||
        (mprime == pcfich_reg[3]))) {
 #ifdef DEBUG_DCI_ENCODING
-    msg("[PHY] REG %d allocated to PCFICH\n",mprime);
+    printf("[PHY] REG %d allocated to PCFICH\n",mprime);
 #endif
     return(1);
   }
@@ -109,7 +109,7 @@ uint32_t check_phich_reg(LTE_DL_FRAME_PARMS *frame_parms,uint32_t kprime,uint8_t
           (mprime == frame_parms->phich_reg[i][1]) ||
           (mprime == frame_parms->phich_reg[i][2]))  {
 #ifdef DEBUG_DCI_ENCODING
-        msg("[PHY] REG %d (lprime %d) allocated to PHICH\n",mprime,lprime);
+        printf("[PHY] REG %d (lprime %d) allocated to PHICH\n",mprime,lprime);
 #endif
         return(1);
       }
@@ -184,7 +184,7 @@ void dci_encoding(uint8_t *a,
   // encode dci
 
 #ifdef DEBUG_DCI_ENCODING
-  msg("Doing DCI encoding for %d bits, e %p, rnti %x\n",A,e,rnti);
+  printf("Doing DCI encoding for %d bits, e %p, rnti %x\n",A,e,rnti);
 #endif
 
   memset((void *)d,LTE_NULL,96);
@@ -194,17 +194,17 @@ void dci_encoding(uint8_t *a,
 #ifdef DEBUG_DCI_ENCODING
 
   for (i=0; i<16+A; i++)
-    msg("%d : (%d,%d,%d)\n",i,*(d+96+(3*i)),*(d+97+(3*i)),*(d+98+(3*i)));
+    printf("%d : (%d,%d,%d)\n",i,*(d+96+(3*i)),*(d+97+(3*i)),*(d+98+(3*i)));
 
 #endif
 
 #ifdef DEBUG_DCI_ENCODING
-  msg("Doing DCI interleaving for %d coded bits, e %p\n",D*3,e);
+  printf("Doing DCI interleaving for %d coded bits, e %p\n",D*3,e);
 #endif
   RCC = sub_block_interleaving_cc(D,d+96,w);
 
 #ifdef DEBUG_DCI_ENCODING
-  msg("Doing DCI rate matching for %d channel bits, RCC %d, e %p\n",E,RCC,e);
+  printf("Doing DCI rate matching for %d channel bits, RCC %d, e %p\n",E,RCC,e);
 #endif
   lte_rate_matching_cc(RCC,E,w,e);
 
@@ -223,7 +223,7 @@ uint8_t *generate_dci0(uint8_t *dci,
   uint8_t dci_flip[8];
 
   if (aggregation_level>3) {
-    msg("dci.c: generate_dci FATAL, illegal aggregation_level %d\n",aggregation_level);
+    printf("dci.c: generate_dci FATAL, illegal aggregation_level %d\n",aggregation_level);
     return NULL;
   }
 
@@ -233,7 +233,7 @@ uint8_t *generate_dci0(uint8_t *dci,
 
   #ifdef DEBUG_DCI_ENCODING
   for (i=0;i<1+((DCI_LENGTH+16)/8);i++)
-    msg("i %d : %x\n",i,dci[i]);
+    printf("i %d : %x\n",i,dci[i]);
   #endif
   */
   if (DCI_LENGTH<=32) {
@@ -251,7 +251,7 @@ uint8_t *generate_dci0(uint8_t *dci,
     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",
+    printf("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
@@ -286,7 +286,7 @@ void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,mod_sym_t **z, mod_sym_t
   int32_t nulled=0;
 #endif
 
-  //  msg("[PHY] PDCCH Interleaving Mquad %d (Nsymb %d)\n",Mquad,n_symbols_pdcch);
+  //  printf("[PHY] PDCCH Interleaving Mquad %d (Nsymb %d)\n",Mquad,n_symbols_pdcch);
   if ((Mquad&0x1f) > 0)
     RCC++;
 
@@ -299,15 +299,15 @@ void pdcch_interleaving(LTE_DL_FRAME_PARMS *frame_parms,mod_sym_t **z, mod_sym_t
     index = bitrev_cc_dci[col];
 
     for (row=0; row<RCC; row++) {
-      //msg("col %d, index %d, row %d\n",col,index,row);
+      //printf("col %d, index %d, row %d\n",col,index,row);
       if (index>=ND) {
         for (a=0; a<frame_parms->nb_antennas_tx_eNB; a++) {
-          //msg("a %d k %d\n",a,k);
+          //printf("a %d k %d\n",a,k);
 
           wptr = &wtemp[a][k<<2];
           zptr = &z[a][(index-ND)<<2];
 
-          //msg("wptr=%p, zptr=%p\n",wptr,zptr);
+          //printf("wptr=%p, zptr=%p\n",wptr,zptr);
 
           wptr[0] = zptr[0];
           wptr[1] = zptr[1];
@@ -460,7 +460,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t
   //  printf("Mquad %d, RCC %d\n",Mquad,RCC);
 
   if (!z) {
-    msg("dci.c: pdcch_deinterleaving: FATAL z is Null\n");
+    printf("dci.c: pdcch_deinterleaving: FATAL z is Null\n");
     return;
   }
 
@@ -573,7 +573,7 @@ int32_t pdcch_qpsk_qpsk_llr(LTE_DL_FRAME_PARMS *frame_parms,
   llr128 = (int16_t*)pdcch_llr;
 
   if (!llr128) {
-    msg("dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
+    printf("dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
     return -1;
   }
 
@@ -613,11 +613,11 @@ int32_t pdcch_llr(LTE_DL_FRAME_PARMS *frame_parms,
   pdcch_llr8 = &pdcch_llr[2*symbol*frame_parms->N_RB_DL*12];
 
   if (!pdcch_llr8) {
-    msg("pdcch_qpsk_llr: llr is null, symbol %d\n",symbol);
+    printf("pdcch_qpsk_llr: llr is null, symbol %d\n",symbol);
     return(-1);
   }
 
-  //    msg("pdcch qpsk llr for symbol %d (pos %d), llr offset %d\n",symbol,(symbol*frame_parms->N_RB_DL*12),pdcch_llr8-pdcch_llr);
+  //    printf("pdcch qpsk llr for symbol %d (pos %d), llr offset %d\n",symbol,(symbol*frame_parms->N_RB_DL*12),pdcch_llr8-pdcch_llr);
 
   for (i=0; i<(frame_parms->N_RB_DL*((symbol==0) ? 16 : 24)); i++) {
 
@@ -689,7 +689,7 @@ void pdcch_channel_level(int32_t **dl_ch_estimates_ext,
                              ((int32_t*)&avg128P)[2] +
                              ((int32_t*)&avg128P)[3])/(nb_rb*12);
 
-      //            msg("Channel level : %d\n",avg[(aatx<<1)+aarx]);
+      //            printf("Channel level : %d\n",avg[(aatx<<1)+aarx]);
     }
 
 #if defined(__x86_64__) || defined(__i386__)
@@ -1024,7 +1024,7 @@ void pdcch_extract_rbs_single(int32_t **rxdataF,
       }
 
       // Do middle RB (around DC)
-      //  msg("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
+      //  printf("dlch_ext %d\n",dl_ch0_ext-&dl_ch_estimates_ext[aarx][0]);
 
       if (symbol_mod==0) {
         j=0;
@@ -1148,7 +1148,7 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
     dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
     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));
+    //    printf("pdcch extract_rbs: rxF_ext pos %d\n",symbol*(frame_parms->N_RB_DL*12));
     rxF_ext   = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
 
     rxF       = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))];
@@ -1168,14 +1168,14 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
           memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int32_t));
 
           /*
-            msg("rb %d\n",rb);
+            printf("rb %d\n",rb);
             for (i=0;i<12;i++)
-            msg("(%d %d)",((int16_t *)dl_ch0)[i<<1],((int16_t*)dl_ch0)[1+(i<<1)]);
-            msg("\n");
+            printf("(%d %d)",((int16_t *)dl_ch0)[i<<1],((int16_t*)dl_ch0)[1+(i<<1)]);
+            printf("\n");
           */
           for (i=0; i<12; i++) {
             rxF_ext[i]=rxF[i];
-            //      msg("%d : (%d,%d)\n",(rxF+(2*i)-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))*2])/2,
+            //      printf("%d : (%d,%d)\n",(rxF+(2*i)-&rxdataF[aarx][( (symbol*(frame_parms->ofdm_symbol_size)))*2])/2,
             //  ((int16_t*)&rxF[i<<1])[0],((int16_t*)&rxF[i<<1])[0]);
           }
 
@@ -1212,7 +1212,7 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
     else {  // Odd number of RBs
       for (rb=0; rb<frame_parms->N_RB_DL>>1; rb++) {
 
-        //  msg("rb %d: %d\n",rb,rxF-&rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))*2]);
+        //  printf("rb %d: %d\n",rb,rxF-&rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))*2]);
 
         if (symbol_mod>0) {
           memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int32_t));
@@ -1323,7 +1323,7 @@ void pdcch_extract_rbs_dual(int32_t **rxdataF,
       for (; rb<frame_parms->N_RB_DL; rb++) {
 
         if (symbol_mod>0) {
-          //  msg("rb %d: %d\n",rb,rxF-&rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))*2]);
+          //  printf("rb %d: %d\n",rb,rxF-&rxdataF[aarx][(symbol*(frame_parms->ofdm_symbol_size))*2]);
           memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int32_t));
           memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int32_t));
 
@@ -1874,9 +1874,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars,
 
 
 #ifdef DEBUG_DCI_DECODING
-  msg("[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols);
+  printf("[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols);
 
-  msg("demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config);
+  printf("demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config);
 #endif
 
   pdcch_demapping(lte_ue_pdcch_vars[eNB_id]->llr,
@@ -2215,7 +2215,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
   LOG_I(PHY," PDCCH Interleaving\n");
 #endif
 
-  //  msg("y %p (%p,%p), wbar %p (%p,%p)\n",y,y[0],y[1],wbar,wbar[0],wbar[1]);
+  //  printf("y %p (%p,%p), wbar %p (%p,%p)\n",y,y[0],y[1],wbar,wbar[0],wbar[1]);
   // This is the interleaving procedure defined in 36-211, first part of Section 6.8.5
   pdcch_interleaving(frame_parms,&y[0],&wbar[0],num_pdcch_symbols,mi);
 
@@ -2240,7 +2240,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
       // if REG is allocated to PHICH, skip it
       if (check_phich_reg(frame_parms,kprime,lprime,mi) == 1) {
 #ifdef DEBUG_DCI_ENCODING
-        msg("generate_dci: skipping REG %d (kprime %d, lprime %d)\n",(lprime==0)?(kprime/6) : (kprime>>2),kprime,lprime);
+        printf("generate_dci: skipping REG %d (kprime %d, lprime %d)\n",(lprime==0)?(kprime/6) : (kprime>>2),kprime,lprime);
 #endif
       } else {
         // Copy REG to TX buffer
@@ -2477,15 +2477,15 @@ void dci_decoding(uint8_t DCI_LENGTH,
   memset(decoded_output,0,2+((16+DCI_LENGTH)>>3));
 
 #ifdef DEBUG_DCI_DECODING
-  msg("Before Viterbi\n");
+  printf("Before Viterbi\n");
 
   for (i=0; i<16+DCI_LENGTH; i++)
-    msg("%d : (%d,%d,%d)\n",i,*(d_rx+96+(3*i)),*(d_rx+97+(3*i)),*(d_rx+98+(3*i)));
+    printf("%d : (%d,%d,%d)\n",i,*(d_rx+96+(3*i)),*(d_rx+97+(3*i)),*(d_rx+98+(3*i)));
 
 #endif
-  //debug_msg("Doing DCI Viterbi \n");
+  //debug_printf("Doing DCI Viterbi \n");
   phy_viterbi_lte_sse2(d_rx+96,decoded_output,16+DCI_LENGTH);
-  //debug_msg("Done DCI Viterbi \n");
+  //debug_printf("Done DCI Viterbi \n");
 }
 
 
@@ -2682,7 +2682,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
       */
       crc = (crc16(dci_decoded_output,sizeof_bits)>>16) ^ extract_crc(dci_decoded_output,sizeof_bits);
 #ifdef DEBUG_DCI_DECODING
-      msg("crc =>%x\n",crc);
+      printf("crc =>%x\n",crc);
 #endif
 
       if (((L>1) && ((crc == si_rnti)||
@@ -2699,7 +2699,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
           dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[2];
           dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[3];
 #ifdef DEBUG_DCI_DECODING
-          msg("DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]);
+          printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]);
 #endif
         } else {
           dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[0];
@@ -2711,7 +2711,7 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **lte_ue_pdcch_vars,
           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",
+          printf("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
@@ -2802,6 +2802,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
   uint8_t tmode = phy_vars_ue->transmission_mode[eNB_id];
   uint8_t frame_type = frame_parms->frame_type;
   uint8_t format1A_size_bits=0,format1A_size_bytes=0;
+  uint8_t format1C_size_bits=0,format1C_size_bytes=0;
   uint8_t format0_size_bits=0,format0_size_bytes=0;
   uint8_t format1_size_bits=0,format1_size_bytes=0;
   uint8_t format2_size_bits=0,format2_size_bytes=0;
@@ -2812,6 +2813,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     if (frame_type == TDD) {
       format1A_size_bits  = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
       format1A_size_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
+      format1C_size_bits  = sizeof_DCI1C_1_5MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_1_5MHz_t);
       format0_size_bits  = sizeof_DCI0_1_5MHz_TDD_1_6_t;
       format0_size_bytes = sizeof(DCI0_1_5MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_1_5MHz_TDD_t;
@@ -2831,6 +2834,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     } else {
       format1A_size_bits  = sizeof_DCI1A_1_5MHz_FDD_t;
       format1A_size_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
+      format1C_size_bits  = sizeof_DCI1C_1_5MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_1_5MHz_t);
       format0_size_bits  = sizeof_DCI0_1_5MHz_FDD_t;
       format0_size_bytes = sizeof(DCI0_1_5MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_1_5MHz_FDD_t;
@@ -2856,6 +2861,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     if (frame_type == TDD) {
       format1A_size_bits  = sizeof_DCI1A_5MHz_TDD_1_6_t;
       format1A_size_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
+      format1C_size_bits  = sizeof_DCI1C_5MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_5MHz_t);
       format0_size_bits  = sizeof_DCI0_5MHz_TDD_1_6_t;
       format0_size_bytes = sizeof(DCI0_5MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_5MHz_TDD_t;
@@ -2875,6 +2882,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     } else {
       format1A_size_bits  = sizeof_DCI1A_5MHz_FDD_t;
       format1A_size_bytes = sizeof(DCI1A_5MHz_FDD_t);
+      format1C_size_bits  = sizeof_DCI1C_5MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_5MHz_t);
       format0_size_bits  = sizeof_DCI0_5MHz_FDD_t;
       format0_size_bytes = sizeof(DCI0_5MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_5MHz_FDD_t;
@@ -2899,6 +2908,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     if (frame_type == TDD) {
       format1A_size_bits  = sizeof_DCI1A_10MHz_TDD_1_6_t;
       format1A_size_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
+      format1C_size_bits  = sizeof_DCI1C_5MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_5MHz_t);
       format0_size_bits  = sizeof_DCI0_10MHz_TDD_1_6_t;
       format0_size_bytes = sizeof(DCI0_10MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_10MHz_TDD_t;
@@ -2918,6 +2929,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     } else {
       format1A_size_bits  = sizeof_DCI1A_10MHz_FDD_t;
       format1A_size_bytes = sizeof(DCI1A_10MHz_FDD_t);
+      format1C_size_bits  = sizeof_DCI1C_10MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_10MHz_t);
       format0_size_bits  = sizeof_DCI0_10MHz_FDD_t;
       format0_size_bytes = sizeof(DCI0_10MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_10MHz_FDD_t;
@@ -2942,6 +2955,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     if (frame_type == TDD) {
       format1A_size_bits  = sizeof_DCI1A_20MHz_TDD_1_6_t;
       format1A_size_bytes = sizeof(DCI1A_20MHz_TDD_1_6_t);
+      format1C_size_bits  = sizeof_DCI1C_20MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_20MHz_t);
       format0_size_bits  = sizeof_DCI0_20MHz_TDD_1_6_t;
       format0_size_bytes = sizeof(DCI0_20MHz_TDD_1_6_t);
       format1_size_bits  = sizeof_DCI1_20MHz_TDD_t;
@@ -2961,6 +2976,8 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     } else {
       format1A_size_bits  = sizeof_DCI1A_20MHz_FDD_t;
       format1A_size_bytes = sizeof(DCI1A_20MHz_FDD_t);
+      format1C_size_bits  = sizeof_DCI1C_20MHz_t;
+      format1C_size_bytes = sizeof(DCI1C_20MHz_t);
       format0_size_bits  = sizeof_DCI0_20MHz_FDD_t;
       format0_size_bytes = sizeof(DCI0_20MHz_FDD_t);
       format1_size_bits  = sizeof_DCI1_20MHz_FDD_t;
@@ -2990,7 +3007,7 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
     if (phy_vars_ue->prach_resources[eNB_id])
       ra_rnti = phy_vars_ue->prach_resources[eNB_id]->ra_RNTI;
 
-    // First check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI format 0/1A),
+    // First check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI format 0/1A),
     // and UE_SPEC format0 (PUSCH) too while we're at it
     dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe,
                             dci_alloc,
@@ -3016,8 +3033,32 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
         ((format0_found==1)&&(format_c_found==1)))
       return(dci_cnt);
 
-    //#ifdef ALL_AGGREGATION
-    // Disabled for performance
+    // Now check common search spaces at aggregation 4 (SI_RNTI and RA_RNTI and C-RNTI format 1C),
+    // and UE_SPEC format0 (PUSCH) too while we're at it
+    dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe,
+                            dci_alloc,
+                            eNB_id,
+                            frame_parms,
+                            mi,
+                            SI_RNTI,
+                            ra_rnti,
+                            2,
+                            format1C,
+                            format1C,
+                            format1C,
+                            format1C_size_bits,
+                            format1C_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);
+
     // Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI format 1A),
     // and UE_SPEC format0 (PUSCH) too while we're at it
     //  printf("[DCI search] doing common search/format0 aggregation 3\n");
@@ -3048,6 +3089,27 @@ uint16_t dci_decoding_procedure(PHY_VARS_UE *phy_vars_ue,
         ((format0_found==1)&&(format_c_found==1)))
       return(dci_cnt);
 
+    // Now check common search spaces at aggregation 8 (SI_RNTI and RA_RNTI and C-RNTI format 1C),
+    // and UE_SPEC format0 (PUSCH) too while we're at it
+    dci_decoding_procedure0(lte_ue_pdcch_vars,1,subframe,
+                            dci_alloc,
+                            eNB_id,
+                            frame_parms,
+                            mi,
+                            SI_RNTI,
+                            ra_rnti,
+                            3,
+                            format1C,
+                            format1C,
+                            format1C,
+                            format1C_size_bits,
+                            format1C_size_bytes,
+                            &dci_cnt,
+                            &format0_found,
+                            &format_c_found,
+                            &CCEmap0,
+                            &CCEmap1,
+                            &CCEmap2);
     //#endif
 
   }
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h
index c06f9ed2417292bdc87f9490b72cfa5d2a07914b..d98984b2a1c2847e2bc6b324cc78ea84a7cf61e8 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.h
+++ b/openair1/PHY/LTE_TRANSPORT/dci.h
@@ -829,14 +829,73 @@ struct DCI1B_5MHz_4A_TDD {
 typedef struct DCI1B_5MHz_4A_TDD DCI1B_5MHz_4A_TDD_t;
 #define sizeof_DCI1B_5MHz_4A_TDD_t 31
 
+/// DCI Format Type 1C (1.4 MHz, 8 bits)
+struct DCI1C_1_5MHz
+{
+  /// padding to 32bits
+  uint32_t padding32:24;
+  uint32_t mcs:5;
+  uint32_t rballoc:3;  // N_RB_step = 2, Ngap=Ngap1=3, NDLVRBGap = 6, ceil(log2((3*4)/2)) = 3
+} __attribute__ ((__packed__));
+
+typedef struct DCI1C_1_5MHz DCI1C_1_5MHz_t;
+#define sizeof_DCI1C_1_5MHz_t 8
+
+/*********************************************************
+**********************************************************/
 /// DCI Format Type 1C (5 MHz, 12 bits)
-typedef struct __attribute__ ((__packed__))
+struct DCI1C_5MHz
 {
-  uint32_t rballoc:7;
-  uint32_t tbs_index:5;
-}
-DCI1C_5MHz_t;
-#define sizeof_DCI1C_5MHz_t 12
+  /// padding to 32bits
+  uint32_t padding32:20;
+  uint32_t mcs:5;
+  uint32_t rballoc:7;   // N_RB_step = 2, Ngap1=Ngap2=12, NDLVRBGap = 24, ceil(log2((12*13)/2)) = 7
+} __attribute__ ((__packed__));
+
+typedef struct DCI1C_5MHz DCI1C_5MHz_t;
+#define sizeof_DCI1C_5MHz_t 12 
+
+/// DCI Format Type 1C (10 MHz, 13 bits)
+struct DCI1C_10MHz
+{
+  /// padding to 32bits
+  uint32_t padding32:19;
+  uint32_t mcs:5;
+  uint32_t rballoc:7;  // N_RB_step = 4, Ngap1=27, NDLVRBGap = 46, ceil(log2(((11*12)/2)) = 7
+  uint32_t Ngap:1;
+} __attribute__ ((__packed__));
+
+typedef struct DCI1C_10MHz DCI1C_10MHz_t;
+#define sizeof_DCI1C_10MHz_t 13
+
+/// DCI Format Type 1C (15 MHz, 14 bits)
+struct DCI1C_15MHz
+{
+  /// padding to 32bits
+  uint32_t padding32:18;
+  uint32_t mcs:5;
+  uint32_t rballoc:8; // N_RB_step = 4, Ngap1=64, ceil(log2((16*17)/2)) = 8
+  uint32_t Ngap:1;
+} __attribute__ ((__packed__));
+
+typedef struct DCI1C_15MHz DCI1C_15MHz_t;
+#define sizeof_DCI1C_15MHz_t X
+
+/// DCI Format Type 1C (20 MHz, 15 bits)
+struct DCI1C_20MHz
+{
+  /// padding to 32bits
+  uint32_t padding32:17;
+  uint32_t mcs:5;
+  uint32_t rballoc:9; // N_RB_step = 4, Ngap1=48, ceil(log2((24*25)/2)) = 9
+  uint32_t Ngap:1;
+} __attribute__ ((__packed__));
+
+typedef struct DCI1C_20MHz DCI1C_20MHz_t;
+#define sizeof_DCI1C_20MHz_t 15
+
+/*********************************************************
+**********************************************************/
 
 /// DCI Format Type 1D (5 MHz, FDD, 2 Antenna Ports, 27 bits)
 struct DCI1D_5MHz_2A_FDD {
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 926ee4dd2f27ffebe38ca2126112dc2c7622b61d..f4e6b1602efa2f0f0594e7a6f07ac77f4ea29e26 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -49,35 +49,55 @@
 
 //#define DEBUG_DCI
 
-uint32_t  localRIV2alloc_LUT6[32];
-uint32_t  distRIV2alloc_LUT6[32];
+uint32_t localRIV2alloc_LUT6[32];
+uint32_t distRIV2alloc_even_LUT6[32];
+uint32_t distRIV2alloc_odd_LUT6[32];
 uint16_t RIV2nb_rb_LUT6[32];
 uint16_t RIV2first_rb_LUT6[32];
 uint16_t RIV_max6=0;
 
-uint32_t  localRIV2alloc_LUT25[512];
-uint32_t  distRIV2alloc_LUT25[512];
+uint32_t localRIV2alloc_LUT25[512];
+uint32_t distRIV2alloc_even_LUT25[512];
+uint32_t distRIV2alloc_odd_LUT25[512];
 uint16_t RIV2nb_rb_LUT25[512];
 uint16_t RIV2first_rb_LUT25[512];
 uint16_t RIV_max25=0;
 
 
-uint32_t  localRIV2alloc_LUT50_0[1600];
-uint32_t  distRIV2alloc_LUT50_0[1600];
-uint32_t  localRIV2alloc_LUT50_1[1600];
-uint32_t  distRIV2alloc_LUT50_1[1600];
+uint32_t localRIV2alloc_LUT50_0[1600];
+uint32_t localRIV2alloc_LUT50_1[1600];
+uint32_t distRIV2alloc_gap0_even_LUT50_0[1600];
+uint32_t distRIV2alloc_gap0_odd_LUT50_0[1600];
+uint32_t distRIV2alloc_gap0_even_LUT50_1[1600];
+uint32_t distRIV2alloc_gap0_odd_LUT50_1[1600];
+uint32_t distRIV2alloc_gap1_even_LUT50_0[1600];
+uint32_t distRIV2alloc_gap1_odd_LUT50_0[1600];
+uint32_t distRIV2alloc_gap1_even_LUT50_1[1600];
+uint32_t distRIV2alloc_gap1_odd_LUT50_1[1600];
 uint16_t RIV2nb_rb_LUT50[1600];
 uint16_t RIV2first_rb_LUT50[1600];
 uint16_t RIV_max50=0;
 
-uint32_t  localRIV2alloc_LUT100_0[6000];
-uint32_t  distRIV2alloc_LUT100_0[6000];
-uint32_t  localRIV2alloc_LUT100_1[6000];
-uint32_t  distRIV2alloc_LUT100_1[6000];
-uint32_t  localRIV2alloc_LUT100_2[6000];
-uint32_t  distRIV2alloc_LUT100_2[6000];
-uint32_t  localRIV2alloc_LUT100_3[6000];
-uint32_t  distRIV2alloc_LUT100_3[6000];
+uint32_t localRIV2alloc_LUT100_0[6000];
+uint32_t localRIV2alloc_LUT100_1[6000];
+uint32_t localRIV2alloc_LUT100_2[6000];
+uint32_t localRIV2alloc_LUT100_3[6000];
+uint32_t distRIV2alloc_gap0_even_LUT100_0[6000];
+uint32_t distRIV2alloc_gap0_odd_LUT100_0[6000];
+uint32_t distRIV2alloc_gap0_even_LUT100_1[6000];
+uint32_t distRIV2alloc_gap0_odd_LUT100_1[6000];
+uint32_t distRIV2alloc_gap0_even_LUT100_2[6000];
+uint32_t distRIV2alloc_gap0_odd_LUT100_2[6000];
+uint32_t distRIV2alloc_gap0_even_LUT100_3[6000];
+uint32_t distRIV2alloc_gap0_odd_LUT100_3[6000];
+uint32_t distRIV2alloc_gap1_even_LUT100_0[6000];
+uint32_t distRIV2alloc_gap1_odd_LUT100_0[6000];
+uint32_t distRIV2alloc_gap1_even_LUT100_1[6000];
+uint32_t distRIV2alloc_gap1_odd_LUT100_1[6000];
+uint32_t distRIV2alloc_gap1_even_LUT100_2[6000];
+uint32_t distRIV2alloc_gap1_odd_LUT100_2[6000];
+uint32_t distRIV2alloc_gap1_even_LUT100_3[6000];
+uint32_t distRIV2alloc_gap1_odd_LUT100_3[6000];
 uint16_t RIV2nb_rb_LUT100[6000];
 uint16_t RIV2first_rb_LUT100[6000];
 uint16_t RIV_max100=0;
@@ -385,32 +405,192 @@ uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs)
   return(RIV);
 }
 
-int dist6[6]= {0,2,3,5,1,4};
-int dist50[50]= {};
-int dist100[100]= {};
+// Convert a DCI Format 1C RIV to a Format 1A RIV
+// This extracts the start and length in PRBs from the 1C rballoc and 
+// recomputes the RIV as if it were the 1A rballoc
+
+uint32_t conv_1C_RIV(int32_t rballoc,uint32_t N_RB_DL) {
+
+  int NpDLVRB,N_RB_step,LpCRBsm1,RBpstart;
+
+  switch (N_RB_DL) {
+
+  case 6: // N_RB_step = 2, NDLVRB = 6, NpDLVRB = 3
+    NpDLVRB   = 3;
+    N_RB_step = 2;
+    break;
+  case 25: // N_RB_step = 2, NDLVRB = 24, NpDLVRB = 12
+    NpDLVRB   = 12;
+    N_RB_step = 2;
+    break;
+  case 50: // N_RB_step = 4, NDLVRB = 46, NpDLVRB = 11
+    NpDLVRB   = 11;
+    N_RB_step = 4;
+    break;
+  case 100: // N_RB_step = 4, NDLVRB = 96, NpDLVRB = 24
+    NpDLVRB   = 24;
+    N_RB_step = 4;
+    break;
+  default:
+    NpDLVRB   = 24;
+    N_RB_step = 4;
+    break;
+  }
+
+  // This is the 1C part from 7.1.6.3 in 36.213
+  LpCRBsm1 = rballoc/NpDLVRB;
+  //  printf("LpCRBs = %d\n",LpCRBsm1+1);
+
+  if (LpCRBsm1 <= (NpDLVRB/2)) {
+    RBpstart = rballoc % NpDLVRB;
+  }
+  else {
+    LpCRBsm1 = NpDLVRB-LpCRBsm1;
+    RBpstart = NpDLVRB-(rballoc%NpDLVRB);
+  }
+  //  printf("RBpstart %d\n",RBpstart);
+  return(computeRIV(N_RB_DL,N_RB_step*RBpstart,N_RB_step*(LpCRBsm1+1)));
+   
+}
+
+int get_prb(int N_RB_DL,int odd_slot,int vrb,int Ngap) {
+
+  int offset;
+
+  switch (N_RB_DL) {
+    
+  case 6:
+  // N_RB_DL = tildeN_RB_DL = 6
+  // Ngap = 4 , P=1, Nrow = 2, Nnull = 2
+  
+    switch (vrb) {
+    case 0:  // even: 0->0, 1->2, odd: 0->3, 1->5
+    case 1:
+      return ((3*odd_slot) + 2*(vrb&3))%6;
+      break;
+    case 2:  // even: 2->3, 3->5, odd: 2->0, 3->2
+    case 3:
+      return ((3*odd_slot) + 2*(vrb&3) + 5)%6;
+      break;
+    case 4:  // even: 4->1, odd: 4->4
+      return ((3*odd_slot) + 1)%6; 
+    case 5:  // even: 5->4, odd: 5->1
+      return ((3*odd_slot) + 4)%6;
+      break;
+    }
+    break;
+    
+  case 15:
+    if (vrb<12) {
+      if ((vrb&3) < 2)     // even: 0->0, 1->4, 4->1, 5->5, 8->2, 9->6 odd: 0->7, 1->11
+	return(((7*odd_slot) + 4*(vrb&3) + (vrb>>2))%14) + 14*(vrb/14);
+      else if (vrb < 12) // even: 2->7, 3->11, 6->8, 7->12, 10->9, 11->13
+	return (((7*odd_slot) + 4*(vrb&3) + (vrb>>2) +13 )%14) + 14*(vrb/14);
+    }
+    if (vrb==12)
+      return (3+(7*odd_slot)) % 14;
+    if (vrb==13)
+      return (10+(7*odd_slot)) % 14;
+    return 14;
+    break;
+    
+  case 25:
+    return (((12*odd_slot) + 6*(vrb&3) + (vrb>>2))%24) + 24*(vrb/24);
+    break;
+    
+  case 50: // P=3
+    if (Ngap==0) {
+      // Nrow=12,Nnull=2,NVRBDL=46,Ngap1= 27
+      if (vrb>=23)
+	offset=4;
+      else
+	offset=0;
+      if (vrb<44) {
+	if ((vrb&3)>=2)
+	  return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2) + 45)%46;
+	else
+	  return offset+((23*odd_slot) + 12*(vrb&3) + (vrb>>2))%46;
+      }
+      if (vrb==44)  // even: 44->11, odd: 45->34
+	return offset+((23*odd_slot) + 22-12+1);
+      if (vrb==45)  // even: 45->10, odd: 45->33
+	return offset+((23*odd_slot) + 22+12);
+      if (vrb==46)
+	return offset+46+((23*odd_slot) + 23-12+1) % 46;
+      if (vrb==47)
+	return offset+46+((23*odd_slot) + 23+12) % 46;
+      if (vrb==48)
+	return offset+46+((23*odd_slot) + 23-12+1) % 46;
+      if (vrb==49)
+	return offset+46+((23*odd_slot) + 23+12) % 46;
+    }
+    else {
+      // Nrow=6,Nnull=6,NVRBDL=18,Ngap1= 27
+      if (vrb>=9)
+	offset=18;
+      else
+	offset=0;
+      
+      if (vrb<12) {
+	if ((vrb&3)>=2)
+	  return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2) + 17)%18;
+	else
+	  return offset+((9*odd_slot) + 6*(vrb&3) + (vrb>>2))%18;
+      }
+      else {
+	return offset+((9*odd_slot) + 12*(vrb&1)+(vrb>>1) )%18 + 18*(vrb/18);
+      }
+    }
+    break;
+  case 75:
+    // Ngap1 = 32, NVRBRL=64, P=4, Nrow= 16, Nnull=0
+    if (Ngap ==0) {
+      return ((32*odd_slot) + 16*(vrb&3) + (vrb>>2))%64 + (vrb/64); 
+    } else {
+      // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
+      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); 
+    }
+    break;
+  case 100:
+    // Ngap1 = 48, NVRBDL=96, Nrow=24, Nnull=0
+    if (Ngap ==0) {
+      return ((48*odd_slot) + 24*(vrb&3) + (vrb>>2))%96 + (vrb/96); 
+    } else {
+      // Ngap2 = 16, NVRBDL=32, Nrow=8, Nnull=0
+      return ((16*odd_slot) + 8*(vrb&3) + (vrb>>2))%32 + (vrb/32); 
+    }
+    break;
+  default:
+    LOG_E(PHY,"Unknown N_RB_DL %d\n",N_RB_DL);
+    return 0;
+  }
+  return 0;
+  
+}
+
 
 void generate_RIV_tables()
 {
 
   // 6RBs localized RIV
   uint8_t Lcrbs,RBstart;
-  uint8_t distpos;
   uint16_t RIV;
-  uint32_t alloc0,alloc_dist0;
-  uint32_t alloc1,alloc_dist1;
-  uint32_t alloc2,alloc_dist2;
-  uint32_t alloc3,alloc_dist3;
+  uint32_t alloc0,allocdist0_0_even,allocdist0_0_odd,allocdist0_1_even,allocdist0_1_odd;
+  uint32_t alloc1,allocdist1_0_even,allocdist1_0_odd,allocdist1_1_even,allocdist1_1_odd;
+  uint32_t alloc2,allocdist2_0_even,allocdist2_0_odd,allocdist2_1_even,allocdist2_1_odd;
+  uint32_t alloc3,allocdist3_0_even,allocdist3_0_odd,allocdist3_1_even,allocdist3_1_odd;
+  uint32_t nVRB,nVRB_even_dist,nVRB_odd_dist;
 
   for (RBstart=0; RBstart<6; RBstart++) {
     alloc0 = 0;
-    alloc_dist0 = 0;
-
+    allocdist0_0_even = 0;
+    allocdist0_0_odd  = 0;
     for (Lcrbs=1; Lcrbs<=(6-RBstart); Lcrbs++) {
       //printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
-      alloc0 |= (1<<(RBstart+Lcrbs-1));
-      // This is the RB<->VRB relationship for N_RB_DL=25
-      alloc_dist0 |= (1<<dist6[RBstart+Lcrbs-1]);
-
+      nVRB             = Lcrbs-1+RBstart;
+      alloc0          |= (1<<nVRB);
+      allocdist0_0_even |= (1<<get_prb(6,0,nVRB,0));
+      allocdist0_0_odd  |= (1<<get_prb(6,1,nVRB,0));
       RIV=computeRIV(6,RBstart,Lcrbs);
 
       if (RIV>RIV_max6)
@@ -418,7 +598,8 @@ void generate_RIV_tables()
 
       //      printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
       localRIV2alloc_LUT6[RIV] = alloc0;
-      distRIV2alloc_LUT6[RIV]  = alloc_dist0;
+      distRIV2alloc_even_LUT6[RIV]  = allocdist0_0_even;
+      distRIV2alloc_odd_LUT6[RIV]  = allocdist0_0_odd;
       RIV2nb_rb_LUT6[RIV]      = Lcrbs;
       RIV2first_rb_LUT6[RIV]   = RBstart;
     }
@@ -427,51 +608,80 @@ void generate_RIV_tables()
 
   for (RBstart=0; RBstart<25; RBstart++) {
     alloc0 = 0;
-    alloc_dist0 = 0;
-
+    allocdist0_0_even = 0;
+    allocdist0_0_odd  = 0;
     for (Lcrbs=1; Lcrbs<=(25-RBstart); Lcrbs++) {
-      //      printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
-      alloc0 |= (1<<(RBstart+Lcrbs-1));
-      // This is the RB<->VRB relationship for N_RB_DL=25
-      distpos = ((RBstart+Lcrbs-1)*6)%23;
-
-      if (distpos == 0)
-        distpos = 23;
-
-      alloc_dist0 |= (1<<distpos);
+      nVRB = Lcrbs-1+RBstart;
+      printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
+      alloc0     |= (1<<nVRB);
+      allocdist0_0_even |= (1<<get_prb(25,0,nVRB,0));
+      allocdist0_0_odd  |= (1<<get_prb(25,1,nVRB,0));
 
+      printf("alloc 0 %x, allocdist0_even %x, allocdist0_odd %x\n",alloc0,allocdist0_0_even,allocdist0_0_odd);
       RIV=computeRIV(25,RBstart,Lcrbs);
 
       if (RIV>RIV_max25)
-        RIV_max25 = RIV;
+        RIV_max25 = RIV;;
 
-      //      printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs);
-      localRIV2alloc_LUT25[RIV] = alloc0;
-      distRIV2alloc_LUT25[RIV]  = alloc_dist0;
-      RIV2nb_rb_LUT25[RIV]      = Lcrbs;
-      RIV2first_rb_LUT25[RIV]   = RBstart;
+
+      localRIV2alloc_LUT25[RIV]      = alloc0;
+      distRIV2alloc_even_LUT25[RIV]  = allocdist0_0_even;
+      distRIV2alloc_odd_LUT25[RIV]   = allocdist0_0_odd;
+      RIV2nb_rb_LUT25[RIV]           = Lcrbs;
+      RIV2first_rb_LUT25[RIV]        = RBstart;
     }
   }
 
 
   for (RBstart=0; RBstart<50; RBstart++) {
     alloc0 = 0;
-    alloc_dist0 = 0;
     alloc1 = 0;
-    alloc_dist1 = 0;
+    allocdist0_0_even=0;
+    allocdist1_0_even=0;
+    allocdist0_0_odd=0;
+    allocdist1_0_odd=0;
+    allocdist0_1_even=0;
+    allocdist1_1_even=0;
+    allocdist0_1_odd=0;
+    allocdist1_1_odd=0;
 
     for (Lcrbs=1; Lcrbs<=(50-RBstart); Lcrbs++) {
-      //      printf("RBstart %d, len %d --> ",RBstart,Lcrbs);
 
-      if ((RBstart+Lcrbs-1)<32)
-        alloc0 |= (1<<(RBstart+Lcrbs-1));
+      nVRB = Lcrbs-1+RBstart;
+
+
+      if (nVRB<32)
+        alloc0 |= (1<<nVRB);
+      else
+        alloc1 |= (1<<(nVRB-32));
+
+      // Distributed Gap1, even slot
+      nVRB_even_dist = get_prb(50,0,nVRB,0);
+      if (nVRB_even_dist<32)
+        allocdist0_0_even |= (1<<nVRB_even_dist);
+      else
+        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
+
+      // Distributed Gap1, odd slot
+      nVRB_odd_dist = get_prb(50,1,nVRB,0);
+      if (nVRB_odd_dist<32)
+        allocdist0_0_odd |= (1<<nVRB_odd_dist);
       else
-        alloc1 |= (1<<(RBstart+Lcrbs-33));
+        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
 
-      if (dist50[RBstart+Lcrbs-1]<32)
-        alloc_dist0 |= (1<<dist50[RBstart+Lcrbs-1]);
+      // Distributed Gap2, even slot
+      nVRB_even_dist = get_prb(50,0,nVRB,1);
+      if (nVRB_even_dist<32)
+        allocdist0_1_even |= (1<<nVRB_even_dist);
       else
-        alloc_dist1 |= (1<<dist50[RBstart+Lcrbs-33]);
+        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
+
+      // Distributed Gap2, odd slot
+      nVRB_odd_dist = get_prb(50,1,nVRB,1);
+      if (nVRB_odd_dist<32)
+        allocdist0_1_odd |= (1<<nVRB_odd_dist);
+      else
+        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
 
       RIV=computeRIV(50,RBstart,Lcrbs);
 
@@ -479,10 +689,16 @@ void generate_RIV_tables()
         RIV_max50 = RIV;
 
       //      printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
-      localRIV2alloc_LUT50_0[RIV] = alloc0;
-      localRIV2alloc_LUT50_1[RIV] = alloc1;
-      distRIV2alloc_LUT50_0[RIV]  = alloc_dist0;
-      distRIV2alloc_LUT50_1[RIV]  = alloc_dist1;
+      localRIV2alloc_LUT50_0[RIV]      = alloc0;
+      localRIV2alloc_LUT50_1[RIV]      = alloc1;
+      distRIV2alloc_gap0_even_LUT50_0[RIV]  = allocdist0_0_even;
+      distRIV2alloc_gap0_even_LUT50_1[RIV]  = allocdist1_0_even;
+      distRIV2alloc_gap0_odd_LUT50_0[RIV]   = allocdist0_0_odd;
+      distRIV2alloc_gap0_odd_LUT50_1[RIV]   = allocdist1_0_odd;
+      distRIV2alloc_gap1_even_LUT50_0[RIV]  = allocdist0_1_even;
+      distRIV2alloc_gap1_even_LUT50_1[RIV]  = allocdist1_1_even;
+      distRIV2alloc_gap1_odd_LUT50_0[RIV]   = allocdist0_1_odd;
+      distRIV2alloc_gap1_odd_LUT50_1[RIV]   = allocdist1_1_odd;
       RIV2nb_rb_LUT50[RIV]        = Lcrbs;
       RIV2first_rb_LUT50[RIV]     = RBstart;
     }
@@ -491,33 +707,97 @@ void generate_RIV_tables()
 
   for (RBstart=0; RBstart<100; RBstart++) {
     alloc0 = 0;
-    alloc_dist0 = 0;
     alloc1 = 0;
-    alloc_dist1 = 0;
     alloc2 = 0;
-    alloc_dist2 = 0;
     alloc3 = 0;
-    alloc_dist3 = 0;
+    allocdist0_0_even=0;
+    allocdist1_0_even=0;
+    allocdist2_0_even=0;
+    allocdist3_0_even=0;
+    allocdist0_0_odd=0;
+    allocdist1_0_odd=0;
+    allocdist2_0_odd=0;
+    allocdist3_0_odd=0;
+    allocdist0_1_even=0;
+    allocdist1_1_even=0;
+    allocdist2_1_even=0;
+    allocdist3_1_even=0;
+    allocdist0_1_odd=0;
+    allocdist1_1_odd=0;
+    allocdist2_1_odd=0;
+    allocdist3_1_odd=0;
 
     for (Lcrbs=1; Lcrbs<=(100-RBstart); Lcrbs++) {
 
-      if ((RBstart+Lcrbs-1)<32)
-        alloc0 |= (1<<(RBstart+Lcrbs-1));
-      else if ((RBstart+Lcrbs-1)<64)
-        alloc1 |= (1<<(RBstart+Lcrbs-33));
-      else if ((RBstart+Lcrbs-1)<96)
-        alloc2 |= (1<<(RBstart+Lcrbs-65));
+      nVRB = Lcrbs-1+RBstart;
+
+      if (nVRB<32)
+        alloc0 |= (1<<nVRB);
+      else if (nVRB<64)
+        alloc1 |= (1<<(nVRB-33));
+      else if (nVRB<96)
+        alloc2 |= (1<<(nVRB-65));
       else
-        alloc3 |= (1<<(RBstart+Lcrbs-97));
-
-      if (dist100[RBstart+Lcrbs-1]<32)
-        alloc_dist0 |= (1<<dist100[RBstart+Lcrbs-1]);
-      else if (dist100[RBstart+Lcrbs-1]<64)
-        alloc_dist1 |= (1<<dist100[RBstart+Lcrbs-33]);
-      else if (dist100[RBstart+Lcrbs-1]<64)
-        alloc_dist2 |= (1<<dist100[RBstart+Lcrbs-65]);
+        alloc3 |= (1<<(nVRB-97));
+
+      // Distributed Gap1, even slot
+      nVRB_even_dist = get_prb(100,0,nVRB,0);
+
+      if ((RBstart==0) && (Lcrbs<=8))
+	printf("nVRB %d => nVRB_even_dist %d\n",nVRB,nVRB_even_dist);
+
+
+      if (nVRB_even_dist<32)
+        allocdist0_0_even |= (1<<nVRB_even_dist);
+      else if (nVRB_even_dist<64)
+        allocdist1_0_even |= (1<<(nVRB_even_dist-32));
+      else if (nVRB_even_dist<96)
+	allocdist2_0_even |= (1<<(nVRB_even_dist-64));
       else
-        alloc_dist3 |= (1<<dist100[RBstart+Lcrbs-97]);
+	allocdist3_0_even |= (1<<(nVRB_even_dist-96));
+      if ((RBstart==0) && (Lcrbs<=8))
+	printf("rballoc =>(%08x.%08x.%08x.%08x)\n",
+	       allocdist0_0_even,
+	       allocdist1_0_even,
+	       allocdist2_0_even,
+	       allocdist3_0_even
+	       );
+
+      // Distributed Gap1, odd slot
+      nVRB_odd_dist = get_prb(100,1,nVRB,0);
+      if (nVRB_odd_dist<32)
+        allocdist0_0_odd |= (1<<nVRB_odd_dist);
+      else if (nVRB_odd_dist<64)
+        allocdist1_0_odd |= (1<<(nVRB_odd_dist-32));
+      else if (nVRB_odd_dist<96)
+	allocdist2_0_odd |= (1<<(nVRB_odd_dist-65));
+      else
+	allocdist3_0_odd |= (1<<(nVRB_odd_dist-97));
+
+
+      // Distributed Gap2, even slot
+      nVRB_even_dist = get_prb(100,0,nVRB,1);
+      if (nVRB_even_dist<32)
+        allocdist0_1_even |= (1<<nVRB_even_dist);
+      else if (nVRB_even_dist<64)
+        allocdist1_1_even |= (1<<(nVRB_even_dist-32));
+      else if (nVRB_even_dist<96)
+	allocdist2_1_even |= (1<<(nVRB_even_dist-64));
+      else
+	allocdist3_1_even |= (1<<(nVRB_even_dist-96));
+
+
+      // Distributed Gap2, odd slot
+      nVRB_odd_dist = get_prb(100,1,nVRB,1);
+      if (nVRB_odd_dist<32)
+        allocdist0_1_odd |= (1<<nVRB_odd_dist);
+      else if (nVRB_odd_dist<64)
+        allocdist1_1_odd |= (1<<(nVRB_odd_dist-32));
+      else if (nVRB_odd_dist<96)
+	allocdist2_1_odd |= (1<<(nVRB_odd_dist-64));
+      else
+	allocdist3_1_odd |= (1<<(nVRB_odd_dist-96));
+
 
       RIV=computeRIV(100,RBstart,Lcrbs);
 
@@ -526,13 +806,26 @@ void generate_RIV_tables()
 
       //      printf("RIV %d : first_rb %d NBRB %d\n",RIV,RBstart,Lcrbs);
       localRIV2alloc_LUT100_0[RIV] = alloc0;
-      distRIV2alloc_LUT100_0[RIV]  = alloc_dist0;
       localRIV2alloc_LUT100_1[RIV] = alloc1;
-      distRIV2alloc_LUT100_1[RIV]  = alloc_dist1;
       localRIV2alloc_LUT100_2[RIV] = alloc2;
-      distRIV2alloc_LUT100_2[RIV]  = alloc_dist2;
       localRIV2alloc_LUT100_3[RIV] = alloc3;
-      distRIV2alloc_LUT100_3[RIV]  = alloc_dist3;
+      distRIV2alloc_gap0_even_LUT100_0[RIV]  = allocdist0_0_even;
+      distRIV2alloc_gap0_even_LUT100_1[RIV]  = allocdist1_0_even;
+      distRIV2alloc_gap0_even_LUT100_2[RIV]  = allocdist2_0_even;
+      distRIV2alloc_gap0_even_LUT100_3[RIV]  = allocdist3_0_even;
+      distRIV2alloc_gap0_odd_LUT100_0[RIV]   = allocdist0_0_odd;
+      distRIV2alloc_gap0_odd_LUT100_1[RIV]   = allocdist1_0_odd;
+      distRIV2alloc_gap0_odd_LUT100_2[RIV]   = allocdist2_0_odd;
+      distRIV2alloc_gap0_odd_LUT100_3[RIV]   = allocdist3_0_odd;
+      distRIV2alloc_gap1_even_LUT100_0[RIV]  = allocdist0_1_even;
+      distRIV2alloc_gap1_even_LUT100_1[RIV]  = allocdist1_1_even;
+      distRIV2alloc_gap1_even_LUT100_2[RIV]  = allocdist2_1_even;
+      distRIV2alloc_gap1_even_LUT100_3[RIV]  = allocdist3_1_even;
+      distRIV2alloc_gap1_odd_LUT100_0[RIV]   = allocdist0_1_odd;
+      distRIV2alloc_gap1_odd_LUT100_1[RIV]   = allocdist1_1_odd;
+      distRIV2alloc_gap1_odd_LUT100_2[RIV]   = allocdist2_1_odd;
+      distRIV2alloc_gap1_odd_LUT100_3[RIV]   = allocdist3_1_odd;
+
       RIV2nb_rb_LUT100[RIV]      = Lcrbs;
       RIV2first_rb_LUT100[RIV]   = RBstart;
     }
@@ -550,13 +843,10 @@ void generate_RIV_tables()
 
 
 
-uint32_t get_rballoc(uint8_t vrb_type,uint16_t rb_alloc_dci)
+uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci)
 {
 
-  if (vrb_type == 0)
-    return(localRIV2alloc_LUT25[rb_alloc_dci]);
-  else
-    return(distRIV2alloc_LUT25[rb_alloc_dci]);
+  return(localRIV2alloc_LUT25[rb_alloc_dci]);
 
 }
 
@@ -638,12 +928,9 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
       dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 
-      if (vrb_type == 0)
-        dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT6[rballoc];
-      else
-        dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT6[rballoc];
-
-      dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT6[rballoc];//NPRB;
+      dlsch0_harq->rb_alloc[0]    = localRIV2alloc_LUT6[rballoc];
+      dlsch0_harq->vrb_type       = vrb_type;
+      dlsch0_harq->nb_rb          = RIV2nb_rb_LUT6[rballoc];//NPRB;
       RIV_max = RIV_max6;
 
 
@@ -672,13 +959,10 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
       dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 
-      if (vrb_type == 0)
-        dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT25[rballoc];
-      else
-        dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT25[rballoc];
-
-      dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT25[rballoc];//NPRB;
-      RIV_max = RIV_max25;
+      dlsch0_harq->rb_alloc[0]    = localRIV2alloc_LUT25[rballoc];
+      dlsch0_harq->vrb_type       = vrb_type;
+      dlsch0_harq->nb_rb          = RIV2nb_rb_LUT25[rballoc];//NPRB;
+      RIV_max                     = RIV_max25;
       break;
 
     case 50:
@@ -703,14 +987,9 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
       dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 
-      if (vrb_type == 0) {
-        dlsch0_harq->rb_alloc[0]                       = localRIV2alloc_LUT50_0[rballoc];
-        dlsch0_harq->rb_alloc[1]                       = localRIV2alloc_LUT50_1[rballoc];
-      } else {
-        dlsch0_harq->rb_alloc[0]                       = distRIV2alloc_LUT50_0[rballoc];
-        dlsch0_harq->rb_alloc[1]                       = distRIV2alloc_LUT50_1[rballoc];
-      }
-
+      dlsch0_harq->rb_alloc[0]     = localRIV2alloc_LUT50_0[rballoc];
+      dlsch0_harq->rb_alloc[1]     = localRIV2alloc_LUT50_1[rballoc];
+      dlsch0_harq->vrb_type        = vrb_type;
       dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT50[rballoc];//NPRB;
       RIV_max = RIV_max50;
       break;
@@ -736,17 +1015,12 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe,
 
       dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
 
-      if (vrb_type == 0) {
-        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 {
-        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];
-      }
+      dlsch0_harq->vrb_type         = vrb_type;
+      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];
+
 
       dlsch0_harq->nb_rb                               = RIV2nb_rb_LUT100[rballoc];//NPRB;
       RIV_max = RIV_max100;
@@ -2655,51 +2929,51 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
         (frame_parms->tdd_config>0)) {
       switch (frame_parms->N_RB_DL) {
       case 6:
-        msg("DCI format1A (TDD1-6, 1_5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        msg("DAI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
+        LOG_D(PHY,"DCI format1A (TDD1-6, 1_5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DAI %d\n",((DCI1A_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
         break;
 
       case 25:
-        msg("DCI format1A (TDD1-6, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %d (NB_RB %d)\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        msg("DAI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
+        LOG_D(PHY,"DCI format1A (TDD1-6, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %d (NB_RB %d)\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DAI %d\n",((DCI1A_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
         break;
 
       case 50:
-        msg("DCI format1A (TDD1-6, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        msg("DAI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
+        LOG_D(PHY,"DCI format1A (TDD1-6, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DAI %d\n",((DCI1A_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
         break;
 
       case 100:
-        msg("DCI format1A (TDD1-6, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
-        msg("DAI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
+        LOG_D(PHY,"DCI format1A (TDD1-6, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DAI %d\n",((DCI1A_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai);
         break;
 
       default:
@@ -2711,47 +2985,47 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
     } else if (frame_parms->frame_type == FDD) {
       switch (frame_parms->N_RB_DL) {
       case 6:
-        msg("DCI format1A(FDD, 1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DCI format1A(FDD, 1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
         break;
 
       case 25:
-        msg("DCI format1A(FDD, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DCI format1A(FDD, 5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
         break;
 
       case 50:
-        msg("DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
         break;
 
       case 100:
-        msg("DCI format1A(FDD, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        msg("VRB_TYPE %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        msg("RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        msg("MCS %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        msg("HARQ_PID %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        msg("NDI %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        msg("RV %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        msg("TPC %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
+        LOG_D(PHY,"DCI format1A(FDD, 20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT100[((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_D(PHY,"MCS %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
+        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_D(PHY,"NDI %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
+        LOG_D(PHY,"RV %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->rv);
+        LOG_D(PHY,"TPC %d\n",((DCI1A_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
         break;
 
       default:
@@ -2763,6 +3037,45 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
 
     break;
 
+  case format1C:  // This is DLSCH allocation for control traffic
+    switch (frame_parms->N_RB_DL) {
+    case 6:
+      LOG_D(PHY,"DCI format1C (1.5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",
+	    ((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT6[conv_1C_RIV(((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->rballoc,6)]);
+      LOG_D(PHY,"MCS %d\n",((DCI1C_1_5MHz_t *)&dci->dci_pdu[0])->mcs);
+      break;
+      
+    case 25:
+      LOG_D(PHY,"DCI format1C (5MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT25[conv_1C_RIV(((DCI1C_5MHz_t *)&dci->dci_pdu[0])->rballoc,25)]);
+      LOG_D(PHY,"MCS %d\n",((DCI1C_5MHz_t *)&dci->dci_pdu[0])->mcs);
+      break;
+      
+    case 50:
+      LOG_D(PHY,"DCI format1C (10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+      LOG_D(PHY,"Ngap %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->Ngap);
+      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_10MHz_t *)&dci->dci_pdu[0])->rballoc,50)]);
+      LOG_D(PHY,"MCS %d\n",((DCI1C_10MHz_t *)&dci->dci_pdu[0])->mcs);
+      break;
+      
+    case 100:
+      LOG_D(PHY,"DCI format1C (20MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+      LOG_D(PHY,"Ngap %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->Ngap);
+      LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[conv_1C_RIV(((DCI1C_20MHz_t *)&dci->dci_pdu[0])->rballoc,100)]);
+      LOG_D(PHY,"MCS %d\n",((DCI1C_20MHz_t *)&dci->dci_pdu[0])->mcs);
+      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;
+    }
+    
+
+    break;
+    
   case format2:
 
     if ((frame_parms->frame_type == TDD) &&
@@ -3456,7 +3769,8 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
 }
 
 
-int generate_ue_dlsch_params_from_dci(uint8_t subframe,
+int generate_ue_dlsch_params_from_dci(int frame,
+				      uint8_t subframe,
                                       void *dci_pdu,
                                       uint16_t rnti,
                                       DCI_format_t dci_format,
@@ -3478,16 +3792,17 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
   uint8_t rah=0;
   uint8_t TPC=0;
   uint8_t NPRB=0,tbswap=0,tpmi=0;
+  uint8_t Ngap;
   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);
+  LOG_D(PHY,"dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format);
 #endif
 
   switch (dci_format) {
 
-  case format0:   // This is an UL SACH allocation so nothing here, inform MAC
+  case format0:   // This is an ULSCH allocation so nothing here, inform MAC
     LOG_E(PHY,"format0 not possible\n");
     return(-1);
     break;
@@ -3534,10 +3849,16 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
       }
 
-      if (vrb_type == 0)
-        dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT6[rballoc];
-      else
-        dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT6[rballoc];
+      if (vrb_type == LOCALIZED) {
+	dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT6[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT6[rballoc];
+      }
+      else {
+	dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT6[rballoc];
+      }
+      dlsch0_harq->vrb_type    = vrb_type;
+
 
       dlsch0_harq->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB;
       RIV_max = RIV_max6;
@@ -3584,12 +3905,16 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
       }
 
-      if (vrb_type == 0)
-        dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT25[rballoc];
-      else
-        dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT25[rballoc];
-
-      dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB;
+      if (vrb_type == LOCALIZED) {
+	dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT25[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT25[rballoc];
+      }
+      else {
+	dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT25[rballoc];
+      }
+      dlsch0_harq->vrb_type    = vrb_type;
+      dlsch0_harq->nb_rb = RIV2nb_rb_LUT25[rballoc];
       RIV_max = RIV_max25;
 
       break;
@@ -3633,13 +3958,28 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
       }
 
-      if (vrb_type == 0) {
-        dlsch0_harq->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc];
-        dlsch0_harq->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc];
-      } else {
-        dlsch0_harq->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc];
-        dlsch0_harq->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc];
+      if (vrb_type == LOCALIZED) {
+	  dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_odd[1]  = localRIV2alloc_LUT50_1[rballoc];
+      } else { // DISTRIBUTED
+	if ((rballoc&(1<<10)) == 0) {
+	  rballoc = rballoc&(~(1<<10));
+	  dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+	}
+	else {
+	  rballoc = rballoc&(~(1<<10));
+	  dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+	}
       }
+      dlsch0_harq->vrb_type    = vrb_type;
 
       dlsch0_harq->nb_rb  = RIV2nb_rb_LUT50[rballoc];//NPRB;
       RIV_max = RIV_max50;
@@ -3684,17 +4024,40 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
 	dlsch[0]->g_pucch += delta_PUCCH_lut[TPC&3];
       }
 
-      if (vrb_type == 0) {
-        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];
+      if (vrb_type == LOCALIZED) {
+	dlsch0_harq->rb_alloc_even[0] = localRIV2alloc_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc_even[1] = localRIV2alloc_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc_even[2] = localRIV2alloc_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc_even[3] = localRIV2alloc_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = localRIV2alloc_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc_odd[1]  = localRIV2alloc_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc_odd[2]  = localRIV2alloc_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc_odd[3]  = localRIV2alloc_LUT100_3[rballoc];
       } else {
-        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];
+	if ((rballoc&(1<<10)) == 0) { //Gap 1
+	  rballoc = rballoc&(~(1<<12));
+	  dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
+	  dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
+	  dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
+	  dlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
+	}
+	else { //Gap 2
+	  rballoc = rballoc&(~(1<<12));
+	  dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
+	  dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
+	  dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
+	  dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
+	  dlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
+	  dlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
+	}
       }
+      dlsch0_harq->vrb_type    = vrb_type;
 
       dlsch0_harq->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB;
       RIV_max = RIV_max100;
@@ -3766,10 +4129,144 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
       dlsch0_harq->Qm  = get_Qm(mcs);
     }
     dlsch[0]->rnti = rnti;
+    dlsch[0]->active = 1;
     dlsch0 = dlsch[0];
     //printf("Format 1A: harq_pid %d, nb_rb %d, round %d\n",harq_pid,dlsch0_harq->nb_rb,dlsch0_harq->round);
     break;
 
+  case format1C:
+
+    harq_pid = 0;
+    dlsch0_harq = dlsch[0]->harq_processes[harq_pid];
+ 
+    switch (frame_parms->N_RB_DL) {
+    case 6:
+      mcs                           = ((DCI1C_1_5MHz_t *)dci_pdu)->mcs;
+      rballoc                       = conv_1C_RIV(((DCI1C_1_5MHz_t *)dci_pdu)->rballoc,6);
+      dlsch0_harq->nb_rb            = RIV2nb_rb_LUT6[rballoc];
+      dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT6[rballoc];
+      dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT6[rballoc];
+      RIV_max                       = RIV_max6;
+
+      break;
+
+    case 25:
+      mcs                           = ((DCI1C_5MHz_t *)dci_pdu)->mcs;
+      rballoc                       = conv_1C_RIV(((DCI1C_5MHz_t *)dci_pdu)->rballoc,25);
+      dlsch0_harq->nb_rb            = RIV2nb_rb_LUT25[rballoc];
+      dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_even_LUT25[rballoc];
+      dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_odd_LUT25[rballoc];
+      RIV_max                       = RIV_max25;
+
+      //      printf("Format1C : %x : mcs %d, rballoc %d=>%d=>%x\n",((uint32_t*)dci_pdu)[0], 
+      //	     mcs,((DCI1C_5MHz_t *)dci_pdu)->rballoc,rballoc,dlsch0_harq->rb_alloc_even[0]);
+      break;
+
+    case 50:
+      mcs                           = ((DCI1C_10MHz_t *)dci_pdu)->mcs;
+      rballoc                       = conv_1C_RIV(((DCI1C_10MHz_t *)dci_pdu)->rballoc,50);
+      Ngap                          = ((DCI1C_10MHz_t *)dci_pdu)->Ngap;
+      dlsch0_harq->nb_rb            = RIV2nb_rb_LUT50[rballoc];
+      if (Ngap == 0) {
+	dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT50_1[rballoc];
+      }
+      else {
+	dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap1_odd_LUT50_0[rballoc];
+	dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT50_1[rballoc];
+	dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap1_odd_LUT50_1[rballoc];
+      }
+      RIV_max                       = RIV_max50;
+
+      break;
+
+    case 100:
+      mcs                      = ((DCI1C_20MHz_t *)dci_pdu)->mcs;
+      rballoc                  = conv_1C_RIV(((DCI1C_20MHz_t *)dci_pdu)->rballoc,100);
+      Ngap                     = ((DCI1C_20MHz_t *)dci_pdu)->Ngap;
+      dlsch0_harq->nb_rb       = RIV2nb_rb_LUT100[rballoc];
+      if (Ngap==0) {
+	dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap0_even_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap0_odd_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap0_even_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap0_odd_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap0_even_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap0_odd_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap0_even_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap0_odd_LUT100_3[rballoc];
+      }
+      else {
+	dlsch0_harq->rb_alloc_even[0] = distRIV2alloc_gap1_even_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc_odd[0]  = distRIV2alloc_gap1_odd_LUT100_0[rballoc];
+	dlsch0_harq->rb_alloc_even[1] = distRIV2alloc_gap1_even_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc_odd[1]  = distRIV2alloc_gap1_odd_LUT100_1[rballoc];
+	dlsch0_harq->rb_alloc_even[2] = distRIV2alloc_gap1_even_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc_odd[2]  = distRIV2alloc_gap1_odd_LUT100_2[rballoc];
+	dlsch0_harq->rb_alloc_even[3] = distRIV2alloc_gap1_even_LUT100_3[rballoc];
+	dlsch0_harq->rb_alloc_odd[3]  = distRIV2alloc_gap1_odd_LUT100_3[rballoc];
+      }
+      RIV_max                  = RIV_max100;
+      /*
+      printf("Format1C : %x : mcs %d, rballoc %d=>%d=>(%08x.%08x.%08x.%08x), Ngap %d\n",((uint32_t*)dci_pdu)[0], 
+	     mcs,((DCI1C_20MHz_t *)dci_pdu)->rballoc,rballoc,
+	     dlsch0_harq->rb_alloc_even[0],
+	     dlsch0_harq->rb_alloc_even[1],
+	     dlsch0_harq->rb_alloc_even[2],
+	     dlsch0_harq->rb_alloc_even[3],
+	     Ngap
+	     );
+      */
+      break;     
+    
+    default:
+      LOG_E(PHY,"Format 1C: Unknown N_RB_DL %d\n",frame_parms->N_RB_DL);
+      return(-1);
+      break;
+    }
+    if (rballoc>RIV_max) {
+      LOG_E(PHY,"Format 1C: rb_alloc > RIV_max\n");
+      return(-1);
+    }
+
+    dlsch0_harq->round     = 0;
+    dlsch0_harq->first_tx  = 1;
+    dlsch0_harq->vrb_type  = DISTRIBUTED;
+    dlsch[0]->current_harq_pid = harq_pid;
+
+    if (rnti==si_rnti) { // rule from Section 5.3.1 of 36.321
+      if (((frame&1) == 0) && (subframe == 5)) 
+	dlsch0_harq->rvidx = (((3*((frame>>1)&3))+1)>>1)&3;  // SIB1
+      else 
+	dlsch0_harq->rvidx = (((3*(subframe&3))+1)>>1)&3;  // other SIBs
+    }
+    else if ((rnti==p_rnti) || (rnti==ra_rnti)) { // Section 7.1.7.3
+      dlsch0_harq->rvidx = 0;
+    }
+
+
+    dlsch0_harq->Nl = 1;
+    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 Format1C DCI: harq_status %d, round %d\n",
+	  dlsch[0]->rnti,
+	  harq_pid,
+	  subframe,
+	  dlsch0_harq->status,
+	  dlsch0_harq->round);
+
+    dlsch0_harq->mcs = mcs;
+
+    dlsch0_harq->TBS = TBStable1C[mcs];
+    dlsch0_harq->Qm  = 2;
+    dlsch[0]->rnti = rnti;
+    dlsch[0]->active = 1;
+    dlsch0 = dlsch[0];
+    break;
+
   case format1:
 
     switch (frame_parms->N_RB_DL) {
@@ -3870,7 +4367,11 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
     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,dlsch0_harq->rb_alloc);
+    conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc_even);
+    dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0];
+    dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1];
+    dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
+    dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
 
     dlsch0_harq->nb_rb = conv_nprb(rah,
                                    rballoc,
@@ -4178,8 +4679,21 @@ int generate_ue_dlsch_params_from_dci(uint8_t 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->rb_alloc_even);
+
+    dlsch0_harq->rb_alloc_odd[0]= dlsch0_harq->rb_alloc_even[0];
+    dlsch0_harq->rb_alloc_odd[1]= dlsch0_harq->rb_alloc_even[1];
+    dlsch0_harq->rb_alloc_odd[2]= dlsch0_harq->rb_alloc_even[2];
+    dlsch0_harq->rb_alloc_odd[3]= dlsch0_harq->rb_alloc_even[3];
+
+    dlsch1_harq->rb_alloc_even[0]                    = dlsch0_harq->rb_alloc_even[0];
+    dlsch1_harq->rb_alloc_even[1]                    = dlsch0_harq->rb_alloc_even[1];
+    dlsch1_harq->rb_alloc_even[2]                    = dlsch0_harq->rb_alloc_even[2];
+    dlsch1_harq->rb_alloc_even[3]                    = dlsch0_harq->rb_alloc_even[3];
+    dlsch1_harq->rb_alloc_odd[0]                     = dlsch0_harq->rb_alloc_odd[0];
+    dlsch1_harq->rb_alloc_odd[1]                     = dlsch0_harq->rb_alloc_odd[1];
+    dlsch1_harq->rb_alloc_odd[2]                     = dlsch0_harq->rb_alloc_odd[2];
+    dlsch1_harq->rb_alloc_odd[3]                     = dlsch0_harq->rb_alloc_odd[3];
 
     dlsch0_harq->nb_rb                               = conv_nprb(rah,
 								 rballoc,
@@ -4579,7 +5093,19 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
     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);
+    conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch0_harq->rb_alloc_even);
+    dlsch0_harq->rb_alloc_odd[0]                     = dlsch0_harq->rb_alloc_even[0];
+    dlsch0_harq->rb_alloc_odd[1]                     = dlsch0_harq->rb_alloc_even[1];
+    dlsch0_harq->rb_alloc_odd[2]                     = dlsch0_harq->rb_alloc_even[2];
+    dlsch0_harq->rb_alloc_odd[3]                     = dlsch0_harq->rb_alloc_even[3];
+    dlsch1_harq->rb_alloc_even[0]                    = dlsch0_harq->rb_alloc_even[0];
+    dlsch1_harq->rb_alloc_even[1]                    = dlsch0_harq->rb_alloc_even[1];
+    dlsch1_harq->rb_alloc_even[2]                    = dlsch0_harq->rb_alloc_even[2];
+    dlsch1_harq->rb_alloc_even[3]                    = dlsch0_harq->rb_alloc_even[3];
+    dlsch1_harq->rb_alloc_odd[0]                     = dlsch0_harq->rb_alloc_odd[0];
+    dlsch1_harq->rb_alloc_odd[1]                     = dlsch0_harq->rb_alloc_odd[1];
+    dlsch1_harq->rb_alloc_odd[2]                     = dlsch0_harq->rb_alloc_odd[2];
+    dlsch1_harq->rb_alloc_odd[3]                     = dlsch0_harq->rb_alloc_odd[3];
 
     dlsch0_harq->nb_rb = conv_nprb(rah,
                                    rballoc,
@@ -4831,9 +5357,18 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe,
     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->rb_alloc);
-    //dlsch1_harq->rb_alloc[0]                         = dlsch0_harq->rb_alloc[0];
-
+                 dlsch0_harq->rb_alloc_even);
+    
+    dlsch0_harq->rb_alloc_odd[0]                         = dlsch0_harq->rb_alloc_even[0];
+    dlsch0_harq->rb_alloc_odd[1]                         = dlsch0_harq->rb_alloc_even[1];
+    dlsch0_harq->rb_alloc_odd[2]                         = dlsch0_harq->rb_alloc_even[2];
+    dlsch0_harq->rb_alloc_odd[3]                         = dlsch0_harq->rb_alloc_even[3];
+    /*
+    dlsch1_harq->rb_alloc_even[0]                         = dlsch0_harq->rb_alloc_even[0];
+    dlsch1_harq->rb_alloc_even[1]                         = dlsch0_harq->rb_alloc_even[1];
+    dlsch1_harq->rb_alloc_even[2]                         = dlsch0_harq->rb_alloc_even[2];
+    dlsch1_harq->rb_alloc_even[3]                         = dlsch0_harq->rb_alloc_even[3];
+    */
     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);
@@ -7391,15 +7926,6 @@ main()
 
   generate_RIV_tables();
 
-  for (i=0; i<512; i++) {
-    msg("RIV %d: nb_rb %d, alloc %x, alloc_dist %x\n",
-        i,
-        RIV2nb_rb_LUT25[i],
-        localRIV2alloc_LUT25[i],
-        distRIV2alloc_LUT25[i]);
-
-  }
-
   rah = 0;
   rballoc = 0x1fff;
   msg("rballoc 0 %x => %x\n",rballoc,conv_rballoc(rah,rballoc));
diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index c3b990d836b3325962efbca2d50efa8674048ddf..488e6961be5b16865d13e4f570f6c85a7b547956 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -124,6 +124,8 @@ typedef struct {
   MIMO_mode_t mimo_mode;
   /// Current RB allocation
   uint32_t rb_alloc[4];
+  /// distributed/localized flag
+  vrb_t vrb_type;
   /// Current subband PMI allocation
   uint16_t pmi_alloc;
   /// Current subband RI allocation
@@ -549,8 +551,12 @@ typedef struct {
   uint16_t nb_rb;
   /// Current subband PMI allocation
   uint16_t pmi_alloc;
-  /// Current RB allocation
-  uint32_t rb_alloc[4];
+  /// Current RB allocation (even slots)
+  uint32_t rb_alloc_even[4];
+  /// Current RB allocation (odd slots)
+  uint32_t rb_alloc_odd[4];
+  /// distributed/localized flag
+  vrb_t vrb_type;
   /// downlink power offset field
   uint8_t dl_power_off;
 } LTE_DL_UE_HARQ_t;
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index 276f34ce7dd5d262b1441208b370bfd3afa00f53..764fdd163d1e5eb0505950b7017080d268403d6f 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -31,7 +31,7 @@
  * \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
- DEBUG * \version 0.1
+ * \version 0.1
  * \company Eurecom
  * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,ankit.bhamri@eurecom.fr,sebastien.aubert@eurecom.fr
  * \note
@@ -53,6 +53,7 @@
 #endif
 
 //#define DEBUG_PHY 1
+//#define DEBUG_DLSCH_MOD 1
 
 int avg[4];
 
@@ -77,6 +78,7 @@ unsigned char offset_mumimo_llr_drange[29][3]= {{0, 6, 5},{0, 4, 5},{0, 4, 5},{0
 
 extern void print_shorts(char *s,int16_t *x);
 
+
 int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
              PDSCH_t type,
              unsigned char eNB_id,
@@ -99,6 +101,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
   unsigned short nb_rb;
   int avgs, rb;
   LTE_DL_UE_HARQ_t *dlsch0_harq,*dlsch1_harq = 0;
+  uint32_t *rballoc;
 
   switch (type) {
   case SI_PDSCH:
@@ -152,19 +155,16 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
     return(-1);
   }
 
-  //  printf("rx_dlsch subframe %d symbol %d: eNB_id %d, eNB_id_i %d, dual_stream_flag %d\n",subframe,symbol,eNB_id,eNB_id_i,dual_stream_flag);
-  //  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;
-    else
-    pilots=0;
-  */
+  
+  if (((frame_parms->Ncp == NORMAL) && (symbol>=7)) ||
+      ((frame_parms->Ncp == EXTENDED) && (symbol>=6)))
+    rballoc = dlsch0_harq->rb_alloc_odd;
+  else
+    rballoc = dlsch0_harq->rb_alloc_even;
 
   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(dlsch0_harq->pmi_alloc),dlsch_ue[0],dlsch0_harq->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_even[0]);
 #endif
     nb_rb = dlsch_extract_rbs_dual(lte_ue_common_vars->rxdataF,
                                    lte_ue_common_vars->dl_ch_estimates[eNB_id],
@@ -172,7 +172,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                    lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                    dlsch0_harq->pmi_alloc,
                                    lte_ue_pdsch_vars[eNB_id]->pmi_ext,
-                                   dlsch0_harq->rb_alloc,
+                                   rballoc,
                                    symbol,
                                    subframe,
                                    phy_vars_ue->high_speed_flag,
@@ -186,7 +186,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                        lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                        dlsch0_harq->pmi_alloc,
                                        lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-                                       dlsch0_harq->rb_alloc,
+                                       rballoc,
                                        symbol,
                                        subframe,
                                        phy_vars_ue->high_speed_flag,
@@ -198,7 +198,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                        lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                        dlsch0_harq->pmi_alloc,
                                        lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-                                       dlsch0_harq->rb_alloc,
+                                       rballoc,
                                        symbol,
                                        subframe,
                                        phy_vars_ue->high_speed_flag,
@@ -212,7 +212,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                      lte_ue_pdsch_vars[eNB_id]->dl_ch_estimates_ext,
                                      dlsch0_harq->pmi_alloc,
                                      lte_ue_pdsch_vars[eNB_id]->pmi_ext,
-                                     dlsch0_harq->rb_alloc,
+                                     rballoc,
                                      symbol,
                                      subframe,
                                      phy_vars_ue->high_speed_flag,
@@ -226,7 +226,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                          lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                          dlsch0_harq->pmi_alloc,
                                          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-                                         dlsch0_harq->rb_alloc,
+                                         rballoc,
                                          symbol,
                                          subframe,
                                          phy_vars_ue->high_speed_flag,
@@ -238,10 +238,10 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                                          lte_ue_pdsch_vars[eNB_id_i]->dl_ch_estimates_ext,
                                          dlsch0_harq->pmi_alloc,
                                          lte_ue_pdsch_vars[eNB_id_i]->pmi_ext,
-                                         dlsch0_harq->rb_alloc,
+                                         rballoc,
                                          symbol,
                                          subframe,
-                                         phy_vars_ue->high_speed_flag,
+					 phy_vars_ue->high_speed_flag,
                                          frame_parms);
     }
   } //else n_tx>1
@@ -607,7 +607,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                        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),
+                       adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                        lte_ue_pdsch_vars[eNB_id]->llr128);
       else if (i_mod == 2) {
         dlsch_qpsk_qpsk_llr(frame_parms,
@@ -616,7 +616,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             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),
+                            adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128);
       } else if (i_mod == 4) {
         dlsch_qpsk_16qam_llr(frame_parms,
@@ -626,7 +626,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                              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),
+                             adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                              lte_ue_pdsch_vars[eNB_id]->llr128);
       } else {
         dlsch_qpsk_64qam_llr(frame_parms,
@@ -636,7 +636,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                              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),
+                             adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                              lte_ue_pdsch_vars[eNB_id]->llr128);
 
       }
@@ -657,7 +657,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             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),
+                            adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128);
         dlsch_qpsk_qpsk_llr(frame_parms,
                             lte_ue_pdsch_vars[eNB_id]->rxdataF_comp1[dlsch0_harq->round],
@@ -665,7 +665,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             lte_ue_pdsch_vars[eNB_id]->dl_ch_rho2_ext,
                             lte_ue_pdsch_vars[eNB_id]->llr[1],
                             symbol,first_symbol_flag,nb_rb,
-                            adjust_G2(frame_parms,dlsch1_harq->rb_alloc,2,subframe,symbol),
+                            adjust_G2(frame_parms,dlsch1_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128_2ndstream);
       } else if (dlsch1_harq->Qm == 4) {
         dlsch_qpsk_16qam_llr(frame_parms,
@@ -675,7 +675,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                              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),
+                             adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                              lte_ue_pdsch_vars[eNB_id]->llr128);
       } else {
         dlsch_qpsk_64qam_llr(frame_parms,
@@ -685,7 +685,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                              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),
+                             adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                              lte_ue_pdsch_vars[eNB_id]->llr128);
 
       }
@@ -700,7 +700,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                       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),
+                      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,4,subframe,symbol),
                       lte_ue_pdsch_vars[eNB_id]->llr128);
     } else if (i_mod == 2) {
       dlsch_16qam_qpsk_llr(frame_parms,
@@ -710,7 +710,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                            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),
+                           adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                            lte_ue_pdsch_vars[eNB_id]->llr128);
     } else if (i_mod == 4) {
       dlsch_16qam_16qam_llr(frame_parms,
@@ -721,7 +721,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             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),
+                            adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128);
     } else {
       dlsch_16qam_64qam_llr(frame_parms,
@@ -732,7 +732,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             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),
+                            adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128);
     }
 
@@ -746,7 +746,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                       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),
+                      adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,6,subframe,symbol),
                       lte_ue_pdsch_vars[eNB_id]->llr128);
     } else if (i_mod == 2) {
       dlsch_64qam_qpsk_llr(frame_parms,
@@ -756,7 +756,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                            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),
+                           adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                            lte_ue_pdsch_vars[eNB_id]->llr128);
     } else if (i_mod == 4) {
       dlsch_64qam_16qam_llr(frame_parms,
@@ -767,7 +767,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             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),
+                            adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128);
 
     } else {
@@ -779,7 +779,7 @@ int rx_pdsch(PHY_VARS_UE *phy_vars_ue,
                             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),
+                            adjust_G2(frame_parms,dlsch0_harq->rb_alloc_even,2,subframe,symbol),
                             lte_ue_pdsch_vars[eNB_id]->llr128);
     }
 
@@ -3675,7 +3675,7 @@ unsigned short dlsch_extract_rbs_single(int **rxdataF,
       }
     }
   }
-
+  
 
   return(nb_rb/frame_parms->nb_antennas_rx);
 }
@@ -3694,11 +3694,12 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
 {
 
 
-  unsigned short rb,nb_rb=0;
-  unsigned char rb_alloc_ind,skip_half=0,sss_symb,pss_symb=0,nsymb,l;
-  unsigned char i,aarx;
-  int *dl_ch0,*dl_ch0_ext,*dl_ch1,*dl_ch1_ext,*rxF,*rxF_ext;
-  unsigned char symbol_mod,pilots=0,j=0;
+  int prb,nb_rb=0;
+  int prb_off,prb_off2;
+  int rb_alloc_ind,skip_half=0,sss_symb,pss_symb=0,nsymb,l;
+  int i,aarx;
+  int32_t *dl_ch0,*dl_ch0p,*dl_ch0_ext,*dl_ch1,*dl_ch1p,*dl_ch1_ext,*rxF,*rxF_ext;
+  int symbol_mod,pilots=0,j=0;
   unsigned char *pmi_loc;
 
   symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
@@ -3728,97 +3729,100 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
       dl_ch1     = &dl_ch_estimates[2+aarx][5];
     }
 
+    pmi_loc = pmi_ext;
+    
+    // pointers to extracted RX signals and channel estimates
+    rxF_ext    = &rxdataF_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
     dl_ch0_ext = &dl_ch_estimates_ext[aarx][symbol*(frame_parms->N_RB_DL*12)];
     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)];
-    rxF       = &rxdataF[aarx][(frame_parms->first_carrier_offset + (symbol*(frame_parms->ofdm_symbol_size)))];
-
-    if ((frame_parms->N_RB_DL&1) == 0)  // even number of RBs
-      for (rb=0; rb<frame_parms->N_RB_DL; rb++) {
-        skip_half=0;
-
-        if (rb < 32)
-          rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
-        else if (rb < 64)
-          rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
-        else if (rb < 96)
-          rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
-        else if (rb < 100)
-          rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
-        else
-          rb_alloc_ind = 0;
-
-        // For second half of RBs skip DC carrier
-        if (rb==(frame_parms->N_RB_DL>>1)) {
-          rxF       = &rxdataF[aarx][(1 + (symbol*(frame_parms->ofdm_symbol_size)))];
-          //dl_ch0++;
-          //dl_ch1++;
-        }
-
-        // PBCH
-        if ((subframe==0) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
-          rb_alloc_ind = 0;
-        }
-
-        //SSS
 
-        if (((subframe==0)||(subframe==5)) &&
-            (rb>=((frame_parms->N_RB_DL>>1)-3)) &&
-            (rb<((frame_parms->N_RB_DL>>1)+3)) &&
-            (l==sss_symb) ) {
-          rb_alloc_ind = 0;
-        }
-
-
-
-        //PSS in subframe 0/5 if FDD
-        if (frame_parms->frame_type == FDD) {  //FDD
-          if (((subframe==0)||(subframe==5)) && (rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-            rb_alloc_ind = 0;
-          }
-        }
-
-        if ((frame_parms->frame_type == TDD) &&
-            (subframe==6)) { //TDD Subframe 6
-          if ((rb>=((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-            rb_alloc_ind = 0;
-          }
-        }
-
-        if (rb_alloc_ind==1) {
-
-          //printf("demod: rb %d\n",rb);
-
-          *pmi_loc = (pmi>>((rb>>2)<<1))&3;
-          //    printf("rb %d: sb %d : pmi %d\n",rb,rb>>2,*pmi_loc);
+    for (prb=0; prb<frame_parms->N_RB_DL; prb++) {
+      skip_half=0;
+      
+      if (prb < 32)
+	rb_alloc_ind = (rb_alloc[0]>>prb) & 1;
+      else if (prb < 64)
+	rb_alloc_ind = (rb_alloc[1]>>(prb-32)) & 1;
+      else if (prb < 96)
+	rb_alloc_ind = (rb_alloc[2]>>(prb-64)) & 1;
+      else if (prb < 100)
+	rb_alloc_ind = (rb_alloc[3]>>(prb-96)) & 1;
+      else
+	rb_alloc_ind = 0;
+      
+      // PBCH
+      if ((subframe==0) && 
+	  (prb>((frame_parms->N_RB_DL>>1)-3)) && 
+	  (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	  (l>=(nsymb>>1)) && 
+	  (l<((nsymb>>1) + 4))) {
+	rb_alloc_ind = 0;
+	//	printf("symbol %d / rb %d: skipping PBCH REs\n",symbol,prb);
+      }
+      
+      //SSS
+      
+      if (((subframe==0)||(subframe==5)) &&
+	  (prb>((frame_parms->N_RB_DL>>1)-3)) &&
+	  (prb<((frame_parms->N_RB_DL>>1)+3)) &&
+	  (l==sss_symb) ) {
+	rb_alloc_ind = 0;
+	//	printf("symbol %d / rb %d: skipping SSS REs\n",symbol,prb);
+      }
+      
+      
+      
+      //PSS in subframe 0/5 if FDD
+      if (frame_parms->frame_type == FDD) {  //FDD
+	if (((subframe==0)||(subframe==5)) && 
+	    (prb>((frame_parms->N_RB_DL>>1)-3)) && 
+	    (prb<((frame_parms->N_RB_DL>>1)+3)) && 
+	    (l==pss_symb) ) {
+	  rb_alloc_ind = 0;
+	  //	  printf("symbol %d / rb %d: skipping PSS REs\n",symbol,prb);
+	}
+      }
+      
+      if ((frame_parms->frame_type == TDD) &&
+	  (subframe==6)) { //TDD Subframe 6
+	if ((prb>=((frame_parms->N_RB_DL>>1)-3)) && 
+	    (prb<=((frame_parms->N_RB_DL>>1)+3)) && 
+	    (l==pss_symb) ) {
+	  rb_alloc_ind = 0;
+	}
+      }
+      
+      if (rb_alloc_ind==1) {              // PRB is allocated
 
+	if ((frame_parms->N_RB_DL&1) == 0) {  // even number of RBs
+	  
+	  prb_off      = 12*prb;
+	  prb_off2     = 1+(12*(prb-(frame_parms->N_RB_DL>>1)));
+	  dl_ch0p    = dl_ch0+(12*prb);
+	  dl_ch1p    = dl_ch1+(12*prb);
+	  if (prb<(frame_parms->N_RB_DL>>1)){
+	    rxF      = &rxdataF[aarx][prb_off+
+				      frame_parms->first_carrier_offset + 
+				      (symbol*(frame_parms->ofdm_symbol_size))];
+	  }
+	  else {
+	    rxF      = &rxdataF[aarx][prb_off2+
+				      (symbol*(frame_parms->ofdm_symbol_size))];
+	  }
+          *pmi_loc = (pmi>>((prb>>2)<<1))&3;
           pmi_loc++;
-
-
+	  
+	  
           if (pilots == 0) {
-
-            memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-            memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
-            /*
-              printf("rb %d\n",rb);
-              for (i=0;i<12;i++)
-              printf("(%d %d)",((short *)dl_ch)[i<<1],((short*)dl_ch)[1+(i<<1)]);
-              printf("\n");*/
-
-            for (i=0; i<12; i++) {
-              rxF_ext[i]=rxF[i];
-              //        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]);
-            }
-
-            dl_ch0_ext+=12;
-            dl_ch1_ext+=12;
-            rxF_ext+=12;
-          } else {
+	    
+            memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int));
+            memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int));
+            memcpy(rxF_ext,rxF,12*sizeof(int));
+	    dl_ch0_ext +=12;
+	    dl_ch1_ext +=12;
+	    rxF_ext    +=12;
+          } else { // pilots==1
             j=0;
-
             for (i=0; i<12; i++) {
               if ((i!=frame_parms->nushift) &&
                   (i!=frame_parms->nushift+3) &&
@@ -3826,480 +3830,220 @@ unsigned short dlsch_extract_rbs_dual(int **rxdataF,
                   (i!=((frame_parms->nushift+9)%12))) {
                 rxF_ext[j]=rxF[i];
                 //        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];
+                dl_ch0_ext[j]=dl_ch0p[i];
+                dl_ch1_ext[j++]=dl_ch1p[i];
               }
             }
-
-            dl_ch0_ext+=8;
-            dl_ch1_ext+=8;
-            rxF_ext+=8;
+	    dl_ch0_ext+=8;
+	    dl_ch1_ext+=8;
+	    rxF_ext+=8;
           } // pilots==1
 
           nb_rb++;
 
-        }
-
-        dl_ch0+=12;
-        dl_ch1+=12;
-        rxF+=12;
-      }
-    else {  // Odd number of RBs
-      for (rb=0; rb<frame_parms->N_RB_DL>>1; rb++) {
-        skip_half=0;
-
-        if (rb < 32)
-          rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
-        else if (rb < 64)
-          rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
-        else if (rb < 96)
-          rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
-        else if (rb < 100)
-          rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
-        else
-          rb_alloc_ind = 0;
-
-
-
-        // PBCH
-        if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
-          rb_alloc_ind = 0;
-        }
-
-        //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
-        if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
-          skip_half=1;
-        else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
-          skip_half=2;
-
-        //SSS
-
-        if (((subframe==0)||(subframe==5)) &&
-            (rb>((frame_parms->N_RB_DL>>1)-3)) &&
-            (rb<((frame_parms->N_RB_DL>>1)+3)) &&
-            (l==sss_symb) ) {
-          rb_alloc_ind = 0;
-        }
-
-        //SSS
-        if (((subframe==0)||(subframe==5)) &&
-            (rb==((frame_parms->N_RB_DL>>1)-3)) &&
-            (l==sss_symb))
-          skip_half=1;
-        else if (((subframe==0)||(subframe==5)) &&
-                 (rb==((frame_parms->N_RB_DL>>1)+3)) &&
-                 (l==sss_symb))
-          skip_half=2;
-
-        //PSS in subframe 0/5 if FDD
-        if (frame_parms->frame_type == FDD) {  //FDD
-          if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-            rb_alloc_ind = 0;
-          }
-
-          if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
-            skip_half=1;
-          else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
-            skip_half=2;
-        }
-
-        if ((frame_parms->frame_type == TDD) &&
-            (subframe==6)) { //TDD Subframe 6
-          if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-            rb_alloc_ind = 0;
-          }
-
-          if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
-            skip_half=1;
-          else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
-            skip_half=2;
-        }
-
-        //  printf("rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p)\n",rb,rb_alloc_ind,skip_half,rxF,rxF_ext);
+        } else {  // Odd number of RBs
+
+	  skip_half=0;
+
+	  //Check if we have to drop half a PRB due to PSS/SSS/PBCH
+	  // skip_half == 0 means full PRB
+	  // skip_half == 1 means first half is used (leftmost half-PRB from PSS/SSS/PBCH)
+	  // skip_half == 2 means second half is used (rightmost half-PRB from PSS/SSS/PBCH)
+	  //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
+	  if ((subframe==0) && 
+	      (prb==((frame_parms->N_RB_DL>>1)-3)) && 
+	      (l>=(nsymb>>1)) && 
+	      (l<((nsymb>>1) + 4)))
+	    skip_half=1;
+	  else if ((subframe==0) && 
+		   (prb==((frame_parms->N_RB_DL>>1)+3)) && 
+		   (l>=(nsymb>>1)) && 
+		   (l<((nsymb>>1) + 4)))
+	    skip_half=2;
+	  
+	  //SSS
+	  if (((subframe==0)||(subframe==5)) &&
+	      (prb==((frame_parms->N_RB_DL>>1)-3)) &&
+	      (l==sss_symb))
+	    skip_half=1;
+	  else if (((subframe==0)||(subframe==5)) &&
+		   (prb==((frame_parms->N_RB_DL>>1)+3)) &&
+		   (l==sss_symb))
+	    skip_half=2;
+	  
+	  //PSS Subframe 0,5
+	  if (((frame_parms->frame_type == FDD) &&
+	       (((subframe==0)||(subframe==5)))) ||  //FDD Subframes 0,5
+	      ((frame_parms->frame_type == TDD) &&
+	       (((subframe==2) || (subframe==6))))) { //TDD Subframes 2,6
+		
+	    if ((prb==((frame_parms->N_RB_DL>>1)-3)) && 
+		(l==pss_symb))
+	      skip_half=1;
+	    else if (((subframe==0)||(subframe==5)) && 
+		     (prb==((frame_parms->N_RB_DL>>1)+3)) && 
+		     (l==pss_symb))
+	      skip_half=2;
+	  }
+	  
+	  
+	  prb_off      = 12*prb;
+	  prb_off2     = 7+(12*(prb-(frame_parms->N_RB_DL>>1)-1));
+	  dl_ch0p      = dl_ch0+(12*prb);
+	  dl_ch1p      = dl_ch1+(12*prb);
+	  
+	  if (prb<=(frame_parms->N_RB_DL>>1)){
+	    rxF      = &rxdataF[aarx][prb_off+
+				      frame_parms->first_carrier_offset + 
+				      (symbol*(frame_parms->ofdm_symbol_size))];
+	  }
+	  else {
+	    rxF      = &rxdataF[aarx][prb_off2+ 
+				      (symbol*(frame_parms->ofdm_symbol_size))];
+	  }
 
-        if (rb_alloc_ind==1) {
+	  //          printf("symbol %d / rb %d: alloc %d skip_half %d (rxF %p, rxF_ext %p) prb_off (%d,%d)\n",symbol,prb,rb_alloc_ind,skip_half,rxF,rxF_ext,prb_off,prb_off2);
 
-          *pmi_loc = (pmi>>((rb>>2)<<1))&3;
+          *pmi_loc = (pmi>>((prb>>2)<<1))&3;
           //    printf("symbol_mod %d (pilots %d) rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",symbol_mod,pilots,rb,rb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
 
           pmi_loc++;
 
-          if (pilots==0) {
-            if (skip_half==1) {
-              memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
-              memcpy(dl_ch1_ext,dl_ch1,6*sizeof(int));
-
-              for (i=0; i<6; i++)
-                rxF_ext[i]=rxF[i];
-
-              dl_ch0_ext+=6;
-              dl_ch1_ext+=6;
-              rxF_ext+=6;
-            } else if (skip_half==2) {
-              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++)
-                rxF_ext[i]=rxF[(i+6)];
-
-              dl_ch0_ext+=6;
-              dl_ch1_ext+=6;
-              rxF_ext+=6;
-            } else {
-              memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-              memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
-
-              for (i=0; i<12; i++)
-                rxF_ext[i]=rxF[i];
-
-              dl_ch0_ext+=12;
-              dl_ch1_ext+=12;
-              rxF_ext+=12;
-            }
-          } else { // pilots=1
-            j=0;
-
-            if (skip_half==1) {
-              for (i=0; i<6; i++) {
-                if ((i!=frame_parms->nushift) &&
-                    (i!=((frame_parms->nushift+3)%6))) {
-                  rxF_ext[j]=rxF[i];
-                  //    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];
-                }
-              }
-
-              dl_ch0_ext+=4;
-              dl_ch1_ext+=4;
-              rxF_ext+=4;
-            } else if (skip_half==2) {
-              for (i=0; i<6; i++) {
-                if ((i!=frame_parms->nushift) &&
-                    (i!=((frame_parms->nushift+3)%6))) {
-                  rxF_ext[j]=rxF[(i+6)];
-                  //        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];
-                }
-
-                dl_ch0_ext+=4;
-                dl_ch1_ext+=4;
-                rxF_ext+=4;
-              }
-            } else {
-              for (i=0; i<12; i++) {
-                if ((i!=frame_parms->nushift) &&
-                    (i!=frame_parms->nushift+3) &&
-                    (i!=frame_parms->nushift+6) &&
-                    (i!=((frame_parms->nushift+9)%12))) {
-                  rxF_ext[j]=rxF[i];
-                  //    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];
-
-                  //            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]));
-                }
-              }
-
-              dl_ch0_ext+=8;
-              dl_ch1_ext+=8;
-              rxF_ext+=8;
-            }
-          }
-
-          nb_rb++;
-        }
-
-        dl_ch0+=12;
-        dl_ch1+=12;
-        rxF+=12;
-      }
-
-
-      // Do middle RB (around DC)
-      if (rb < 32)
-        rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
-      else if (rb < 64)
-        rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
-      else if (rb < 96)
-        rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
-      else if (rb < 100)
-        rb_alloc_ind = (rb_alloc[0]>>(rb-96)) & 1;
-      else
-        rb_alloc_ind = 0;
-
-
-
-
-
-      // PBCH
-      if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
-        rb_alloc_ind = 0;
-      }
-
-      //SSS
-      if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
-        rb_alloc_ind = 0;
-      }
-
-      if (frame_parms->frame_type == FDD) {
-        //PSS
-        if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-          rb_alloc_ind = 0;
-        }
-      }
-
-      if ((frame_parms->frame_type == TDD) &&
-          (subframe==6)) {
-        //PSS
-        if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-          rb_alloc_ind = 0;
-        }
-      }
-
-
-      if (rb_alloc_ind==1) {
-
-        *pmi_loc = (pmi>>((rb>>2)<<1))&3;
-        //  printf("rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",rb,rb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
-        pmi_loc++;
-
-        if (pilots==0) {
-          for (i=0; i<6; i++) {
-            dl_ch0_ext[i]=dl_ch0[i];
-            dl_ch1_ext[i]=dl_ch1[i];
-            rxF_ext[i]=rxF[i];
-          }
-
-          rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-
-          for (; i<12; i++) {
-            dl_ch0_ext[i]=dl_ch0[i];
-            dl_ch1_ext[i]=dl_ch1[i];
-            rxF_ext[i]=rxF[(1+i-6)];
-          }
-
-          dl_ch0_ext+=12;
-          dl_ch1_ext+=12;
-          rxF_ext+=12;
-        } else { // pilots==1
-          j=0;
-
-          for (i=0; i<6; i++) {
-            if ((i!=frame_parms->nushift) &&
-                (i!=((frame_parms->nushift+3)%6))) {
-              dl_ch0_ext[j]=dl_ch0[i];
-              dl_ch1_ext[j]=dl_ch1[i];
-              rxF_ext[j++]=rxF[i];
-              //            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]));
-            }
-          }
-
-          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;
-        }
-
-        nb_rb++;
-      } else {
-        rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
-      }
-
-      dl_ch0+=12;
-      dl_ch1+=12;
-      rxF+=7;
-      rb++;
-
-      for (; rb<frame_parms->N_RB_DL; rb++) {
-        skip_half=0;
-
-        if (rb < 32)
-          rb_alloc_ind = (rb_alloc[0]>>rb) & 1;
-        else if (rb < 64)
-          rb_alloc_ind = (rb_alloc[1]>>(rb-32)) & 1;
-        else if (rb < 96)
-          rb_alloc_ind = (rb_alloc[2]>>(rb-64)) & 1;
-        else if (rb < 100)
-          rb_alloc_ind = (rb_alloc[3]>>(rb-96)) & 1;
-        else
-          rb_alloc_ind = 0;
-
-
-        // PBCH
-        if ((subframe==0) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4))) {
-          rb_alloc_ind = 0;
-        }
-
-        //PBCH subframe 0, symbols nsymb>>1 ... nsymb>>1 + 3
-        if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
-          skip_half=1;
-        else if ((subframe==0) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l>=(nsymb>>1)) && (l<((nsymb>>1) + 4)))
-          skip_half=2;
-
-        //SSS
-        if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==sss_symb) ) {
-          rb_alloc_ind = 0;
-        }
-
-        //SSS
-        if (((subframe==0)||(subframe==5)) &&
-            (rb==((frame_parms->N_RB_DL>>1)-3)) &&
-            (l==sss_symb))
-          skip_half=1;
-        else if (((subframe==0)||(subframe==5)) &&
-                 (rb==((frame_parms->N_RB_DL>>1)+3)) &&
-                 (l==sss_symb))
-          skip_half=2;
-
-        if (frame_parms->frame_type == FDD) {
-          //PSS
-          if (((subframe==0)||(subframe==5)) && (rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-            rb_alloc_ind = 0;
-
-          }
-
-          if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
-            skip_half=1;
-          else if (((subframe==0)||(subframe==5)) && (rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
-            skip_half=2;
-        }
-
-        if ((frame_parms->frame_type == TDD) &&
-            (subframe==6)) {
-          //PSS
-          if ((rb>((frame_parms->N_RB_DL>>1)-3)) && (rb<((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb) ) {
-            rb_alloc_ind = 0;
-          }
-
-          if ((rb==((frame_parms->N_RB_DL>>1)-3)) && (l==pss_symb))
-            skip_half=1;
-          else if ((rb==((frame_parms->N_RB_DL>>1)+3)) && (l==pss_symb))
-            skip_half=2;
-        }
-
-        if (rb_alloc_ind==1) {
-
-          *pmi_loc = (pmi>>((rb>>2)<<1))&3;
-          //      printf("rb %d, sb %d, pmi %d (pmi_loc %p,rxF %p, ch00 %p, ch01 %p, rxF_ext %p dl_ch0_ext %p dl_ch1_ext %p)\n",rb,rb>>2,*pmi_loc,pmi_loc,rxF,dl_ch0, dl_ch1, rxF_ext,dl_ch0_ext,dl_ch1_ext);
-
-          pmi_loc++;
-
-          if (pilots==0) {
-            if (skip_half==1) {
-              memcpy(dl_ch0_ext,dl_ch0,6*sizeof(int));
-              memcpy(dl_ch1_ext,dl_ch1,6*sizeof(int));
-
-              for (i=0; i<6; i++)
-                rxF_ext[i]=rxF[i];
-
-              dl_ch0_ext+=6;
-              dl_ch1_ext+=6;
-              rxF_ext+=6;
-
-            } else if (skip_half==2) {
-              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++)
-                rxF_ext[i]=rxF[(i+6)];
-
-              dl_ch0_ext+=6;
-              dl_ch1_ext+=6;
-              rxF_ext+=6;
-
-            } else {
-              memcpy(dl_ch0_ext,dl_ch0,12*sizeof(int));
-              memcpy(dl_ch1_ext,dl_ch1,12*sizeof(int));
-
-              for (i=0; i<12; i++)
-                rxF_ext[i]=rxF[i];
-
-              dl_ch0_ext+=12;
-              dl_ch1_ext+=12;
-              rxF_ext+=12;
-            }
-          } else {
-            j=0;
-
-            if (skip_half==1) {
-              for (i=0; i<6; i++) {
-                if ((i!=(frame_parms->nushift)) &&
-                    (i!=((frame_parms->nushift+3)%6))) {
-                  rxF_ext[j]=rxF[i];
-                  //        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];
-                }
-              }
-
-              dl_ch0_ext+=4;
-              dl_ch1_ext+=4;
-              rxF_ext+=4;
-            } else if (skip_half==2) {
-              for (i=0; i<6; i++) {
-                if ((i!=(frame_parms->nushift))  &&
-                    (i!=((frame_parms->nushift+3)%6))) {
-                  rxF_ext[j]=rxF[(i+6)];
-                  //        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];
-                }
-              }
-
-              dl_ch0_ext+=4;
-              dl_ch1_ext+=4;
-              rxF_ext+=4;
-            } else {
-              for (i=0; i<12; i++) {
-                if ((i!=frame_parms->nushift) &&
-                    (i!=frame_parms->nushift+3) &&
-                    (i!=frame_parms->nushift+6) &&
-                    (i!=((frame_parms->nushift+9)%12))) {
-                  rxF_ext[j]=rxF[i];
-                  //  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];
-                  //            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]));
-                }
-              }
-
-              dl_ch0_ext+=8;
-              dl_ch1_ext+=8;
-              rxF_ext+=8;
-
-            }
-          }
-
-          nb_rb++;
-        }
-
-        dl_ch0+=12;
-        dl_ch1+=12;
-        rxF+=12;
-      }
-    }
-  }
-
+	  if (prb != (frame_parms->N_RB_DL>>1)) { // This PRB is not around DC
+	    if (pilots==0) {
+	      if (skip_half==1) {
+		memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
+		memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
+		memcpy(rxF_ext,rxF,6*sizeof(int32_t));
+		dl_ch0_ext+=6;
+		dl_ch1_ext+=6;
+		rxF_ext+=6;
+	      } else if (skip_half==2) {
+		memcpy(dl_ch0_ext,dl_ch0p+6,6*sizeof(int32_t));
+		memcpy(dl_ch1_ext,dl_ch1p+6,6*sizeof(int32_t));
+		memcpy(rxF_ext,rxF+6,6*sizeof(int32_t));
+		dl_ch0_ext+=6;
+		dl_ch1_ext+=6;
+		rxF_ext+=6;
+	      } else {  // skip_half==0
+		memcpy(dl_ch0_ext,dl_ch0p,12*sizeof(int32_t));
+		memcpy(dl_ch1_ext,dl_ch1p,12*sizeof(int32_t));
+		memcpy(rxF_ext,rxF,12*sizeof(int32_t));
+		for (i=0;i<12;i++)
+		  //		  printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+		dl_ch0_ext+=12;
+		dl_ch1_ext+=12;
+		rxF_ext+=12;
+	      }
+	    } else { // pilots=1
+	      j=0;
+	      
+	      if (skip_half==1) {
+		for (i=0; i<6; i++) {
+		  if ((i!=frame_parms->nushift) &&
+		      (i!=((frame_parms->nushift+3)%6))) {
+		    rxF_ext[j]=rxF[i];
+		    //		    printf("(pilots,skip1)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+		    dl_ch0_ext[j]=dl_ch0p[i];
+		    dl_ch1_ext[j++]=dl_ch1p[i];
+		  }
+		}
+		dl_ch0_ext+=4;
+		dl_ch1_ext+=4;
+		rxF_ext+=4;
+	      } else if (skip_half==2) {
+		for (i=0; i<6; i++) {
+		  if ((i!=frame_parms->nushift) &&
+		      (i!=((frame_parms->nushift+3)%6))) {
+		    rxF_ext[j]=rxF[(i+6)];
+		    //		    printf("(pilots,skip2)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+		    dl_ch0_ext[j]=dl_ch0p[i+6];
+		    dl_ch1_ext[j++]=dl_ch1p[i+6];
+		  }
+		  
+		  dl_ch0_ext+=4;
+		  dl_ch1_ext+=4;
+		  rxF_ext+=4;
+		}
+	      } else { //skip_half==0
+		for (i=0; i<12; i++) {
+		  if ((i!=frame_parms->nushift) &&
+		      (i!=frame_parms->nushift+3) &&
+		      (i!=frame_parms->nushift+6) &&
+		      (i!=((frame_parms->nushift+9)%12))) {
+		    rxF_ext[j]=rxF[i];
+		    //		    printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[j],*(1+(short*)&rxF_ext[j]));
+		    dl_ch0_ext[j]  =dl_ch0p[i];
+		    dl_ch1_ext[j++]=dl_ch1p[i];
+		  }
+		}
+		dl_ch0_ext+=8;
+		dl_ch1_ext+=8;
+		rxF_ext+=8;
+	      } //skip_half==0
+	    } //pilots==1
+	    nb_rb++;
+	  } else {       // Do middle RB (around DC)
+	    
+	    if (pilots==0) {
+	      memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
+	      memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
+	      memcpy(rxF_ext,rxF,6*sizeof(int32_t));
+	      /*
+	      for (i=0; i<6; i++) {
+		printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+		}*/
+	      rxF_ext+=6;
+	      dl_ch0_ext+=6;
+	      dl_ch1_ext+=6;
+	      dl_ch0p+=6;
+	      dl_ch1p+=6;
+	      
+	      rxF       = &rxdataF[aarx][((symbol*(frame_parms->ofdm_symbol_size)))];
+
+	      memcpy(dl_ch0_ext,dl_ch0p,6*sizeof(int32_t));
+	      memcpy(dl_ch1_ext,dl_ch1p,6*sizeof(int32_t));
+	      memcpy(rxF_ext,rxF,6*sizeof(int32_t));	      
+	      /*for (i=0; i<6; i++) {
+		printf("extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF_ext[i],*(1+(short*)&rxF_ext[i]));
+		}*/
+	      rxF_ext+=6;
+	      dl_ch0_ext+=6;
+	      dl_ch1_ext+=6;
+	    } else { // pilots==1
+	      j=0;
+	      
+	      for (i=0; i<6; i++) {
+		if ((i!=frame_parms->nushift) &&
+		    (i!=((frame_parms->nushift+3)%6))) {
+		  dl_ch0_ext[j]=dl_ch0p[i];
+		  dl_ch1_ext[j]=dl_ch1p[i];
+		  rxF_ext[j++]=rxF[i];
+		  //printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF[i],*(1+(short*)&rxF[i]));
+		}
+	      }
+	      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_ch0p[i];
+		  dl_ch1_ext[j]=dl_ch1p[i];
+		  rxF_ext[j++]=rxF[(1+i-6)];
+		  //printf("(pilots)extract rb %d, re %d => (%d,%d)\n",prb,i,*(short *)&rxF[1+i-6],*(1+(short*)&rxF[1+i-6]));
+		}
+	      }
+	      
+	      dl_ch0_ext+=8;
+	      dl_ch1_ext+=8;
+	      rxF_ext+=8;
+	    } //pilots==1
+	    nb_rb++;
+	  }  // if Middle PRB
+	} // if odd PRB	      	      	         
+      } // if rballoc==1
+    } // for prb 
+  } // for aarx
 
   return(nb_rb/frame_parms->nb_antennas_rx);
 }
@@ -4361,7 +4105,6 @@ void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per
   sprintf(fname,"dlsch%d_rxF_r%d_comp0.m",eNB_id,round);
   sprintf(vname,"dl%d_rxF_r%d_comp0",eNB_id,round);
   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_r%d_comp1.m",eNB_id,round);
     sprintf(vname,"dl%d_rxF_r%d_comp1",eNB_id,round);
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h
index 5c0487e9ed2947bd11bae27ac66cb41ebdca37b0..e570ae950b47e1e2b357fe11280819aabb6c0cfb 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_tbs_full.h
@@ -59,3 +59,5 @@ unsigned int TBStable[TBStable_rowCnt][110] = {{16,32,56,88,120,152,176,208,224,
   {616,1256,1864,2536,3112,3752,4392,5160,5736,6200,6968,7480,8248,8760,9528,10296,10680,11448,12216,12576,13536,14112,14688,15264,15840,16416,16992,17568,18336,19080,19848,20616,20616,21384,22152,22920,23688,24496,24496,25456,26416,26416,27376,28336,28336,29296,29296,30576,31704,31704,32856,32856,34008,34008,35160,35160,36696,36696,37888,37888,39232,39232,40576,40576,40576,42368,42368,43816,43816,43816,45352,45352,46888,46888,46888,48936,48936,48936,51024,51024,51024,52752,52752,52752,55056,55056,55056,55056,57336,57336,57336,59256,59256,59256,61664,61664,61664,61664,63776,63776,63776,63776,66592,66592,66592,66592,68808,68808,68808,71112},
   {712,1480,2216,2984,3752,4392,5160,5992,6712,7480,8248,8760,9528,10296,11064,11832,12576,13536,14112,14688,15264,16416,16992,17568,18336,19080,19848,20616,21384,22152,22920,23688,24496,25456,25456,26416,27376,28336,29296,29296,30576,30576,31704,32856,32856,34008,35160,35160,36696,36696,37888,37888,39232,40576,40576,40576,42368,42368,43816,43816,45352,45352,46888,46888,48936,48936,48936,51024,51024,52752,52752,52752,55056,55056,55056,55056,57336,57336,57336,59256,59256,59256,61664,61664,61664,63776,63776,63776,66592,66592,66592,68808,68808,68808,71112,71112,71112,73712,73712,75376,75376,75376,75376,75376,75376,75376,75376,75376,75376,75376}
 };
+
+unsigned int TBStable1C[32] = {40, 56, 72, 120, 136, 144, 176, 208, 224, 256, 280, 296, 328, 336, 392, 488, 552, 600, 632, 696, 776, 840, 904, 1000, 1064, 1128, 1224, 1288, 1384, 1480, 1608, 1736};
diff --git a/openair1/PHY/LTE_TRANSPORT/extern.h b/openair1/PHY/LTE_TRANSPORT/extern.h
index d3a1f6afa91976ba6f8151f7dc4c7ae90ba17bda..b4ca0a8bac792fadee3d05d2dbd38dbf0d4d7b7b 100644
--- a/openair1/PHY/LTE_TRANSPORT/extern.h
+++ b/openair1/PHY/LTE_TRANSPORT/extern.h
@@ -26,7 +26,7 @@
   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
 
  *******************************************************************************/
-extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
+extern unsigned int dlsch_tbs25[27][25],TBStable[27][110],TBStable1C[32];
 extern unsigned short lte_cqi_eff1024[16];
 extern char lte_cqi_snr_dB[15];
 extern short conjugate[8],conjugate2[8];
diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c
index dfa38fca59242db4bbb0e9f6643aa103b1956765..fc5dee1db7ba403c57ef6330d555938f18dbf7c0 100644
--- a/openair1/PHY/LTE_TRANSPORT/pmch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pmch.c
@@ -257,23 +257,31 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN
 
   switch(frame_parms->N_RB_DL) {
   case 6:
-    dlsch->harq_processes[0]->rb_alloc[0] = 0x3f;
+    dlsch->harq_processes[0]->rb_alloc_even[0] = 0x3f;
+    dlsch->harq_processes[0]->rb_alloc_odd[0] = 0x3f;
     break;
 
   case 25:
-    dlsch->harq_processes[0]->rb_alloc[0] = 0x1ffffff;
+    dlsch->harq_processes[0]->rb_alloc_even[0] = 0x1ffffff;
+    dlsch->harq_processes[0]->rb_alloc_odd[0] = 0x1ffffff;
     break;
 
   case 50:
-    dlsch->harq_processes[0]->rb_alloc[0] = 0xffffffff;
-    dlsch->harq_processes[0]->rb_alloc[1] = 0x3ffff;
+    dlsch->harq_processes[0]->rb_alloc_even[0] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_odd[0]  = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_even[1] = 0x3ffff;
+    dlsch->harq_processes[0]->rb_alloc_odd[1]  = 0x3ffff;
     break;
 
   case 100:
-    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;
+    dlsch->harq_processes[0]->rb_alloc_even[0] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_odd[0]  = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_even[1] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_odd[1]  = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_even[2] = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_odd[2]  = 0xffffffff;
+    dlsch->harq_processes[0]->rb_alloc_even[3] = 0xf;
+    dlsch->harq_processes[0]->rb_alloc_odd[3]  = 0xf;
     break;
   }
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 921dd9f6a4f8f164b6fda6d9eb50f526f4a886a5..08001f2ca4a590105b9aa7c76c4e0959ba18fc28 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -852,6 +852,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 vrb_type Flag to indicate distributed VRB type
     @param high_speed_flag
     @param frame_parms Pointer to frame descriptor
 */
@@ -1232,7 +1233,7 @@ uint32_t get_TBS_UL(uint8_t mcs, uint16_t nb_rb);
    @param vrb_type VRB type (0=localized,1=distributed)
    @param rb_alloc_dci rballoc field from DCI
 */
-uint32_t get_rballoc(uint8_t vrb_type,uint16_t rb_alloc_dci);
+uint32_t get_rballoc(vrb_t vrb_type,uint16_t rb_alloc_dci);
 
 /* \brief Return bit-map of resource allocation for a given DCI rballoc (RIV format) and vrb type
    @returns Transmission mode (1-7)
@@ -1341,7 +1342,8 @@ void ulsch_extract_rbs_single(int32_t **rxdataF,
 uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,frame_t frame,uint8_t subframe);
 uint8_t subframe2harq_pid_eNBrx(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
 
-int generate_ue_dlsch_params_from_dci(uint8_t subframe,
+int generate_ue_dlsch_params_from_dci(int frame,
+				      uint8_t subframe,
                                       void *dci_pdu,
                                       rnti_t rnti,
                                       DCI_format_t dci_format,
diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile
index d50cde372f2e9694172d33776a58567f3961f834..908c1b6f14c89b1f388dd033a2b5409e4bf12b0c 100644
--- a/openair1/PHY/TOOLS/Makefile
+++ b/openair1/PHY/TOOLS/Makefile
@@ -1,5 +1,8 @@
 lte_dfts: lte_dfts.c
-	gcc -O3 -mavx2 -o lte_dfts lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
+	gcc -O2 -mavx2 -g -ggdb -o lte_dfts lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
+
+lte_dfts.s: lte_dfts.c
+	gcc -O2 -mavx2 -S lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS
 
 dft_cycles: lte_dfts
 	./lte_dfts | egrep cycles
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index 3e7296f4a8b55a21767ec6907fcd93e58412ccd9..92d9099051bd3e6bce2c7c822b1fd9b6da303646 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -493,7 +493,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
   if (phy_vars_ue->dlsch_ue[eNB_id][0]!=NULL) {
     coded_bits_per_codeword = get_G(frame_parms,
                                     phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-                                    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
+                                    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
                                     get_Qm(mcs),
                                     phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
                                     num_pdcch_symbols,
diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h
index 1bb5212b55f32263f2d12431c50349b492e923a4..900c5b3f9a7c9c70bf3283eba7b352e4680c38ce 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/openair1/PHY/TOOLS/time_meas.h
@@ -130,8 +130,6 @@ static inline void stop_meas(time_stats_t *ts)
 
 static inline void reset_meas(time_stats_t *ts) {
 
-  static int cpu_freq_set=0;
-  
   ts->trials=0;
   ts->diff=0;
   ts->diff_now=0;
diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h
index 47c32d87c83984a63374930f8d4694db62d11bbb..66b30ffda092203e089227248effe59422118af6 100644
--- a/openair1/PHY/impl_defs_lte.h
+++ b/openair1/PHY/impl_defs_lte.h
@@ -68,6 +68,8 @@ typedef enum {TDD=1,FDD=0} lte_frame_type_t;
 
 typedef enum {EXTENDED=1,NORMAL=0} lte_prefix_type_t;
 
+typedef enum {LOCALIZED=0,DISTRIBUTED=1} vrb_t;
+
 /// Enumeration for parameter PHICH-Duration \ref PHICH_CONFIG_COMMON::phich_duration.
 typedef enum {
   normal=0,
diff --git a/openair1/PHY/sse_intrin.h b/openair1/PHY/sse_intrin.h
index 00e2efdb6327ae3f4dd8ca7f456c59f76e7012f6..cfd3d0b653afc88ded000a4e3ff00f4252d1c303 100644
--- a/openair1/PHY/sse_intrin.h
+++ b/openair1/PHY/sse_intrin.h
@@ -63,6 +63,9 @@
 #  include <smmintrin.h>
 #endif
 
+#ifdef __AVX2__
+#  include <immintrin.h>
+#endif
 
 // ------------------------------------------------
 // compatibility functions if SSE3 or SSE4 is not available
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 6e2581d8155601f495c314290b32199c4e1e906e..410a35065953269e0d1ef5e7dc0e30614396421c 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -134,7 +134,7 @@ void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t
 
   coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms,
                                   phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-                                  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
+                                  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
                                   phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm,
                                   phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
                                   phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
@@ -163,7 +163,7 @@ void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
 
   coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms,
                                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
-                                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc,
+                                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even,
                                   2,
                                   1,
                                   phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
@@ -268,7 +268,7 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
 
   coded_bits_per_codeword = get_G(&phy_vars_ue->lte_frame_parms,
                                   phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb,
-                                  phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc,
+                                  phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even,
                                   2,
                                   1,
                                   phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
@@ -2140,7 +2140,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
       
       //      dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
       if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) &&
-	  (generate_ue_dlsch_params_from_dci(subframe_rx,
+	  (generate_ue_dlsch_params_from_dci(frame_rx,
+					     subframe_rx,
 					     (void *)&dci_alloc_rx[i].dci_pdu,
 					     phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti,
 					     dci_alloc_rx[i].format,
@@ -2186,10 +2187,10 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
     }
 
     else if ((dci_alloc_rx[i].rnti == SI_RNTI) &&
-             (dci_alloc_rx[i].format == format1A)) {
+             ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) {
 
 #ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1A, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
+      LOG_D(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",phy_vars_ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i);
       /*
       if (((frame_rx%100) == 0) || (frame_rx < 20))
       dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
@@ -2207,10 +2208,11 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 
 #endif
 
-      if (generate_ue_dlsch_params_from_dci(subframe_rx,
+      if (generate_ue_dlsch_params_from_dci(frame_rx,
+					    subframe_rx,
                                             (void *)&dci_alloc_rx[i].dci_pdu,
                                             SI_RNTI,
-                                            format1A,
+                                            dci_alloc_rx[i].format,
                                             &phy_vars_ue->dlsch_ue_SI[eNB_id],
                                             &phy_vars_ue->lte_frame_parms,
                                             phy_vars_ue->pdsch_config_dedicated,
@@ -2221,7 +2223,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
         phy_vars_ue->dlsch_SI_received[eNB_id]++;
  
 
-	LOG_D(PHY,"[UE  %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1A\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx);
+	LOG_D(PHY,"[UE  %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C");
         //dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]);
 
       }
@@ -2250,7 +2252,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 
 #endif
 
-      if (generate_ue_dlsch_params_from_dci(subframe_rx,
+      if (generate_ue_dlsch_params_from_dci(frame_rx,
+					    subframe_rx,
                                             (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu,
                                             phy_vars_ue->prach_resources[eNB_id]->ra_RNTI,
                                             format1A,
@@ -2265,7 +2268,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 
 #ifdef DEBUG_PHY_PROC
         LOG_D(PHY,"[UE  %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ue_ra[eNB_id] %p\n",
-              phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc[0],phy_vars_ue->dlsch_ue_ra[eNB_id]);
+              phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],phy_vars_ue->dlsch_ue_ra[eNB_id]);
 #endif
       }
     } else if( (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) &&
@@ -2396,7 +2399,7 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst
 int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,
                          relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn)
 {
-
+ 
   uint16_t l,m,n_symb;
   //  int eNB_id = 0,
   int ret=0;
@@ -2631,7 +2634,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
           if (abstraction_flag == 0) {
             phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&phy_vars_ue->lte_frame_parms,
                 phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-                phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
+                phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
                 phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm,
                 phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
                 phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
@@ -2745,7 +2748,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
       // SI_DLSCH
       if (phy_vars_ue->dlsch_ue_SI[eNB_id]->active == 1) {
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev);
+        LOG_I(PHY,"SI is active in subframe %d\n",subframe_prev);
 #endif
 
         // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding
@@ -2789,19 +2792,19 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
             phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G =
               get_G(&phy_vars_ue->lte_frame_parms,
                     phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
-                    phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc,
+                    phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even,
                     2,
 		    1,
                     phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
                     frame_rx,subframe_prev);
 
-#ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0],
+	    //#ifdef DEBUG_PHY_PROC
+            LOG_I(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->nb_rb,
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->G,
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
                   phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols);
-#endif
+	    //#endif
 
 
             dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
@@ -2843,21 +2846,21 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 
           if (ret == (1+phy_vars_ue->dlsch_ue_SI[eNB_id]->max_turbo_iterations)) {
             phy_vars_ue->dlsch_SI_errors[eNB_id]++;
-#ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
+	    //#ifdef DEBUG_PHY_PROC
+            LOG_I(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
 		  phy_vars_ue->Mod_id,
 		  frame_rx,
 		  subframe_prev,
 		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs,
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx,
-		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0],
-                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[1],
-		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[2],
-                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[3]);
-#endif
+		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
+                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1],
+		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
+                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
+	    //#endif
 
-	    //            dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev);
+	      dump_dlsch_SI(phy_vars_ue,eNB_id,subframe_prev);
             VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
             stop_meas(&phy_vars_ue->phy_proc_rx);
 	    return(-1);
@@ -2871,10 +2874,10 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->TBS,
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->mcs,
                   phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rvidx,
-		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[0],
-                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[1],
-		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[2],
-                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc[3]);
+		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
+                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1],
+		  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
+                  phy_vars_ue->dlsch_ue_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
 #endif
 
 #ifdef OPENAIR2
@@ -2949,7 +2952,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
         if (abstraction_flag==0) {
           phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms,
 									 phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->nb_rb,
-									 phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc,
+									 phy_vars_ue->dlsch_ue_ra[eNB_id]->harq_processes[0]->rb_alloc_even,
 									 2,
 									 1,
 									 phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
@@ -3327,7 +3330,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
           */
           phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->G = get_G(&phy_vars_ue->lte_frame_parms,
               phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->nb_rb,
-              phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc,
+              phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->rb_alloc_even,
               phy_vars_ue->dlsch_ue_MCH[0]->harq_processes[0]->Qm,
               1,
               2,
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 9aa344f5e3a6daa0010cbf7ef974d804f42c5483..ff0e2055144de4722bfdcfa636c74e2808c75269 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -3043,6 +3043,7 @@ PMI_FEEDBACK:
 
                     if ((dci_alloc_rx[i].rnti == n_rnti) &&
                         (generate_ue_dlsch_params_from_dci(0,
+							   0,
                                                            dci_alloc_rx[i].dci_pdu,
                                                            dci_alloc_rx[i].rnti,
                                                            dci_alloc_rx[i].format,
@@ -3055,7 +3056,7 @@ PMI_FEEDBACK:
                       //dump_dci(&PHY_vars_UE->lte_frame_parms,&dci_alloc_rx[i]);
                       coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
                                                       PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->nb_rb,
-                                                      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->rb_alloc,
+                                                      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->rb_alloc_even,
                                                       get_Qm(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]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->Nl,
                                                       PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
@@ -3099,6 +3100,7 @@ PMI_FEEDBACK:
                   case 1:
                   case 2:
                     generate_ue_dlsch_params_from_dci(0,
+						      0,
                                                       &DLSCH_alloc_pdu_1[0],
                                                       (common_flag==0)? C_RNTI : SI_RNTI,
                                                       (common_flag==0)? format1 : format1A,
@@ -3113,6 +3115,7 @@ PMI_FEEDBACK:
                   case 3:
                     //        printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx);
                     generate_ue_dlsch_params_from_dci(0,
+						      0,
                                                       &DLSCH_alloc_pdu_1[0],
                                                       (common_flag==0)? C_RNTI : SI_RNTI,
                                                       (common_flag==0)? format2A : format1A,
@@ -3127,6 +3130,7 @@ PMI_FEEDBACK:
 
                   case 4:
                     generate_ue_dlsch_params_from_dci(0,
+						      0,
                                                       &DLSCH_alloc_pdu_1[0],
                                                       (common_flag==0)? C_RNTI : SI_RNTI,
                                                       (common_flag==0)? format2 : format1A,
@@ -3141,6 +3145,7 @@ PMI_FEEDBACK:
                   case 5:
                   case 6:
                     generate_ue_dlsch_params_from_dci(0,
+						      0,
                                                       &DLSCH_alloc_pdu2_1E[0],
                                                       C_RNTI,
                                                       format1E_2A_M10PRB,
@@ -3389,7 +3394,7 @@ PMI_FEEDBACK:
               dlsch0_ue_harq = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
               dlsch0_eNB_harq = PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
               dlsch0_eNB_harq->mimo_mode    = LARGE_CDD;
-              dlsch0_eNB_harq->rb_alloc[0]  = dlsch0_ue_harq->rb_alloc[0];
+              dlsch0_eNB_harq->rb_alloc[0]  = dlsch0_ue_harq->rb_alloc_even[0];
               dlsch0_eNB_harq->nb_rb        = dlsch0_ue_harq->nb_rb;
               dlsch0_eNB_harq->mcs          = dlsch0_ue_harq->mcs;
               dlsch0_eNB_harq->rvidx        = dlsch0_ue_harq->rvidx;
diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c
index 1b2fc97b4657a16319a05ecc9edeccebeb249b9e..77f3b8accf30a781eef7725ca63da073a26583f2 100644
--- a/openair1/SIMULATION/LTE_PHY/prachsim.c
+++ b/openair1/SIMULATION/LTE_PHY/prachsim.c
@@ -554,7 +554,7 @@ int main(int argc, char **argv)
 
         for (i=1; i<64; i++) {
           if (preamble_energy_max < preamble_energy_list[i]) {
-            //    printf("preamble %d => %d\n",i,preamble_energy_list[i]);
+            //   printf("preamble %d => %d\n",i,preamble_energy_list[i]);
             preamble_energy_max = preamble_energy_list[i];
             preamble_max = i;
           }
diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
index 2e90e5227462321feaebe91010cd75c760c0f65e..9f299fa58e0d2ee4384c3d0be5d25e84fbe3e584 100644
--- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
+++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c
@@ -422,6 +422,17 @@ int trx_eth_reset_stats(openair0_device* device) {
 
 }
 
+int openair0_set_gains(openair0_device* device, 
+		       openair0_config_t *openair0_cfg) {
+
+  return(0);
+}
+
+int openair0_set_frequencies(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) {
+
+  return(0);
+}
+
 
 
 void trx_eth_end(openair0_device *device) {
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index d5ba61186f537dddff1e5edbe847f935dbcc466e..56f6825931ead9913372ae0d02180c4f1512d3f1 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -1631,8 +1631,10 @@ static void* eNB_thread( void* arg )
 
   int frame = 0;
 
+#ifndef EXMIMO
   spp = openair0_cfg[0].samples_per_packet;
   tx_pos=spp*openair0_cfg[0].tx_delay;
+#endif
 
   while (!oai_exit) {
     start_meas( &softmodem_stats_mt );
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 7c0539497b935c3f69d515a2516bd0369667d89b..40aed08998a926b4befc3b30adf1d8ed474f931a 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -175,9 +175,9 @@ static const eutra_band_t eutra_bands[] = {
   {12,  698    * MHz,  716    * MHz,  728    * MHz,  746    * MHz, FDD},
   {13,  777    * MHz,  787    * MHz,  746    * MHz,  756    * MHz, FDD},
   {14,  788    * MHz,  798    * MHz,  758    * MHz,  768    * MHz, FDD},
-
   {17,  704    * MHz,  716    * MHz,  734    * MHz,  746    * MHz, FDD},
   {20,  832    * MHz,  862    * MHz,  791    * MHz,  821    * MHz, FDD},
+  {22, 3510    * MHz, 3590    * MHz, 3410    * MHz, 3490    * MHz, FDD},
   {33, 1900    * MHz, 1920    * MHz, 1900    * MHz, 1920    * MHz, TDD},
   {34, 2010    * MHz, 2025    * MHz, 2010    * MHz, 2025    * MHz, TDD},
   {35, 1850    * MHz, 1910    * MHz, 1850    * MHz, 1910    * MHz, TDD},
diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c
index 1c98ac2a38310ea83e442501b8f09aa3909782cc..a32c4f2e59b5080def42172eb3e430b76069f410 100644
--- a/targets/RT/USER/sched_rx_pdsch.c
+++ b/targets/RT/USER/sched_rx_pdsch.c
@@ -152,7 +152,7 @@ static void * rx_pdsch_thread(void *param)
     harq_pid = UE->dlsch_ue[eNB_id][0]->current_harq_pid;
     UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&UE->lte_frame_parms,
         UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-        UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
+        UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
         get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),
         UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
         UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,