diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index c03776455ee9b2a04b65526259f4497b22a97244..8936eba73f4158785981c0fdfdccc8bd5332126b 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -1393,6 +1393,7 @@ set(PHY_SRC_UE
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sch_dmrs.c
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_llr_computation.c
   ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+  ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_dmrs_rx.c
   ${OPENAIR1_DIR}/PHY/NR_REFSIG/nr_gold.c
   ${OPENAIR1_DIR}/PHY/NR_UE_ESTIMATION/filt16a_32.c
   ${OPENAIR1_DIR}/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 6b5acb85e46c397d220b3492e2131cad0baa555a..ebdee91d11d01b323dc9f9407875f9aa07d8b96e 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -294,7 +294,7 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
   //NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
   //nfapi_nr_config_request_t *cfg       = &gNB->gNB_config;
   NR_gNB_COMMON *const common_vars  = &gNB->common_vars;
-  //NR_gNB_PUSCH **const pusch_vars   = gNB->pusch_vars;
+  NR_gNB_PUSCH **const pusch_vars   = gNB->pusch_vars;
   /*LTE_eNB_SRS *const srs_vars        = gNB->srs_vars;
   LTE_eNB_PRACH *const prach_vars    = &gNB->prach_vars;*/
   uint32_t ***pdcch_dmrs             = gNB->nr_gold_pdcch_dmrs;
@@ -330,29 +330,38 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
 
   free_and_zero(prach_vars->prach_ifft[0]);
   free_and_zero(prach_vars->rxsigF[0]);
-
-  for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
-    for (i = 0; i < 2; i++) {
+*/
+  for (int UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
+    for (int i = 0; i < 2; i++) {
       free_and_zero(pusch_vars[UE_id]->rxdataF_ext[i]);
       free_and_zero(pusch_vars[UE_id]->rxdataF_ext2[i]);
-      free_and_zero(pusch_vars[UE_id]->drs_ch_estimates[i]);
-      free_and_zero(pusch_vars[UE_id]->drs_ch_estimates_time[i]);
+      free_and_zero(pusch_vars[UE_id]->ul_ch_estimates[i]);
+      free_and_zero(pusch_vars[UE_id]->ul_ch_estimates_ext[i]);
+      free_and_zero(pusch_vars[UE_id]->ul_ch_estimates_time[i]);
       free_and_zero(pusch_vars[UE_id]->rxdataF_comp[i]);
+      free_and_zero(pusch_vars[UE_id]->ul_ch_mag0[i]);
+      free_and_zero(pusch_vars[UE_id]->ul_ch_magb0[i]);
       free_and_zero(pusch_vars[UE_id]->ul_ch_mag[i]);
       free_and_zero(pusch_vars[UE_id]->ul_ch_magb[i]);
+      free_and_zero(pusch_vars[UE_id]->rho[i]);
     }
 
     free_and_zero(pusch_vars[UE_id]->rxdataF_ext);
     free_and_zero(pusch_vars[UE_id]->rxdataF_ext2);
-    free_and_zero(pusch_vars[UE_id]->drs_ch_estimates);
-    free_and_zero(pusch_vars[UE_id]->drs_ch_estimates_time);
+    free_and_zero(pusch_vars[UE_id]->ul_ch_estimates);
+    free_and_zero(pusch_vars[UE_id]->ul_ch_estimates_ext);
+    free_and_zero(pusch_vars[UE_id]->ul_ch_estimates_time);
     free_and_zero(pusch_vars[UE_id]->rxdataF_comp);
+    free_and_zero(pusch_vars[UE_id]->ul_ch_mag0);
+    free_and_zero(pusch_vars[UE_id]->ul_ch_magb0);
     free_and_zero(pusch_vars[UE_id]->ul_ch_mag);
     free_and_zero(pusch_vars[UE_id]->ul_ch_magb);
+    free_and_zero(pusch_vars[UE_id]->rho);
+
     free_and_zero(pusch_vars[UE_id]->llr);
     free_and_zero(pusch_vars[UE_id]);
   } //UE_id
-
+/*
   for (UE_id = 0; UE_id < NUMBER_OF_UE_MAX; UE_id++) gNB->UE_stats_ptr[UE_id] = NULL;
 */
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index c3e4f42e5f904f0e62c01db6304de093f3aa308a..e1b3c5cec9558a4f260297e3c4743647efc630a4 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -3,15 +3,13 @@
 #include "nr_transport_proto.h"
 #include "PHY/impl_defs_top.h"
 #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
+#include "PHY/NR_ESTIMATION/nr_ul_estimation.h"
 #include "PHY/defs_nr_common.h"
 
 //#define DEBUG_CH_COMP
 //#define DEBUG_RB_EXT
 //#define DEBUG_CH_MAG
 
-static short jitter[8]  __attribute__ ((aligned(16))) = {1,0,0,1,0,1,1,0};
-static short jitterc[8] __attribute__ ((aligned(16))) = {0,1,1,0,1,0,0,1};
-
 void nr_idft(uint32_t *z, uint32_t Msc_PUSCH)
 {
 
@@ -353,13 +351,11 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
 #if defined(__x86_64__)||defined(__i386__)
 
   short rb;
-  unsigned char aatx, aarx, nre = 12;
+  unsigned char aatx, aarx;
   __m128i *ul_ch128, avg128U;
 
-  //nb_rb*nre = y * 2^x
   int16_t x = factor2(len);
   int16_t y = (len)>>x;
-  //printf("nb_rb*nre = %d = %d * 2^(%d)\n",nb_rb*nre,y,x);
 
   for (aatx = 0; aatx < frame_parms->nb_antennas_tx; aatx++)
     for (aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
@@ -975,14 +971,13 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
                  unsigned char harq_pid)
 {
 
-  uint8_t cw_idx, first_symbol_flag, aarx, aatx, pilots; // pilots, a flag to indicate DMRS REs in current symbol
+  uint8_t first_symbol_flag, aarx, aatx, pilots; // pilots, a flag to indicate DMRS REs in current symbol
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
   nfapi_nr_ul_config_ulsch_pdu_rel15_t *rel15_ul = &gNB->ulsch[UE_id+1][0]->harq_processes[harq_pid]->ulsch_pdu.ulsch_pdu_rel15;
   uint32_t nb_re_pusch, bwp_start_subcarrier;
   int avgs;
   int avg[4];
 
-  cw_idx = 0; // temp implementation
   pilots = 0;
   first_symbol_flag = 0;
   
@@ -1031,7 +1026,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
 
   nr_ulsch_scale_channel(gNB->pusch_vars[UE_id]->ul_ch_estimates_ext,
                          frame_parms,
-                         gNB->ulsch,
+                         gNB->ulsch[UE_id+1],
                          symbol,
                          pilots,
                          rel15_ul->number_rbs);
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 674df8b451555f02b5bd36daf611bb81241f4d6a..89d89cbae2f763ce36c2f1fb3d0176b89fb1a6b1 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -2464,11 +2464,10 @@ void ue_pucch_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_
 
 
 void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
-		                    UE_nr_rxtx_proc_t *proc,
-							uint8_t gNB_id,
-							uint8_t thread_id)
+                            UE_nr_rxtx_proc_t *proc,
+                            uint8_t gNB_id,
+                            uint8_t thread_id)
 {
-  //NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
   NR_UE_ULSCH_t *ulsch_ue;
   NR_UL_UE_HARQ_t *harq_process_ul_ue;
   //int32_t ulsch_start=0;
@@ -4116,10 +4115,10 @@ int is_pbch_in_slot(fapi_nr_pbch_config_t *pbch_config, int frame, int slot, int
 
 
 int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
-		                   UE_nr_rxtx_proc_t *proc,
-						   uint8_t eNB_id,
-						   uint8_t do_pdcch_flag,
-						   runmode_t mode)
+                           UE_nr_rxtx_proc_t *proc,
+                           uint8_t eNB_id,
+                           uint8_t do_pdcch_flag,
+                           runmode_t mode)
 {
   int frame_rx = proc->frame_rx;
   int nr_tti_rx = proc->nr_tti_rx;