diff --git a/openair1/PHY/MODULATION/slot_fep.c b/openair1/PHY/MODULATION/slot_fep.c
index 84a1c85c567585d74ed53a62fdcb7ea35f98cb11..b655426d0bd0b154b57a79dc7d26e174495a8039 100644
--- a/openair1/PHY/MODULATION/slot_fep.c
+++ b/openair1/PHY/MODULATION/slot_fep.c
@@ -52,6 +52,8 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
   //NR_UE_PDCCH *pdcch_vars  = ue->pdcch_vars[ue->current_thread_id[Ns>>1]][0];
   uint16_t coreset_start_subcarrier = frame_parms->first_carrier_offset;
   uint16_t nb_rb_coreset = 24;
+  uint16_t bwp_start_subcarrier = frame_parms->first_carrier_offset;
+  uint16_t nb_rb_pdsch = 100;
 
   /*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
   unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
@@ -255,6 +257,28 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
       }
     break;
 
+  case NR_PDSCH_EST:
+      for (aa=0; aa<frame_parms->nb_antenna_ports_eNB; aa++) {
+
+#ifdef DEBUG_FEP
+          printf("Channel estimation eNB %d, aatx %d, slot %d, symbol %d\n",eNB_id,aa,Ns,l);
+#endif
+#if UE_TIMING_TRACE
+          start_meas(&ue->dlsch_channel_estimation_stats);
+#endif
+          nr_pdsch_channel_estimation(ue,eNB_id,0,
+                                    Ns,
+                                    aa,
+                                    l,
+                                    symbol,
+									bwp_start_subcarrier,
+									nb_rb_pdsch);
+#if UE_TIMING_TRACE
+        stop_meas(&ue->dlsch_channel_estimation_stats);
+#endif
+      }
+    break;
+
   case NR_SSS_EST:
   break;
 
diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
index 72d5f56029859b9c27f1282cd9eb2b39c4415cbc..4ea226ebbe7264fb0702e85bc7322c6f551e5971 100644
--- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
+++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
@@ -53,8 +53,9 @@ int wt2[12][2] = {{1,1},{1,1},{1,1},{1,1},{1,1},{1,1},{1,-1},{1,-1},{1,-1},{1,-1
 short nr_mod_table[14] = {0,0,23170,-23170,-23170,23170,23170,-23170,23170,23170,-23170,-23170,-23170,23170};
 
 int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
+						uint8_t eNB_offset,
 						unsigned int Ns,
-						unsigned int nr_gold_pdcch[2][20][3][10],
+						unsigned int nr_gold_pdcch[7][20][3][10],
 						int32_t *output,
 						unsigned short p,
 						int length_dmrs,
@@ -87,7 +88,7 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
         			ind_dword = ind>>4;
         			ind_qpsk_symb = ind&0xf;
 
-        			output[k] = qpsk[(ue->nr_gold_pdcch[0][Ns][l][ind_dword]>>(2*ind_qpsk_symb))&3];
+        			output[k] = qpsk[(nr_gold_pdcch[eNB_offset][Ns][l][ind_dword]>>(2*ind_qpsk_symb))&3];
 
 #ifdef DEBUG_DL_DMRS
           LOG_I(PHY,"Ns %d, p %d, ind_dword %d, ind_qpsk_symbol %d\n",
@@ -107,8 +108,9 @@ int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
 }
 
 int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
+						uint8_t eNB_offset,
 						unsigned int Ns,
-						unsigned int nr_gold_pdsch[2][20][2][21],
+						unsigned int nr_gold_pdsch[7][20][2][21],
 						int32_t *output,
 						unsigned short p,
 						int length_dmrs,
@@ -166,7 +168,7 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
         			ind_dword = ind>>4;
         			ind_qpsk_symb = ind&0xf;
 
-        			output[k] = qpsk_p[(ue->nr_gold_pdsch[0][Ns][lp][ind_dword]>>(2*ind_qpsk_symb))&3];
+        			output[k] = qpsk_p[(nr_gold_pdsch[0][Ns][lp][ind_dword]>>(2*ind_qpsk_symb))&3];
 
 
 #ifdef DEBUG_DL_DMRS
diff --git a/openair1/PHY/NR_REFSIG/nr_gold_ue.c b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
index 1ffa51a029c5e7b4277bb81a6c6809df8069eea1..ce8e0de522882e998ee606e607cb2b4e2f68538a 100644
--- a/openair1/PHY/NR_REFSIG/nr_gold_ue.c
+++ b/openair1/PHY/NR_REFSIG/nr_gold_ue.c
@@ -64,7 +64,7 @@ void nr_gold_pbch(PHY_VARS_NR_UE* ue)
 
 }
 
-void nr_gold_pdcch(PHY_VARS_NR_UE* ue,unsigned int nr_gold_pdcch[20][2][10],unsigned int Nid_cell, unsigned short n_idDMRS, unsigned short length_dmrs)
+void nr_gold_pdcch(PHY_VARS_NR_UE* ue,unsigned int Nid_cell, unsigned short n_idDMRS, unsigned short length_dmrs)
 {
 
   unsigned char ns,l;
@@ -101,14 +101,14 @@ void nr_gold_pdcch(PHY_VARS_NR_UE* ue,unsigned int nr_gold_pdcch[20][2][10],unsi
           x1 = x1 ^ (x1<<31) ^ (x1<<28);
           x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
           x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
-          nr_gold_pdcch[ns][l][n] = x1^x2;
+          ue->nr_gold_pdcch[0][ns][l][n] = x1^x2;
             //printf("n=%d : c %x\n",n,x1^x2);
         }
       }
     }
 }
 
-void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned int nr_gold_pdsch[2][20][2][21],unsigned int Nid_cell, unsigned short *n_idDMRS, unsigned short length_dmrs)
+void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned int Nid_cell, unsigned short *n_idDMRS, unsigned short length_dmrs)
 {
 
   unsigned char ns,l;
@@ -130,7 +130,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned int nr_gold_p
       for (l=0; l<length_dmrs; l++) {
 
     	x2tmp0 = ((14*ns+(lbar+l)+1)*((nid<<1)+1))<<17;
-        x2 = (x2tmp0+(nid<<1))%(1<<31);  //cinit
+        x2 = (x2tmp0+(nid<<1)+nscid)%(1<<31);  //cinit
 
         x1 = 1+ (1<<31);
         x2=x2 ^ ((x2 ^ (x2>>1) ^ (x2>>2) ^ (x2>>3))<<31);
@@ -149,7 +149,7 @@ void nr_gold_pdsch(PHY_VARS_NR_UE* ue,unsigned short lbar,unsigned int nr_gold_p
           x1 = x1 ^ (x1<<31) ^ (x1<<28);
           x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
           x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
-          nr_gold_pdsch[nscid][ns][l][n] = x1^x2;
+          ue->nr_gold_pdsch[nscid][ns][l][n] = x1^x2;
             //printf("n=%d : c %x\n",n,x1^x2);
         }
 
diff --git a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
index c2f286aacd9ff12953ad1573b3ebaa20d19351fb..d0d6338d448e99bea1ef9a8afa7f78de3612fd3a 100644
--- a/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
+++ b/openair1/PHY/NR_REFSIG/refsig_defs_ue.h
@@ -35,16 +35,18 @@ int nr_pbch_dmrs_rx(unsigned int *nr_gold_pbch,	int32_t *output	);
 @param PHY_VARS_NR_UE* ue structure provides configuration, frame parameters and the pointers to the 32 bits sequence storage tables
  */
 int nr_pdcch_dmrs_rx(PHY_VARS_NR_UE *ue,
+						uint8_t eNB_offset,
 						unsigned int Ns,
-						unsigned int nr_gold_pdcch[2][20][3][10],
+						unsigned int nr_gold_pdcch[7][20][3][10],
 						int32_t *output,
 						unsigned short p,
 						int length_dmrs,
 						unsigned short nb_rb_corset);
 
 int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
+						uint8_t eNB_offset,
 						unsigned int Ns,
-						unsigned int nr_gold_pdsch[2][20][2][21],
+						unsigned int nr_gold_pdsch[7][20][2][21],
 						int32_t *output,
 						unsigned short p,
 						int length_dmrs,
@@ -52,9 +54,13 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
 
 void nr_gold_pbch(PHY_VARS_NR_UE* ue);
 
+void nr_gold_pdcch(PHY_VARS_NR_UE* ue,
+					unsigned int Nid_cell,
+					unsigned short n_idDMRS,
+					unsigned short length_dmrs);
+
 void nr_gold_pdsch(PHY_VARS_NR_UE* ue,
 					unsigned short lbar,
-					unsigned int nr_gold_pdsch[2][20][2][21],
 					unsigned int Nid_cell,
 					unsigned short *n_idDMRS,
 					unsigned short length_dmrs);
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index a37a591d2f57d3f79439fc85c9e42bbb9e28ee05..52356a9438bc22923bc2f2db71e457f23eba2b1a 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -84,3 +84,28 @@ short filt16a_2l1[16] = {
 
 short filt16a_2r1[16] = {
 -4096,0,4096,8192,12288,16384,0,0,0,0,0,0,0,0,0,0};
+
+/*filter8*/
+short filt8_l0[8] = {
+16384,8192,0,0,0,0,0,0};
+
+short filt8_mr0[8] = {
+0,8192,16384,8192,0,-8192,0,0};
+
+short filt8_r0[8] = {
+0,8192,16384,24576,0,0,0,0};
+
+short filt8_m0[8] = {
+0,8192,16384,8192,0,0,0,0};
+
+short filt8_l1[8] = {
+24576,16384,0,0,0,0,0,0};
+
+short filt8_ml1[8] = {
+-8192,0,8192,16384,8192,0,0,0};
+
+short filt8_r1[8] = {
+0,0,8192,16384,0,0,0,0};
+
+short filt8_m1[8] = {
+0,0,8192,16384,8192,0,0,0};
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 11a50ca20f5b1d89f94d28ea679f330033d2a2af..18da8473d35e11bfe2f62488bc22062549b87a07 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -267,7 +267,7 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
   fr = filt16a_r1;
 
   // generate pilot
-  nr_pdcch_dmrs_rx(ue->nr_gold_pdcch[0][Ns][symbol], &pilot[p][0]);
+  nr_pdcch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdcch[eNB_offset][Ns][symbol], &pilot[p][0],2000,symbol, nb_rb_coreset);
 
   for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
 
@@ -392,3 +392,194 @@ int nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
   return(0);
 }
 
+int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
+                              uint8_t eNB_id,
+                              uint8_t eNB_offset,
+                              unsigned char Ns,
+                              unsigned char p,
+                              unsigned char l,
+                              unsigned char symbol,
+							  unsigned short bwp_start_subcarrier,
+							  unsigned short nb_rb_pdsch)
+{
+  int pilot[2][200] __attribute__((aligned(16)));
+  unsigned char aarx;
+  unsigned short k;
+  unsigned int pilot_cnt;
+  int16_t ch[2],*pil,*rxF,*dl_ch,*fl,*fm,*fr,*fml,*fmr;
+  int ch_offset,symbol_offset;
+
+  //uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
+
+  uint8_t nushift;
+  int **dl_ch_estimates  =ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].dl_ch_estimates[eNB_offset];
+  int **rxdataF=ue->common_vars.common_vars_rx_data_per_thread[ue->current_thread_id[Ns>>1]].rxdataF;
+
+  nushift = (p>>1)&1;
+  ue->frame_parms.nushift = nushift;
+
+  if (ue->high_speed_flag == 0) // use second channel estimate position for temporary storage
+    ch_offset     = ue->frame_parms.ofdm_symbol_size ;
+  else
+    ch_offset     = ue->frame_parms.ofdm_symbol_size*symbol;
+
+  symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
+
+  k = bwp_start_subcarrier;
+
+#ifdef DEBUG_CH
+  printf("PBCH Channel Estimation : ThreadId %d, eNB_offset %d cell_id %d ch_offset %d, OFDM size %d, Ncp=%d, l=%d, Ns=%d, k=%d symbol %d\n",ue->current_thread_id[Ns>>1], eNB_offset,Nid_cell,ch_offset,ue->frame_parms.ofdm_symbol_size,
+         ue->frame_parms.Ncp,l,Ns,k, symbol);
+#endif
+
+  switch (nushift) {
+   case 0:
+         fl = filt8_l0;
+         fm = filt8_m0;
+         fr = filt8_r0;
+         fml = filt8_m0;
+         fmr = filt8_mr0;
+         break;
+
+   case 1:
+         fl = filt8_l1;
+         fm = filt8_m1;
+         fr = filt8_r1;
+         fml = filt8_ml1;
+         fmr = filt8_m1;
+         break;
+
+   default:
+     msg("pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
+     return(-1);
+     break;
+   }
+
+
+  // generate pilot
+  nr_pdsch_dmrs_rx(ue,eNB_offset,Ns,ue->nr_gold_pdsch[eNB_offset][Ns][symbol], &pilot[p][0],1000,1,nb_rb_pdsch);
+
+  for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
+
+    pil   = (int16_t *)&pilot[p][0];
+    rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];
+    dl_ch = (int16_t *)&dl_ch_estimates[(p<<1)+aarx][ch_offset];
+
+    memset(dl_ch,0,4*(ue->frame_parms.ofdm_symbol_size));
+    if (ue->high_speed_flag==0) // multiply previous channel estimate by ch_est_alpha
+      multadd_complex_vector_real_scalar(dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),
+                                         ue->ch_est_alpha,dl_ch-(ue->frame_parms.ofdm_symbol_size<<1),
+                                         1,ue->frame_parms.ofdm_symbol_size);
+#ifdef DEBUG_CH
+    printf("ch est pilot addr %p RB_DL %d\n",&pilot[p][0], ue->frame_parms.N_RB_DL);
+    printf("k %d, first_carrier %d\n",k,ue->frame_parms.first_carrier_offset);
+    printf("rxF addr %p\n", rxF);
+    printf("dl_ch addr %p\n",dl_ch);
+#endif
+    if ((ue->frame_parms.N_RB_DL&1)==0) {
+
+      // Treat first 2 pilots specially (left edge)
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+#ifdef DEBUG_CH
+      printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
+      printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+      multadd_real_vector_complex_scalar(fl,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      pil+=2;
+      rxF+=4;
+      //for (int i= 0; i<8; i++)
+      //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
+
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+#ifdef DEBUG_CH
+      printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+#endif
+      multadd_real_vector_complex_scalar(fml,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      pil+=2;
+      rxF+=4;
+      dl_ch+=4;
+      k+=4;
+
+      for (pilot_cnt=2; pilot_cnt<(6*(nb_rb_pdsch-1)+4); pilot_cnt+=2) {
+    	if ((pilot_cnt%6)==0)
+    		dl_ch+=4;
+
+        if (k >= ue->frame_parms.ofdm_symbol_size){
+    		 k-=ue->frame_parms.ofdm_symbol_size;
+    		 rxF   = (int16_t *)&rxdataF[aarx][(symbol_offset+k+nushift)];}
+
+        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+#ifdef DEBUG_CH
+	printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+#endif
+        multadd_real_vector_complex_scalar(fm,
+                                           ch,
+                                           dl_ch,
+                                           8);
+
+        pil+=2;
+        rxF+=4;
+        dl_ch+=4;
+
+        ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+        ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+#ifdef DEBUG_CH
+	printf("pilot %d : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+#endif
+        multadd_real_vector_complex_scalar(fm,
+                                           ch,
+                                           dl_ch,
+                                           8);
+        pil+=2;
+        rxF+=4;
+        dl_ch+=4;
+        k+=4;
+
+      }
+
+      // Treat first 2 pilots specially (right edge)
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+#ifdef DEBUG_CH
+      printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
+      printf("pilot 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+#endif
+      multadd_real_vector_complex_scalar(fmr,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      pil+=2;
+      rxF+=4;
+      //for (int i= 0; i<8; i++)
+      //printf("dl_ch addr %p %d\n", dl_ch+i, *(dl_ch+i));
+
+      ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
+      ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
+#ifdef DEBUG_CH
+      printf("pilot 1 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+#endif
+      multadd_real_vector_complex_scalar(fr,
+                                         ch,
+                                         dl_ch,
+                                         8);
+      pil+=2;
+      rxF+=4;
+      dl_ch+=4;
+      k+=4;
+
+    }
+
+  }
+
+  return(0);
+}
+
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
index fdc184918d83fcd0180052ec8cac533eb46b9262..fb012b03facae5f57564d19d684b8fd869e07b17 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
@@ -59,4 +59,14 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
                               unsigned char p,
                               unsigned char l,
                               unsigned char symbol);
+
+int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
+                              uint8_t eNB_id,
+                              uint8_t eNB_offset,
+                              unsigned char Ns,
+                              unsigned char p,
+                              unsigned char l,
+                              unsigned char symbol,
+							  unsigned short bwp_start_subcarrier,
+							  unsigned short nb_rb_pdsch);
 #endif
diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h
index f3c3e58f1b57b4cc1fcd643a7ec54b51ab9a8941..8b75de944dc96e6d2132d101365b929ccc07474f 100644
--- a/openair1/PHY/defs_nr_UE.h
+++ b/openair1/PHY/defs_nr_UE.h
@@ -995,7 +995,7 @@ typedef struct {
   uint32_t nr_gold_pdsch[2][20][2][21];
 
   /// PDCCH DMRS
-  uint32_t nr_gold_pdcch[2][20][3][10];
+  uint32_t nr_gold_pdcch[7][20][3][10];
 
   uint32_t X_u[64][839];
 
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 4d007c766c411a087790b696aa4200735115cdd9..a8f1136dce308377d0781be061b0f00624742fd8 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -5944,6 +5944,7 @@ int phy_procedures_UE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_
   LOG_D(PHY," ------  --> FFT/ChannelEst/PDCCH slot 0: AbsSubframe %d.%d ------  \n", frame_rx%1024, nr_tti_rx);
 
 
+  nr_gold_pdcch(ue,ue->frame_parms.Nid_cell, 0, 3);
 
   for (; l<=3; l++) {
     if (abstraction_flag == 0) {
@@ -6014,6 +6015,17 @@ int phy_procedures_UE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_
 #endif
 
   LOG_D(PHY," ------ --> PDSCH ChannelComp/LLR slot 0: AbsSubframe %d.%d ------  \n", frame_rx%1024, nr_tti_rx);
+  //to update from pdsch config
+  nr_gold_pdsch(ue,0,ue->frame_parms.Nid_cell, 0, 1);
+
+  nr_slot_fep(ue,
+          2,  //to be updated from higher layer
+          (nr_tti_rx<<1),
+          0,
+          0,
+          0,
+ 		  NR_PDSCH_EST);
+
 #if UE_TIMING_TRACE
   start_meas(&ue->generic_stat);
 #endif
@@ -6038,7 +6050,6 @@ int phy_procedures_UE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_
   if ((ue->dlsch_SI[eNB_id]) && (ue->dlsch_SI[eNB_id]->active == 1)) {
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC_SI, VCD_FUNCTION_IN);
     ue_pdsch_procedures(ue,
-
 			proc,
 			eNB_id,
 			SI_PDSCH,