diff --git a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h
index 5cd58ea5b614ac6cdf187e72f93050b06995e746..52a9c41ae95c8b113ffa58677f1f7810bbc323b9 100644
--- a/openair1/PHY/NR_REFSIG/ss_pbch_nr.h
+++ b/openair1/PHY/NR_REFSIG/ss_pbch_nr.h
@@ -51,10 +51,16 @@
 #define  PSS_SC_START_NR              (52)     /* see from TS 38.211 table 7.4.3.1-1: Resources within an SS/PBCH block for PSS... */
 
 /* define ofdm symbol offset in the SS/PBCH block of NR synchronisation */
-#define  PSS_SYMBOL_NB                (4)     /* symbol numbers for each element */
-#define  PBCH_SYMBOL_NB               (5)
-#define  SSS_SYMBOL_NB                (6)
-#define  PBCH_LAST_SYMBOL_NB          (7)
+#ifdef NR_UNIT_TEST
+#define OFFSET_SS_PBCH                (0)
+#else
+#define OFFSET_SS_PBCH                (4)
+#endif
+
+#define  PSS_SYMBOL_NB                ((0) + OFFSET_SS_PBCH)   /* symbol numbers for each element */
+#define  PBCH_SYMBOL_NB               ((1) + OFFSET_SS_PBCH)
+#define  SSS_SYMBOL_NB                ((2) + OFFSET_SS_PBCH)
+#define  PBCH_LAST_SYMBOL_NB          ((3) + OFFSET_SS_PBCH)
 
 /* SS/PBCH parameters */
 #define  N_RB_SS_PBCH_BLOCK           (20)
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
index 7cbd022f1f9814733be0e938d9fe677e4a54152c..32f906c1d9424a68d031449848fc06a1b9dbc31c 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
@@ -369,7 +369,7 @@ void init_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue)
      assert(0);
     }
 
-    size = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms_ue->samples_per_subframe;
+    size = NR_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int)*frame_parms_ue->samples_per_subframe;
     q = malloc16(size);
     if (q != NULL) {
       pss_corr_ue[i] = q;
@@ -578,7 +578,7 @@ void restore_frame_context_pss_nr(NR_DL_FRAME_PARMS *frame_parms_ue, int rate_ch
 void decimation_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int rate_change, int **rxdata)
 {
   NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
-  int samples_for_frame = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti;
+  int samples_for_frame = NR_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti;
 
 #if TEST_SYNCHRO_TIMING_PSS
 
@@ -631,7 +631,7 @@ int pss_synchro_nr(PHY_VARS_NR_UE *PHY_vars_UE, int rate_change)
 
 #ifdef DBG_PSS_NR
 
-  int samples_for_frame = frame_parms->samples_per_subframe*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME;
+  int samples_for_frame = frame_parms->samples_per_subframe*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
 
   write_output("rxdata0_rand.m","rxd0_rand", &PHY_vars_UE->common_vars.rxdata[0][0], samples_for_frame, 1, 1);
 
@@ -772,7 +772,7 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
   int result;
   int synchro_out;
   unsigned int tmp[NUMBER_PSS_SEQUENCE];
-  unsigned int length = (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->ttis_per_subframe*frame_parms->samples_per_tti);  /* 1 frame for now, it should be 2 TODO_NR */
+  unsigned int length = (NR_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->ttis_per_subframe*frame_parms->samples_per_tti);  /* 1 frame for now, it should be 2 TODO_NR */
 
   for (int i = 0; i < NUMBER_PSS_SEQUENCE; i++) {
 	  tmp[i] = 0;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
index 5d2142e2bc4af7ec483268a0331916beaa404bce..03d303a123f453c532e8fe5567321fe2dc54a18f 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pucch_nr.c
@@ -643,11 +643,11 @@ void nr_generate_pucch1(int32_t **txdataF,
   // the value of u,v (delta always 0 for PUCCH) has to be calculated according to TS 38.211 Subclause 6.3.2.2.1
   uint8_t u=0,v=0,delta=0;
   // depending on the value of the PUCCH_GroupHopping, we will obtain different values for u,v
-  uint8_t PUCCH_GroupHopping; // from higher layers FIXME!!
+  uint8_t PUCCH_GroupHopping=0; // from higher layers FIXME!!
   // n_id is hoppingId from PUCCH-ConfigCommon:
   // Cell-Specific scrambling ID for group hoppping and sequence hopping if enabled
   // Corresponds to L1 parameter 'HoppingID' (see 38.211, section 6.3.2.2) BIT STRING (SIZE (10))
-  uint32_t n_id; // from higher layers FIXME!!
+  uint32_t n_id=0; // from higher layers FIXME!!
   // if frequency hopping is disabled, intraSlotFrequencyHopping is not provided
   //              n_hop = 0
   // if frequency hopping is enabled,  intraSlotFrequencyHopping is     provided
@@ -671,6 +671,10 @@ void nr_generate_pucch1(int32_t **txdataF,
 
   // y_n contains the complex value d multiplied by the sequence r_u_v
   int16_t y_n_re[12],y_n_im[12];
+  #ifdef DEBUG_NR_PUCCH_TX
+    printf("\t [nr_generate_pucch1] entering function nr_group_sequence_hopping with PUCCH_GroupHopping=%d,n_id=%d, n_hop=%d, nr_tti_tx=%d\n",
+            PUCCH_GroupHopping,n_id,n_hop,nr_tti_tx);
+  #endif
   nr_group_sequence_hopping(PUCCH_GroupHopping,n_id,n_hop,nr_tti_tx,&u,&v); // calculating u and v value
   alpha = nr_cyclic_shift_hopping(n_id,m0,mcs,lnormal,lprime,nr_tti_tx);
   for (int n=0; n<12; n++){
diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h
index 8e2c2e8b7894898193ea2bd4f4022c7430a714a3..b2be888e18c9ba4e40b4270c4d4534871dcbfe83 100644
--- a/openair1/PHY/impl_defs_nr.h
+++ b/openair1/PHY/impl_defs_nr.h
@@ -120,6 +120,9 @@ SystemInformationBlockType1_nr_t;
 #define NR_TDD_UPLINK_SLOT                 (0x3FFF) /* uplink bitmap for each symbol, there are 14 symbols per slots */
 #define NR_TDD_SET_ALL_SYMBOLS             (0x3FFF)
 
+#define NR_DOWNLINK_SLOT                   (0x01)
+#define NR_UPLINK_SLOT                     (0x02)
+
 #define FRAME_DURATION_MICRO_SEC           (10000)  /* frame duration in microsecond */
 
 typedef enum {
diff --git a/openair1/SCHED_NR_UE/phy_frame_config_nr.c b/openair1/SCHED_NR_UE/phy_frame_config_nr.c
index 8515c4da46f450cb6c5902e22ee22fa3442feed6..b2eeef6e2614c0c33d4fd3d94df4923810c82ff3 100644
--- a/openair1/SCHED_NR_UE/phy_frame_config_nr.c
+++ b/openair1/SCHED_NR_UE/phy_frame_config_nr.c
@@ -250,26 +250,26 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms)
 *
 *********************************************************************/
 
-nr_slot_t slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_tti)
+int slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_tti)
 {
   /* for FFD all slot can be considered as an uplink */
   if (frame_parms->frame_type == FDD) {
-    return (NR_TDD_UPLINK_SLOT);
+    return (NR_UPLINK_SLOT | NR_DOWNLINK_SLOT );
   }
 
   if (nr_frame%2 == 0) {
     if (frame_parms->tdd_uplink_nr[nr_tti] == NR_TDD_UPLINK_SLOT) {
-      return (NR_TDD_UPLINK_SLOT);
+      return (NR_UPLINK_SLOT);
     }
     else {
-      return (NR_TDD_DOWNLINK_SLOT);
+      return (NR_DOWNLINK_SLOT);
     }
   }
   else if ((frame_parms->tdd_uplink_nr[(frame_parms->ttis_per_subframe * LTE_NUMBER_OF_SUBFRAMES_PER_FRAME) + nr_tti] == NR_TDD_UPLINK_SLOT)) {
-    return (NR_TDD_UPLINK_SLOT);
+    return (NR_UPLINK_SLOT);
   }
   else {
-    return (NR_TDD_DOWNLINK_SLOT);
+    return (NR_DOWNLINK_SLOT);
   }
 }
 
diff --git a/openair1/SCHED_NR_UE/phy_frame_config_nr.h b/openair1/SCHED_NR_UE/phy_frame_config_nr.h
index a4c268f9709c6150a7abfab4b682eea5b65c183f..429dff221b1fd7ff2020eb531bb5d1f12433716e 100644
--- a/openair1/SCHED_NR_UE/phy_frame_config_nr.h
+++ b/openair1/SCHED_NR_UE/phy_frame_config_nr.h
@@ -76,7 +76,7 @@ int set_tdd_configuration_dedicated_nr(NR_DL_FRAME_PARMS *frame_parms);
  *  @param nr_tti   : slot number
     @returns nr_slot_t : downlink or uplink */
 
-nr_slot_t slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_tti);
+int slot_select_nr(NR_DL_FRAME_PARMS *frame_parms, int nr_frame, int nr_tti);
 
 /** \brief This function frees tdd configuration for nr
  *  @param frame_parms NR DL Frame parameters
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 751ccddf06277344130ddba7ab6ee968ca24c1f6..ca72fd15dc2cc7619b60cb59bca81d4509371bda 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -3090,6 +3090,23 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *pro
 
 #endif //(0)
 
+unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb)
+{
+
+  int gain_dB = power_dBm - power_max_dBm;
+  double gain_lin;
+
+  gain_lin = pow(10,.1*gain_dB);
+  if ((nb_rb >0) && (nb_rb <= N_RB_UL)) {
+    return((int)(AMP*sqrt(gain_lin*N_RB_UL/(double)nb_rb)));
+  }
+  else {
+    LOG_E(PHY,"Illegal nb_rb/N_RB_UL combination (%d/%d)\n",nb_rb,N_RB_UL);
+    //mac_xface->macphy_exit("");
+  }
+  return(0);
+}
+
 #ifdef NR_PDCCH_SCHED
 
 int nr_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t abstraction_flag)
diff --git a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
index ff0cefa0d263f4629d86d8de71f742705c6f99bd..b64c3ab114e25a5b2bdd99b3510153e9dac25caf 100644
--- a/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
+++ b/openair1/SCHED_NR_UE/pucch_uci_ue_nr.c
@@ -385,7 +385,7 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
     }
 
     /* TS 38.212 6.3.1.2  Code block segmentation and CRC attachment */
-    /* crc attachment can be done depending of paylaod size */
+    /* crc attachment can be done depending of payload size */
     if (N_UCI < 11) {
       O_CRC = 0;  /* no additional crc bits */
     }
@@ -468,8 +468,8 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
   NR_TST_PHY_PRINTF("PUCCH ( AbsSubframe : %d.%d ) ( total payload size %d data 0x%02x ) ( ack length %d data 0x%02x ) ( sr length %d value %d ) ( csi length %d data : 0x%02x ) \n",
                          frame_tx%1024, nr_tti_tx, N_UCI,  pucch_payload, O_ACK, pucch_ack_payload, O_SR, sr_payload, csi_status, csi_payload);
 
-  NR_TST_PHY_PRINTF("PUCCH ( format : %d ) ( modulation : %s ) ( nb prb : %d ) ( nb symbols : %d ) ( max code rate*100 : %d ) ( starting_symbol_index : %d ) \n",
-                        format, (Q_m == BITS_PER_SYMBOL_QPSK ? " QPSK " : " BPSK "), nb_of_prbs, nb_symbols, max_code_rate, starting_symbol_index);
+  NR_TST_PHY_PRINTF("PUCCH ( format : %d ) ( modulation : %s ) ( nb prb : %d ) ( nb symbols total: %d ) ( nb symbols : %d ) ( max code rate*100 : %d ) ( starting_symbol_index : %d ) \n",
+                        format, (Q_m == BITS_PER_SYMBOL_QPSK ? " QPSK " : " BPSK "), nb_of_prbs, nb_symbols_total, nb_symbols, max_code_rate, starting_symbol_index);
 
   NR_TST_PHY_PRINTF("PUCCH ( starting_prb : %d ) ( second_hop : %d ) ( m_0 : %d ) ( m_CS : %d ) ( time_domain_occ %d ) (occ_length : %d ) ( occ_Index : %d ) \n",
                          starting_prb,         second_hop,         m_0,         m_CS,         time_domain_occ,      occ_length,         occ_Index);
@@ -482,7 +482,21 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
                                                   nb_of_prbs, N_sc_ctrl_RB, nb_symbols, N_UCI, O_SR, O_CSI, O_ACK,
                                                   O_CRC, n_HARQ_ACK);
 
+  /* set tx power */
+  ue->tx_power_dBm[nr_tti_tx] = pucch_tx_power;
+  ue->tx_total_RE[nr_tti_tx] = nb_of_prbs*N_SC_RB;
 
+  int tx_amp;
+
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
+
+  tx_amp = get_tx_amp(pucch_tx_power,
+                      ue->tx_power_max_dBm,
+                      ue->frame_parms.N_RB_UL,
+					  nb_of_prbs);
+#else
+  tx_amp = AMP;
+#endif
 
   switch(format) {
     case pucch_format0_nr:
@@ -490,10 +504,10 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
       nr_generate_pucch0(ue->common_vars.txdataF,
                          &ue->frame_parms,
                          &ue->pucch_config_dedicated_nr[gNB_id],
-                         pucch_tx_power,
+						 tx_amp,
                          nr_tti_tx,
                          (uint8_t)m_CS,
-                         nb_symbols,
+						 nb_symbols_total,
                          starting_symbol_index,
                          starting_prb);
       break;
@@ -504,9 +518,9 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
                          &ue->frame_parms,
                          &ue->pucch_config_dedicated_nr[gNB_id],
                          pucch_payload,
-                         pucch_tx_power,
+						 tx_amp,
                          nr_tti_tx,
-                         nb_symbols,
+						 nb_symbols_total,
                          starting_symbol_index,
                          starting_prb,
                          second_hop,
@@ -520,9 +534,9 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
                          &ue->frame_parms,
                          &ue->pucch_config_dedicated_nr[gNB_id],
                          pucch_payload,
-                         pucch_tx_power,
+						 tx_amp,
                          nr_tti_tx,
-                         nb_symbols,
+						 nb_symbols_total,
                          starting_symbol_index,
                          nb_of_prbs,
                          starting_prb,
@@ -537,9 +551,9 @@ bool pucch_procedures_ue_nr(PHY_VARS_NR_UE *ue, uint8_t gNB_id, UE_nr_rxtx_proc_
                            format,
                            &ue->pucch_config_dedicated_nr[gNB_id],
                            pucch_payload,
-                           pucch_tx_power,
+						   tx_amp,
                            nr_tti_tx,
-                           nb_symbols,
+						   nb_symbols_total,
                            starting_symbol_index,
                            nb_of_prbs,
                            starting_prb,
@@ -1012,7 +1026,7 @@ boolean_t check_pucch_format(PHY_VARS_NR_UE *ue, uint8_t gNB_id, pucch_format_nr
     }
   }
 
-  NR_TST_PHY_PRINTF("PUCCH format %d nb symbols %d uci size %d selected format %d \n", format_pucch, nb_symbols_for_tx, uci_size, selected_pucch_format);
+  NR_TST_PHY_PRINTF("PUCCH format %d nb symbols total %d uci size %d selected format %d \n", format_pucch, nb_symbols_for_tx, uci_size, selected_pucch_format);
 
   if (format_pucch != selected_pucch_format) {
     if (format_pucch != selected_pucch_format_second) {
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeLists.txt b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeLists.txt
index 5865350cb91451b695f26bdd7e77cf21821c54ae..af4e096690bb219ab4b7a31ab90911543eca51ba 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeLists.txt
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/build/CMakeLists.txt
@@ -55,42 +55,42 @@ set(INC_UNIT_TESTS
 
 add_executable(pss_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pss_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(pss_test 
-                       -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                       -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
                       
 add_executable(sss_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/sss_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(sss_test 
-                       -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                       -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
 
 add_executable(frame_config_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(frame_config_test 
-                       -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                       -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
                       
 add_executable(harq_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/harq_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(harq_test 
-                       -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                       -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
                       
 add_executable(srs_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/srs_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(srs_test 
-                       -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                       -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
                       
 add_executable(pbch_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(pbch_test 
-                      -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                      -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
 
 add_executable(pucch_uci_test ${OPENAIR1_DIR}/SIMULATION/NR_UE_PHY/unit_tests/src/pucch_uci_test.c ${SRC_UNIT_TESTS} ${INC_UNIT_TESTS})
 target_link_libraries(pucch_uci_test 
-                       -Wl,--start-group UTIL SCHED_UE_LIB SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
+                       -Wl,--start-group UTIL SCHED_NR_UE_LIB PHY PHY_COMMON PHY_UE PHY_NR_UE -Wl,--end-group
                       pthread m ${ATLAS_LIBRARIES}
                       )
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
index 04533af083e061936378c26206909dc17e440eb3..ef76a0340157e431bd3c28b3e493babd84346be6 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/dummy_functions.c
@@ -46,6 +46,11 @@ uint32_t (*p_nr_ue_get_SR)(module_id_t module_idP,int CC_id,frame_t frameP,uint8
 
 /*****************functions****************************************/
 
+lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subframe)
+{
+	return(0);
+}
+
 PRACH_RESOURCES_t *ue_get_rach(module_id_t module_idP, int CC_id,
 			       frame_t frameP, uint8_t new_Msg3,
 			       sub_frame_t subframe){ return(NULL);}
@@ -61,7 +66,7 @@ void Msg1_transmitted(module_id_t module_idP, uint8_t CC_id,
 void Msg3_transmitted(module_id_t module_idP, uint8_t CC_id,
 		      frame_t frameP, uint8_t eNB_id){}
 
-uint32_t ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP,
+uint32_t nr_ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP,
 		   uint8_t eNB_id, rnti_t rnti, sub_frame_t subframe){
 
 	uint32_t value = 0;
@@ -193,3 +198,8 @@ void exit_fun(const char* s)
   undefined_function(__FUNCTION__);
 }
 
+uint32_t ue_get_SR(module_id_t module_idP, int CC_id, frame_t frameP,
+		          uint8_t eNB_id, rnti_t rnti, sub_frame_t subframe){
+	uint32_t value = 0;
+	return(value);
+}
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c
index d09d92d9bcc9335939e71f1c1b8de980fbfa5b60..1ab935fcae92c008b42b94a64beda8cac9733d55 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/frame_config_test.c
@@ -54,26 +54,24 @@ void display_frame_configuration(NR_DL_FRAME_PARMS *frame_parms) {
   printf("\nTdd configuration tti %d downlink %d uplink %d period %d \n", frame_parms->ttis_per_subframe, frame_parms->p_tdd_UL_DL_Configuration->nrofDownlinkSlots,
       frame_parms->p_tdd_UL_DL_Configuration->nrofUplinkSlots, frame_parms->p_tdd_UL_DL_Configuration->dl_UL_TransmissionPeriodicity);
 
-  int k = (TDD_CONFIG_NB_FRAMES * LTE_NUMBER_OF_SUBFRAMES_PER_FRAME) - 1; //19;
+  int k = (TDD_CONFIG_NB_FRAMES * NR_NUMBER_OF_SUBFRAMES_PER_FRAME) - 1; //19;
   int tti = 0;
-  for (int j = 0; j < TDD_CONFIG_NB_FRAMES * frame_parms->ttis_per_subframe * LTE_NUMBER_OF_SUBFRAMES_PER_FRAME; j++) {
+  for (int j = 0; j < TDD_CONFIG_NB_FRAMES * frame_parms->ttis_per_subframe * NR_NUMBER_OF_SUBFRAMES_PER_FRAME; j++) {
     int frame = 0;
     if (j != 0) {
-      frame = (frame_parms->ttis_per_subframe * LTE_NUMBER_OF_SUBFRAMES_PER_FRAME)/j;
-      tti = (j)%(frame_parms->ttis_per_subframe * LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
+      frame = (frame_parms->ttis_per_subframe * NR_NUMBER_OF_SUBFRAMES_PER_FRAME)/j;
+      tti = (j)%(frame_parms->ttis_per_subframe * NR_NUMBER_OF_SUBFRAMES_PER_FRAME);
     }
     else {
       frame = 0;
       tti = 0;
     }
 
-    if (slot_select_nr(frame_parms, frame, tti)  == NR_TDD_DOWNLINK_SLOT) {
-    //if (frame_parms->tdd_uplink_nr[j] == NR_TDD_DOWNLINK_SLOT) {
+    if (slot_select_nr(frame_parms, frame, tti) & NR_DOWNLINK_SLOT) {
       printf(" [%3d] D", j);
     }
     else {
-      if (slot_select_nr(frame_parms, frame, tti)  == NR_TDD_UPLINK_SLOT) {
-      //if (frame_parms->tdd_uplink_nr[j] == NR_TDD_UPLINK_SLOT) {
+      if (slot_select_nr(frame_parms, frame, tti) & NR_UPLINK_SLOT) {
         printf(" [%3d] U", j);
       }
       else {
@@ -83,7 +81,7 @@ void display_frame_configuration(NR_DL_FRAME_PARMS *frame_parms) {
     }
     if (j == k) {
       printf("\n");
-      k += (TDD_CONFIG_NB_FRAMES * LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); // 20
+      k += (TDD_CONFIG_NB_FRAMES * NR_NUMBER_OF_SUBFRAMES_PER_FRAME); // 20
     }
   }
   printf("\n");
@@ -120,7 +118,7 @@ void set_tti_test(NR_DL_FRAME_PARMS *frame_parms, int ttis_per_subframe)
 
 int test_frame_configuration(PHY_VARS_NR_UE *PHY_vars_UE)
 {
-  LTE_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
+  NR_DL_FRAME_PARMS *frame_parms = &(PHY_vars_UE->frame_parms);
   int v_return = 0;
 
   #define  NO_DOWNLINK_SYMBOL           (0)
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c
index db506e45d121e7759ff537555147512efabd448d..990a277a3895082da8b930bf0a81590d1f9ebae4 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pss_util_test.c
@@ -256,7 +256,7 @@ int init_test(unsigned char N_tx, unsigned char N_rx, unsigned char transmission
   frame_parms->threequarter_fs      = 0;
   frame_parms->numerology_index     = NUMEROLOGY_INDEX_MAX_NR;
 
-  nr_init_frame_parms_ue(config,frame_parms);
+  nr_init_frame_parms_ue(frame_parms);
 
   PHY_vars_UE->frame_parms.Nid_cell = (3 * N_ID_1_NUMBER) + N_ID_2_NUMBER; /* set to unvalid value */
 
diff --git a/targets/RT/USER/nr-ue.c b/targets/RT/USER/nr-ue.c
index 3a62ea36dfb3721d61608ac0002c5f03833ea076..7ffaaffb9f1c0b0781e73a3da806b1ee467aa623 100644
--- a/targets/RT/USER/nr-ue.c
+++ b/targets/RT/USER/nr-ue.c
@@ -67,6 +67,69 @@ extern double cpuf;
 static  nfapi_nr_config_request_t config_t;
 static  nfapi_nr_config_request_t* config =&config_t;
 
+/*
+ *  NR SLOT PROCESSING SEQUENCE
+ *
+ *  Processing occurs with following steps for connected mode:
+ *
+ *  - Rx samples for a slot are received,
+ *  - PDCCH processing (including DCI extraction for downlink and uplink),
+ *  - PDSCH processing (including transport blocks decoding),
+ *  - PUCCH/PUSCH (transmission of acknowledgements, CSI, ... or data).
+ *
+ *  Time between reception of the slot and related transmission depends on UE processing performance.
+ *  It is defined by the value NR_UE_CAPABILITY_SLOT_RX_TO_TX.
+ *
+ *  In NR, network gives the duration between Rx slot and Tx slot in the DCI:
+ *  - for reception of a PDSCH and its associated acknowledgment slot (with a PUCCH or a PUSCH),
+ *  - for reception of an uplink grant and its associated PUSCH slot.
+ *
+ *  So duration between reception and it associated transmission depends on its transmission slot given in the DCI.
+ *  NR_UE_CAPABILITY_SLOT_RX_TO_TX means the minimum duration but higher duration can be given by the network because UE can support it.
+ *
+*                                                                                                    Slot k
+*                                                                                  -------+------------+--------
+*                Frame                                                                    | Tx samples |
+*                Subframe                                                                 |   buffer   |
+*                Slot n                                                            -------+------------+--------
+*       ------ +------------+--------                                                     |
+*              | Rx samples |                                                             |
+*              |   buffer   |                                                             |
+*       -------+------------+--------                                                     |
+*                           |                                                             |
+*                           V                                                             |
+*                           +------------+                                                |
+*                           |   PDCCH    |                                                |
+*                           | processing |                                                |
+*                           +------------+                                                |
+*                           |            |                                                |
+*                           |            v                                                |
+*                           |            +------------+                                   |
+*                           |            |   PDSCH    |                                   |
+*                           |            | processing | decoding result                   |
+*                           |            +------------+    -> ACK/NACK of PDSCH           |
+*                           |                         |                                   |
+*                           |                         v                                   |
+*                           |                         +-------------+------------+        |
+*                           |                         | PUCCH/PUSCH | Tx samples |        |
+*                           |                         |  processing | transfer   |        |
+*                           |                         +-------------+------------+        |
+*                           |                                                             |
+*                           |/___________________________________________________________\|
+*                            \  duration between reception and associated transmission   /
+*
+* Remark: processing is done slot by slot, it can be distribute on different threads which are executed in parallel.
+* This is an architecture optimization in order to cope with real time constraints.
+* By example, for LTE, subframe processing is spread over 4 different threads.
+*
+ */
+
+#ifndef NO_RAT_NR
+  #define DURATION_RX_TO_TX           (NR_UE_CAPABILITY_SLOT_RX_TO_TX)  /* for NR this will certainly depends to such UE capability which is not yet defined */
+#else
+  #define DURATION_RX_TO_TX           (4)   /* For LTE, this duration is fixed to 4 and it is linked to LTE standard for both modes FDD/TDD */
+#endif
+
 #define FRAME_PERIOD    100000000ULL
 #define DAQ_PERIOD      66667ULL
 #define FIFO_PRIORITY   40
@@ -586,9 +649,7 @@ static void *UE_thread_rxn_txnp4(void *arg) {
 
 #ifndef NO_RAT_NR
         // Process Rx data for one sub-frame
-        nr_slot_t nr_slot ; //= slot_select_nr(&UE->frame_parms, proc->frame_tx, proc->nr_tti_tx);
-
-        if (nr_slot == NR_TDD_DOWNLINK_SLOT) {
+        if (slot_select_nr(&UE->frame_parms, proc->frame_tx, proc->nr_tti_tx) & NR_DOWNLINK_SLOT) {
 #else
         // Process Rx data for one sub-frame
         lte_subframe_t sf_type = subframe_select( &UE->frame_parms, proc->subframe_rx);
@@ -695,11 +756,15 @@ static void *UE_thread_rxn_txnp4(void *arg) {
 
         // Prepare the future Tx data
 #if 0
+#ifndef NO_RAT_NR
+        if (slot_select_nr(&UE->frame_parms, proc->frame_tx, proc->nr_tti_tx) & NR_UPLINK_SLOT)
+#else
         if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_UL) ||
                 (UE->frame_parms.frame_type == FDD) )
             if (UE->mode != loop_through_memory)
                 phy_procedures_UE_TX(UE,proc,0,0,UE->mode,no_relay);
 #endif
+#endif
 #if 0
         if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_S) &&
                 (UE->frame_parms.frame_type == TDD))
@@ -810,7 +875,7 @@ void *UE_thread(void *arg) {
                 if (UE->mode != loop_through_memory) {
                     for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
                         rxp[i] = (void*)&dummy_rx[i][0];
-                    for (int sf=0; sf<10; sf++)
+                    for (int sf=0; sf<LTE_NUMBER_OF_SUBFRAMES_PER_FRAME; sf++)
                         //	    printf("Reading dummy sf %d\n",sf);
                           UE->rfdevice.trx_read_func(&UE->rfdevice,
                                               &timestamp,
@@ -857,7 +922,8 @@ void *UE_thread(void *arg) {
 
             } else {
                 tti_nr++;
-                tti_nr%=10*UE->frame_parms.ttis_per_subframe;
+                int ttis_per_frame = LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*UE->frame_parms.ttis_per_subframe;
+                tti_nr %= ttis_per_frame;               
                 UE_nr_rxtx_proc_t *proc = &UE->proc.proc_rxtx[thread_idx];
                 // update thread index for received subframe
                 UE->current_thread_id[tti_nr] = thread_idx;
@@ -878,7 +944,7 @@ void *UE_thread(void *arg) {
                         txp[i] = (void*)&UE->common_vars.txdata[i][((tti_nr+2)%10*UE->frame_parms.ttis_per_subframe)*UE->frame_parms.samples_per_tti];
 
                     int readBlockSize, writeBlockSize;
-                    if (tti_nr<(10*UE->frame_parms.ttis_per_subframe-1)) {
+                    if (tti_nr<(ttis_per_frame - 1)) {
                         readBlockSize=UE->frame_parms.samples_per_tti;
                         writeBlockSize=UE->frame_parms.samples_per_tti;
                     } else {
@@ -917,7 +983,7 @@ void *UE_thread(void *arg) {
                                          writeBlockSize,
                                          UE->frame_parms.nb_antennas_tx,
                                          1),"");
-                    if( tti_nr==(10*UE->frame_parms.ttis_per_subframe-1)) {
+                    if( tti_nr==(ttis_per_frame-1)) {
                         // read in first symbol of next frame and adjust for timing drift
                         int first_symbols=writeBlockSize-readBlockSize;
                         if ( first_symbols > 0 )
@@ -954,13 +1020,19 @@ void *UE_thread(void *arg) {
                     for (th_id=0; th_id < RX_NB_TH; th_id++) {
                         UE->proc.proc_rxtx[th_id].gotIQs=readTime(gotIQs);
                     }
+
                     proc->nr_tti_rx=tti_nr;
-                    proc->nr_tti_tx=(tti_nr+4)%(10*UE->frame_parms.ttis_per_subframe);
                     proc->subframe_rx=tti_nr>>((uint8_t)(log2 (UE->frame_parms.ttis_per_subframe)));
-                    proc->frame_tx = proc->frame_rx + (proc->subframe_rx>5?1:0);
+
+                    proc->frame_tx = proc->frame_rx;
+                    proc->nr_tti_tx= tti_nr + DURATION_RX_TO_TX;
+                    if (proc->nr_tti_tx > ttis_per_frame) {
+                      proc->frame_tx = (proc->frame_tx + 1)%MAX_FRAME_NUMBER;
+                      proc->nr_tti_tx %= ttis_per_frame;
+                    }
                     proc->subframe_tx=(proc->nr_tti_tx)>>((uint8_t)(log2 (UE->frame_parms.ttis_per_subframe)));
                     proc->timestamp_tx = timestamp+
-                                         (4*UE->frame_parms.samples_per_tti)-
+                                         (DURATION_RX_TO_TX*UE->frame_parms.samples_per_tti)-
                                          UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0;
 
                     proc->instance_cnt_rxtx++;