diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index 2640a86240bba7abe906e54dc91530b75ff26e92..c92da6dd7f0db2dda8b4a6bb964b02c0b2992352 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -707,7 +707,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
 
       Xu=(int16_t*)gNB->X_u[preamble_offset-first_nonzero_root_idx];
 
-      LOG_D(PHY,"PRACH RX new dft preamble_offset-first_nonzero_root_idx %d\n",preamble_offset-first_nonzero_root_idx);
+      LOG_I(PHY,"PRACH RX new dft preamble_offset-first_nonzero_root_idx %d\n",preamble_offset-first_nonzero_root_idx);
 
 
       memset(prach_ifft,0,((N_ZC==839) ? 2048 : 256)*sizeof(int32_t));
@@ -790,7 +790,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
   else *TA = *TA/2;
 
 
-  if (LOG_DUMPFLAG(PRACH)) {
+  //if (LOG_DUMPFLAG(PRACH)) {
     //int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][0],840));
     //    if (en>60) {
       int k = (12*n_ra_prb) - 6*fp->N_RB_UL;
@@ -807,7 +807,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
       LOG_M("Xu.m","xu",Xu,N_ZC,1,1);
       LOG_M("prach_ifft0.m","prach_t0",prach_ifft,1024,1,1);
       //    }
-  } /* LOG_DUMPFLAG(PRACH) */
+  //} /* LOG_DUMPFLAG(PRACH) */
   stop_meas(&gNB->rx_prach);
 
 }
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index c950d6f4da2079fe3a23af075fe8e6f5ceb1e547..42518c6438fe22cc1a48515b1746f2bc6b70115d 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -729,6 +729,7 @@ int main(int argc, char **argv) {
                                 channel_model,
                                 N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
                                 N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
+                                30e-9,
                                 forgetting_factor,
                                 delay,
                                 0);
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index 5604caf4612f512aa565ca4579e106c4f4a54fbe..b388db4d9fb3672ae699499e84a01d21cfb16993 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -106,6 +106,12 @@ uint16_t n_rnti = 0x1234;
 openair0_config_t openair0_cfg[MAX_CARDS];
 //const uint8_t nr_rv_round_map[4] = {0, 2, 1, 3}; 
 
+channel_desc_t *UE2gNB[NUMBER_OF_UE_MAX][NUMBER_OF_gNB_MAX];
+double s_re0[122880],s_im0[122880],r_re0[122880],r_im0[122880];
+double s_re1[122880],s_im1[122880],r_re1[122880],r_im1[122880];
+double r_re2[122880],r_im2[122880];
+double r_re3[122880],r_im3[122880];
+
 int main(int argc, char **argv)
 {
   char c;
@@ -116,23 +122,31 @@ int main(int argc, char **argv)
   uint8_t snr1set = 0;
   int slot = 8, frame = 0;
   FILE *output_fd = NULL;
+  double *s_re[2]= {s_re0,s_re1};
+  double *s_im[2]= {s_im0,s_im1};
+  double *r_re[4]= {r_re0,r_re1,r_re2,r_re3};
+  double *r_im[4]= {r_im0,r_im1,r_im2,r_im3};
   //uint8_t write_output_file = 0;
   int trial, n_trials = 1, n_errors = 0, n_false_positive = 0, delay = 0;
+  double maxDoppler = 0.0;
   uint8_t n_tx = 1, n_rx = 1;
   //uint8_t transmission_mode = 1;
   //uint16_t Nid_cell = 0;
-  channel_desc_t *gNB2UE;
+  channel_desc_t *UE2gNB;
   uint8_t extended_prefix_flag = 0;
   //int8_t interf1 = -21, interf2 = -21;
   FILE *input_fd = NULL;
   SCM_t channel_model = AWGN;  //Rayleigh1_anticorr;
   uint16_t N_RB_DL = 106, N_RB_UL = 106, mu = 1;
+  double tx_gain=1.0;
+  double N0=30;
+
   //unsigned char frame_type = 0;
   NR_DL_FRAME_PARMS *frame_parms;
   int loglvl = OAILOG_WARNING;
   //uint64_t SSB_positions=0x01;
   uint16_t nb_symb_sch = 12;
-  int start_symbol = 2;
+  int start_symbol = 0;
   uint16_t nb_rb = 50;
   uint8_t Imcs = 9;
   uint8_t precod_nbr_layers = 1;
@@ -156,6 +170,8 @@ int main(int argc, char **argv)
   UE_nr_rxtx_proc_t UE_proc;
   FILE *scg_fd=NULL;
 
+  double TDL_DS = 30e-9;
+
   int ibwps=24;
   int ibwp_rboffset=41;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) {
@@ -234,7 +250,22 @@ int main(int argc, char **argv)
       case 'G':
 	channel_model = ETU;
 	break;
-	
+
+      case 'H':
+        channel_model = TDL_C;
+	TDL_DS = 30e-9;
+	break;
+  
+      case 'I':
+	channel_model = TDL_C;
+	TDL_DS = 300e-9;
+        break;
+     
+      case 'J':
+	channel_model=TDL_D;
+	TDL_DS = 30e-9;
+	break;
+
       default:
 	printf("Unsupported channel model!\n");
 	exit(-1);
@@ -401,13 +432,26 @@ int main(int argc, char **argv)
 
   if (snr1set == 0)
     snr1 = snr0 + 10;
-
-  gNB2UE = new_channel_desc_scm(n_tx, n_rx, channel_model,
-                                61.44e6, //N_RB2sampling_rate(N_RB_DL),
-                                40e6, //N_RB2channel_bandwidth(N_RB_DL),
+  double sampling_frequency;
+  double bandwidth;
+
+  if (N_RB_UL >= 217) sampling_frequency = 122.88e6;
+  else if (N_RB_UL >= 106) sampling_frequency = 61.44e6;
+  else { printf("Need at least 106 PRBs\b"); exit(-1); }
+  if (N_RB_UL == 273) bandwidth = 100e6;
+  else if (N_RB_UL == 217) bandwidth = 80e6;
+  else if (N_RB_UL == 106) bandwidth = 40e6;
+  else { printf("Add N_RB_UL %d\n",N_RB_UL); exit(-1); }
+			   
+
+  UE2gNB = new_channel_desc_scm(n_tx, n_rx, channel_model,
+                                sampling_frequency,
+                                bandwidth,
+				TDL_DS,
                                 0, 0, 0);
 
-  if (gNB2UE == NULL) {
+  UE2gNB->max_Doppler = maxDoppler;
+  if (UE2gNB == NULL) {
     printf("Problem generating channel model. Exiting.\n");
     exit(-1);
   }
@@ -470,7 +514,6 @@ int main(int argc, char **argv)
   N_RB_DL = gNB->frame_parms.N_RB_DL;
 
 
-
   NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
 
   //crcTableInit();
@@ -574,6 +617,8 @@ int main(int argc, char **argv)
   uint8_t ptrs_time_density = get_L_ptrs(ptrs_mcs1, ptrs_mcs2, ptrs_mcs3, Imcs, mcs_table);
   uint8_t ptrs_freq_density = get_K_ptrs(n_rb0, n_rb1, nb_rb);
 
+  if (input_fd != NULL) max_rounds=1;
+
   if(1<<ptrs_time_density >= nb_symb_sch)
     pdu_bit_map &= ~PUSCH_PDU_BITMAP_PUSCH_PTRS; // disable PUSCH PTRS
 
@@ -774,22 +819,38 @@ int main(int argc, char **argv)
       }	
       else n_trials = 1;
 
+      if (input_fd == NULL ) {
 
-      sigma_dB = 10*log10(txlev_float)-SNR;
-      sigma    = pow(10,sigma_dB/10);
-      if(n_trials==1) printf("txlev_float %f, sigma_dB %f\n",10*log10(txlev_float),sigma_dB);
+	sigma_dB = N0;
+	sigma    = pow(10,sigma_dB/10);
 
-	  //----------------------------------------------------------
-	  //------------------------ add noise -----------------------
-	  //----------------------------------------------------------
-	if (input_fd == NULL ) {
-	  for (i=0; i<slot_length; i++) {
-	    for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
-	      ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)]   = (int16_t)((double)(((int16_t *)&UE->common_vars.txdata[ap][slot_offset])[(i<<1)])/sqrt(scale)   + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
-	      ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)]   = (int16_t)((double)(((int16_t *)&UE->common_vars.txdata[ap][slot_offset])[(i<<1)+1])/sqrt(scale) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
-	    }
+	tx_gain = sqrt(pow(10.0,.1*(N0+SNR))/txlev_float);
+	if(n_trials==1) printf("txlev_float %f, sigma_dB %f, tx_gain %f tx_offset %d, slot_offset %d\n",10*log10(txlev_float),sigma_dB,tx_gain,tx_offset,slot_offset);
+
+	for (i=0; i<slot_length; i++) {
+	  for (int aa=0; aa<1; aa++) {
+	    s_re[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)]);
+	    s_im[aa][i] = ((double)(((short *)&UE->common_vars.txdata[aa][slot_offset]))[(i<<1)+1]);
+	  }
+	}
+	
+
+	if (UE2gNB->max_Doppler == 0) {
+	  multipath_channel(UE2gNB,s_re,s_im,r_re,r_im,
+			    slot_length,0);
+	} else {
+	  multipath_tv_channel(UE2gNB,s_re,s_im,r_re,r_im,
+			       2*slot_length,0);
+	}
+	for (i=0; i<slot_length; i++) {
+	  if (n_trials== 1 && i<256) printf("i %d : (%f,%f)*%f = (%f,%f) \n",i,r_re[0][i],r_im[0][i],tx_gain,r_re[0][i]*tx_gain,r_im[0][i]*tx_gain);
+	  for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
+	    ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i) + (delay*2)]   = (int16_t)((tx_gain*r_re[ap][i])   + (sqrt(sigma/2)*gaussdouble(0.0,1.0))); // convert to fixed point
+	    ((int16_t*) &gNB->common_vars.rxdata[ap][slot_offset])[(2*i)+1 + (delay*2)]   = (int16_t)((tx_gain*r_im[ap][i]) + (sqrt(sigma/2)*gaussdouble(0.0,1.0)));
 	  }
 	}
+	
+	}
 	else {
 	  AssertFatal(frame_parms->nb_antennas_rx == 1, "nb_ant != 1\n");
 	  // 800 samples is N_TA_OFFSET for FR1 @ 30.72 Ms/s,
@@ -799,7 +860,7 @@ int main(int argc, char **argv)
 	  int ta_offset=1600;
 	  if (N_RB_DL <217) ta_offset=800;
 	  else if (N_RB_DL < 106) ta_offset = 400;
-
+	  fseek(input_fd,(slot_length<<2)+2000,SEEK_SET);
 	  fread((void*)&gNB->common_vars.rxdata[0][slot_offset],
 		sizeof(int16_t),
 		slot_length<<1,
@@ -821,14 +882,14 @@ int main(int argc, char **argv)
         start_meas(&gNB->phy_proc_rx);
         phy_procedures_gNB_common_RX(gNB, frame, slot);
 
-	if (n_trials==1) {
+	if (n_trials==1 && round==0) {
 	  LOG_M("rxsig0.m","rx0",&gNB->common_vars.rxdata[0][0],frame_parms->samples_per_subframe*10,1,1);
 
 	  LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0]+start_symbol*frame_parms->ofdm_symbol_size,nb_symb_sch*frame_parms->ofdm_symbol_size,1,1);
 
 	}
         phy_procedures_gNB_uespec_RX(gNB, frame, slot);
-	if (n_trials == 1) { 
+	if (n_trials == 1  && round==0) { 
 	  LOG_M("rxsigF0_ext.m","rxsF0_ext",
 		&gNB->pusch_vars[0]->rxdataF_ext[0][(start_symbol+1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size],(nb_symb_sch-1)*NR_NB_SC_PER_RB * pusch_pdu->rb_size,1,1);
 	  LOG_M("chestF0.m","chF0",
diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c
index 70227c8e8db271d51ef6c0345c9d01332f480e54..af0b8874afb168e889006ec6f2c070b9afd97444 100644
--- a/openair1/SIMULATION/TOOLS/multipath_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_channel.c
@@ -201,11 +201,11 @@ void multipath_channel(channel_desc_t *desc,
 
       rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
       rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
-      /*
-      if ((ii==0)&&((i%32)==0)) {
-      printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
-      }
-      */
+      
+      /*      if ((ii==0)&&((i%32)==0)) {
+	printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
+	}*/
+      
       //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
       //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
 
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index 41d8551e75726427f356cc0a78226723ad8bd1ff..69115d0741223f1e41f3d29db8687e522585bdfd 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -173,6 +173,223 @@ double mbsfn_amps_dB[] = {0,-1.5,-1.4,-3.6,-0.6,-7.0,-10,-11.5,-11.4,-13.6,-10.6
 double scm_c_delays[] = {0, 0.0125, 0.0250, 0.3625, 0.3750, 0.3875, 0.2500, 0.2625, 0.2750, 1.0375, 1.0500, 1.0625, 2.7250, 2.7375, 2.7500, 4.6000, 4.6125, 4.6250};
 double scm_c_amps_dB[] = {0.00, -2.22, -3.98, -1.86, -4.08, -5.84, -1.08, -3.30, -5.06, -9.08, -11.30, -13.06, -15.14, -17.36, -19.12, -20.64, -22.85, -24.62};
 
+double tdl_a_delays[] = {0.0000,
+			 0.3819,
+			 0.4025,
+			 0.5868,
+			 0.4610,
+			 0.5375,
+			 0.6708,
+			 0.5750,
+			 0.7618,
+			 1.5375,
+			 1.8978,
+			 2.2242,
+			 2.1718,
+			 2.4942,
+			 2.5119,
+			 3.0582,
+			 4.0810,
+			 4.4579,
+			 4.5695,
+			 4.7966,
+			 5.0066,
+			 5.3043,
+			 9.6586};
+double tdl_a_amps_dB[] = {-13.4,
+			  0,
+			  -2.2,
+			  -4,
+			  -6,
+			  -8.2,
+			  -9.9,
+			  -10.5,
+			  -7.5,
+			  -15.9,
+			  -6.6,
+			  -16.7,
+			  -12.4,
+			  -15.2,
+			  -10.8,
+			  -11.3,
+			  -12.7,
+			  -16.2,
+			  -18.3,
+			  -18.9,
+			  -16.6,
+			  -19.9,
+			  -29.7};
+#define TDL_A_PATHS 23
+
+double tdl_b_delays[] = {0.0000,
+			 0.1072,
+			 0.2155,
+			 0.2095,
+			 0.2870,
+			 0.2986,
+			 0.3752,
+			 0.5055,
+			 0.3681,
+			 0.3697,
+			 0.5700,
+			 0.5283,
+			 1.1021,
+			 1.2756,
+			 1.5474,
+			 1.7842,
+			 2.0169,
+			 2.8294,
+			 3.0219,
+			 3.6187,
+			 4.1067,
+			 4.2790,
+			 4.7834};
+
+double tdl_b_amps_dB[] = {0,
+			  -2.2,
+			  -4,
+			  -3.2,
+			  -9.8,
+			  -1.2,
+			  -3.4,
+			  -5.2,
+			  -7.6,
+			  -3,
+			  -8.9,
+			  -9,
+			  -4.8,
+			  -5.7,
+			  -7.5,
+			  -1.9,
+			  -7.6,
+			  -12.2,
+			  -9.8,
+			  -11.4,
+			  -14.9,
+			  -9.2,
+			  -11.3};
+#define TDL_B_PATHS 23
+
+double tdl_c_delays[] = {0,
+			 0.2099,
+			 0.2219,
+			 0.2329,
+			 0.2176,
+			 0.6366,
+			 0.6448,
+			 0.6560,
+			 0.6584,
+			 0.7935,
+			 0.8213,
+			 0.9336,
+			 1.2285,
+			 1.3083,
+			 2.1704,
+			 2.7105,
+			 4.2589,
+			 4.6003,
+			 5.4902,
+			 5.6077,
+			 6.3065,
+			 6.6374,
+			 7.0427,
+			 8.6523};
+
+double tdl_c_amps_dB[] = {-4.4,
+			  -1.2,
+			  -3.5,
+			  -5.2,
+			  -2.5,
+			  0,
+			  -2.2,
+			  -3.9,
+			  -7.4,
+			  -7.1,
+			  -10.7,
+			  -11.1,
+			  -5.1,
+			  -6.8,
+			  -8.7,
+			  -13.2,
+			  -13.9,
+			  -13.9,
+			  -15.8,
+			  -17.1,
+			  -16,
+			  -15.7,
+			  -21.6,
+			  -22.8};
+#define TDL_C_PATHS 24
+
+double tdl_d_delays[] = {//0,
+			 0,
+	  	         0.035,
+			 0.612,
+			 1.363,
+			 1.405,
+			 1.804,
+			 2.596,
+			 1.775,
+			 4.042,
+			 7.937,
+			 9.424,
+			 9.708,
+			 12.525};
+
+double tdl_d_amps_dB[] = {//-0.2,
+//-13.5,
+                          -.00147,
+			  -18.8,
+			  -21,
+			  -22.8,
+			  -17.9,
+			  -20.1,
+			  -21.9,
+			  -22.9,
+			  -27.8,
+			  -23.6,
+			  -24.8,
+			  -30.0,
+			  -27.7};
+
+#define TDL_D_PATHS 13
+#define TDL_D_RICEAN_FACTOR .046774
+
+double tdl_e_delays[] = {0,
+			 0.5133,
+			 0.5440,
+			 0.5630,
+			 0.5440,
+			 0.7112,
+			 1.9092,
+			 1.9293,
+			 1.9589,
+			 2.6426,
+			 3.7136,
+			 5.4524,
+			 12.0034,
+			 20.6519};
+
+double tdl_e_amps_dB[] = {//-0.03,
+			  //-22.03,
+                          -.00433,
+			  -15.8,
+			  -18.1,
+			  -19.8,
+			  -22.9,
+			  -22.4,
+			  -18.6,
+			  -20.8,
+			  -22.6,
+			  -22.3,
+			  -25.6,
+			  -20.2,
+			  -29.8,
+			  -29.2};
+
+#define TDL_E_PATHS 14
+#define TDL_E_RICEAN_FACTOR 0.0063096
+
 double epa_delays[] = { 0,.03,.07,.09,.11,.19,.41};
 double epa_amps_dB[] = {0.0,-1.0,-2.0,-3.0,-8.0,-17.2,-20.8};
 
@@ -277,6 +494,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
                                      SCM_t channel_model,
                                      double sampling_rate,
                                      double channel_bandwidth,
+				     double DS_TDL,
                                      double forgetting_factor,
                                      int32_t channel_offset,
                                      double path_loss_dB) {
@@ -284,6 +502,7 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
   uint16_t i,j;
   double sum_amps;
   double aoa,ricean_factor,Td,maxDoppler;
+
   int channel_length,nb_taps;
   chan_desc->nb_tx                      = nb_tx;
   chan_desc->nb_rx                      = nb_rx;
@@ -296,6 +515,11 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
   chan_desc->ip                                 = 0.0;
   LOG_I(OCM,"Channel Model (inside of new_channel_desc_scm)=%d\n\n", channel_model);
 
+  int tdl_paths=0;
+  double tdl_ricean_factor = 1;
+  double *tdl_amps_dB;
+  double *tdl_delays;
+
   switch (channel_model) {
     case SCM_A:
       LOG_W(OCM,"channel model not yet supported\n");
@@ -423,6 +647,99 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
       }
 
       break;
+      
+    case TDL_A:
+    case TDL_B:
+    case TDL_C:  
+    case TDL_D:  
+  case TDL_E:
+      if (channel_model == TDL_A) {  
+	tdl_paths=TDL_A_PATHS;
+	tdl_delays=tdl_a_delays;
+	tdl_amps_dB=tdl_a_amps_dB;
+      }else if (channel_model == TDL_B) {
+	  tdl_paths=TDL_B_PATHS;
+	tdl_delays=tdl_b_delays;
+	tdl_amps_dB=tdl_b_amps_dB;      
+      }
+      else if (channel_model == TDL_C) {
+	tdl_paths=TDL_C_PATHS;
+	tdl_delays=tdl_c_delays;
+	tdl_amps_dB=tdl_c_amps_dB;
+	printf("Initializing TDL_C channel with %d paths\n",TDL_C_PATHS);
+      } else if (channel_model == TDL_D) {
+	tdl_paths=TDL_D_PATHS;
+	tdl_delays=tdl_d_delays;
+	tdl_amps_dB=tdl_d_amps_dB;
+	tdl_ricean_factor = TDL_D_RICEAN_FACTOR;
+      } else if (channel_model == TDL_E) {
+	tdl_paths=TDL_E_PATHS-1;
+	tdl_delays=tdl_e_delays+1;
+	tdl_amps_dB=tdl_e_amps_dB;
+	tdl_ricean_factor = TDL_E_RICEAN_FACTOR;
+      }
+
+      int tdl_pathsby3 = tdl_paths/3;
+      if ((tdl_paths%3)>0) tdl_pathsby3++;
+
+      chan_desc->nb_taps        = tdl_paths;
+      chan_desc->Td             = tdl_delays[tdl_paths-1]*DS_TDL;
+      printf("last path (%d) at %f * %e = %e\n",tdl_paths-1,tdl_delays[tdl_paths-1],DS_TDL,chan_desc->Td);
+      chan_desc->channel_length = (int) (2*chan_desc->sampling_rate*chan_desc->Td + 1 + 2/(M_PI*M_PI)*log(4*M_PI*chan_desc->sampling_rate*chan_desc->Td));
+      printf("TDL : %f Ms/s, nb_taps %d, Td %e, channel_length %d\n",chan_desc->sampling_rate,tdl_paths,chan_desc->Td,chan_desc->channel_length);
+      sum_amps = 0;
+      chan_desc->amps           = (double *) malloc(chan_desc->nb_taps*sizeof(double));
+
+      for (i = 0; i<chan_desc->nb_taps; i++) {
+        chan_desc->amps[i]      = pow(10,.1*tdl_amps_dB[i]);
+        sum_amps += chan_desc->amps[i];
+      }
+
+      for (i = 0; i<chan_desc->nb_taps; i++)
+        chan_desc->amps[i] /= sum_amps;
+
+      chan_desc->delays         = tdl_delays;
+      chan_desc->ricean_factor  = tdl_ricean_factor;
+      chan_desc->aoa            = 0;
+      chan_desc->random_aoa     = 0;
+      chan_desc->ch             = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
+      chan_desc->chF            = (struct complex **) malloc(nb_tx*nb_rx*sizeof(struct complex *));
+      chan_desc->a              = (struct complex **) malloc(chan_desc->nb_taps*sizeof(struct complex *));
+
+      for (i = 0; i<nb_tx*nb_rx; i++)
+        chan_desc->ch[i] = (struct complex *) malloc(chan_desc->channel_length * sizeof(struct complex));
+
+      for (i = 0; i<nb_tx*nb_rx; i++)
+        chan_desc->chF[i] = (struct complex *) malloc(1200 * sizeof(struct complex));
+
+      for (i = 0; i<chan_desc->nb_taps; i++)
+        chan_desc->a[i]         = (struct complex *) malloc(nb_tx*nb_rx * sizeof(struct complex));
+
+      chan_desc->R_sqrt  = (struct complex **) malloc(6*sizeof(struct complex **));
+
+      if (nb_tx==2 && nb_rx==2) {
+        for (i = 0; i<(tdl_pathsby3); i++)
+          chan_desc->R_sqrt[i] = (struct complex *) &R22_sqrt[i][0];
+      } else if (nb_tx==2 && nb_rx==1) {
+        for (i = 0; i<(tdl_pathsby3); i++)
+          chan_desc->R_sqrt[i] = (struct complex *) &R21_sqrt[i][0];
+      } else if (nb_tx==1 && nb_rx==2) {
+        for (i = 0; i<(tdl_pathsby3); i++)
+          chan_desc->R_sqrt[i] = (struct complex *) &R12_sqrt[i][0];
+      } else {
+        for (i = 0; i<(tdl_pathsby3); i++) {
+          chan_desc->R_sqrt[i]    = (struct complex *) malloc(nb_tx*nb_rx*nb_tx*nb_rx * sizeof(struct complex));
+
+          for (j = 0; j<nb_tx*nb_rx*nb_tx*nb_rx; j+=(nb_tx*nb_rx+1)) {
+            chan_desc->R_sqrt[i][j].x = 1.0;
+            chan_desc->R_sqrt[i][j].y = 0.0;
+          }
+
+          LOG_W(OCM,"correlation matrix not implemented for nb_tx==%d and nb_rx==%d, using identity\n", nb_tx, nb_rx);
+        }
+      }
+
+      break;
 
     case EPA:
       chan_desc->nb_taps        = 7;
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index 6071e1e74387ab7f54d38c57fa306520649ef113..dbfd7d4b2c999abf252c25ec92a1a84e09ab0bed 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -160,6 +160,11 @@ typedef enum {
   EVA,
   ETU,
   MBSFN,
+  TDL_A,
+  TDL_B,
+  TDL_C,
+  TDL_D,
+  TDL_E,
   Rayleigh8,
   Rayleigh1,
   Rayleigh1_800,
@@ -190,6 +195,11 @@ typedef enum {
   {"EVA",EVA},\
   {"ETU",ETU},\
   {"MBSFN",MBSFN},\
+  {"TDL_A",TDL_A},\
+  {"TDL_B",TDL_B},\
+  {"TDL_C",TDL_C},\
+  {"TDL_D",TDL_D},\
+  {"TDL_E",TDL_E},\
   {"Rayleigh8",Rayleigh8},\
   {"Rayleigh1",Rayleigh1},\
   {"Rayleigh1_800",Rayleigh1_800},\
@@ -243,33 +253,12 @@ typedef struct {
 } sim_t;
 
 
-/**
-\brief This routine initializes a new channel descriptor
-\param nb_tx Number of TX antennas
-\param nb_rx Number of RX antennas
-\param nb_taps Number of taps
-\param channel_length Length of the interpolated channel impulse response
-\param amps Linear amplitudes of the taps (length(amps)=channel_length). The values should sum up to 1.
-\param delays Delays of the taps. If delays==NULL the taps are assumed to be spaced equidistantly between 0 and t_max.
-\param R_sqrt Channel correlation matrix. If R_sqrt==NULL, no channel correlation is applied.
-\param Td Maximum path delay in mus.
-\param BW Channel bandwidth in MHz.
-\param ricean_factor Ricean factor applied to all taps.
-\param aoa Anlge of arrival
-\param forgetting_factor This parameter (0...1) allows for simple 1st order temporal variation
-\param max_Doppler This is the maximum Doppler frequency for Jakes' Model
-\param channel_offset This is a time delay to apply to channel
-\param path_loss_dB This is the path loss in dB
-\param random_aoa If set to 1, AoA of ricean component is randomized
-*/
-
-//channel_desc_t *new_channel_desc(uint8_t nb_tx,uint8_t nb_rx, uint8_t nb_taps, uint8_t channel_length, double *amps, double* delays, struct complex** R_sqrt, double Td, double BW, double ricean_factor, double aoa, double forgetting_factor, double max_Doppler, int32_t channel_offset, double path_loss_dB,uint8_t random_aoa);
-
 channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
                                      uint8_t nb_rx,
                                      SCM_t channel_model,
-				                     double sampling_rate,
+				     double sampling_rate,
                                      double channel_bandwidth,
+				     double TDL_DS,
                                      double forgetting_factor,
                                      int32_t channel_offset,
                                      double path_loss_dB);