diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index 514d5f0239ea67a6e733d47fae7c4970c9f2ca08..236ff2dad2cb09a59a1d38c624e134607b7fe254 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -374,7 +374,7 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
   nr_scheduled_response_t scheduled_response;
 
   // program PUSCH. this should actually be done by the MAC upon reception of an UL DCI
-  if (proc->nr_tti_tx == 8 || proc->nr_tti_tx == 19 || UE->frame_parms.frame_type == FDD){
+  if (proc->nr_tti_tx == 8 || UE->frame_parms.frame_type == FDD){ //proc->nr_tti_tx == 19 ||
 
     mod_id = UE->Mod_id;
 
@@ -403,7 +403,7 @@ void processSlotTX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
     rvidx = 0;
     //------------------------------------------------------------------------------//
 
-    scheduled_response.ul_config->slot = 8;
+    scheduled_response.ul_config->slot = proc->nr_tti_tx;
     scheduled_response.ul_config->number_pdus = 1;
     scheduled_response.ul_config->ul_config_list[0].pdu_type = FAPI_NR_UL_CONFIG_TYPE_PUSCH;
     scheduled_response.ul_config->ul_config_list[0].ulsch_config_pdu.rnti = n_rnti;
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index d5c34fc72830730fff3ad4ca52ace4782c35b71d..8adfb26a84e063261acc9881bdeb1c8b1575c5d1 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -642,7 +642,7 @@ void init_pdcp(void) {
 	  LOG_I(RLC, "Problem at RLC initiation \n");
   }
   pdcp_layer_init();
-  nr_ip_over_LTE_DRB_preconfiguration();*/
+  nr_DRB_preconfiguration();*/
   pdcp_module_init(pdcp_initmask);
   pdcp_set_rlc_data_req_func((send_rlc_data_req_func_t) rlc_data_req);
   pdcp_set_pdcp_data_ind_func((pdcp_data_ind_func_t) pdcp_data_ind);
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 85e1079c5b80e25cd2fb60adbb6bcb29ea39b733..ee64c5a32aa76a0d2b66964e2a3ea5d23a52452d 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -176,6 +176,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
   }
 
   uint32_t Nid_pusch[2] = {cfg->cell_config.phy_cell_id.value,cfg->cell_config.phy_cell_id.value};
+  LOG_D(PHY,"Initializing PUSCH DMRS Gold sequence with (%x,%x)\n",Nid_pusch[0],Nid_pusch[1]);
   nr_gold_pusch(gNB, &Nid_pusch[0]);
 
   /// Transport init necessary for NR synchro
diff --git a/openair1/PHY/MODULATION/slot_fep_nr.c b/openair1/PHY/MODULATION/slot_fep_nr.c
index 8feb5f13b9771290309732470bc86833e386f701..5c704f3adf129f9fbd23e537e627fe0e8eb7e52d 100644
--- a/openair1/PHY/MODULATION/slot_fep_nr.c
+++ b/openair1/PHY/MODULATION/slot_fep_nr.c
@@ -456,13 +456,15 @@ int nr_slot_fep_ul(NR_DL_FRAME_PARMS *frame_parms,
     memcpy((void *)&tmp_dft_in[sample_offset-rxdata_offset],
            (void *) &rxdata[0],
            (frame_parms->ofdm_symbol_size-sample_offset+rxdata_offset)*sizeof(int));
-
+ 
     dft((int16_t *)&tmp_dft_in,
         (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
   }
   else
     dft((int16_t *)&rxdata[rxdata_offset-sample_offset],
         (int16_t *)&rxdataF[symbol * frame_parms->ofdm_symbol_size], 1);
+  // clear DC carrier from OFDM symbols
+  rxdataF[symbol * frame_parms->ofdm_symbol_size] = 0;
 
   return(0);
 }
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 94da06dd8b6d36eb040491d9391bfa87406dabac..a1419708400aeae618529f407c91a4749aa5a442 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -28,7 +28,7 @@
 #include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
 
 //#define DEBUG_CH
-
+//#define DEBUG_PUSCH
 
 int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
                                 unsigned char Ns,
@@ -116,7 +116,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
   //------------------generate DMRS------------------//
 
-  if (pusch_pdu->transform_precoding) // if transform precoding is disabled
+  if (pusch_pdu->transform_precoding==1) // if transform precoding is disabled
     nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, pusch_pdu->rb_start*NR_NB_SC_PER_RB, pusch_pdu->dmrs_config_type);
   else
     nr_pusch_dmrs_rx(gNB, Ns, gNB->nr_gold_pusch_dmrs[pusch_pdu->scid][Ns][symbol], &pilot[0], 1000, 0, nb_rb_pusch, 0, pusch_pdu->dmrs_config_type);
@@ -132,8 +132,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
     memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
 
 #ifdef DEBUG_PUSCH
+    printf("symbol_offset %d, nushift %d\n",symbol_offset,nushift);
     printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL);
-    printf("k %d, first_carrier %d\n",k,gNB->frame_parms.first_carrier_offset);
+    printf("bwp_start_subcarrier %d, k %d, first_carrier %d\n",bwp_start_subcarrier,k,gNB->frame_parms.first_carrier_offset);
     printf("rxF addr %p p %d\n", rxF,p);
     printf("ul_ch addr %p nushift %d\n",ul_ch,nushift);
 #endif
@@ -148,7 +149,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 #ifdef DEBUG_PUSCH
       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]);
-      printf("data 0 : rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",rxF[2],rxF[3],&rxF[2],ch[0],ch[1],pil[0],pil[1]);
+      printf("data 0 : rxF - > (%d,%d)\n",rxF[2],rxF[3]);
 #endif
 
       multadd_real_vector_complex_scalar(fl,
@@ -166,6 +167,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
 #ifdef DEBUG_PUSCH
       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]);
+      printf("data 1 : rxF - > (%d,%d)\n",rxF[2],rxF[3]);
 #endif
       multadd_real_vector_complex_scalar(fml,
                                          ch,
@@ -181,6 +183,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
 #ifdef DEBUG_PUSCH
       printf("pilot 2 : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("data 2 : rxF - > (%d,%d)\n",rxF[2],rxF[3]);
 #endif
       multadd_real_vector_complex_scalar(fmm,
                                          ch,
@@ -201,7 +204,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
         ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 
   #ifdef DEBUG_PUSCH
-        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]);
+        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]);
+	printf("data %d : rxF - > (%d,%d)\n",pilot_cnt,rxF[2],rxF[3]);
   #endif
         multadd_real_vector_complex_scalar(fml,
                                            ch,
@@ -217,6 +221,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 
   #ifdef DEBUG_PUSCH
         printf("pilot %u : 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]);
+	printf("data %d : rxF - > (%d,%d)\n",pilot_cnt+1,rxF[2],rxF[3]);
   #endif
         multadd_real_vector_complex_scalar(fmm,
                                            ch,
@@ -238,6 +243,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PUSCH
       printf("pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("data %d : rxF - > (%d,%d)\n",pilot_cnt,rxF[2],rxF[3]);
 #endif
       multadd_real_vector_complex_scalar(fm,
                                          ch,
@@ -256,6 +262,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
 #ifdef DEBUG_PUSCH
       printf("ch 0 %d\n",((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1]));
       printf("pilot %u: rxF - > (%d,%d) addr %p  ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+1,rxF[0],rxF[1],&rxF[0],ch[0],ch[1],pil[0],pil[1]);
+      printf("data %d : rxF - > (%d,%d)\n",pilot_cnt+1,rxF[2],rxF[3]);
 #endif
       multadd_real_vector_complex_scalar(fmr,
                                          ch,
@@ -271,6 +278,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
       ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
 #ifdef DEBUG_PUSCH
       printf("pilot %u: rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d) \n",pilot_cnt+2,rxF[0],rxF[1],ch[0],ch[1],pil[0],pil[1]);
+      printf("data %d : rxF - > (%d,%d)\n",pilot_cnt+2,rxF[2],rxF[3]);
 #endif
       multadd_real_vector_complex_scalar(fr,
                                          ch,
diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
index b1b038e918610706437ee7a3da93aadd18f33bb5..2f88242eb7b52d496d42d545b88d8fe585ef65ce 100644
--- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
+++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
@@ -32,7 +32,7 @@
 
 //#define NR_PBCH_DMRS_LENGTH_DWORD 5
 //#define NR_PBCH_DMRS_LENGTH 144
-//#define DEBUG_PDCCH
+//#define DEBUG_PUSCH
 
 #include "refsig_defs_ue.h"
 #include "PHY/defs_nr_UE.h"
@@ -63,32 +63,34 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
   int8_t w, nb_dmrs;
   short *mod_table;
   unsigned char idx=0;
-
+  int k;
   typedef int array_of_w[2];
   array_of_w *wf;
   array_of_w *wt;
   wf = (dmrs_type==pusch_dmrs_type1) ? wf1 : wf2;
   wt = (dmrs_type==pusch_dmrs_type1) ? wt1 : wt2;
 
+  int dmrs_offset = re_offset/((dmrs_type==pusch_dmrs_type1)?2:3);
+
   if (dmrs_type > 2)
     LOG_E(PHY,"PUSCH DMRS config type %d not valid\n", dmrs_type+1);
 
   if ((p>=1000) && (p<((dmrs_type==pusch_dmrs_type1) ? 1008 : 1012))) {
       if (gNB->frame_parms.Ncp == NORMAL) {
         nb_dmrs = ((dmrs_type==pusch_dmrs_type1) ? 6:4);
-        for (int i=re_offset; i<re_offset+(nb_pusch_rb*nb_dmrs); i++) {
-
+        for (int i=dmrs_offset; i<dmrs_offset+(nb_pusch_rb*nb_dmrs); i++) {
+          k = i-dmrs_offset;
           w = (wf[p-1000][i&1])*(wt[p-1000][lp]);
           mod_table = (w==1) ? nr_rx_mod_table : nr_rx_nmod_table;
 
           idx = ((((nr_gold_pusch[(i<<1)>>5])>>((i<<1)&0x1f))&1)<<1) ^ (((nr_gold_pusch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1);
-          ((int16_t*)output)[i<<1] = mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
-          ((int16_t*)output)[(i<<1)+1] = mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1];
+          ((int16_t*)output)[k<<1] = mod_table[(NR_MOD_TABLE_QPSK_OFFSET + idx)<<1];
+          ((int16_t*)output)[(k<<1)+1] = mod_table[((NR_MOD_TABLE_QPSK_OFFSET + idx)<<1) + 1];
 #ifdef DEBUG_PUSCH
           printf("nr_pusch_dmrs_rx dmrs config type %d port %d nb_pusch_rb %d\n", dmrs_type, p, nb_pusch_rb);
           printf("wf[%d] = %d wt[%d]= %d\n", i&1, wf[p-1000][i&1], lp, wt[p-1000][lp]);
           printf("i %d idx %d pusch gold %u b0-b1 %d-%d mod_dmrs %d %d\n", i, idx, nr_gold_pusch[(i<<1)>>5], (((nr_gold_pusch[(i<<1)>>5])>>((i<<1)&0x1f))&1),
-          (((nr_gold_pusch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1), ((int16_t*)output)[i<<1], ((int16_t*)output)[(i<<1)+1]);
+          (((nr_gold_pusch[((i<<1)+1)>>5])>>(((i<<1)+1)&0x1f))&1), ((int16_t*)output)[k<<1], ((int16_t*)output)[(k<<1)+1]);
 #endif
 
         }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index 9f555e663e3541e4c2a312a6453dfed578667dab..19b50792e4f92dec36604808196415fb318b6351 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -46,12 +46,12 @@
     @param symbol Symbol on which to act (within-in nr_TTI_rx)
     @param harq_pid HARQ process ID
 */
-void nr_rx_pusch(PHY_VARS_gNB *gNB,
-                 uint8_t UE_id,
-                 uint32_t frame,
-                 uint8_t nr_tti_rx,
-                 unsigned char symbol,
-                 unsigned char harq_pid);
+int nr_rx_pusch(PHY_VARS_gNB *gNB,
+                uint8_t UE_id,
+                uint32_t frame,
+                uint8_t nr_tti_rx,
+                unsigned char symbol,
+                unsigned char harq_pid);
 
 
 /** \brief This function performs RB extraction (signal and channel estimates) (currently signal only until channel estimation and compensation are implemented)
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index c74bc16754dd7772ae32279c1a95a6eea9f231ed..f7e5737a9f75e05e0ba6c11ebf8766986fb1f884 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -714,11 +714,11 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
   }
 
 #ifdef DEBUG_ULSCH_DECODING
-  LOG_I(PHY, "Decoder output (payload): \n");
-  for (i = 0; i < harq_process->TBS / 8; i++) {
+  LOG_I(PHY, "Decoder output (payload, TBS: %d): \n", harq_process->TBS);
+  for (i = 0; i < harq_process->TBS; i++) {
 	  //harq_process_ul_ue->a[i] = (unsigned char) rand();
 	  //printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
-	  printf("0x%02x",harq_process->b[i]);
+	  printf("%02x",harq_process->b[i]);
   }
 #endif
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
index b09f9110299a757ec0ae7393f57fe5949a4fd6b8..2824ac154403fbb9e9d044e728e4b6a5b29c3467 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
@@ -1013,12 +1013,12 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
 
 }
 
-void nr_rx_pusch(PHY_VARS_gNB *gNB,
-                 uint8_t UE_id,
-                 uint32_t frame,
-                 uint8_t nr_tti_rx,
-                 unsigned char symbol,
-                 unsigned char harq_pid)
+int nr_rx_pusch(PHY_VARS_gNB *gNB,
+                uint8_t ulsch_id,
+                uint32_t frame,
+                uint8_t nr_tti_rx,
+                unsigned char symbol,
+                unsigned char harq_pid)
 {
 
   uint8_t aarx, aatx, dmrs_symbol_flag, ptrs_symbol_flag; // dmrs_symbol_flag, a flag to indicate DMRS REs in current symbol
@@ -1027,23 +1027,23 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
   int avgs;
   int avg[4];
   NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
-  nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[UE_id][0]->harq_processes[harq_pid]->ulsch_pdu;
+  nfapi_nr_pusch_pdu_t *rel15_ul = &gNB->ulsch[ulsch_id][0]->harq_processes[harq_pid]->ulsch_pdu;
   uint8_t nodata_dmrs = 1; // FIXME to be properly configured from fapi
 
   dmrs_symbol_flag = 0;
   ptrs_symbol_flag = 0;
-  gNB->pusch_vars[UE_id]->ptrs_sc_per_ofdm_symbol = 0;
+  gNB->pusch_vars[ulsch_id]->ptrs_sc_per_ofdm_symbol = 0;
 
   if(symbol == rel15_ul->start_symbol_index){
-    gNB->pusch_vars[UE_id]->rxdataF_ext_offset = 0;
-    gNB->pusch_vars[UE_id]->dmrs_symbol = 0;
-    gNB->pusch_vars[UE_id]->cl_done = 0;
-    gNB->pusch_vars[UE_id]->ptrs_symbols = 0;
+    gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset = 0;
+    gNB->pusch_vars[ulsch_id]->dmrs_symbol = 0;
+    gNB->pusch_vars[ulsch_id]->cl_done = 0;
+    gNB->pusch_vars[ulsch_id]->ptrs_symbols = 0;
 
     if ( ((rel15_ul->pdu_bit_map)>>2)& 0x01 ) {  // if there is ptrs pdu
       L_ptrs = 1<<(rel15_ul->pusch_ptrs.ptrs_time_density);
 
-      set_ptrs_symb_idx(&gNB->pusch_vars[UE_id]->ptrs_symbols,
+      set_ptrs_symb_idx(&gNB->pusch_vars[ulsch_id]->ptrs_symbols,
                         rel15_ul->nr_of_symbols,
                         rel15_ul->start_symbol_index,
                         rel15_ul->dmrs_config_type,
@@ -1064,7 +1064,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
       nb_re_pusch = 0;
     else
       nb_re_pusch = rel15_ul->rb_size * ((rel15_ul->dmrs_config_type==pusch_dmrs_type1)?6:8);
-    gNB->pusch_vars[UE_id]->dmrs_symbol = symbol;
+    gNB->pusch_vars[ulsch_id]->dmrs_symbol = symbol;
   } else {
     nb_re_pusch = rel15_ul->rb_size * NR_NB_SC_PER_RB;
   }
@@ -1077,7 +1077,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
                                       rel15_ul->nr_of_symbols,
                                       0,
                                       (rel15_ul->pusch_ptrs.ptrs_freq_density)?4:2,
-                                      gNB->pusch_vars[UE_id]->ptrs_symbols,
+                                      gNB->pusch_vars[ulsch_id]->ptrs_symbols,
                                       0,
                                       frame_parms->ofdm_symbol_size,
                                       rel15_ul->dmrs_config_type,
@@ -1085,7 +1085,7 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
   }
 
   if (ptrs_symbol_flag == 1){
-    gNB->pusch_vars[UE_id]->ptrs_symbol_index = symbol;
+    gNB->pusch_vars[ulsch_id]->ptrs_symbol_index = symbol;
   }
 
 
@@ -1110,25 +1110,25 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
 
     start_meas(&gNB->ulsch_rbs_extraction_stats);
     nr_ulsch_extract_rbs_single(gNB->common_vars.rxdataF,
-                                gNB->pusch_vars[UE_id],
+                                gNB->pusch_vars[ulsch_id],
                                 symbol,
                                 dmrs_symbol_flag,
                                 rel15_ul,
                                 frame_parms);
     stop_meas(&gNB->ulsch_rbs_extraction_stats);
 
-    nr_ulsch_scale_channel(gNB->pusch_vars[UE_id]->ul_ch_estimates_ext,
+    nr_ulsch_scale_channel(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
                            frame_parms,
-                           gNB->ulsch[UE_id],
+                           gNB->ulsch[ulsch_id],
                            symbol,
                            dmrs_symbol_flag,
                            rel15_ul->rb_size,
                            rel15_ul->dmrs_config_type);
 
 
-    if (gNB->pusch_vars[UE_id]->cl_done==0) {
+    if (gNB->pusch_vars[ulsch_id]->cl_done==0) {
 
-      nr_ulsch_channel_level(gNB->pusch_vars[UE_id]->ul_ch_estimates_ext,
+      nr_ulsch_channel_level(gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
                              frame_parms,
                              avg,
                              symbol,
@@ -1141,26 +1141,32 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
         for (aarx=0;aarx<frame_parms->nb_antennas_rx;aarx++)
           avgs = cmax(avgs,avg[(aatx<<1)+aarx]);
 
-      gNB->pusch_vars[UE_id]->log2_maxh = (log2_approx(avgs)/2)+1;
-      gNB->pusch_vars[UE_id]->cl_done = 1;
+      gNB->pusch_vars[ulsch_id]->log2_maxh = (log2_approx(avgs)/2)+1;
+      gNB->pusch_vars[ulsch_id]->cl_done = 1;
     }
     start_meas(&gNB->ulsch_channel_compensation_stats);
-    nr_ulsch_channel_compensation(gNB->pusch_vars[UE_id]->rxdataF_ext,
-                                  gNB->pusch_vars[UE_id]->ul_ch_estimates_ext,
-                                  gNB->pusch_vars[UE_id]->ul_ch_mag0,
-                                  gNB->pusch_vars[UE_id]->ul_ch_magb0,
-                                  gNB->pusch_vars[UE_id]->rxdataF_comp,
-                                  (frame_parms->nb_antennas_tx>1) ? gNB->pusch_vars[UE_id]->rho : NULL,
+    nr_ulsch_channel_compensation(gNB->pusch_vars[ulsch_id]->rxdataF_ext,
+                                  gNB->pusch_vars[ulsch_id]->ul_ch_estimates_ext,
+                                  gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
+                                  gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
+                                  gNB->pusch_vars[ulsch_id]->rxdataF_comp,
+                                  (frame_parms->nb_antennas_tx>1) ? gNB->pusch_vars[ulsch_id]->rho : NULL,
                                   frame_parms,
                                   symbol,
                                   dmrs_symbol_flag,
                                   rel15_ul->qam_mod_order,
                                   rel15_ul->rb_size,
-                                  gNB->pusch_vars[UE_id]->log2_maxh);
+                                  gNB->pusch_vars[ulsch_id]->log2_maxh);
     stop_meas(&gNB->ulsch_channel_compensation_stats);
 
+
+    int rxsig = signal_energy(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][(symbol*rel15_ul->rb_size*12)],
+                              rel15_ul->rb_size*12);
+
+    if (rxsig==1) return (rxsig);
+
 #ifdef NR_SC_FDMA
-    nr_idft(&((uint32_t*)gNB->pusch_vars[UE_id]->rxdataF_ext[0])[symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB], nb_re_pusch);
+    nr_idft(&((uint32_t*)gNB->pusch_vars[ulsch_id]->rxdataF_ext[0])[symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB], nb_re_pusch);
 #endif
 
   //----------------------------------------------------------
@@ -1168,10 +1174,10 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
   //----------------------------------------------------------
 
     start_meas(&gNB->ulsch_llr_stats);
-    nr_ulsch_compute_llr(&gNB->pusch_vars[UE_id]->rxdataF_comp[0][symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB],
-                         gNB->pusch_vars[UE_id]->ul_ch_mag0,
-                         gNB->pusch_vars[UE_id]->ul_ch_magb0,
-                         &gNB->pusch_vars[UE_id]->llr[gNB->pusch_vars[UE_id]->rxdataF_ext_offset * rel15_ul->qam_mod_order],
+    nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB],
+                         gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
+                         gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
+                         &gNB->pusch_vars[ulsch_id]->llr[gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset * rel15_ul->qam_mod_order],
                          rel15_ul->rb_size,
                          nb_re_pusch,
                          symbol,
@@ -1180,6 +1186,6 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
 
   }
 
-  gNB->pusch_vars[UE_id]->rxdataF_ext_offset = gNB->pusch_vars[UE_id]->rxdataF_ext_offset +  nb_re_pusch;
-  
+  gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset = gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset +  nb_re_pusch;
+  return (0);
 }
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index 14c70e65827501dff5023293939d2df6a820cb42..fc02cb989e9e842979bef03abc36181199c5be86 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -193,15 +193,14 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
       if (!IS_SOFTMODEM_NOS1 || !data_existing) {
         //Use zeros for the header bytes in noS1 mode, in order to make sure that the LCID is not valid
         //and block this traffic from being forwarded to the upper layers at the gNB
-        uint16_t payload_offset = 5;
         LOG_D(PHY, "Random data to be tranmsitted: \n");
 
-        //Give the header bytes a dummy value (a value not corresponding to any valid LCID based on 38.321, Table 6.2.1-2)
-        //in order to block the random packet at the MAC layer of the receiver
-        for (i = 0; i<payload_offset; i++)
-          harq_process_ul_ue->a[i] = 64;
+        //Give the first byte a dummy value (a value not corresponding to any valid LCID based on 38.321, Table 6.2.1-2)
+        //in order to distinguish the PHY random packets at the MAC layer of the gNB receiver from the normal packets that should
+        //have a valid LCID (nr_process_mac_pdu function)
+          harq_process_ul_ue->a[0] = 0x31;
 
-        for (i = payload_offset; i < harq_process_ul_ue->TBS / 8; i++) {
+        for (i = 1; i < harq_process_ul_ue->TBS / 8; i++) {
           harq_process_ul_ue->a[i] = (unsigned char) rand();
           //printf(" input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
         }
@@ -537,22 +536,52 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
   txdata = UE->common_vars.txdata;
   txdataF = UE->common_vars.txdataF;
 
-  for (ap = 0; ap < Nl; ap++) {
+  if(UE->N_TA_offset > tx_offset) {
+    int32_t *tmp_idft_out = (int32_t*)malloc16(frame_parms->get_samples_per_slot(slot, frame_parms) * sizeof(int32_t));
+
+    for(ap = 0; ap < Nl; ap++) {
       if (frame_parms->Ncp == 1) { // extended cyclic prefix
-  PHY_ofdm_mod(txdataF[ap],
-         &txdata[ap][tx_offset],
-         frame_parms->ofdm_symbol_size,
-         12,
-         frame_parms->nb_prefix_samples,
-         CYCLIC_PREFIX);
+        PHY_ofdm_mod(txdataF[ap],
+                     tmp_idft_out,
+                     frame_parms->ofdm_symbol_size,
+                     12,
+                     frame_parms->nb_prefix_samples,
+                     CYCLIC_PREFIX);
       } else { // normal cyclic prefix
-  nr_normal_prefix_mod(txdataF[ap],
-           &txdata[ap][tx_offset],
-           14,
-           frame_parms);
+        nr_normal_prefix_mod(txdataF[ap],
+                             tmp_idft_out,
+                             14,
+                             frame_parms);
       }
+
+      memcpy((void *) &txdata[ap][frame_parms->samples_per_frame - UE->N_TA_offset + tx_offset],
+             (void *) tmp_idft_out,
+             (UE->N_TA_offset - tx_offset) * sizeof(int32_t));
+
+      memcpy((void *) &txdata[ap][0],
+             (void *) &tmp_idft_out[UE->N_TA_offset - tx_offset],
+             (frame_parms->get_samples_per_slot(slot, frame_parms) - UE->N_TA_offset + tx_offset) * sizeof(int32_t));
     }
 
+    free(tmp_idft_out);
+  } else { // UE->N_TA_offset <= tx_offset
+    for (ap = 0; ap < Nl; ap++) {
+      if (frame_parms->Ncp == 1) { // extended cyclic prefix
+        PHY_ofdm_mod(txdataF[ap],
+                     &txdata[ap][tx_offset-UE->N_TA_offset],
+                     frame_parms->ofdm_symbol_size,
+                     12,
+                     frame_parms->nb_prefix_samples,
+                     CYCLIC_PREFIX);
+      } else { // normal cyclic prefix
+        nr_normal_prefix_mod(txdataF[ap],
+                             &txdata[ap][tx_offset-UE->N_TA_offset],
+                             14,
+                             frame_parms);
+      }
+    }
+  }
+
   ///////////
   ////////////////////////////////////////////////////
   return 0;
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 147ff778f3c8ec50b3ae7a2cc6e00b9f908522d2..6b49d64338cbba7aeca8a9e60326ee9bb0151984 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -50,6 +50,8 @@
 
 #include "intertask_interface.h"
 
+//#define DEBUG_RXDATA
+
 uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,254,32,34,36,38,40,42,44,46,254,254,48,50,52,54,56,58,60,62};
 
 extern uint8_t nfapi_mode;
@@ -228,7 +230,7 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
     number_dmrs_symbols += ((pusch_pdu->ul_dmrs_symb_pos)>>l)&0x01;
 
   if (nodata_dmrs)
-    nb_re_dmrs = 12*number_dmrs_symbols;
+    nb_re_dmrs = 12;
   else
     nb_re_dmrs = ((pusch_pdu->dmrs_config_type == pusch_dmrs_type1)?6:4);
 
@@ -243,7 +245,6 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
   //----------------------------------------------------------
   //------------------- ULSCH unscrambling -------------------
   //----------------------------------------------------------
-
   start_meas(&gNB->ulsch_unscrambling_stats);
   nr_ulsch_unscrambling(gNB->pusch_vars[ULSCH_id]->llr,
                         G,
@@ -423,6 +424,7 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
   for (int ULSCH_id=0;ULSCH_id<NUMBER_OF_NR_ULSCH_MAX;ULSCH_id++) {
     NR_gNB_ULSCH_t *ulsch = gNB->ulsch[ULSCH_id][0];
     int harq_pid;
+    int no_sig;
     NR_UL_gNB_HARQ_t *ulsch_harq;
 
     if ((ulsch) &&
@@ -436,10 +438,24 @@ void phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
 	    (ulsch_harq->slot == slot_rx) &&
 	    (ulsch_harq->handled == 0)){
 
+#ifdef DEBUG_RXDATA
+          NR_DL_FRAME_PARMS *frame_parms = &gNB->frame_parms;
+          RU_t *ru = gNB->RU_list[0];
+          int slot_offset = frame_parms->get_samples_slot_timestamp(slot_rx,frame_parms,0);
+          slot_offset -= ru->N_TA_offset;
+          char name[128];
+          FILE *f;
+          sprintf(name, "rxdata.%d.%d.raw", frame_rx,slot_rx);
+          f = fopen(name, "w"); if (f == NULL) exit(1);
+          fwrite(&ru->common.rxdata[0][slot_offset],2,frame_parms->get_samples_per_slot(slot_rx,frame_parms)*2, f);
+          fclose(f);
+#endif
+
 	  uint8_t symbol_start = ulsch_harq->ulsch_pdu.start_symbol_index;
 	  uint8_t symbol_end = symbol_start + ulsch_harq->ulsch_pdu.nr_of_symbols;
 	  for(uint8_t symbol = symbol_start; symbol < symbol_end; symbol++) {
-	    nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, symbol, harq_pid);
+	    no_sig = nr_rx_pusch(gNB, ULSCH_id, frame_rx, slot_rx, symbol, harq_pid);
+            if (no_sig) return;
 	  }
 	  //LOG_M("rxdataF_comp.m","rxF_comp",gNB->pusch_vars[0]->rxdataF_comp[0],6900,1,1);
 	  //LOG_M("rxdataF_ext.m","rxF_ext",gNB->pusch_vars[0]->rxdataF_ext[0],6900,1,1);
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 8e0ef92c81c46b1db0be5d1176956ad97eeb39a6..cb94ff985d71e88d9047854164b10fd9a4c100c7 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -123,7 +123,7 @@ int generate_dlsch_header(unsigned char *mac_header,
                           unsigned char *ue_cont_res_id,
                           unsigned char short_padding,
                           unsigned short post_padding){return 0;}
-void nr_ip_over_LTE_DRB_preconfiguration(void){}
+void nr_DRB_preconfiguration(void){}
 
 // needed for some functions
 openair0_config_t openair0_cfg[MAX_CARDS];
diff --git a/openair1/SIMULATION/NR_PHY/prachsim.c b/openair1/SIMULATION/NR_PHY/prachsim.c
index aed7eb4505ab2a7159596e6603260a0dc07da58c..d0af529ec30e5bb8715df2c1c3cd4f443e02d539 100644
--- a/openair1/SIMULATION/NR_PHY/prachsim.c
+++ b/openair1/SIMULATION/NR_PHY/prachsim.c
@@ -76,7 +76,7 @@ boolean_t pdcp_data_ind(const protocol_ctxt_t *const ctxt_pP,
                         const sdu_size_t   sdu_buffer_sizeP,
                         mem_block_t *const sdu_buffer_pP) {return(false);}
 
-void nr_ip_over_LTE_DRB_preconfiguration(void){}
+void nr_DRB_preconfiguration(void){}
 void pdcp_layer_init(void) {}
 int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const int8_t channel, const uint8_t* pduP, const sdu_size_t pdu_len) {return 0;}
 
diff --git a/openair1/SIMULATION/NR_PHY/ulsim.c b/openair1/SIMULATION/NR_PHY/ulsim.c
index b3d0d1160687aae437639cc05c3a571a9f076651..75143dc07783a7c46bc0349dfb346ef4186d811d 100644
--- a/openair1/SIMULATION/NR_PHY/ulsim.c
+++ b/openair1/SIMULATION/NR_PHY/ulsim.c
@@ -98,7 +98,7 @@ boolean_t pdcp_data_ind(
 ) { return(false);}
 
 void pdcp_run (const protocol_ctxt_t *const  ctxt_pP) { return;}
-void nr_ip_over_LTE_DRB_preconfiguration(void){}
+void nr_DRB_preconfiguration(void){}
 int rrc_init_nr_global_param(void){return(0);}
 
 
@@ -114,7 +114,7 @@ int main(int argc, char **argv)
   double sigma, sigma_dB;
   double snr_step = 1;
   uint8_t snr1set = 0;
-  int slot = 0, frame = 0;
+  int slot = 17, frame = 0;
   FILE *output_fd = NULL;
   //uint8_t write_output_file = 0;
   int trial, n_trials = 1, n_errors = 0, n_false_positive = 0, delay = 0;
@@ -147,12 +147,13 @@ int main(int argc, char **argv)
   float target_error_rate = 0.01;
   int print_perf = 0;
   cpuf = get_cpu_freq_GHz();
-
+  int msg3_flag = 0;
 
   UE_nr_rxtx_proc_t UE_proc;
   FILE *scg_fd=NULL;
 
-
+  int ibwp_size=24;
+  int ibwp_rboffset=41;
   if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == 0 ) {
     exit_fun("[NR_ULSIM] Error, configuration module init failed\n");
   }
@@ -160,202 +161,226 @@ int main(int argc, char **argv)
   //logInit();
   randominit(0);
 
-  while ((c = getopt(argc, argv, "d:f:g:h:i:j:l:m:n:p:r:s:y:z:F:M:N:PR:S:L:")) != -1) {
+  while ((c = getopt(argc, argv, "a:b:c:d:ef:g:h:i:j:kl:m:n:p:r:s:y:z:F:M:N:PR:S:L:")) != -1) {
+    printf("handling optarg %c\n",c);
     switch (c) {
 
       /*case 'd':
         frame_type = 1;
         break;*/
 
-      case 'd':
-        delay = atoi(optarg);
-        break;
-
-      case 'f':
-         scg_fd = fopen(optarg, "r");
-
-         if (scg_fd == NULL) {
-             printf("Error opening %s\n", optarg);
-             exit(-1);
-         }
-
-         break;
-
-      case 'g':
-        switch ((char) *optarg) {
-          case 'A':
-            channel_model = SCM_A;
-            break;
-
-          case 'B':
-            channel_model = SCM_B;
-            break;
-
-          case 'C':
-            channel_model = SCM_C;
-            break;
-
-          case 'D':
-            channel_model = SCM_D;
-            break;
-
-          case 'E':
-            channel_model = EPA;
-            break;
-
-          case 'F':
-            channel_model = EVA;
-            break;
-
-          case 'G':
-            channel_model = ETU;
-            break;
-
-          default:
-            printf("Unsupported channel model!\n");
-            exit(-1);
-        }
-
-        break;
+    case 'a':
+      start_symbol = atoi(optarg);
+      AssertFatal(start_symbol >= 0 && start_symbol < 13,"start_symbol %d is not in 0..12\n",start_symbol);
+      break;
+
+    case 'b':
+      nb_symb_sch = atoi(optarg);
+      AssertFatal(nb_symb_sch > 0 && nb_symb_sch < 15,"start_symbol %d is not in 1..14\n",nb_symb_sch);
+      break;
+    case 'c':
+      n_rnti = atoi(optarg);
+      AssertFatal(n_rnti > 0 && n_rnti<=65535,"Illegal n_rnti %x\n",n_rnti);
+      break;
+
+    case 'd':
+      delay = atoi(optarg);
+      break;
+      
+    case 'e':
+      msg3_flag = 1;
+      break;
+      
+    case 'f':
+      scg_fd = fopen(optarg, "r");
+      
+      if (scg_fd == NULL) {
+	printf("Error opening %s\n", optarg);
+	exit(-1);
+      }
 
+      break;
+      
+    case 'g':
+      switch ((char) *optarg) {
+      case 'A':
+	channel_model = SCM_A;
+	break;
+	
+      case 'B':
+	channel_model = SCM_B;
+	break;
+	
+      case 'C':
+	channel_model = SCM_C;
+	break;
+	
+      case 'D':
+	channel_model = SCM_D;
+	break;
+	
+      case 'E':
+	channel_model = EPA;
+	break;
+	
+      case 'F':
+	channel_model = EVA;
+	break;
+	
+      case 'G':
+	channel_model = ETU;
+	break;
+	
+      default:
+	printf("Unsupported channel model!\n");
+	exit(-1);
+      }
+      
+      break;
+      
       /*case 'i':
         interf1 = atoi(optarg);
         break;
-
-      case 'j':
+	
+	case 'j':
         interf2 = atoi(optarg);
         break;*/
 
-      case 'l':
-        nb_symb_sch = atoi(optarg);
-        break;
-
-      case 'm':
-        Imcs = atoi(optarg);
-        break;
-
-      case 'n':
-        n_trials = atoi(optarg);
-        break;
-
-      case 'p':
-        extended_prefix_flag = 1;
-        break;
-
-      case 'r':
-        nb_rb = atoi(optarg);
-        break;
-
-      case 's':
-        snr0 = atof(optarg);
-        printf("Setting SNR0 to %f\n", snr0);
-        break;
+    case 'k':
+      printf("Setting threequarter_fs_flag\n");
+      openair0_cfg[0].threequarter_fs= 1;
+      break;
 
+    case 'l':
+      nb_symb_sch = atoi(optarg);
+      break;
+      
+    case 'm':
+      Imcs = atoi(optarg);
+      break;
+      
+    case 'n':
+      n_trials = atoi(optarg);
+      break;
+      
+    case 'p':
+      extended_prefix_flag = 1;
+      break;
+      
+    case 'r':
+      nb_rb = atoi(optarg);
+      break;
+      
+    case 's':
+      snr0 = atof(optarg);
+      printf("Setting SNR0 to %f\n", snr0);
+      break;
+      
       /*
-       case 'r':
-       ricean_factor = pow(10,-.1*atof(optarg));
-       if (ricean_factor>1) {
-       printf("Ricean factor must be between 0 and 1\n");
-       exit(-1);
-       }
-       break;
-       */
-
+	case 'r':
+	ricean_factor = pow(10,-.1*atof(optarg));
+	if (ricean_factor>1) {
+	printf("Ricean factor must be between 0 and 1\n");
+	exit(-1);
+	}
+	break;
+      */
+      
       /*case 'x':
         transmission_mode = atoi(optarg);
         break;*/
-
-      case 'y':
-        n_tx = atoi(optarg);
-
-        if ((n_tx == 0) || (n_tx > 2)) {
-          printf("Unsupported number of tx antennas %d\n", n_tx);
-          exit(-1);
-        }
-
-        break;
-
-      case 'z':
-        n_rx = atoi(optarg);
-
-        if ((n_rx == 0) || (n_rx > 2)) {
-          printf("Unsupported number of rx antennas %d\n", n_rx);
-          exit(-1);
-        }
-
-        break;
-
-      case 'F':
-        input_fd = fopen(optarg, "r");
-
-        if (input_fd == NULL) {
-            printf("Problem with filename %s\n", optarg);
-            exit(-1);
-        }
-
-        break;
-
-      case 'M':
-        SSB_positions = atoi(optarg);
-        break;
-
-      case 'N':
-        Nid_cell = atoi(optarg);
-        break;
-
-      case 'R':
-        N_RB_DL = atoi(optarg);
-        N_RB_UL = N_RB_DL;
-        break;
-
-      case 'S':
-        snr1 = atof(optarg);
-        snr1set = 1;
-        printf("Setting SNR1 to %f\n", snr1);
-        break;
-
-      case 'P':
-        print_perf=1;
-        opp_enabled=1;
-        break;
-
-      case 'L':
-        loglvl = atoi(optarg);
-        break;
-
-      default:
-        case 'h':
-          printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
-          //printf("-d Use TDD\n");
-          printf("-d Introduce delay in terms of number of samples\n");
-          printf("-f Number of frames to simulate\n");
-          printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
-          printf("-h This message\n");
-          //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
-          //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
-          printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
-          printf("-m MCS value\n");
-          printf("-n Number of trials to simulate\n");
-          printf("-p Use extended prefix mode\n");
-          printf("-t Delay spread for multipath channel\n");
-          //printf("-x Transmission mode (1,2,6 for the moment)\n");
-          printf("-y Number of TX antennas used in eNB\n");
-          printf("-z Number of RX antennas used in UE\n");
-          printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
-          //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
-          printf("-F Input filename (.txt format) for RX conformance testing\n");
-	  printf("-G raw file containing RRC configuration (generated by gNB)\n");
-          printf("-M Multiple SSB positions in burst\n");
-          printf("-N Nid_cell\n");
-          printf("-O oversampling factor (1,2,4,8,16)\n");
-          printf("-R N_RB_DL\n");
-          printf("-S Ending SNR, runs from SNR0 to SNR1\n");
-          printf("-P Print ULSCH performances\n");
-          exit(-1);
-          break;
+      
+    case 'y':
+      n_tx = atoi(optarg);
+      
+      if ((n_tx == 0) || (n_tx > 2)) {
+	printf("Unsupported number of tx antennas %d\n", n_tx);
+	exit(-1);
+      }
+      
+      break;
+      
+    case 'z':
+      n_rx = atoi(optarg);
+      
+      if ((n_rx == 0) || (n_rx > 2)) {
+	printf("Unsupported number of rx antennas %d\n", n_rx);
+	exit(-1);
+      }
+      
+      break;
+      
+    case 'F':
+      input_fd = fopen(optarg, "r");
+      
+      if (input_fd == NULL) {
+	printf("Problem with filename %s\n", optarg);
+	exit(-1);
+      }
+      
+      break;
+      
+    case 'M':
+      SSB_positions = atoi(optarg);
+      break;
+      
+    case 'N':
+      Nid_cell = atoi(optarg);
+      break;
+      
+    case 'R':
+      N_RB_DL = atoi(optarg);
+      N_RB_UL = N_RB_DL;
+      break;
+      
+    case 'S':
+      snr1 = atof(optarg);
+      snr1set = 1;
+      printf("Setting SNR1 to %f\n", snr1);
+      break;
+      
+    case 'P':
+      print_perf=1;
+      opp_enabled=1;
+      break;
+      
+    case 'L':
+      loglvl = atoi(optarg);
+      break;
+      
+    default:
+    case 'h':
+      printf("%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId\n", argv[0]);
+      //printf("-d Use TDD\n");
+      printf("-d Introduce delay in terms of number of samples\n");
+      printf("-f Number of frames to simulate\n");
+      printf("-g [A,B,C,D,E,F,G] Use 3GPP SCM (A,B,C,D) or 36-101 (E-EPA,F-EVA,G-ETU) models (ignores delay spread and Ricean factor)\n");
+      printf("-h This message\n");
+      //printf("-i Relative strength of first intefering eNB (in dB) - cell_id mod 3 = 1\n");
+      //printf("-j Relative strength of second intefering eNB (in dB) - cell_id mod 3 = 2\n");
+      printf("-s Starting SNR, runs from SNR0 to SNR0 + 10 dB if ending SNR isn't given\n");
+      printf("-m MCS value\n");
+      printf("-n Number of trials to simulate\n");
+      printf("-p Use extended prefix mode\n");
+      printf("-t Delay spread for multipath channel\n");
+      //printf("-x Transmission mode (1,2,6 for the moment)\n");
+      printf("-y Number of TX antennas used in eNB\n");
+      printf("-z Number of RX antennas used in UE\n");
+      printf("-A Interpolation_filname Run with Abstraction to generate Scatter plot using interpolation polynomial in file\n");
+      //printf("-C Generate Calibration information for Abstraction (effective SNR adjustment to remove Pe bias w.r.t. AWGN)\n");
+      printf("-F Input filename (.txt format) for RX conformance testing\n");
+      printf("-G raw file containing RRC configuration (generated by gNB)\n");
+      printf("-M Multiple SSB positions in burst\n");
+      printf("-N Nid_cell\n");
+      printf("-O oversampling factor (1,2,4,8,16)\n");
+      printf("-R N_RB_DL\n");
+      printf("-S Ending SNR, runs from SNR0 to SNR1\n");
+      printf("-P Print ULSCH performances\n");
+      exit(-1);
+      break;
     }
   }
-
+  
   logInit();
   set_glog(loglvl);
   T_stdout = 1;
@@ -387,12 +412,15 @@ int main(int argc, char **argv)
   gNB->UL_INFO.rx_ind.number_of_pdus = 0;
   gNB->UL_INFO.crc_ind.number_crcs = 0;
   frame_parms = &gNB->frame_parms; //to be initialized I suppose (maybe not necessary for PBCH)
+
+
   frame_parms->nb_antennas_tx = n_tx;
   frame_parms->nb_antennas_rx = n_rx;
   frame_parms->N_RB_DL = N_RB_DL;
   frame_parms->N_RB_UL = N_RB_UL;
   frame_parms->Ncp = extended_prefix_flag ? EXTENDED : NORMAL;
 
+
   RC.nb_nr_macrlc_inst = 1;
   RC.nb_nr_mac_CC = (int*)malloc(RC.nb_nr_macrlc_inst*sizeof(int));
   for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
@@ -421,6 +449,7 @@ int main(int argc, char **argv)
   xer_fprint(stdout, &asn_DEF_NR_CellGroupConfig, (const void*)secondaryCellGroup);
 
   AssertFatal((gNB->if_inst         = NR_IF_Module_init(0))!=NULL,"Cannot register interface");
+
   gNB->if_inst->NR_PHY_config_req      = nr_phy_config_request;
   // common configuration
   rrc_mac_config_req_gNB(0,0,1,scc,0,0,NULL);
@@ -429,6 +458,10 @@ int main(int argc, char **argv)
   phy_init_nr_gNB(gNB,0,0);
   N_RB_DL = gNB->frame_parms.N_RB_DL;
 
+
+
+  NR_BWP_Uplink_t *ubwp=secondaryCellGroup->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.array[0];
+
   //crcTableInit();
 
   //nr_phy_config_request_sim(gNB, N_RB_DL, N_RB_UL, mu, Nid_cell, SSB_positions);
@@ -570,19 +603,40 @@ int main(int argc, char **argv)
       UL_tti_req->pdus_list[0].pdu_size = sizeof(nfapi_nr_pusch_pdu_t);
       memset(pusch_pdu,0,sizeof(nfapi_nr_pusch_pdu_t));
       
+      int abwp_size  = NRRIV2BW(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+      int abwp_start = NRRIV2PRBOFFSET(ubwp->bwp_Common->genericParameters.locationAndBandwidth,275);
+      int ibwp_size  = ibwp_size;
+      int ibwp_start = ibwp_rboffset;
+      if (msg3_flag == 1) {
+	if ((ibwp_start < abwp_start) || (ibwp_size > abwp_size))
+	  pusch_pdu->bwp_start = abwp_start;
+	else
+	  pusch_pdu->bwp_start = ibwp_start;
+	pusch_pdu->bwp_size = ibwp_size;
+	start_rb += (ibwp_start - abwp_start);
+	printf("msg3: ibwp_size %d, abwp_size %d, ibwp_start %d, abwp_start %d\n",
+	       ibwp_size,abwp_size,ibwp_start,abwp_start);
+      }
+      else {
+	pusch_pdu->bwp_start = abwp_start;
+	pusch_pdu->bwp_size = abwp_size;
+      }
+
       pusch_pdu->pdu_bit_map = PUSCH_PDU_BITMAP_PUSCH_DATA;  
       pusch_pdu->rnti = n_rnti;
       pusch_pdu->mcs_index = Imcs;
       pusch_pdu->mcs_table = 0; 
       pusch_pdu->target_code_rate = code_rate;
       pusch_pdu->qam_mod_order = mod_order;
-      pusch_pdu->transform_precoding = 0;
-      pusch_pdu->data_scrambling_id = 0;
+      pusch_pdu->transform_precoding = 1;
+      pusch_pdu->data_scrambling_id = *scc->physCellId;
       pusch_pdu->nrOfLayers = 1;
-      pusch_pdu->ul_dmrs_symb_pos = 1;
+      pusch_pdu->ul_dmrs_symb_pos = (1<<start_symbol);
       pusch_pdu->dmrs_config_type = 0;
-      pusch_pdu->ul_dmrs_scrambling_id =  0;
+      pusch_pdu->ul_dmrs_scrambling_id =  *scc->physCellId;
       pusch_pdu->scid = 0;
+      pusch_pdu->dmrs_ports = 1;
+      pusch_pdu->num_dmrs_cdm_grps_no_data = 2;
       pusch_pdu->resource_alloc = 1; 
       pusch_pdu->rb_start = start_rb;
       pusch_pdu->rb_size = nb_rb;
@@ -626,62 +680,100 @@ int main(int argc, char **argv)
       //there are plenty of other parameters that we don't seem to be using for now. e.g.
       //ul_config.ul_config_list[0].ulsch_config_pdu.ulsch_pdu_rel15.absolute_delta_PUSCH = 0;
 
-      // set FAPI parameters for UE, put them in the scheduled response and call
-      nr_ue_scheduled_response(&scheduled_response);
-
-      /////////////////////////phy_procedures_nr_ue_TX///////////////////////
-      ///////////
-
-      phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id, 0);
-
-      if (n_trials==1)
-	LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_length_complex_samples,1,1);
-
-      ///////////
-      ////////////////////////////////////////////////////
-      tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
-
-      txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
-              frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
-
-      txlev_float = (double)txlev; // output of signal_energy is fixed point representation
-
-      n_errors = 0;
-      n_false_positive = 0;
-
-      //AWGN
-      sigma_dB = 10*log10(txlev_float)-SNR;
-      sigma    = pow(10,sigma_dB/10);
+      if (input_fd != NULL) {
+	// set FAPI parameters for UE, put them in the scheduled response and call
+	nr_ue_scheduled_response(&scheduled_response);
+	
+	/////////////////////////phy_procedures_nr_ue_TX///////////////////////
+	///////////
+	
+	phy_procedures_nrUE_TX(UE, &UE_proc, gNB_id, 0);
+	
+	if (n_trials==1)
+	  LOG_M("txsig0.m","txs0", UE->common_vars.txdata[0],frame_length_complex_samples,1,1);
+	
+	///////////
+	////////////////////////////////////////////////////
+	tx_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);
+	
+	txlev = signal_energy(&UE->common_vars.txdata[0][tx_offset + 5*frame_parms->ofdm_symbol_size + 4*frame_parms->nb_prefix_samples + frame_parms->nb_prefix_samples0],
+			      frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
+	
+	txlev_float = (double)txlev; // output of signal_energy is fixed point representation
+	
+	n_errors = 0;
+	n_false_positive = 0;
+	
+	//AWGN
+	sigma_dB = 10*log10(txlev_float)-SNR;
+	sigma    = pow(10,sigma_dB/10);
+      }	
+      else n_trials = 1;
 
       for (trial = 0; trial < n_trials; trial++) {
-
-        errors_scrambling  = 0;
-        errors_decoding    = 0;
-
-        //----------------------------------------------------------
-        //------------------------ add noise -----------------------
-        //----------------------------------------------------------
-        for (i=0; i<frame_length_complex_samples; i++) {
-          for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
-            ((short*) gNB->common_vars.rxdata[ap])[(2*i) + (delay*2)]   = (((int16_t *)UE->common_vars.txdata[ap])[(i<<1)])   + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0)); // convert to fixed point
-            ((short*) gNB->common_vars.rxdata[ap])[2*i+1 + (delay*2)]   = (((int16_t *)UE->common_vars.txdata[ap])[(i<<1)+1]) + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0));
-          }
-        }
-        ////////////////////////////////////////////////////////////
-
-        //----------------------------------------------------------
-        //------------------- gNB phy procedures -------------------
-        //----------------------------------------------------------
-        gNB->UL_INFO.rx_ind.number_of_pdus = 0;
-        gNB->UL_INFO.crc_ind.number_crcs = 0;
+	
+	errors_scrambling  = 0;
+	errors_decoding    = 0;
+	
+	  //----------------------------------------------------------
+	  //------------------------ add noise -----------------------
+	  //----------------------------------------------------------
+	if (input_fd == NULL ) {
+	  for (i=0; i<frame_length_complex_samples; i++) {
+	    for (ap=0; ap<frame_parms->nb_antennas_rx; ap++) {
+	      ((short*) gNB->common_vars.rxdata[ap])[(2*i) + (delay*2)]   = (((int16_t *)UE->common_vars.txdata[ap])[(i<<1)])   + (int16_t)(sqrt(sigma/2)*gaussdouble(0.0,1.0)); // convert to fixed point
+	      ((short*) gNB->common_vars.rxdata[ap])[2*i+1 + (delay*2)]   = (((int16_t *)UE->common_vars.txdata[ap])[(i<<1)+1]) + (int16_t)(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,
+	  AssertFatal(frame_parms->subcarrier_spacing==30000,"only 30 kHz for file input for now (%d)\n",frame_parms->subcarrier_spacing);
+	  double factor = 1;
+	  if (openair0_cfg[0].threequarter_fs== 1) factor =.75;
+	  int ta_offset=1600;
+	  if (N_RB_DL <217) ta_offset=800;
+	  else if (N_RB_DL < 106) ta_offset = 400;
+
+	  int slot_offset = frame_parms->get_samples_slot_timestamp(slot,frame_parms,0);// - (int)(800*factor);
+	  int slot_length = slot_offset - frame_parms->get_samples_slot_timestamp(slot-1,frame_parms,0);
+	  fread((void*)&gNB->common_vars.rxdata[0][slot_offset],
+		sizeof(int16_t),
+		slot_length<<1,
+		input_fd);
+	  for (int i=0;i<16;i+=2) printf("slot_offset %d : %d,%d\n",
+					 slot_offset,
+					 ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[i],
+					 ((int16_t*)&gNB->common_vars.rxdata[0][slot_offset])[1+i]);
+	  fclose(input_fd);
+	}
+	////////////////////////////////////////////////////////////
+	
+	//----------------------------------------------------------
+	//------------------- gNB phy procedures -------------------
+	//----------------------------------------------------------
+	gNB->UL_INFO.rx_ind.number_of_pdus = 0;
+	gNB->UL_INFO.crc_ind.number_crcs = 0;
 
         start_meas(&gNB->phy_proc_rx);
         phy_procedures_gNB_common_RX(gNB, frame, slot);
 
-	if (n_trials==1)
-	  LOG_M("rxsigF0.m","rxsF0",gNB->common_vars.rxdataF[0],frame_length_complex_samples_no_prefix,1,1);
+	if (n_trials==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) { 
+	  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",
+		&gNB->pusch_vars[0]->ul_ch_estimates[0][start_symbol*frame_parms->ofdm_symbol_size],frame_parms->ofdm_symbol_size,1,1);
+	  LOG_M("chestF0_ext.m","chF0_ext",
+		&gNB->pusch_vars[0]->ul_ch_estimates_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("rxsigF0_comp.m","rxsF0_comp",
+		&gNB->pusch_vars[0]->rxdataF_comp[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);
+	}
         start_meas(&gNB->phy_proc_rx);
         ////////////////////////////////////////////////////////////
 
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 9903544612357f2fb3a87a1c7f72aa22f5ff64c5..e1c8e6fac0f49bf7fdcd49fca48ef7f245bc76cf 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -262,8 +262,8 @@ typedef struct {
 #define UL_SCH_LCID_CCCH                           0x00
 #define UL_SCH_LCID_SRB1                           0x01
 #define UL_SCH_LCID_SRB2                           0x02
-#define UL_SCH_LCID_SRB3                           0x03
-#define UL_SCH_LCID_DTCH                           0x04
+#define UL_SCH_LCID_DTCH                           0x03
+#define UL_SCH_LCID_SRB3                           0x04
 #define UL_SCH_LCID_CCCH_MSG3                      0x21
 #define UL_SCH_LCID_RECOMMENDED_BITRATE_QUERY      0x35
 #define UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT          0x36
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 4358cdd772fbe3cb1b8b66879a09c63711ada57a..60814529a6184bcc8fb1d945cf1f2ef125cf9d29 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -1452,7 +1452,7 @@ void nr_get_tbs_dl(nfapi_nr_dl_tti_pdsch_pdu *pdsch_pdu,
                        R,
 		       pdsch_rel15->rbSize,
 		       N_sh_symb,
-		       N_PRB_DMRS,
+		       N_PRB_DMRS, // FIXME // This should be multiplied by the number of dmrs symbols
 		       N_PRB_oh,
                        tb_scaling,
 		       pdsch_rel15->nrOfLayers)>>3;
@@ -1742,7 +1742,7 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
       dci_pdu->time_domain_assignment.nbits = (int)ceil(log2(num_entries));
       size += dci_pdu->time_domain_assignment.nbits;
       // VRB to PRB mapping 
-      if (pdsch_config->resourceAllocation == 1) {
+      if ((pdsch_config->resourceAllocation == 1) && (bwp->bwp_Dedicated->pdsch_Config->choice.setup->vrb_ToPRB_Interleaver != NULL)) {
         dci_pdu->vrb_to_prb_mapping.nbits = 1;
         size += dci_pdu->vrb_to_prb_mapping.nbits;
       }
@@ -1791,7 +1791,7 @@ uint16_t nr_dci_size(NR_CellGroupConfig_t *secondaryCellGroup,
       NR_SetupRelease_DMRS_DownlinkConfig_t *typeA = pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA;
       NR_SetupRelease_DMRS_DownlinkConfig_t *typeB = pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeB;
       dci_pdu->antenna_ports.nbits = getAntPortBitWidth(typeA,typeB);
-      size += dci_pdu->antenna_ports.nbits; 
+      size += dci_pdu->antenna_ports.nbits;
       // Tx Config Indication
       long *isTciEnable = bwp->bwp_Dedicated->pdcch_Config->choice.setup->controlResourceSetToAddModList->list.array[bwp_id-1]->tci_PresentInDCI;
       if (isTciEnable != NULL) {
diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
index 2cb9e5971d914195bb87c6ed0dc3be4157f373c4..2e758d51da4cb106d11520d87a547e1b8b3091da 100644
--- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
+++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c
@@ -39,6 +39,7 @@
 #include "PHY/defs_UE.h"
 #include "openair2/LAYER2/RLC/rlc.h"
 #include "openair2/LAYER2/PDCP_v10.1.0/pdcp.h"
+#include "openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h"
 #include "executables/softmodem-common.h"
 
 static NR_UE_MAC_INST_t *nr_ue_mac_inst; 
@@ -59,7 +60,7 @@ NR_UE_MAC_INST_t * nr_l2_init_ue(NR_UE_RRC_INST_t* rrc_inst)
 	  LOG_I(RLC, "Problem at RLC initiation \n");
     	}
     	pdcp_layer_init();
-    	nr_ip_over_LTE_DRB_preconfiguration();
+    	nr_DRB_preconfiguration();
       }
     }
     else LOG_I(MAC,"Running without RRC instance\n");
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 4751fb1237cb3a6c071e8eb68df2387afa9b876c..3cf9c486b1f827a3bb1d9da4b27cb75a6451d65b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -482,7 +482,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
 
   } //is_nr_DL_slot
 
-  if (is_nr_UL_slot(cc->ServingCellConfigCommon,slot_rxP)) { 
+  if (is_nr_UL_slot(cc->ServingCellConfigCommon,slot_rxP)) {
 
     if (get_softmodem_params()->phy_test == 0) {
       schedule_nr_prach(module_idP, (frame_rxP+1)&1023, slot_rxP);
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 7015c0d8ce54bc2c425f1aa2bb5051090104b0f9..8b4275b763510a84f0afa261fe4133785e881125 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -539,8 +539,6 @@ void nr_schedule_uss_dlsch_phytest(module_id_t   module_idP,
                                    NR_sched_pucch *pucch_sched,
                                    nfapi_nr_dl_tti_pdsch_pdu_rel15_t *dlsch_config){
 
-  LOG_I(MAC, "In nr_schedule_uss_dlsch_phytest frame %d slot %d\n",frameP,slotP);
-
   int post_padding = 0, ta_len = 0, header_length_total = 0, sdu_length_total = 0, num_sdus = 0;
   int lcid, offset, i, header_length_last, TBS_bytes;
   int UE_id = 0, CC_id = 0;
@@ -577,9 +575,9 @@ void nr_schedule_uss_dlsch_phytest(module_id_t   module_idP,
   if (TBS_bytes == 0)
    return;
  
-  //The --NOS1 use case currently schedules DLSCH transmissions only when there is IP traffic arriving
-  //through the LTE stack
-  if (IS_SOFTMODEM_NOS1){
+  //Corresponding to noS1 and EPC_MODE_ENABLED use cases where DLSCH transmissions are scheduled only when there is IP traffic
+  //at the upper layers
+  if (IS_SOFTMODEM_NOS1 || get_softmodem_params()->phy_test == 0){
 
     for (lcid = NB_RB_MAX - 1; lcid >= DTCH; lcid--) {
 
@@ -635,7 +633,7 @@ void nr_schedule_uss_dlsch_phytest(module_id_t   module_idP,
       }
     }
 
-  } //if (IS_SOFTMODEM_NOS1)
+  } //if (IS_SOFTMODEM_NOS1 || get_softmodem_params()->phy_test)
   else {
 
     //When the --NOS1 option is not enabled, DLSCH transmissions with random data
@@ -818,11 +816,18 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
   pusch_pdu->pusch_data.rv_index = 0;
   pusch_pdu->pusch_data.harq_process_id = 0;
   pusch_pdu->pusch_data.new_data_indicator = 0;
+
+  uint8_t no_data_in_dmrs = 1; // temp implementation
+  uint8_t num_dmrs_symb = 0;
+
+  for(int dmrs_counter = pusch_pdu->start_symbol_index; dmrs_counter < pusch_pdu->start_symbol_index + pusch_pdu->nr_of_symbols; dmrs_counter++)
+    num_dmrs_symb += ((pusch_pdu->ul_dmrs_symb_pos >> dmrs_counter) & 1);
+
   pusch_pdu->pusch_data.tb_size = nr_compute_tbs(pusch_pdu->qam_mod_order,
 						 pusch_pdu->target_code_rate,
 						 pusch_pdu->rb_size,
 						 pusch_pdu->nr_of_symbols,
-						 6, //nb_re_dmrs - not sure where this is coming from - its not in the FAPI
+						 ( no_data_in_dmrs ? 12 : ((pusch_pdu->dmrs_config_type == pusch_dmrs_type1) ? 6 : 4) ) * num_dmrs_symb,
 						 0, //nb_rb_oh
                                                  0,
 						 pusch_pdu->nrOfLayers)>>3;
diff --git a/openair2/LAYER2/NR_MAC_gNB/main.c b/openair2/LAYER2/NR_MAC_gNB/main.c
index d38a251a2b2f4bafbb00affe1409e39aae168f6e..ea43f1f735b35489fd2bfaae6cda51ccb14eb69a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/main.c
+++ b/openair2/LAYER2/NR_MAC_gNB/main.c
@@ -35,6 +35,7 @@
 #include "assertions.h"
 
 #include "LAYER2/PDCP_v10.1.0/pdcp.h"
+#include "LAYER2/nr_pdcp/nr_pdcp_entity.h"
 #include "RRC/NR/nr_rrc_defs.h"
 #include "common/utils/LOG/log.h"
 //#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
@@ -89,7 +90,7 @@ void mac_top_init_gNB(void)
     pdcp_layer_init();
 
     if(IS_SOFTMODEM_NOS1)
-      nr_ip_over_LTE_DRB_preconfiguration();
+      nr_DRB_preconfiguration();
 
     rrc_init_nr_global_param();
 
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index b0e6143de1e9074cc1bd0162aa35aeba857c341d..03e5dd5d0b9ebdf4678f88f392c1f63c059ea388 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -2361,101 +2361,6 @@ void pdcp_module_cleanup (void)
 {
 }
 
-void nr_ip_over_LTE_DRB_preconfiguration(void){
-
-	  // Addition for the use-case of 4G stack on top of 5G-NR.
-	  // We need to configure pdcp and rlc instances without having an actual
-	  // UE RRC Connection. In order to be able to test the NR PHY with some injected traffic
-	  // on top of the LTE stack.
-	  protocol_ctxt_t ctxt;
-	  LTE_DRB_ToAddModList_t*                DRB_configList=NULL;
-	  DRB_configList = CALLOC(1, sizeof(LTE_DRB_ToAddModList_t));
-	  struct LTE_LogicalChannelConfig        *DRB_lchan_config                                 = NULL;
-	  struct LTE_RLC_Config                  *DRB_rlc_config                   = NULL;
-	  struct LTE_PDCP_Config                 *DRB_pdcp_config                  = NULL;
-	  struct LTE_PDCP_Config__rlc_UM         *PDCP_rlc_UM                      = NULL;
-
-	  struct LTE_DRB_ToAddMod                *DRB_config                       = NULL;
-	  struct LTE_LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters        = NULL;
-	  long  *logicalchannelgroup_drb;
-
-
-	  //Static preconfiguration of DRB
-	  DRB_config = CALLOC(1, sizeof(*DRB_config));
-
-	  DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long));
-	  // allowed value 5..15, value : x+4
-	  *(DRB_config->eps_BearerIdentity) = 1; //ue_context_pP->ue_context.e_rab[i].param.e_rab_id;//+ 4; // especial case generation
-	  //   DRB_config->drb_Identity =  1 + drb_identity_index + e_rab_done;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id;
-	  // 1 + drb_identiy_index;
-	  DRB_config->drb_Identity = 1;
-	  DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long));
-	  *(DRB_config->logicalChannelIdentity) = DRB_config->drb_Identity + 2; //(long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2
-
-	  DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config));
-	  DRB_config->rlc_Config = DRB_rlc_config;
-
-	  DRB_pdcp_config = CALLOC(1, sizeof(*DRB_pdcp_config));
-	  DRB_config->pdcp_Config = DRB_pdcp_config;
-	  DRB_pdcp_config->discardTimer = CALLOC(1, sizeof(long));
-	  *DRB_pdcp_config->discardTimer = LTE_PDCP_Config__discardTimer_infinity;
-	  DRB_pdcp_config->rlc_AM = NULL;
-	  DRB_pdcp_config->rlc_UM = NULL;
-
-	  DRB_rlc_config->present = LTE_RLC_Config_PR_um_Bi_Directional;
-	  DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10;
-	  DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10;
-	  DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = LTE_T_Reordering_ms35;
-	  // PDCP
-	  PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM));
-	  DRB_pdcp_config->rlc_UM = PDCP_rlc_UM;
-	  PDCP_rlc_UM->pdcp_SN_Size = LTE_PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits;
-
-	  DRB_pdcp_config->headerCompression.present = LTE_PDCP_Config__headerCompression_PR_notUsed;
-
-	  DRB_lchan_config = CALLOC(1, sizeof(*DRB_lchan_config));
-	  DRB_config->logicalChannelConfig = DRB_lchan_config;
-	  DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters));
-	  DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters;
-
-	  DRB_ul_SpecificParameters->priority= 4;
-
-	  DRB_ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
-	  //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
-	  DRB_ul_SpecificParameters->bucketSizeDuration =
-	  LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50;
-
-	  logicalchannelgroup_drb = CALLOC(1, sizeof(long));
-	  *logicalchannelgroup_drb = 1;//(i+1) % 3;
-	  DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb;
-
-	  ASN_SEQUENCE_ADD(&DRB_configList->list,DRB_config);
-
-	  if (ENB_NAS_USE_TUN){
-		  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_YES, 0x1234, 0, 0,0);
-	  }
-	  else{
-		  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, 0x1234, 0, 0,0);
-	  }
-
-	  rrc_pdcp_config_asn1_req(&ctxt,
-	               (LTE_SRB_ToAddModList_t *) NULL,
-	               DRB_configList,
-	               (LTE_DRB_ToReleaseList_t *) NULL,
-	               0xff, NULL, NULL, NULL
-	               , (LTE_PMCH_InfoList_r9_t *) NULL,
-	               &DRB_config->drb_Identity);
-
-	rrc_rlc_config_asn1_req(&ctxt,
-	               (LTE_SRB_ToAddModList_t*)NULL,
-	               DRB_configList,
-	               (LTE_DRB_ToReleaseList_t*)NULL
-	//#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
-	               ,(LTE_PMCH_InfoList_r9_t *)NULL
-	               , 0, 0
-	//#endif
-	         );
-}
 //-----------------------------------------------------------------------------
 void pdcp_layer_init(void)
 //-----------------------------------------------------------------------------
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
index 74f09352d6bf70c6459a7794576be13c1d386331..45555ad6af9374dc2a8c5138bc09f10e12311a1a 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_entity.h
@@ -60,4 +60,6 @@ nr_pdcp_entity_t *new_nr_pdcp_entity_drb_am(
                         char *buf, int size, int sdu_id),
     void *deliver_pdu_data);
 
+void nr_DRB_preconfiguration(void);
+
 #endif /* _NR_PDCP_ENTITY_H_ */
diff --git a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
index 44b493b807d89018e1f1fd04277ee4531ab2ef38..2f9a01c8a9dd0e33045d415186442eb8f3666e64 100644
--- a/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+++ b/openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
@@ -20,6 +20,10 @@
  */
 
 #include "nr_pdcp_ue_manager.h"
+#include "NR_RadioBearerConfig.h"
+#include "NR_RLC-BearerConfig.h"
+#include "NR_CellGroupConfig.h"
+#include "openair2/RRC/NR/nr_rrc_proto.h"
 
 /* from OAI */
 #include "pdcp.h"
@@ -77,6 +81,13 @@ typedef struct {
 
 static rlc_data_req_queue q;
 
+extern rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP,
+    const NR_SRB_ToAddModList_t   * const srb2add_listP,
+    const NR_DRB_ToAddModList_t   * const drb2add_listP,
+    const NR_DRB_ToReleaseList_t  * const drb2release_listP,
+    const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP,
+    struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_bearer2add_list);
+
 static void *rlc_data_req_thread(void *_)
 {
   int i;
@@ -170,102 +181,6 @@ static void enqueue_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
 
 #include "LAYER2/MAC/mac_extern.h"
 
-void nr_ip_over_LTE_DRB_preconfiguration(void)
-{
-          // Addition for the use-case of 4G stack on top of 5G-NR.
-          // We need to configure pdcp and rlc instances without having an actual
-          // UE RRC Connection. In order to be able to test the NR PHY with some injected traffic
-          // on top of the LTE stack.
-          protocol_ctxt_t ctxt;
-          LTE_DRB_ToAddModList_t*                DRB_configList=NULL;
-          DRB_configList = CALLOC(1, sizeof(LTE_DRB_ToAddModList_t));
-          struct LTE_LogicalChannelConfig        *DRB_lchan_config                                 = NULL;
-          struct LTE_RLC_Config                  *DRB_rlc_config                   = NULL;
-          struct LTE_PDCP_Config                 *DRB_pdcp_config                  = NULL;
-          struct LTE_PDCP_Config__rlc_UM         *PDCP_rlc_UM                      = NULL;
-
-          struct LTE_DRB_ToAddMod                *DRB_config                       = NULL;
-          struct LTE_LogicalChannelConfig__ul_SpecificParameters *DRB_ul_SpecificParameters        = NULL;
-          long  *logicalchannelgroup_drb;
-
-
-          //Static preconfiguration of DRB
-          DRB_config = CALLOC(1, sizeof(*DRB_config));
-
-          DRB_config->eps_BearerIdentity = CALLOC(1, sizeof(long));
-          // allowed value 5..15, value : x+4
-          *(DRB_config->eps_BearerIdentity) = 1; //ue_context_pP->ue_context.e_rab[i].param.e_rab_id;//+ 4; // especial case generation
-          //   DRB_config->drb_Identity =  1 + drb_identity_index + e_rab_done;// + i ;// (DRB_Identity_t) ue_context_pP->ue_context.e_rab[i].param.e_rab_id;
-          // 1 + drb_identiy_index;
-          DRB_config->drb_Identity = 1;
-          DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long));
-          *(DRB_config->logicalChannelIdentity) = DRB_config->drb_Identity + 2; //(long) (ue_context_pP->ue_context.e_rab[i].param.e_rab_id + 2); // value : x+2
-
-          DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config));
-          DRB_config->rlc_Config = DRB_rlc_config;
-
-          DRB_pdcp_config = CALLOC(1, sizeof(*DRB_pdcp_config));
-          DRB_config->pdcp_Config = DRB_pdcp_config;
-          DRB_pdcp_config->discardTimer = CALLOC(1, sizeof(long));
-          *DRB_pdcp_config->discardTimer = LTE_PDCP_Config__discardTimer_infinity;
-          DRB_pdcp_config->rlc_AM = NULL;
-          DRB_pdcp_config->rlc_UM = NULL;
-
-          DRB_rlc_config->present = LTE_RLC_Config_PR_um_Bi_Directional;
-          DRB_rlc_config->choice.um_Bi_Directional.ul_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10;
-          DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.sn_FieldLength = LTE_SN_FieldLength_size10;
-          DRB_rlc_config->choice.um_Bi_Directional.dl_UM_RLC.t_Reordering = LTE_T_Reordering_ms35;
-          // PDCP
-          PDCP_rlc_UM = CALLOC(1, sizeof(*PDCP_rlc_UM));
-          DRB_pdcp_config->rlc_UM = PDCP_rlc_UM;
-          PDCP_rlc_UM->pdcp_SN_Size = LTE_PDCP_Config__rlc_UM__pdcp_SN_Size_len12bits;
-
-          DRB_pdcp_config->headerCompression.present = LTE_PDCP_Config__headerCompression_PR_notUsed;
-
-          DRB_lchan_config = CALLOC(1, sizeof(*DRB_lchan_config));
-          DRB_config->logicalChannelConfig = DRB_lchan_config;
-          DRB_ul_SpecificParameters = CALLOC(1, sizeof(*DRB_ul_SpecificParameters));
-          DRB_lchan_config->ul_SpecificParameters = DRB_ul_SpecificParameters;
-
-          DRB_ul_SpecificParameters->priority= 4;
-
-          DRB_ul_SpecificParameters->prioritisedBitRate = LTE_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_kBps8;
-          //LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
-          DRB_ul_SpecificParameters->bucketSizeDuration =
-          LTE_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50;
-
-          logicalchannelgroup_drb = CALLOC(1, sizeof(long));
-          *logicalchannelgroup_drb = 1;//(i+1) % 3;
-          DRB_ul_SpecificParameters->logicalChannelGroup = logicalchannelgroup_drb;
-
-          ASN_SEQUENCE_ADD(&DRB_configList->list,DRB_config);
-
-          if (ENB_NAS_USE_TUN){
-                  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_YES, 0x1234, 0, 0,0);
-          }
-          else{
-                  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, 0x1234, 0, 0,0);
-          }
-
-          rrc_pdcp_config_asn1_req(&ctxt,
-                       (LTE_SRB_ToAddModList_t *) NULL,
-                       DRB_configList,
-                       (LTE_DRB_ToReleaseList_t *) NULL,
-                       0xff, NULL, NULL, NULL
-                       , (LTE_PMCH_InfoList_r9_t *) NULL,
-                       &DRB_config->drb_Identity);
-
-        rrc_rlc_config_asn1_req(&ctxt,
-                       (LTE_SRB_ToAddModList_t*)NULL,
-                       DRB_configList,
-                       (LTE_DRB_ToReleaseList_t*)NULL
-        //#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
-                       ,(LTE_PMCH_InfoList_r9_t *)NULL
-                       , 0, 0
-        //#endif
-                 );
-}
-
 static void reblock_tun_socket(void)
 {
   extern int nas_sock_fd[];
@@ -626,7 +541,7 @@ void pdcp_run(const protocol_ctxt_t *const  ctxt_pP)
   }
 }
 
-static void add_srb(int rnti, struct LTE_SRB_ToAddMod *s)
+static void add_srb(int rnti, struct NR_SRB_ToAddMod *s)
 {
   TODO;
 }
@@ -740,6 +655,7 @@ boolean_t nr_rrc_pdcp_config_asn1_req(
   return 0;
 }
 
+/* Dummy function due to dependency from LTE libraries */
 boolean_t rrc_pdcp_config_asn1_req(
   const protocol_ctxt_t *const  ctxt_pP,
   LTE_SRB_ToAddModList_t  *const srb2add_list,
@@ -754,48 +670,143 @@ boolean_t rrc_pdcp_config_asn1_req(
 #endif
   ,rb_id_t                 *const defaultDRB)
 {
-  int rnti = ctxt_pP->rnti;
-  int i;
-
-  if (//ctxt_pP->enb_flag != 1 ||
-      ctxt_pP->module_id != 0 ||
-      ctxt_pP->instance != 0 ||
-      ctxt_pP->eNB_index != 0 ||
-      //ctxt_pP->configured != 2 ||
-      //srb2add_list == NULL ||
-      //drb2add_list != NULL ||
-      drb2release_list != NULL ||
-      security_modeP != 255 ||
-      //kRRCenc != NULL ||
-      //kRRCint != NULL ||
-      //kUPenc != NULL ||
-      pmch_InfoList_r9 != NULL /*||
-      defaultDRB != NULL */) {
-    TODO;
-  }
+  return 0;
+}
 
-  if (srb2add_list != NULL) {
-    for (i = 0; i < srb2add_list->list.count; i++) {
-      add_srb(rnti, srb2add_list->list.array[i]);
-    }
-  }
+void nr_DRB_preconfiguration(void)
+{
 
-  if (drb2add_list != NULL) {
-    for (i = 0; i < drb2add_list->list.count; i++) {
-      add_drb(rnti, drb2add_list->list.array[i], NULL);
-    }
+  NR_RadioBearerConfig_t             *rbconfig = NULL;
+  struct NR_CellGroupConfig__rlc_BearerToAddModList *Rlc_Bearer_ToAdd_list = NULL;
+  protocol_ctxt_t ctxt;
+  //fill_default_rbconfig(rb_config, 5, 1);
+  rbconfig = calloc(1, sizeof(*rbconfig));
+
+  rbconfig->srb_ToAddModList = NULL;
+  rbconfig->srb3_ToRelease = NULL;
+  rbconfig->drb_ToAddModList = calloc(1,sizeof(*rbconfig->drb_ToAddModList));
+  NR_DRB_ToAddMod_t *drb_ToAddMod = calloc(1,sizeof(*drb_ToAddMod));
+  drb_ToAddMod->cnAssociation = calloc(1,sizeof(*drb_ToAddMod->cnAssociation));
+  drb_ToAddMod->cnAssociation->present = NR_DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity;
+  drb_ToAddMod->cnAssociation->choice.eps_BearerIdentity= 5;
+  drb_ToAddMod->drb_Identity = 1;
+  drb_ToAddMod->reestablishPDCP = NULL;
+  drb_ToAddMod->recoverPDCP = NULL;
+  drb_ToAddMod->pdcp_Config = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config));
+  drb_ToAddMod->pdcp_Config->drb = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb));
+  drb_ToAddMod->pdcp_Config->drb->discardTimer = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->discardTimer));
+  *drb_ToAddMod->pdcp_Config->drb->discardTimer=NR_PDCP_Config__drb__discardTimer_ms30;
+  drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL));
+  *drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeUL = NR_PDCP_Config__drb__pdcp_SN_SizeUL_len12bits;
+  drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL));
+  *drb_ToAddMod->pdcp_Config->drb->pdcp_SN_SizeDL = NR_PDCP_Config__drb__pdcp_SN_SizeDL_len12bits;
+  drb_ToAddMod->pdcp_Config->drb->headerCompression.present = NR_PDCP_Config__drb__headerCompression_PR_notUsed;
+  drb_ToAddMod->pdcp_Config->drb->headerCompression.choice.notUsed = 0;
+
+  drb_ToAddMod->pdcp_Config->drb->integrityProtection=NULL;
+  drb_ToAddMod->pdcp_Config->drb->statusReportRequired=NULL;
+  drb_ToAddMod->pdcp_Config->drb->outOfOrderDelivery=NULL;
+  drb_ToAddMod->pdcp_Config->moreThanOneRLC = NULL;
+
+  drb_ToAddMod->pdcp_Config->t_Reordering = calloc(1,sizeof(*drb_ToAddMod->pdcp_Config->t_Reordering));
+  *drb_ToAddMod->pdcp_Config->t_Reordering = NR_PDCP_Config__t_Reordering_ms0;
+  drb_ToAddMod->pdcp_Config->ext1 = NULL;
+
+  ASN_SEQUENCE_ADD(&rbconfig->drb_ToAddModList->list,drb_ToAddMod);
+
+  rbconfig->drb_ToReleaseList = NULL;
+
+  rbconfig->securityConfig = calloc(1,sizeof(*rbconfig->securityConfig));
+  rbconfig->securityConfig->securityAlgorithmConfig = calloc(1,sizeof(*rbconfig->securityConfig->securityAlgorithmConfig));
+  rbconfig->securityConfig->securityAlgorithmConfig->cipheringAlgorithm = NR_CipheringAlgorithm_nea0;
+  rbconfig->securityConfig->securityAlgorithmConfig->integrityProtAlgorithm=NULL;
+  rbconfig->securityConfig->keyToUse = calloc(1,sizeof(*rbconfig->securityConfig->keyToUse));
+  *rbconfig->securityConfig->keyToUse = NR_SecurityConfig__keyToUse_master;
+
+  xer_fprint(stdout, &asn_DEF_NR_RadioBearerConfig, (const void*)rbconfig);
+
+
+  NR_RLC_BearerConfig_t *RLC_BearerConfig = calloc(1,sizeof(*RLC_BearerConfig));
+
+  RLC_BearerConfig->logicalChannelIdentity = 3;
+  RLC_BearerConfig->servedRadioBearer = calloc(1,sizeof(*RLC_BearerConfig->servedRadioBearer));
+  RLC_BearerConfig->servedRadioBearer->present =    NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity;
+
+  RLC_BearerConfig->servedRadioBearer->choice.drb_Identity=1;
+  RLC_BearerConfig->reestablishRLC=calloc(1,sizeof(*RLC_BearerConfig->reestablishRLC));
+  *RLC_BearerConfig->reestablishRLC=NR_RLC_BearerConfig__reestablishRLC_true;
+  RLC_BearerConfig->rlc_Config=calloc(1,sizeof(*RLC_BearerConfig->rlc_Config));
+
+  // RLC UM Bi-directional Bearer configuration
+  RLC_BearerConfig->rlc_Config->present = NR_RLC_Config_PR_um_Bi_Directional;
+  RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional));
+  RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength));
+  *RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->ul_UM_RLC.sn_FieldLength   =    NR_SN_FieldLengthUM_size12;
+
+  RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength));
+  *RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.sn_FieldLength   =    NR_SN_FieldLengthUM_size12;
+  RLC_BearerConfig->rlc_Config->choice.um_Bi_Directional->dl_UM_RLC.t_Reassembly = NR_T_Reassembly_ms15;
+
+  // RLC AM Bearer configuration
+  /*RLC_BearerConfig->rlc_Config->present = NR_RLC_Config_PR_am;
+  RLC_BearerConfig->rlc_Config->choice.am = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.am));
+  RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength));
+  *RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.sn_FieldLength   =    NR_SN_FieldLengthAM_size18;
+  RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.t_PollRetransmit = NR_T_PollRetransmit_ms45;
+  RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.pollPDU          = NR_PollPDU_p64;
+  RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.pollByte         = NR_PollByte_kB500;
+  RLC_BearerConfig->rlc_Config->choice.am->ul_AM_RLC.maxRetxThreshold = NR_UL_AM_RLC__maxRetxThreshold_t32;
+
+  RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = calloc(1,sizeof(*RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength));
+  *RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.sn_FieldLength = NR_SN_FieldLengthAM_size18;
+  RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.t_Reassembly   = NR_T_Reassembly_ms15;
+  RLC_BearerConfig->rlc_Config->choice.am->dl_AM_RLC.t_StatusProhibit = NR_T_StatusProhibit_ms15;*/
+
+  RLC_BearerConfig->mac_LogicalChannelConfig = calloc(1,sizeof(*RLC_BearerConfig->mac_LogicalChannelConfig));
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters = calloc(1,sizeof(*RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters));
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->priority            = 1;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->prioritisedBitRate  = NR_LogicalChannelConfig__ul_SpecificParameters__prioritisedBitRate_infinity;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->bucketSizeDuration  = NR_LogicalChannelConfig__ul_SpecificParameters__bucketSizeDuration_ms50;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->allowedServingCells = NULL;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->allowedSCS_List     = NULL;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->maxPUSCH_Duration   = NULL;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULL;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelGroup   = calloc(1,sizeof(*RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelGroup));
+  *RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelGroup  = 1;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->schedulingRequestID   = NULL;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
+  RLC_BearerConfig->mac_LogicalChannelConfig->ul_SpecificParameters->bitRateQueryProhibitTimer   = NULL;
+
+  Rlc_Bearer_ToAdd_list = calloc(1,sizeof(*Rlc_Bearer_ToAdd_list));
+  ASN_SEQUENCE_ADD(&Rlc_Bearer_ToAdd_list->list, RLC_BearerConfig);
+
+  if (ENB_NAS_USE_TUN){
+    PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_YES, 0x1234, 0, 0,0);
   }
-
-  /* update security */
-  if (kRRCint != NULL) {
-    /* todo */
+  else{
+    PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, 0x1234, 0, 0,0);
   }
 
-  free(kRRCenc);
-  free(kRRCint);
-  free(kUPenc);
-
-  return 0;
+  nr_rrc_pdcp_config_asn1_req(
+    &ctxt,
+    (NR_SRB_ToAddModList_t *) NULL,
+    rbconfig->drb_ToAddModList ,
+    rbconfig->drb_ToReleaseList,
+    0xff,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    Rlc_Bearer_ToAdd_list);
+
+  nr_rrc_rlc_config_asn1_req (&ctxt,
+      (NR_SRB_ToAddModList_t *) NULL,
+      rbconfig->drb_ToAddModList,
+      rbconfig->drb_ToReleaseList,
+      (LTE_PMCH_InfoList_r9_t *) NULL,
+      Rlc_Bearer_ToAdd_list);
 }
 
 uint64_t get_pdcp_optmask(void)
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 6564fc897b9c3150e8a5381f65380fb429fa3b1d..b5e2c72fa1e86cc6893f93a0fca063b76718dcc3 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -821,7 +821,7 @@ __attribute__ ((unused)) static void add_drb(int rnti, struct NR_DRB_ToAddMod *s
   }
 }
 
-//#if 0
+/* Dummy function due to dependency from LTE libraries */
 rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP,
     const LTE_SRB_ToAddModList_t   * const srb2add_listP,
     const LTE_DRB_ToAddModList_t   * const drb2add_listP,
@@ -830,46 +830,11 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP
     const uint32_t sourceL2Id,
     const uint32_t destinationL2Id)
 {
-  int rnti = ctxt_pP->rnti;
-  int i;
-
-  if (/*ctxt_pP->enb_flag != 1 ||*/ ctxt_pP->module_id != 0 /*||
-      ctxt_pP->instance != 0 || ctxt_pP->eNB_index != 0 ||
-      ctxt_pP->configured != 1 || ctxt_pP->brOption != 0 */) {
-    LOG_E(RLC, "%s: ctxt_pP not handled (%d %d %d %d %d %d)\n", __FUNCTION__,
-          ctxt_pP->enb_flag , ctxt_pP->module_id, ctxt_pP->instance,
-          ctxt_pP->eNB_index, ctxt_pP->configured, ctxt_pP->brOption);
-    exit(1);
-  }
-
-  if (pmch_InfoList_r9_pP != NULL) {
-    LOG_E(RLC, "%s: pmch_InfoList_r9_pP not handled\n", __FUNCTION__);
-    exit(1);
-  }
-
-  if (drb2release_listP != NULL) {
-    LOG_E(RLC, "%s:%d:%s: TODO\n", __FILE__, __LINE__, __FUNCTION__);
-    exit(1);
-  }
-
-  if (srb2add_listP != NULL) {
-    for (i = 0; i < srb2add_listP->list.count; i++) {
-      add_srb(rnti, srb2add_listP->list.array[i]);
-    }
-  }
-
-  if (drb2add_listP != NULL) {
-    for (i = 0; i < drb2add_listP->list.count; i++) {
-      add_drb(rnti, drb2add_listP->list.array[i], NULL);
-    }
-  }
-
-  return RLC_OP_STATUS_OK;
+  return 0;
 }
-//#endif
 
 rlc_op_status_t nr_rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP,
-    const NR_SRB_ToAddModList_t   * const srb2add_listP,
+    const LTE_SRB_ToAddModList_t   * const srb2add_listP,
     const NR_DRB_ToAddModList_t   * const drb2add_listP,
     const NR_DRB_ToReleaseList_t  * const drb2release_listP,
     const LTE_PMCH_InfoList_r9_t * const pmch_InfoList_r9_pP,
diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
index 174e07cc330fd286908ab505eb9c461f2c14e178..f347a3358199e6ace98df39ef1a11e730319491b 100644
--- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c
@@ -76,76 +76,11 @@ void handle_nr_rach(NR_UL_IND_t *UL_info) {
 }
 
 
-void handle_nr_sr(NR_UL_IND_t *UL_info) {
-
-
- /* if (nfapi_mode == 1)  // PNF
-  {
-    if (UL_info->sr_ind.sr_indication_body.number_of_srs>0)
-    {
-      //      oai_nfapi_sr_indication(&UL_info->sr_ind);
-    }
-  }
-  else
-  {
-
-    
-    for (int i=0;i<UL_info->sr_ind.sr_indication_body.number_of_srs;i++)
-      SR_indication(UL_info->module_id,
-          UL_info->CC_id,
-          UL_info->frame,
-          UL_info->slot,
-          UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].rx_ue_information.rnti,
-          UL_info->sr_ind.sr_indication_body.sr_pdu_list[i].ul_cqi_information.ul_cqi);
-
-
-
-  }
-
-  UL_info->sr_ind.sr_indication_body.number_of_srs=0;*/
+void handle_nr_uci(NR_UL_IND_t *UL_info) {
+  // TODO
+  UL_info->uci_ind.num_ucis = 0;
 }
 
-void handle_nr_cqi(NR_UL_IND_t *UL_info) {
-
-    /*
-    for (int i=0;i<UL_info->cqi_ind.number_of_cqis;i++) 
-      cqi_indication(UL_info->module_id,
-          UL_info->CC_id,
-          UL_info->frame,
-          UL_info->slot,
-          UL_info->cqi_ind.cqi_pdu_list[i].rx_ue_information.rnti,
-          &UL_info->cqi_ind.cqi_pdu_list[i].cqi_indication_rel9,
-          UL_info->cqi_ind.cqi_raw_pdu_list[i].pdu,
-          &UL_info->cqi_ind.cqi_pdu_list[i].ul_cqi_information);
-    
-    UL_info->cqi_ind.number_of_cqis=0;*/
-
-}
-
-void handle_nr_harq(NR_UL_IND_t *UL_info) {
- /*  if (nfapi_mode == 1 && UL_info->harq_ind.harq_indication_body.number_of_harqs>0) { // PNF
-    //LOG_D(PHY, "UL_info->harq_ind.harq_indication_body.number_of_harqs:%d Send to VNF\n", UL_info->harq_ind.harq_indication_body.number_of_harqs);
-       int retval = oai_nfapi_harq_indication(&UL_info->harq_ind);
-
-    if (retval!=0) {
-      LOG_E(PHY, "Failed to encode NFAPI HARQ_IND retval:%d\n", retval);
-    }
-    
-    UL_info->harq_ind.harq_indication_body.number_of_harqs = 0;
-  }
-  else
-  {
-    
-    for (int i=0;i<UL_info->harq_ind.harq_indication_body.number_of_harqs;i++)
-      harq_indication(UL_info->module_id,
-          UL_info->CC_id,
-          NFAPI_SFNSF2SFN(UL_info->harq_ind.sfn_sf),
-          NFAPI_SFNSF2SF(UL_info->harq_ind.sfn_sf),
-          &UL_info->harq_ind.harq_indication_body.harq_pdu_list[i]);
-    
-    UL_info->harq_ind.harq_indication_body.number_of_harqs=0;
-  }*/
-}
 
 void handle_nr_ulsch(NR_UL_IND_t *UL_info) {
   if(nfapi_mode == 1) {
@@ -245,9 +180,7 @@ void NR_UL_indication(NR_UL_IND_t *UL_info) {
   // clear DL/UL info for new scheduling round
   clear_nr_nfapi_information(mac,CC_id,UL_info->frame,UL_info->slot);
   handle_nr_rach(UL_info);
-  handle_nr_sr(UL_info);
-  handle_nr_cqi(UL_info);
-  handle_nr_harq(UL_info);
+  handle_nr_uci(UL_info);
   // clear HI prior to handling ULSCH
   mac->UL_dci_req[CC_id].numPdus = 0;
   handle_nr_ulsch(UL_info);