diff --git a/openairITS/phy/DOT11/data_detection.c b/openairITS/phy/DOT11/data_detection.c
index 4de09ec2dca97e2043ce09198a1973e3e45158b7..7569f6202af3a5e63159b3804af864a4a502506c 100644
--- a/openairITS/phy/DOT11/data_detection.c
+++ b/openairITS/phy/DOT11/data_detection.c
@@ -186,7 +186,7 @@ int data_detection(RX_VECTOR_t *rxv,uint8_t *data_ind,uint32_t* rx_data,int fram
 #endif
 #endif
 
-    //    log2_maxh=10;
+    //        log2_maxh=7;
     mult_cpx_vector_norep_unprepared_conjx2(rxDATA_F,(int16_t*)chest,(int16_t*)rxDATA_F_comp,64,log2_maxh);
 #ifdef EXECTIME
 #ifdef RTAI
@@ -225,7 +225,7 @@ int data_detection(RX_VECTOR_t *rxv,uint8_t *data_ind,uint32_t* rx_data,int fram
 	scale = FOUR_OVER_SQRT_42;
 
       for (i=0;i<48;i++) {
-	//	printf("mag[%d] = %d\n",i,rxDATA_F_mag[i]);
+	//		printf("mag[%d] = %d\n",i,rxDATA_F_mag[i]);
 	rxDATA_F_mag[i] = (int16_t)((rxDATA_F_mag[i]*scale)>>15);
       }
       if ((rxv->rate>>1) == 3)
@@ -301,6 +301,8 @@ int data_detection(RX_VECTOR_t *rxv,uint8_t *data_ind,uint32_t* rx_data,int fram
     rotate_cpx_vector_norep(rxDATA_F_comp2,&cfo_Q15,rxDATA_F_comp3,48,log2_maxh>>1);
 
 #ifdef DEBUG_DATA
+    if (s==0)
+      write_output("rxDATA_F_mag.m","rxDAT_mag",rxDATA_F_mag,48,1,0);
     sprintf(fname,"rxDATA_F%d.m",s);
     sprintf(vname,"rxDAT_F_%d",s);
     write_output(fname,vname, rxDATA_F,128,2,1);
@@ -376,14 +378,14 @@ int data_detection(RX_VECTOR_t *rxv,uint8_t *data_ind,uint32_t* rx_data,int fram
 	pos = interleaver_16qam[k];
 	//	printf("k %d, pos %d\n",k,pos);
 	if ((pos&1)==1) {
-	  tmp = ((int16_t*)rxDATA_F_comp3)[pos>>1]>>4;
-	  //printf("pos (msb) %d : %d\n",pos>>1,tmp);
+	  tmp = ((int16_t*)rxDATA_F_comp2)[pos>>1]>>4;
+	  //	  printf("pos (msb) %d : %d\n",pos>>1,tmp);
 	}
 	else {
-	  tmp = ((int16_t*)rxDATA_F_comp3)[pos>>1];
+	  tmp = ((int16_t*)rxDATA_F_comp2)[pos>>1];
 	  tmp = (tmp<0)? tmp : -tmp;
 	  tmp = (tmp + rxDATA_F_mag[pos>>2])>>4;
-	  //printf("pos (lsb) %d : rxDATA_F_mag[%d] %d : %d (%d)\n",pos>>1,pos>>2,rxDATA_F_mag[pos>>2],tmp,((int16_t*)rxDATA_F_comp2)[pos>>1]);
+	  //	  printf("pos (lsb) %d : rxDATA_F_mag[%d] %d : %d (%d)\n",pos>>1,pos>>2,rxDATA_F_mag[pos>>2],tmp,((int16_t*)rxDATA_F_comp2)[pos>>1]);
 	}
 	
 	if (tmp<-8)
@@ -401,10 +403,10 @@ int data_detection(RX_VECTOR_t *rxv,uint8_t *data_ind,uint32_t* rx_data,int fram
 	  rxDATA_llr[k] = (int8_t)tmp;
 	*/
       }
-      if (rxv->rate==3) { // rate 3/4, so add zeros for punctured bits
+      if (rxv->rate==5) { // rate 3/4, so add zeros for punctured bits
 	llr_ptr = rxDATA_llr2;
-	memset(rxDATA_llr2,0,144);
-	for (k=0,k2=0;k<96;k++,k2++) {
+	memset(rxDATA_llr2,0,288);
+	for (k=0,k2=0;k<192;k++,k2++) {
 	  rxDATA_llr2[k2] = rxDATA_llr[k];
 	  if ((k&3) == 2)
 	    k2+=2;
diff --git a/openairITS/phy/DOT11/initial_sync.c b/openairITS/phy/DOT11/initial_sync.c
index 655b00b923d998ab4db05e66590070141820fb58..bbc59e8b7d52a5a666654813fa307064471d91b4 100644
--- a/openairITS/phy/DOT11/initial_sync.c
+++ b/openairITS/phy/DOT11/initial_sync.c
@@ -268,7 +268,7 @@ CHANNEL_STATUS_t initial_sync(RX_VECTOR_t **rx_vector,
 #endif
 #endif
 
-    if ((dB_fixed(mean_energy) > 15) && (peak_energy>(50*mean_energy))) {
+    if ((dB_fixed(mean_energy) > 10) && (peak_energy>(50*mean_energy))) {
 #ifdef DEBUG_SYNC
       write_output("STSLTScorr.m","STSLTScorrT", corrT,512,2,1);
 #endif
diff --git a/openairITS/phy/DOT11/phy_tx_start.c b/openairITS/phy/DOT11/phy_tx_start.c
index 943879cf0f6b3af6710486121bbcf8f1c8e415da..419ca408b1e1d656c9855e79a9b84d9152d3bbd6 100644
--- a/openairITS/phy/DOT11/phy_tx_start.c
+++ b/openairITS/phy/DOT11/phy_tx_start.c
@@ -403,8 +403,11 @@ int phy_tx_start_bot(TX_VECTOR_t *tx_vector,int16_t *output_ptr,uint32_t tx_offs
       }
       
     break;
-
+    default:
+      break;
     }
+
+
 #ifdef DEBUG_TX
     if (s<12) {
       for (i=0;i<64;i++)
diff --git a/openairITS/phy/SIMULATION/Makefile b/openairITS/phy/SIMULATION/Makefile
index 621f5ae23e783bf16055d0ea73a00c681161803b..1c78da1fe5e697df9433abfee000be63c50a2315 100644
--- a/openairITS/phy/SIMULATION/Makefile
+++ b/openairITS/phy/SIMULATION/Makefile
@@ -3,7 +3,7 @@ CC = gcc
 
 SSE3PROC = $(shell echo `grep ssse3 /proc/cpuinfo`) 
 SSE4PROC = $(shell echo `grep sse4 /proc/cpuinfo`) 
-CPUFLAGS = -mmmx -msse -msse2 -m32 -mssse3 #-msse4
+CPUFLAGS = -mmmx -msse -msse2 -m32 -mssse3 -msse4.1
 #CPUFLAGS += $(shell if [ -z $(SSE3PROC) ]; then echo "" ; else echo "-mssse3"; fi)
 #CPUFLAGS += $(shell if [ -z $(SSE4PROC) ]; then echo "" ; else echo "-msse4"; fi)
 
diff --git a/openairITS/phy/SIMULATION/dot11sim.c b/openairITS/phy/SIMULATION/dot11sim.c
index 1bf066f497f7610b76b2873361169baca9a6b6ae..b1974a9f98c7874cfa1741435bfcfa810db72cad 100644
--- a/openairITS/phy/SIMULATION/dot11sim.c
+++ b/openairITS/phy/SIMULATION/dot11sim.c
@@ -55,6 +55,15 @@ int main(int argc, char **argv) {
   int off,off2;
   double txg,txg_dB;
   int log2_maxh;
+  double  snr_array[100];
+  int  errors_array[100];
+  int  trials_array[100];
+  int  misdetected_errors_array[100];
+  int  signal_errors_array[100];
+  int  missed_packets_array[100];
+  int  cnt=0;
+  char fname[100],vname[100];
+  int stop=0;
 
   data_ind    = (uint8_t*)malloc(4095+2+1);
   data_ind_rx = (uint8_t*)malloc(4095+2+1);
@@ -230,7 +239,7 @@ int main(int argc, char **argv) {
   }
 
 
-  phy_tx_start(&tx_vector,txdata,0,data_ind);
+  phy_tx_start(&tx_vector,txdata,0,FRAME_LENGTH_SAMPLES_MAX,data_ind);
 
   tx_lev = signal_energy((int32_t*)txdata,320);
   tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
@@ -246,11 +255,12 @@ int main(int argc, char **argv) {
   
   for (SNR=snr0;SNR<snr1;SNR+=.2) {
 
-    printf("n_frames %d SNR %f\n",n_frames,SNR);
+    printf("n_frames %d SNR %f sdu_length %d rate %d\n",n_frames,SNR,tx_vector.sdu_length,tx_vector.rate);
     errors=0;
     misdetected_errors=0;
     signal_errors=0;
     missed_packets=0;
+    stop=0;
     for (trial=0; trial<n_frames; trial++) {
       //      printf("Trial %d (errors %d), sdu_length_samples %d\n",trial,errors,sdu_length_samples);
       sigma2_dB = 25; //10*log10((double)tx_lev) - SNR;
@@ -311,13 +321,19 @@ int main(int argc, char **argv) {
 	  else
 	    off2=off;
 	  if ((initial_sync(&rxv,&rx_offset,&log2_maxh,(uint32_t*)rxdata[0],FRAME_LENGTH_SAMPLES_MAX,off2,1) == BUSY)) {
-	    //	    printf("Channel is busy, rxv %p, offset %d\n",(void*)rxv,rx_offset);
+	    if (n_frames==1)
+	      printf("Channel is busy, rxv %p, offset %d\n",(void*)rxv,rx_offset);
 	    no_detection=0;
 	    if (rxv) {
-	      //	    printf("Rate %d, SDU_LENGTH %d\n",rxv->rate,rxv->sdu_length);
+	      if (n_frames==1)
+		printf("Rate %d, SDU_LENGTH %d\n",rxv->rate,rxv->sdu_length);
 	      if ( (rxv->rate != tx_vector.rate)||(rxv->sdu_length != tx_vector.sdu_length)) {
 		signal_errors++;
-		printf("SIGNAL error: rx_offset %d, tx_offset %d (off2 %d)\n",rx_offset,tx_offset,off2);
+		if ((signal_errors > (n_frames/10)) && (trial>=100)) {
+		  stop=1;
+		}
+		if (n_frames == 1)
+		  printf("SIGNAL error: rx_offset %d, tx_offset %d (off2 %d)\n",rx_offset,tx_offset,off2);
 		break;
 	      }
 	      else {
@@ -325,20 +341,32 @@ int main(int argc, char **argv) {
 		if (data_detection(rxv,data_ind_rx,(uint32_t*)rxdata[0],FRAME_LENGTH_SAMPLES_MAX,rx_offset,log2_maxh,NULL)) {
 		  for (i=0;i<rxv->sdu_length+6;i++) {
 		    if (data_ind[i]!=data_ind_rx[i]) {
-		      		  printf("error position %d : %x,%x\n",i,data_ind[i],data_ind_rx[i]);
+		      //printf("error position %d : %x,%x\n",i,data_ind[i],data_ind_rx[i]);
 		      misdetected_errors++;
 		      errors++;
 		    }
 		  }
+		  if ((errors > (n_frames/10)) && (trial>100)) {
+		    stop=1;
+		    break;
+		  }
 		} // initial_synch returns IDLE
 		else {
-		  /*		  printf("Running data_detection fails\n");
-		  for (i=0;i<rxv->sdu_length+6;i++) {
-		    if (data_ind[i]!=data_ind_rx[i]) {
-		      printf("error position %d : %x,%x\n",i,data_ind[i],data_ind_rx[i]);
+		  errors++;
+		  if (n_frames == 1) {
+		    printf("Running data_detection fails\n");
+		    
+		    for (i=0;i<rxv->sdu_length+6;i++) {
+		      if (data_ind[i]!=data_ind_rx[i]) {
+			printf("error position %d : %x,%x\n",i,data_ind[i],data_ind_rx[i]);
+		      }
 		    }
 		  }
-		  */
+		  if ((errors > (n_frames/10)) && (trial>=100)) {
+		    stop=1;
+		    break;
+		  }
+		  
 		}
 		break;
 	      }
@@ -350,15 +378,43 @@ int main(int argc, char **argv) {
       }
       if (no_detection==1)
 	missed_packets++;
+      if (stop==1)
+	break;
     }
     
-    printf("\nSNR %f dB: errors %d/%d, misdetected errors %d/%d,signal_errors %d/%d, missed_packets %d/%d\n",SNR,errors,n_frames-signal_errors,misdetected_errors,n_frames-signal_errors,signal_errors,n_frames,missed_packets,n_frames);
+    printf("\nSNR %f dB: errors %d/%d, misdetected errors %d/%d,signal_errors %d/%d, missed_packets %d/%d\n",SNR,errors,trial-signal_errors,misdetected_errors,trial-signal_errors,signal_errors,trial,missed_packets,trial);
+    snr_array[cnt] = SNR;
+    errors_array[cnt] = errors;
+    trials_array[cnt] = trial;
+    misdetected_errors_array[cnt] = misdetected_errors;
+    signal_errors_array[cnt] = signal_errors;
+    missed_packets_array[cnt] = missed_packets;
+    cnt++;
+    if (cnt>99) {
+      printf("too many SNR points, exiting ...\n");
+      break;
+    }
+    if (errors == 0)
+      break;
 #ifdef EXECTIME
     print_is_stats();
     print_dd_stats();
 #endif
   }
-  
+
+
+  sprintf(fname,"SNR_%d_%d.m",tx_vector.rate,tx_vector.sdu_length);
+  sprintf(vname,"SNR_%d_%d_v",tx_vector.rate,tx_vector.sdu_length);
+  write_output(fname,vname,snr_array,cnt,1,7);
+  sprintf(fname,"errors_%d_%d.m",tx_vector.rate,tx_vector.sdu_length);
+  sprintf(vname,"errors_%d_%d_v",tx_vector.rate,tx_vector.sdu_length);
+  write_output(fname,vname,errors_array,cnt,1,2);
+  sprintf(fname,"trials_%d_%d.m",tx_vector.rate,tx_vector.sdu_length);
+  sprintf(vname,"trials_%d_%d_v",tx_vector.rate,tx_vector.sdu_length);
+  write_output(fname,vname,trials_array,cnt,1,2);
+  sprintf(fname,"signal_errors_%d_%d.m",tx_vector.rate,tx_vector.sdu_length);
+  sprintf(vname,"signal_errors_%d_%d_v",tx_vector.rate,tx_vector.sdu_length);
+  write_output(fname,vname,signal_errors_array,cnt,1,2);
   free(data_ind);
   free(data_ind_rx);
   //  free_channel_desc_scm(ch);