diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 9ecf19777ca419f6e1c9027f7cd2723af33b7bd9..6752e0b07729c5b68ec220b0c077833f554ccb2f 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -336,12 +336,14 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
     pbch_vars[gNB_id] = (NR_UE_PBCH *)malloc16_clear(sizeof(NR_UE_PBCH));
 
     // PRS channel estimates
-    ue->prs_ch_estimates = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
-    AssertFatal(ue->prs_ch_estimates!=NULL, "NR UE init: PRS channel estimates malloc failed\n");
+    ue->prs_ch_estimates      = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
+    ue->prs_ch_estimates_time = (int32_t **)malloc16( fp->nb_antennas_rx*sizeof(int32_t *) );
+    AssertFatal(((ue->prs_ch_estimates!=NULL) || (ue->prs_ch_estimates_time!=NULL)), "NR UE init: PRS channel estimates malloc failed\n");
 
     for (i=0; i<fp->nb_antennas_rx; i++) {
-      ue->prs_ch_estimates[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB);
-      AssertFatal(ue->prs_ch_estimates[i]!=NULL, "NR UE init: PRS channel estimates malloc failed %d\n", i);
+      ue->prs_ch_estimates[i]      = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB);
+      ue->prs_ch_estimates_time[i] = (int32_t *)malloc16(2*fp->ofdm_symbol_size*NR_MAX_NUM_PRS_SYMB);
+      AssertFatal(((ue->prs_ch_estimates[i]!=NULL) || (ue->prs_ch_estimates_time[i]!=NULL)), "NR UE init: PRS channel estimates malloc failed %d\n", i);
     }
 
 
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index 7e85312f951fda5944a0cfa9b88ca0cd8703c229..02ef3077f23512ee6556c3b550777f61ea9866d5 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -41,6 +41,9 @@ short filt16a_mm1[16] = {
 short filt16a_ml1[16] = {
 -4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0,0};
 
+short filt16a_mr1[16] = {
+0,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,-8192,0,0,0,0};
+
 short filt16a_r1[16] = {
 0,0,0,0,0,0,4096,8192,12288,16384,20480,24576,0,0,0,0};
 
@@ -56,6 +59,9 @@ short filt16a_mm2[16] = {
 short filt16a_ml2[16] = {
 -8192,-4096,0,4096,8192,12288,16384,12288,8192,4096,0,0,0,0,0,0};
 
+short filt16a_mr2[16] = {
+0,0,0,4096,8192,12288,16384,12288,8192,4096,0,-4096,0,0,0,0};
+
 short filt16a_r2[16] = {
 0,0,0,0,0,0,0,4096,8192,12288,16384,20480,0,0,0,0};
 
@@ -169,7 +175,7 @@ short filt8_dcr0_h[8]= {
 0,4096,8192,12288,16384,0,0,0};
 
 short filt8_l1[8] = {
-24576,16384,0,0,0,0,0,0};
+24576,16384,8192,0,0,0,0,0};
 
 short filt8_ml1[8] = {
 -8192,0,8192,16384,8192,0,0,0};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index 6211df0a2abf8490d822cfaf459e513557ed883a..0acd4c0e1a64c9ccd6c2df3ced7b9d83a346f684 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -38,6 +38,8 @@ extern short filt16a_m1[16];
 
 extern short filt16a_mm1[16];
 
+extern short filt16a_mr1[16];
+
 extern short filt16a_ml1[16];
 
 extern short filt16a_l2[16];
@@ -48,6 +50,8 @@ extern short filt16a_m2[16];
 
 extern short filt16a_mm2[16];
 
+extern short filt16a_mr2[16];
+
 extern short filt16a_ml2[16];
 
 extern short filt16a_l3[16];
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 262dcada2dbf247bd8fa43fe7c08a1162689f20c..f9795686a08f26f6cb34579631c69d01e8e2a99e 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -34,7 +34,7 @@
 //#define DEBUG_PDSCH
 //#define DEBUG_PDCCH
 //#define DEBUG_CH
-#define DEBUG_PRS_CHEST
+//#define DEBUG_PRS_CHEST
 extern short nr_qpsk_mod_table[8];
 
 int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
@@ -53,11 +53,13 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
   prs_data_t *prs_cfg    = &ue->prs_cfg;
   
   int16_t *prs_chest, ch[2] = {0}, *rxF, *pil, *fl,*fm, *fmm, *fml, *fmr, *fr, mod_prs[NR_MAX_PRS_LENGTH<<1];
-  int16_t k_prime = 0, k = 0;
+  int16_t k_prime = 0, k = 0, re_offset;
   uint8_t idx = prs_cfg->NPRSID;
   uint8_t rxAnt = 0; // ant 0 rxdataF for now
+  int16_t *ch_intrp = (int16_t *)malloc16(frame_params->ofdm_symbol_size*2*sizeof(int16_t));
+  AssertFatal(ch_intrp != NULL, "nr_prs_channel_estimation: channel estimate buffer initialization failed!!");
+  int16_t *ch_init = ch_intrp;
 
-  printf("Inside nr_prs_channel_estimation proc->thread_id %d, proc->nr_slot_rx %d\n", proc->thread_id, proc->nr_slot_rx);
   for(int l = prs_cfg->SymbolStart; l < prs_cfg->SymbolStart+prs_cfg->NumPRSSymbols; l++)
   {
     int symInd = l-prs_cfg->SymbolStart;
@@ -74,10 +76,10 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
       k_prime = k_prime_table[3][symInd];
     }
    
-  printf("PRS config l %d k_prime %d:\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize);
-    
     //re_offset
-    k = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset;
+    k = re_offset = (prs_cfg->REOffset+k_prime) % prs_cfg->CombSize + frame_params->first_carrier_offset;
+  
+    printf("PRS config l %d k_prime %d, re_offset %d :\nprs_cfg->SymbolStart %d\nprs_cfg->NumPRSSymbols %d\nprs_cfg->NumRB %d\nprs_cfg->CombSize %d\n", l, k_prime, re_offset, prs_cfg->SymbolStart, prs_cfg->NumPRSSymbols, prs_cfg->NumRB, prs_cfg->CombSize);
    
     // Pilots generation and modulation
     for (int m = 0; m < (12/prs_cfg->CombSize)*prs_cfg->NumRB; m++) 
@@ -92,6 +94,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
     rxF       = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
     prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size];
     memset(prs_chest,0,4*(ue->frame_parms.ofdm_symbol_size));
+    memset(ch_intrp,0,4*(ue->frame_parms.ofdm_symbol_size));
     
     if(prs_cfg->CombSize == 2)
     {
@@ -114,6 +117,7 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
           fm  = filt8_m1;
           fr  = filt8_r1;
           break;
+
         default:
           printf("nr=prs channel_estimation: k_prime=%d -> ERROR\n",k_prime);
           return(-1);
@@ -123,126 +127,69 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
       //Start pilot
       ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
       ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-        
-      multadd_real_vector_complex_scalar(fl,
-		  	       ch,
-		  	       prs_chest,
-		  	       8);
       
-      pil +=2;
-      k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
-      rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-
-      ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
-      ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-      
-      multadd_real_vector_complex_scalar(fml,
+      multadd_real_vector_complex_scalar(fl,
 		  	       ch,
-		  	       prs_chest,
+		  	       ch_intrp,
 		  	       8);
       
       pil +=2;
       k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
       rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-
-      ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
-      ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-      
-      multadd_real_vector_complex_scalar(fmm,
-		  	       ch,
-		  	       prs_chest,
-		  	       8);
       
-      pil +=2;
-      k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
-      rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-      prs_chest +=8;
-
       //Middle pilots
-      for(int pIdx = 3; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-3; pIdx+=2) 
+      for(int pIdx = 1; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-1; pIdx+=2) 
       {
         ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
         ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-        printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-      
-        multadd_real_vector_complex_scalar(fm,
-		    	       ch,
-		    	       prs_chest,
-		    	       8);
-        
+        if(pIdx == 1) // 2nd pilot
+        {
+          multadd_real_vector_complex_scalar(fml,
+		      	       ch,
+		      	       ch_intrp,
+		      	       8);
+        } 
+        else
+        {
+          multadd_real_vector_complex_scalar(fm,
+		      	       ch,
+		      	       ch_intrp,
+		      	       8);
+        }
         pil +=2;
         k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
         rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
         
         ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
         ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-        printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx+1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-        
-        multadd_real_vector_complex_scalar(fmm,
-		  		       ch,
-		  		       prs_chest,
-		  		       8);
+        if(pIdx == (prs_cfg->NumRB*(12/prs_cfg->CombSize)-3)) // 2nd last pilot
+        {
+          multadd_real_vector_complex_scalar(fmr,
+		      	       ch,
+		      	       ch_intrp,
+		      	       8);
+        } 
+        else
+        {
+          multadd_real_vector_complex_scalar(fmm,
+		      	       ch,
+		      	       ch_intrp,
+		      	       8);
+        } 
         
         pil +=2;
         k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
         rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-        prs_chest +=8;
+        ch_intrp +=8;
       }
       
       //End pilot
       ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
       ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
       
-      multadd_real_vector_complex_scalar(fm,
-		  	       ch,
-		  	       prs_chest,
-		  	       8);
-      
-      pil +=2;
-      k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
-      rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-
-      ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
-      ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-      
-      multadd_real_vector_complex_scalar(fmr,
-		  	       ch,
-		  	       prs_chest,
-		  	       8);
-      
-      pil +=2;
-      k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
-      rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-      prs_chest +=8;
-      
-      ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
-      ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-   
       multadd_real_vector_complex_scalar(fr,
 	    	       ch,
-	    	       prs_chest,
+	    	       ch_intrp,
 	    	       8);
       
     }
@@ -252,32 +199,36 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
       switch (k_prime) {
         case 0:
           fl  = filt16a_l0;
-          fmm = filt16a_mm0;
           fml = filt16a_mm0;
+          fmm = filt16a_mm0;
+          fmr = filt16a_m0;
           fm  = filt16a_m0;
           fr  = filt16a_r0;
           break;
         
         case 1:
           fl  = filt16a_l1;
-          fmm = filt16a_mm1;
           fml = filt16a_ml1;
+          fmm = filt16a_mm1;
+          fmr = filt16a_mr1;
           fm  = filt16a_m1;
           fr  = filt16a_r1;
           break;
 
         case 2:
           fl  = filt16a_l2;
-          fmm = filt16a_mm2;
           fml = filt16a_ml2;
+          fmm = filt16a_mm2;
+          fmr = filt16a_mr2;
           fm  = filt16a_m2;
           fr  = filt16a_r2;
           break;
 
         case 3:
           fl  = filt16a_l3;
-          fmm = filt16a_mm3;
           fml = filt16a_ml3;
+          fmm = filt16a_mm3;
+          fmr = filt16a_mm3;
           fm  = filt16a_m3;
           fr  = filt16a_r3;
           break;
@@ -291,13 +242,10 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
       //Start pilot
       ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
       ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 0, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-        
+      
       multadd_real_vector_complex_scalar(fl,
 		  	       ch,
-		  	       prs_chest,
+	    	       ch_intrp,
 		  	       16);
       
       pil +=2;
@@ -306,50 +254,41 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
 
       ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
       ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", 1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
       
       multadd_real_vector_complex_scalar(fml,
 		  	       ch,
-		  	       prs_chest,
+	    	       ch_intrp,
 		  	       16);
       
       pil +=2;
       k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
       rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-      prs_chest +=8;
+      ch_intrp +=8;
 
       //Middle pilots
       for(int pIdx = 2; pIdx < prs_cfg->NumRB*(12/prs_cfg->CombSize)-2; pIdx++) 
       {
         ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
         ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-        printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", pIdx, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-        
+
         multadd_real_vector_complex_scalar(fmm,
 		  		       ch,
-		  		       prs_chest,
+		  		       ch_intrp,
 		  		       16);
         
         pil +=2;
         k   = (k+prs_cfg->CombSize) % frame_params->ofdm_symbol_size;
         rxF = (int16_t *)&rxdataF[rxAnt][l*frame_params->ofdm_symbol_size + k];
-        prs_chest +=8;
+        ch_intrp +=8;
       }
       
       //End pilot
       ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
       ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-2, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-      
-      multadd_real_vector_complex_scalar(fm,
+
+      multadd_real_vector_complex_scalar(fmr,
 		  	       ch,
-		  	       prs_chest,
+		  		     ch_intrp,
 		  	       16);
       
       pil +=2;
@@ -358,23 +297,71 @@ int nr_prs_channel_estimation(PHY_VARS_NR_UE *ue,
       
       ch[0] = (int16_t)(((int32_t)rxF[0]*pil[0] + (int32_t)rxF[1]*pil[1])>>15);
       ch[1] = (int16_t)(((int32_t)rxF[1]*pil[0] - (int32_t)rxF[0]*pil[1])>>15);
-#ifdef DEBUG_PRS_CHEST
-      printf("pilIdx %d at k %d of l %d reIdx %d rxF %p %d %d ch[0] %d ch[1] %d\n", prs_cfg->NumRB*(12/prs_cfg->CombSize)-1, k, l, (l*frame_params->ofdm_symbol_size + k), rxF, rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-   
+
       multadd_real_vector_complex_scalar(fr,
 	    	       ch,
-	    	       prs_chest,
+		  		     ch_intrp,
 	    	       16);
     }
 
-    prs_chest = (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size];
+    ch_intrp = ch_init;
     for (int re = 0; re < prs_cfg->NumRB*12; re++)
-      printf("prs_ch[%d] %d %d\n", re, prs_chest[re<<1], prs_chest[(re<<1)+1]);
-     
+    {
+      prs_chest[re_offset]   = ch_intrp[re<<1];
+      prs_chest[re_offset+1] = ch_intrp[(re<<1)+1];
+      printf("prs_ch[%d] %d %d\n", re_offset, ch_intrp[re<<1], ch_intrp[(re<<1)+1]);
+      re_offset = (re_offset+1) % frame_params->ofdm_symbol_size;
+    }
+    
+    // Time domain IMPULSE response
+    idft_size_idx_t idftsizeidx;
+
+    switch (frame_params->ofdm_symbol_size) {
+    case 128:
+      idftsizeidx = IDFT_128;
+      break;
+
+    case 256:
+      idftsizeidx = IDFT_256;
+      break;
+
+    case 512:
+      idftsizeidx = IDFT_512;
+      break;
+
+    case 1024:
+      idftsizeidx = IDFT_1024;
+      break;
+
+    case 1536:
+      idftsizeidx = IDFT_1536;
+      break;
+
+    case 2048:
+      idftsizeidx = IDFT_2048;
+      break;
+
+    case 3072:
+      idftsizeidx = IDFT_3072;
+      break;
+
+    case 4096:
+      idftsizeidx = IDFT_4096;
+      break;
+
+    default:
+      printf("unsupported ofdm symbol size \n");
+      assert(0);
+    }
+    
+    idft(idftsizeidx,
+         (int16_t *)&ue->prs_ch_estimates[rxAnt][l*frame_params->ofdm_symbol_size],
+         (int16_t *)&ue->prs_ch_estimates_time[rxAnt][l*frame_params->ofdm_symbol_size],1);
+
   } //for l
   
-  LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], prs_cfg->NumPRSSymbols*prs_cfg->NumRB*12,1,1);
+  LOG_M("prsEst.m","prs_chest",&ue->prs_ch_estimates[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1);
+  LOG_M("prsEst_time.m","prs_chest_time",&ue->prs_ch_estimates_time[rxAnt][prs_cfg->SymbolStart*frame_params->ofdm_symbol_size], frame_params->ofdm_symbol_size,1,1);
   return(0);
 }
 
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index a8ccc0e3a19849a251f1ba712cbae0b27feb0827..58631acb1d4bbe726b6d9c97c66bb50ca918e0f8 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -824,6 +824,8 @@ typedef struct {
   NR_UE_DLSCH_t   *dlsch_p[NUMBER_OF_CONNECTED_gNB_MAX];
   NR_UE_DLSCH_t   *dlsch_MCH[NUMBER_OF_CONNECTED_gNB_MAX];
   prs_data_t prs_cfg;
+  int32_t **prs_ch_estimates;
+  int32_t **prs_ch_estimates_time;
   
   //Paging parameters
   uint32_t              IMSImod1024;
@@ -846,7 +848,6 @@ typedef struct {
 
 #endif
 
-  int32_t **prs_ch_estimates;
 
   /// PBCH DMRS sequence
   uint32_t nr_gold_pbch[2][64][NR_PBCH_DMRS_LENGTH_DWORD];
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 086ad735e4f7e4df43f48c32f312e73d95707361..c8e80f7afcb444a0cfe02129ea87c4edf156cd3e 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -105,8 +105,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_
   prs_data.PRSResourceSetPeriod[0]=40; // PRS resource slot period
   prs_data.PRSResourceSetPeriod[1]=0;  // resource slot offset
   prs_data.SymbolStart=7;		
-  prs_data.NumPRSSymbols=6;
-  prs_data.NumRB=8;
+  prs_data.NumPRSSymbols=4;
+  prs_data.NumRB=273;
   prs_data.RBOffset=0;
   prs_data.CombSize=4;
   prs_data.REOffset=0;
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 36a572cbcd4fdfdff30f9e4c4831877e543d9c73..873bd93b0bb9972f13febb21857be28d663d1925 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -154,7 +154,6 @@ int main(int argc, char **argv)
   int **txdata;
   double **s_re,**s_im,**r_re,**r_im;
   //double iqim = 0.0;
-  double DS_TDL = .03;
   double ip =0.0;
   //unsigned char pbch_pdu[6];
   //  int sync_pos, sync_pos_slot;
@@ -257,21 +256,6 @@ int main(int argc, char **argv)
       case 'G':
         channel_model=ETU;
         break;
-	
-      case 'H':
-        channel_model = TDL_C;
-	DS_TDL = .030; // 30 ns
-	break;
-  
-      case 'I':
-	channel_model = TDL_C;
-	DS_TDL = .3;  // 300ns
-        break;
-     
-      case 'J':
-	channel_model=TDL_D;
-	DS_TDL = .03;
-	break;
 
       default:
         printf("Unsupported channel model! Exiting.\n");
@@ -521,8 +505,10 @@ int main(int argc, char **argv)
                                 channel_model,
  				fs, 
 				bw, 
-				DS_TDL,
-                                0, 0, 0, 0);
+				300e-9,
+                                0,
+                                0,
+                                0, 0);
 
   if (gNB2UE==NULL) {
 	printf("Problem generating channel model. Exiting.\n");
@@ -670,8 +656,8 @@ int main(int argc, char **argv)
 
   for (i=0; i<frame_length_complex_samples; i++) {
     for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-      s_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
-      s_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
+      r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
+      r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
     }
   }
   
@@ -681,18 +667,9 @@ int main(int argc, char **argv)
     n_errors_payload = 0;
 
     for (trial=0; trial<n_trials; trial++) {
-
-      if (channel_model != AWGN) {
-	// multipath channel
-	multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0,0);
-      }
-      else {
-	for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-	  memcpy(r_re[aa],s_re[aa],frame_length_complex_samples*sizeof(double));
-	  memcpy(r_im[aa],s_im[aa],frame_length_complex_samples*sizeof(double));
-	}
-      }
-       
+      // multipath channel
+      //multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
+      
       //AWGN
       sigma2_dB = 20*log10((double)AMP/4)-SNR;
       sigma2 = pow(10,sigma2_dB/10);
@@ -762,8 +739,8 @@ int main(int argc, char **argv)
       UE->prs_cfg.PRSResourceSetPeriod[0]=40; // PRS resource slot period
       UE->prs_cfg.PRSResourceSetPeriod[1]=0;  // resource slot offset
       UE->prs_cfg.SymbolStart=7;		
-      UE->prs_cfg.NumPRSSymbols=6;
-      UE->prs_cfg.NumRB=8;
+      UE->prs_cfg.NumPRSSymbols=4;
+      UE->prs_cfg.NumRB=273;
       UE->prs_cfg.RBOffset=0;
       UE->prs_cfg.CombSize=4;
       UE->prs_cfg.REOffset=0;