diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 55b08e9d00de52c39447666e31f43906e15f4372..f764fd3df9c4c29f0dc9760ec1a56be6c7e16c3d 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -292,6 +292,8 @@ set(protobuf_generated_dir ${OPENAIR_BIN_DIR})
 
 add_list2_option(RRC_ASN1_VERSION "Rel15" "ASN.1 version of RRC interface" "Rel8" "Rel10" "Rel14" "CBA")
 
+Message("RRC_ASN1_VERSION is ${RRC_ASN1_VERSION}")
+
 if (${RRC_ASN1_VERSION} STREQUAL "Rel8")
   make_version(RRC_VERSION 8 6 0)
   set (RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/LTE/MESSAGES/asn1c/ASN1_files/EUTRA-RRC-Definitions-86.asn)
@@ -321,14 +323,14 @@ endif  (${RRC_ASN1_VERSION} STREQUAL "Rel8")
 add_definitions(-DRRC_VERSION=${RRC_VERSION})
 set (RRC_FULL_DIR ${asn1_generated_dir}/RRC_${RRC_ASN1_VERSION})
 message("calling asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}")
-execute_process(COMMAND mkdir -p ${RRC_FULL_DIR}
-                COMMAND env asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}
-                RESULT_VARIABLE ret
-		OUTPUT_QUIET
-                ERROR_QUIET)
-if (NOT ${ret} STREQUAL 0)
-  message(FATAL_ERROR "${ret}: error")
-endif (NOT ${ret} STREQUAL 0)
+#execute_process(COMMAND mkdir -p ${RRC_FULL_DIR}
+#                COMMAND env asn1c -pdu=all -fcompound-names -gen-PER -no-gen-OER -no-gen-example -D ${RRC_FULL_DIR} ${RRC_GRAMMAR}
+#                RESULT_VARIABLE ret
+#		OUTPUT_QUIET
+#                ERROR_QUIET)
+#if (NOT ${ret} STREQUAL 0)
+#  message(FATAL_ERROR "${ret}: error")
+#endif (NOT ${ret} STREQUAL 0)
 
 file(GLOB rrc_source ${RRC_FULL_DIR}/*.c)
 file(GLOB rrc_h ${RRC_FULL_DIR}/*.h)
@@ -362,15 +364,15 @@ add_definitions(-DNR_RRC_VERSION=${NR_RRC_VERSION})
 set (NR_RRC_FULL_DIR ${asn1_generated_dir}/${NR_RRC_ASN1_VERSION})
 
 message("calling ASN1C_PREFIX=NR_ asn1c -pdu=all -fcompound-names -findirect-choice -gen-PER -no-gen-OER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}")
-execute_process(COMMAND mkdir -p ${NR_RRC_FULL_DIR}
-                COMMAND env "ASN1C_PREFIX=NR_" asn1c -fcompound-names -findirect-choice -gen-PER -no-gen-OER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}
-                RESULT_VARIABLE ret
-		OUTPUT_QUIET
-		ERROR_QUIET)
+#execute_process(COMMAND mkdir -p ${NR_RRC_FULL_DIR}
+#                COMMAND env "ASN1C_PREFIX=NR_" asn1c -fcompound-names -findirect-choice -gen-PER -no-gen-OER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}
+#                RESULT_VARIABLE ret
+#		OUTPUT_QUIET
+#		ERROR_QUIET)
 
-if (NOT ${ret} STREQUAL 0)
-   message(FATAL_ERROR "${ret}: error")
-endif (NOT ${ret} STREQUAL 0)
+#if (NOT ${ret} STREQUAL 0)
+#   message(FATAL_ERROR "${ret}: error")
+#endif (NOT ${ret} STREQUAL 0)
 
 file(GLOB nr_rrc_source ${NR_RRC_FULL_DIR}/*.c)
 file(GLOB nr_rrc_h ${NR_RRC_FULL_DIR}/*.h)
@@ -426,14 +428,14 @@ add_definitions(-DS1AP_VERSION=${S1AP_VERSION})
 set(S1AP_ASN_DIR ${S1AP_DIR}/MESSAGES/ASN1/${S1AP_RELEASE})
 set(S1AP_C_DIR ${asn1_generated_dir}/S1AP_${S1AP_RELEASE})
 message("calling ASN1C_PREFIX=S1AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}")
-execute_process(COMMAND mkdir -p ${S1AP_C_DIR}
-                COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
-                RESULT_VARIABLE ret
-		OUTPUT_QUIET
-                ERROR_QUIET)
-if (NOT ${ret} STREQUAL 0)
-  message(FATAL_ERROR "${ret}: error")
-endif (NOT ${ret} STREQUAL 0)
+#execute_process(COMMAND mkdir -p ${S1AP_C_DIR}
+#                COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
+#                RESULT_VARIABLE ret
+#		OUTPUT_QUIET
+#                ERROR_QUIET)
+#if (NOT ${ret} STREQUAL 0)
+#  message(FATAL_ERROR "${ret}: error")
+#endif (NOT ${ret} STREQUAL 0)
 file(GLOB S1AP_source ${S1AP_C_DIR}/*.c)
 
 file(GLOB s1ap_h ${S1AP_C_DIR}/*.h)
@@ -495,14 +497,14 @@ add_definitions(-DX2AP_VERSION=${X2AP_VERSION})
 set(X2AP_ASN_DIR ${X2AP_DIR}/MESSAGES/ASN1/${X2AP_RELEASE})
 set(X2AP_C_DIR ${asn1_generated_dir}/X2AP_${X2AP_RELEASE})
 message("calling ASN1C_PREFIX=X2AP_ asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}")
-execute_process(COMMAND mkdir -p ${X2AP_C_DIR}
-                COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
-                RESULT_VARIABLE ret
-                OUTPUT_QUIET
-                ERROR_QUIET)
-if (NOT ${ret} STREQUAL 0)
-  message(FATAL_ERROR "${ret}: error")
-endif (NOT ${ret} STREQUAL 0)
+#execute_process(COMMAND mkdir -p ${X2AP_C_DIR}
+#                COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
+#                RESULT_VARIABLE ret
+#                OUTPUT_QUIET
+#                ERROR_QUIET)
+#if (NOT ${ret} STREQUAL 0)
+#  message(FATAL_ERROR "${ret}: error")
+#endif (NOT ${ret} STREQUAL 0)
 file(GLOB X2AP_source ${X2AP_C_DIR}/*.c)
 
 file(GLOB x2ap_h ${X2AP_C_DIR}/*.h)
@@ -543,7 +545,9 @@ set (CONFIG_SOURCES
    )
 set (CONFIG_LIBCONFIG_SOURCES
     ${CONFIG_ROOTDIR}/libconfig/config_libconfig.c
-   )
+    )
+add_library(CONFIG_LIB ${CONFIG_SOURCES})
+set(CONFIG_LIBRARIES CONFIG_LIB)  
 add_library(params_libconfig MODULE ${CONFIG_LIBCONFIG_SOURCES} )
 target_link_libraries(params_libconfig config)
 # shared library loader
@@ -1461,7 +1465,7 @@ set(L2_SRC
   ${RRC_DIR}/L2_interface_ue.c
   )
 
-set(L2_NR_SRC
+set(NR_L2_SRC
   ${NR_RRC_DIR}/rrc_gNB.c
   ${NR_RRC_DIR}/nr_rrc_common.c
   ${NR_RRC_DIR}/L2_nr_interface.c
@@ -1513,14 +1517,6 @@ set(NR_L2_SRC_UE
   ${NR_UE_RRC_DIR}/L2_interface_ue.c
   ${NR_UE_RRC_DIR}/main_ue.c
   ${NR_UE_RRC_DIR}/rrc_UE.c
-#  ${NR_UE_RRC_DIR}/mac_vars.c
-#${RRC_DIR}/rrc_UE.c
-  )
-
-set(L2_NR_SRC_UE
-  ${NR_UE_RRC_DIR}/L2_interface_ue.c
-  ${NR_UE_RRC_DIR}/main_ue.c
-  ${NR_UE_RRC_DIR}/rrc_UE.c
   )
 
 set (MAC_SRC
@@ -1547,7 +1543,7 @@ set (MAC_SRC
   ${MAC_DIR}/config_ue.c
  )
 
-set (MAC_NR_SRC
+set (NR_MAC_SRC
   ${NR_PHY_INTERFACE_DIR}/NR_IF_Module.c
   ${NR_MAC_DIR}/main.c
   ${NR_MAC_DIR}/config.c
@@ -2530,10 +2526,14 @@ target_link_libraries (dlsim_tm4
   )
 
 add_executable(polartest ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/polartest.c)
-target_link_libraries(polartest m SIMU PHY PHY_NR PHY_COMMON -lm ${ATLAS_LIBRARIES})
+target_link_libraries(polartest SIMU PHY PHY_NR PHY_COMMON m ${ATLAS_LIBRARIES})
 
 add_executable(ldpctest  ${OPENAIR1_DIR}/PHY/CODING/TESTBENCH/ldpctest.c)
-target_link_libraries(ldpctest m SIMU PHY PHY_NR ${ATLAS_LIBRARIES})
+target_link_libraries(ldpctest SIMU PHY PHY_NR m ${ATLAS_LIBRARIES})
+
+add_executable(nr_pbchsim  ${OPENAIR1_DIR}/SIMULATION/NR_PHY/pbchsim.c )
+target_link_libraries(nr_pbchsim  -Wl,--start-group UTIL SIMU PHY PHY_COMMON PHY_NR PHY_NR_UE SCHED_NR_LIB ${CONFIG_LIBRARIES} -Wl,--end-group m pthread dl ${ATLAS_LIBRARIES})
+
 
 foreach(myExe dlsim dlsim_tm7 ulsim pbchsim scansim mbmssim pdcchsim pucchsim prachsim syncsim)
 
diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index 9a83d784ce25b18a7983dd3e6117a2518452823f..9c90166e520dcaa3024b07f482d82c9cf353827b 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -671,7 +671,7 @@ function main() {
   fi
 
   if [ "$SIMUS_PHY" = "1" -o "$SIMUS_CORE" = "1" ] ; then
-    cd $OPENAIR_DIR/cmake_targets/lte-simulators
+    cd $OPENAIR_DIR/cmake_targets/phy_simulators
     [ "$CLEAN" = "1" ] && rm -rf build
     mkdir -p build
     cd build
@@ -687,11 +687,11 @@ function main() {
     simlist="dlsim ulsim polartest ldpctest"
     for f in $simlist ; do
       compilations \
-      lte-simulators $f \
+      phy_simulators $f \
 	  $f $dbin/$f.$REL
     done
     compilations \
-          lte-simulators coding \
+          phy_simulators coding \
           libcoding.so $dbin/libcoding.so
   fi
 
@@ -703,7 +703,7 @@ function main() {
     simlist="secu_knas_encrypt_eia1 secu_kenb aes128_ctr_encrypt aes128_ctr_decrypt secu_knas_encrypt_eea2 secu_knas secu_knas_encrypt_eea1 kdf aes128_cmac_encrypt secu_knas_encrypt_eia2"
     for f in $simlist ; do
       compilations \
-	  lte-simulators test_$f \
+	  phy_simulators test_$f \
 	  test_$f $dbin/test_$f.$REL
     done
   fi
diff --git a/cmake_targets/lte-simulators/CMakeLists.txt b/cmake_targets/phy_simulators/CMakeLists.txt
similarity index 94%
rename from cmake_targets/lte-simulators/CMakeLists.txt
rename to cmake_targets/phy_simulators/CMakeLists.txt
index b7e83a92a03282f9dfae9b54633a8ea745763cee..83b292eed5999d960026083d2874514d56020534 100644
--- a/cmake_targets/lte-simulators/CMakeLists.txt
+++ b/cmake_targets/phy_simulators/CMakeLists.txt
@@ -9,4 +9,5 @@ set(MU_RECIEVER False)
 set(NAS_UE False)
 set(MESSAGE_CHART_GENERATOR False)
 set(RRC_ASN1_VERSION "Rel14")
+set(T_TRACER False)
 include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index 3864ad53c7fa7ea4c8b5a4850ea93c0975a53b8b..f9025adbe10325df5134cbe71c80079b9fd0e1db 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -345,10 +345,10 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
      /* define variable only used in LOG macro's */
 #    define LOG_VAR(A,B) A B
 #  else /* T_TRACER: remove all debugging and tracing messages, except errors */
-#    define LOG_I(c, x...) /* */
-#    define LOG_W(c, x...) /* */
-#    define LOG_E(c, x...) /* */
-#    define LOG_D(c, x...) /* */
+#    define LOG_I(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_INFO, x) ; } while(0)/* */
+#    define LOG_W(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_WARNING, x) ; } while(0)/* */
+#    define LOG_E(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_ERR, x) ; } while(0)/* */
+#    define LOG_D(c, x...) do {logRecord_mt(__FILE__, __FUNCTION__, __LINE__,c, OAILOG_DEBUG, x) ; } while(0)/* */
 #    define LOG_T(c, x...) /* */
 #    define LOG_F(c, x...) /* */
 #    define nfapi_log(FILE, FNC, LN, COMP, LVL, FMT...) 
@@ -356,7 +356,7 @@ int32_t write_file_matlab(const char *fname, const char *vname, void *data, int
 #    define LOG_DEBUG_END   }
 #    define LOG_M_BEGIN(D) if (0) {
 #    define LOG_M_END   }
-#    define LOG_M(file, vector, data, len, dec, format) 
+#    define LOG_M(file, vector, data, len, dec, format) do { write_file_matlab(file, vector, data, len, dec, format);} while(0)
 #    define LOG_VAR(A,B)
 #  endif /* T_TRACER */
 /* avoid warnings for variables only used in LOG macro's but set outside debug section */
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 44904c45532fa98a9997c9fda08c60b0a4c7dfb2..eccb10f7b4709b1bd39aa6151002e660cdd421ee 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -92,7 +92,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
 
   int i, UE_id; 
 
-  LOG_I(PHY,"[gNB %d] %s() About to wait for gNB to be configured", gNB->Mod_id, __FUNCTION__);
+  LOG_I(PHY,"[gNB %d] %s() About to wait for gNB to be configured\n", gNB->Mod_id, __FUNCTION__);
 
   gNB->total_dlsch_bitrate = 0;
   gNB->total_transmitted_bits = 0;
@@ -335,7 +335,7 @@ void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
     free_and_zero(srs_vars[UE_id].srs_ch_estimates_time);
   } //UE_id
 
-  free_ul_ref_sigs();
+  //free_ul_ref_sigs();
 
   for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) free_and_zero(srs_vars[UE_id].srs);
 
@@ -378,7 +378,7 @@ void install_schedule_handlers(IF_Module_t *if_inst)
 
 /// this function is a temporary addition for NR configuration
 
-/*void nr_phy_config_request(PHY_VARS_gNB *gNB)
+void nr_phy_config_request_sim(PHY_VARS_gNB *gNB)
 {
   NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
   nfapi_nr_config_request_t *gNB_config = &gNB->gNB_config;
@@ -407,7 +407,7 @@ void install_schedule_handlers(IF_Module_t *if_inst)
 
   gNB->configured                                   = 1;
   LOG_I(PHY,"gNB configured\n");
-}*/
+}
 
 
 void nr_phy_config_request(NR_PHY_Config_t *phy_config)
diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c
index 022f6699645e3af5604b23c3d378724430b739a2..148496e9f254a6cc7e767d6c203fd2cd3fcc09c3 100644
--- a/openair1/PHY/INIT/nr_init_ue.c
+++ b/openair1/PHY/INIT/nr_init_ue.c
@@ -983,3 +983,64 @@ void phy_init_nr_top(PHY_VARS_NR_UE *ue)
   //set_taus_seed(1328);
 
 }
+
+void set_default_frame_parms_single(nfapi_nr_config_request_t *config, NR_DL_FRAME_PARMS *frame_parms) {
+
+  //int CC_id;
+
+  //for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+        /* Set some default values that may be overwritten while reading options */
+        frame_parms = (NR_DL_FRAME_PARMS*) malloc(sizeof(NR_DL_FRAME_PARMS));
+        config = (nfapi_nr_config_request_t*) malloc(sizeof(nfapi_nr_config_request_t));
+        config->subframe_config.numerology_index_mu.value =1;
+        config->subframe_config.duplex_mode.value = 1; //FDD
+        config->subframe_config.dl_cyclic_prefix_type.value = 0; //NORMAL
+        config->rf_config.dl_carrier_bandwidth.value = 106;
+        config->rf_config.ul_carrier_bandwidth.value = 106;
+        config->rf_config.tx_antenna_ports.value = 1;
+        config->rf_config.rx_antenna_ports.value = 1;
+        config->sch_config.physical_cell_id.value = 0;
+
+        frame_parms->frame_type          = FDD;
+        frame_parms->tdd_config          = 3;
+        //frame_parms[CC_id]->tdd_config_S        = 0;
+        frame_parms->N_RB_DL             = 100;
+        frame_parms->N_RB_UL             = 100;
+        frame_parms->Ncp                 = NORMAL;
+        //frame_parms[CC_id]->Ncp_UL              = NORMAL;
+        frame_parms->Nid_cell            = 0;
+        //frame_parms[CC_id]->num_MBSFN_config    = 0;
+        frame_parms->nb_antenna_ports_eNB  = 1;
+        frame_parms->nb_antennas_tx      = 1;
+        frame_parms->nb_antennas_rx      = 1;
+
+        //frame_parms[CC_id]->nushift             = 0;
+
+        ///frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth;
+        //frame_parms[CC_id]->phich_config_common.phich_duration = normal;
+	
+	// UL RS Config
+        /*frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 1;//n_DMRS1 set to 0
+        frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
+        frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
+        frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
+
+	frame_parms[CC_id]->pusch_config_common.n_SB = 1;
+	frame_parms[CC_id]->pusch_config_common.hoppingMode = 0;
+	frame_parms[CC_id]->pusch_config_common.pusch_HoppingOffset = 0;
+	frame_parms[CC_id]->pusch_config_common.enable64QAM = 0;
+		
+        frame_parms[CC_id]->prach_config_common.rootSequenceIndex=22;
+        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1;
+        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
+        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.highSpeedFlag=0;
+        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;*/
+
+        // NR: Init to legacy LTE 20Mhz params
+        frame_parms->numerology_index	= 0;
+        frame_parms->ttis_per_subframe	= 1;
+        frame_parms->slots_per_tti		= 2;
+
+    //}
+
+}
diff --git a/openair1/PHY/LTE_TRANSPORT/transport_vars.h b/openair1/PHY/LTE_TRANSPORT/transport_vars.h
index 611028e1e9805d748de9c9c4f77ba0b8856b2170..bf6b911bc77c5e69753e42951b9b160a03af80bb 100644
--- a/openair1/PHY/LTE_TRANSPORT/transport_vars.h
+++ b/openair1/PHY/LTE_TRANSPORT/transport_vars.h
@@ -59,9 +59,6 @@ char lte_cqi_snr_dB[15] = { -2,
 
 unsigned char ue_power_offsets[25] = {14,11,9,8,7,6,6,5,4,4,4,3,3,3,2,2,2,1,1,1,1,1,0,0,0};
 
-short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
-short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
-
 int qam64_table[8],qam16_table[4],qpsk_table[2];
 
 unsigned char cs_ri_normal[4]    = {1,4,7,10};
diff --git a/openair1/PHY/MODULATION/modulation_common.h b/openair1/PHY/MODULATION/modulation_common.h
index 2ac0dc23b3012b5bc76aa8ad7acbdf9f4fedd318..f550eeca5f6c7f9b483e13c5a44b33eb41f1abd5 100644
--- a/openair1/PHY/MODULATION/modulation_common.h
+++ b/openair1/PHY/MODULATION/modulation_common.h
@@ -22,6 +22,7 @@
 #ifndef __MODULATION_COMMON__H__
 #define __MODULATION_COMMON__H__
 #include "PHY/defs_common.h"
+#include "PHY/defs_nr_common.h"
 /** @addtogroup _PHY_MODULATION_
  * @{
 */
@@ -48,6 +49,7 @@ void PHY_ofdm_mod(int *input,
 
 
 void normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,LTE_DL_FRAME_PARMS *frame_parms);
+void nr_normal_prefix_mod(int32_t *txdataF,int32_t *txdata,uint8_t nsymb,NR_DL_FRAME_PARMS *frame_parms);
 
 void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
 
diff --git a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
index a0707353d8954d8901dcb8f55088c8b5b43fb819..597a47bf5ab650fa7ef8a4fd2e59252506d2adbe 100644
--- a/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
+++ b/openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
@@ -41,7 +41,7 @@
 
 #include "refsig_defs_ue.h"
 #include "PHY/defs_nr_UE.h"
-//#include "nr_mod_table.h"
+#include "nr_mod_table.h"
 #include "log.h"
 
 /*Table 7.4.1.1.2-1/2 from 38.211 */
diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h
index ccffc7028e1b9c3fb78b9ae52afaa31597551ccd..97abc5844ccb0f3c580e766d1fa62510a6aca445 100644
--- a/openair1/PHY/NR_REFSIG/nr_mod_table.h
+++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h
@@ -1,7 +1 @@
-#define NR_MOD_TABLE_SIZE_SHORT 686
-#define NR_MOD_TABLE_BPSK_OFFSET 1
-#define NR_MOD_TABLE_QPSK_OFFSET 3
-#define NR_MOD_TABLE_QAM16_OFFSET 7
-#define NR_MOD_TABLE_QAM64_OFFSET 23
-#define NR_MOD_TABLE_QAM256_OFFSET 87
-short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170,10362,10362,10362,31086,31086,10362,31086,31086,10362,-10362,10362,-31086,31086,-10362,31086,-31086,-10362,10362,-10362,31086,-31086,10362,-31086,31086,-10362,-10362,-10362,-31086,-31086,-10362,-31086,-31086,15169,15169,15169,5057,5057,15169,5057,5057,15169,25281,15169,35393,5057,25281,5057,35393,25281,15169,25281,5057,35393,15169,35393,5057,25281,25281,25281,35393,35393,25281,35393,35393,15169,-15169,15169,-5057,5057,-15169,5057,-5057,15169,-25281,15169,-35393,5057,-25281,5057,-35393,25281,-15169,25281,-5057,35393,-15169,35393,-5057,25281,-25281,25281,-35393,35393,-25281,35393,-35393,-15169,15169,-15169,5057,-5057,15169,-5057,5057,-15169,25281,-15169,35393,-5057,25281,-5057,35393,-25281,15169,-25281,5057,-35393,15169,-35393,5057,-25281,25281,-25281,35393,-35393,25281,-35393,35393,-15169,-15169,-15169,-5057,-5057,-15169,-5057,-5057,-15169,-25281,-15169,-35393,-5057,-25281,-5057,-35393,-25281,-15169,-25281,-5057,-35393,-15169,-35393,-5057,-25281,-25281,-25281,-35393,-35393,-25281,-35393,-35393,12566,12566,12566,17592,17592,12566,17592,17592,12566,7540,12566,2514,17592,7540,17592,2514,7540,12566,7540,17592,2514,12566,2514,17592,7540,7540,7540,2514,2514,7540,2514,2514,12566,27644,12566,22618,17592,27644,17592,22618,12566,32670,12566,37696,17592,32670,17592,37696,7540,27644,7540,22618,2514,27644,2514,22618,7540,32670,7540,37696,2514,32670,2514,37696,27644,12566,27644,17592,22618,12566,22618,17592,27644,7540,27644,2514,22618,7540,22618,2514,32670,12566,32670,17592,37696,12566,37696,17592,32670,7540,32670,2514,37696,7540,37696,2514,27644,27644,27644,22618,22618,27644,22618,22618,27644,32670,27644,37696,22618,32670,22618,37696,32670,27644,32670,22618,37696,27644,37696,22618,32670,32670,32670,37696,37696,32670,37696,37696,12566,-12566,12566,-17592,17592,-12566,17592,-17592,12566,-7540,12566,-2514,17592,-7540,17592,-2514,7540,-12566,7540,-17592,2514,-12566,2514,-17592,7540,-7540,7540,-2514,2514,-7540,2514,-2514,12566,-27644,12566,-22618,17592,-27644,17592,-22618,12566,-32670,12566,-37696,17592,-32670,17592,-37696,7540,-27644,7540,-22618,2514,-27644,2514,-22618,7540,-32670,7540,-37696,2514,-32670,2514,-37696,27644,-12566,27644,-17592,22618,-12566,22618,-17592,27644,-7540,27644,-2514,22618,-7540,22618,-2514,32670,-12566,32670,-17592,37696,-12566,37696,-17592,32670,-7540,32670,-2514,37696,-7540,37696,-2514,27644,-27644,27644,-22618,22618,-27644,22618,-22618,27644,-32670,27644,-37696,22618,-32670,22618,-37696,32670,-27644,32670,-22618,37696,-27644,37696,-22618,32670,-32670,32670,-37696,37696,-32670,37696,-37696,-12566,12566,-12566,17592,-17592,12566,-17592,17592,-12566,7540,-12566,2514,-17592,7540,-17592,2514,-7540,12566,-7540,17592,-2514,12566,-2514,17592,-7540,7540,-7540,2514,-2514,7540,-2514,2514,-12566,27644,-12566,22618,-17592,27644,-17592,22618,-12566,32670,-12566,37696,-17592,32670,-17592,37696,-7540,27644,-7540,22618,-2514,27644,-2514,22618,-7540,32670,-7540,37696,-2514,32670,-2514,37696,-27644,12566,-27644,17592,-22618,12566,-22618,17592,-27644,7540,-27644,2514,-22618,7540,-22618,2514,-32670,12566,-32670,17592,-37696,12566,-37696,17592,-32670,7540,-32670,2514,-37696,7540,-37696,2514,-27644,27644,-27644,22618,-22618,27644,-22618,22618,-27644,32670,-27644,37696,-22618,32670,-22618,37696,-32670,27644,-32670,22618,-37696,27644,-37696,22618,-32670,32670,-32670,37696,-37696,32670,-37696,37696,-12566,-12566,-12566,-17592,-17592,-12566,-17592,-17592,-12566,-7540,-12566,-2514,-17592,-7540,-17592,-2514,-7540,-12566,-7540,-17592,-2514,-12566,-2514,-17592,-7540,-7540,-7540,-2514,-2514,-7540,-2514,-2514,-12566,-27644,-12566,-22618,-17592,-27644,-17592,-22618,-12566,-32670,-12566,-37696,-17592,-32670,-17592,-37696,-7540,-27644,-7540,-22618,-2514,-27644,-2514,-22618,-7540,-32670,-7540,-37696,-2514,-32670,-2514,-37696,-27644,-12566,-27644,-17592,-22618,-12566,-22618,-17592,-27644,-7540,-27644,-2514,-22618,-7540,-22618,-2514,-32670,-12566,-32670,-17592,-37696,-12566,-37696,-17592,-32670,-7540,-32670,-2514,-37696,-7540,-37696,-2514,-27644,-27644,-27644,-22618,-22618,-27644,-22618,-22618,-27644,-32670,-27644,-37696,-22618,-32670,-22618,-37696,-32670,-27644,-32670,-22618,-37696,-27644,-37696,-22618,-32670,-32670,-32670,-37696,-37696,-32670,-37696,-37696};
\ No newline at end of file
+short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170,10362,10362,10362,31086,31086,10362,31086,31086,10362,-10362,10362,-31086,31086,-10362,31086,-31086,-10362,10362,-10362,31086,-31086,10362,-31086,31086,-10362,-10362,-10362,-31086,-31086,-10362,-31086,-31086,15169,15169,15169,5057,5057,15169,5057,5057,15169,25281,15169,35393,5057,25281,5057,35393,25281,15169,25281,5057,35393,15169,35393,5057,25281,25281,25281,35393,35393,25281,35393,35393,15169,-15169,15169,-5057,5057,-15169,5057,-5057,15169,-25281,15169,-35393,5057,-25281,5057,-35393,25281,-15169,25281,-5057,35393,-15169,35393,-5057,25281,-25281,25281,-35393,35393,-25281,35393,-35393,-15169,15169,-15169,5057,-5057,15169,-5057,5057,-15169,25281,-15169,35393,-5057,25281,-5057,35393,-25281,15169,-25281,5057,-35393,15169,-35393,5057,-25281,25281,-25281,35393,-35393,25281,-35393,35393,-15169,-15169,-15169,-5057,-5057,-15169,-5057,-5057,-15169,-25281,-15169,-35393,-5057,-25281,-5057,-35393,-25281,-15169,-25281,-5057,-35393,-15169,-35393,-5057,-25281,-25281,-25281,-35393,-35393,-25281,-35393,-35393,12566,12566,12566,17592,17592,12566,17592,17592,12566,7540,12566,2514,17592,7540,17592,2514,7540,12566,7540,17592,2514,12566,2514,17592,7540,7540,7540,2514,2514,7540,2514,2514,12566,27644,12566,22618,17592,27644,17592,22618,12566,32670,12566,37696,17592,32670,17592,37696,7540,27644,7540,22618,2514,27644,2514,22618,7540,32670,7540,37696,2514,32670,2514,37696,27644,12566,27644,17592,22618,12566,22618,17592,27644,7540,27644,2514,22618,7540,22618,2514,32670,12566,32670,17592,37696,12566,37696,17592,32670,7540,32670,2514,37696,7540,37696,2514,27644,27644,27644,22618,22618,27644,22618,22618,27644,32670,27644,37696,22618,32670,22618,37696,32670,27644,32670,22618,37696,27644,37696,22618,32670,32670,32670,37696,37696,32670,37696,37696,12566,-12566,12566,-17592,17592,-12566,17592,-17592,12566,-7540,12566,-2514,17592,-7540,17592,-2514,7540,-12566,7540,-17592,2514,-12566,2514,-17592,7540,-7540,7540,-2514,2514,-7540,2514,-2514,12566,-27644,12566,-22618,17592,-27644,17592,-22618,12566,-32670,12566,-37696,17592,-32670,17592,-37696,7540,-27644,7540,-22618,2514,-27644,2514,-22618,7540,-32670,7540,-37696,2514,-32670,2514,-37696,27644,-12566,27644,-17592,22618,-12566,22618,-17592,27644,-7540,27644,-2514,22618,-7540,22618,-2514,32670,-12566,32670,-17592,37696,-12566,37696,-17592,32670,-7540,32670,-2514,37696,-7540,37696,-2514,27644,-27644,27644,-22618,22618,-27644,22618,-22618,27644,-32670,27644,-37696,22618,-32670,22618,-37696,32670,-27644,32670,-22618,37696,-27644,37696,-22618,32670,-32670,32670,-37696,37696,-32670,37696,-37696,-12566,12566,-12566,17592,-17592,12566,-17592,17592,-12566,7540,-12566,2514,-17592,7540,-17592,2514,-7540,12566,-7540,17592,-2514,12566,-2514,17592,-7540,7540,-7540,2514,-2514,7540,-2514,2514,-12566,27644,-12566,22618,-17592,27644,-17592,22618,-12566,32670,-12566,37696,-17592,32670,-17592,37696,-7540,27644,-7540,22618,-2514,27644,-2514,22618,-7540,32670,-7540,37696,-2514,32670,-2514,37696,-27644,12566,-27644,17592,-22618,12566,-22618,17592,-27644,7540,-27644,2514,-22618,7540,-22618,2514,-32670,12566,-32670,17592,-37696,12566,-37696,17592,-32670,7540,-32670,2514,-37696,7540,-37696,2514,-27644,27644,-27644,22618,-22618,27644,-22618,22618,-27644,32670,-27644,37696,-22618,32670,-22618,37696,-32670,27644,-32670,22618,-37696,27644,-37696,22618,-32670,32670,-32670,37696,-37696,32670,-37696,37696,-12566,-12566,-12566,-17592,-17592,-12566,-17592,-17592,-12566,-7540,-12566,-2514,-17592,-7540,-17592,-2514,-7540,-12566,-7540,-17592,-2514,-12566,-2514,-17592,-7540,-7540,-7540,-2514,-2514,-7540,-2514,-2514,-12566,-27644,-12566,-22618,-17592,-27644,-17592,-22618,-12566,-32670,-12566,-37696,-17592,-32670,-17592,-37696,-7540,-27644,-7540,-22618,-2514,-27644,-2514,-22618,-7540,-32670,-7540,-37696,-2514,-32670,-2514,-37696,-27644,-12566,-27644,-17592,-22618,-12566,-22618,-17592,-27644,-7540,-27644,-2514,-22618,-7540,-22618,-2514,-32670,-12566,-32670,-17592,-37696,-12566,-37696,-17592,-32670,-7540,-32670,-2514,-37696,-7540,-37696,-2514,-27644,-27644,-27644,-22618,-22618,-27644,-22618,-22618,-27644,-32670,-27644,-37696,-22618,-32670,-22618,-37696,-32670,-27644,-32670,-22618,-37696,-27644,-37696,-22618,-32670,-32670,-32670,-37696,-37696,-32670,-37696,-37696};
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
index 0784d9ca9d85b26f80aed832492645ddb590eb50..4039a972381a5c7d16497cbe68a7837fb1e8c7ec 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
@@ -39,7 +39,8 @@
 //#define DEBUG_PBCH_ENCODING
 //#define DEBUG_PBCH_DMRS
 
-extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
+//extern short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT];
+#include "PHY/NR_REFSIG/nr_mod_table.h"
 
 int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
                           int32_t **txdataF,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c
index 3c4f296cd616794c7dc190e1b408033fde04082a..1f653038a620c512d2040be52f04bd68b2a6898a 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pss.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c
@@ -22,7 +22,7 @@
 
 #include "PHY/NR_TRANSPORT/nr_transport.h"
 
-//#define NR_PSS_DEBUG
+#define NR_PSS_DEBUG
 
 int nr_generate_pss(  int16_t *d_pss,
                       int32_t **txdataF,
@@ -52,7 +52,7 @@ int nr_generate_pss(  int16_t *d_pss,
   }
 
 #ifdef NR_PSS_DEBUG
-  write_output("d_pss.m", "d_pss", (void*)d_pss, NR_PSS_LENGTH, 1, 1);
+  write_output("d_pss.m", "d_pss", (void*)d_pss, NR_PSS_LENGTH, 1, 0);
 #endif
 
   /// Resource mapping
@@ -75,7 +75,7 @@ int nr_generate_pss(  int16_t *d_pss,
   }
 
 #ifdef NR_PSS_DEBUG
-  write_output("pss_0.m", "pss_0", (void*)txdataF[0][2*l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1);
+  write_output("pss_0.m", "pss_0", (void*)&txdataF[0][2*l*frame_parms->ofdm_symbol_size], frame_parms->ofdm_symbol_size, 1, 1);
 #endif
 
   return 0;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index de155a86edc674048f5b263d0d8acdfe95831875..5727785e8bb47f5b2571ab11b5d12296fad9adcd 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -1335,6 +1335,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
   __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b;
 
 
+  
   //if (frame_parms->mode1_flag==1) // 10 out of 12 so don't reduce size
   if (symbol == 2){
       pilots=1;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
index 0937fa60366f7344d918ad030d4dffad13b0b051..7acc0d082dde939701885c1d9ca3e437c5e2473b 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
@@ -197,13 +197,15 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
   *          sync_pos            SS/PBCH block
   */
   cnt++;
-  if (cnt >100){
-	  cnt =0;
+  if (1){
+    cnt =0;
   /* process pss search on received buffer */
   sync_pos = pss_synchro_nr(ue, NO_RATE_CHANGE);
 
   sync_pos_slot = (frame_parms->samples_per_tti>>1) - 3*(frame_parms->ofdm_symbol_size + frame_parms->nb_prefix_samples);
 
+  sync_pos = sync_pos_slot+frame_parms->nb_prefix_samples;
+
   if (sync_pos >= frame_parms->nb_prefix_samples)
       sync_pos2 = sync_pos - frame_parms->nb_prefix_samples;
     else
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
index 773135d1b5cc38fb07058e7161d963b2f4d88ef8..25c8afdc124b7c33992c9ee4e9d0da733e47fbec 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
@@ -35,7 +35,7 @@
 #include "PHY/sse_intrin.h"
 //#include "SIMULATION/TOOLS/sim.h"
 
-//#define DEBUG_PBCH 1
+#define DEBUG_PBCH 1
 //#define DEBUG_PBCH_ENCODING
 
 #ifdef OPENAIR2
@@ -247,6 +247,9 @@ void nr_pbch_channel_compensation(int **rxdataF_ext,
                                uint8_t output_shift)
 {
 
+  short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+  short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
+
   uint16_t rb,nb_rb=20;
   uint8_t aatx,aarx;
 #if defined(__x86_64__) || defined(__i386__)
@@ -554,8 +557,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
 
   for (symbol=5; symbol<8; symbol++) {
 
+#ifdef DEBUG_PBCH
     //printf("address dataf %p",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF);
-    //write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,2,1);
+    write_output("rxdataF0_pbch.m","rxF0pbch",nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,frame_parms->ofdm_symbol_size*4,2,1);
+#endif
   
     nr_pbch_extract(nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].rxdataF,
                  nr_ue_common_vars->common_vars_rx_data_per_thread[ue->current_thread_id[subframe_rx]].dl_ch_estimates[eNB_id],
@@ -585,8 +590,10 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
                               symbol,
                               log2_maxh); // log2_maxh+I0_shift
 
-    //write_output("rxdataF_comp.m","rxFcomp",nr_ue_pbch_vars->rxdataF_comp,180,2,1);
-  
+#ifdef DEBUG_PBCH
+    write_output("rxdataF_comp.m","rxFcomp",nr_ue_pbch_vars->rxdataF_comp,180,2,1);
+#endif
+    
     /*if (frame_parms->nb_antennas_rx > 1)
       pbch_detection_mrc(frame_parms,
                          nr_ue_pbch_vars->rxdataF_comp,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
index 32f906c1d9424a68d031449848fc06a1b9dbc31c..969fe1b1e547300067446adda0b032f20c6cb49e 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
@@ -57,6 +57,8 @@
 *
 *********************************************************************/
 
+#define DBG_PSS_NR
+
 void *get_idft(int ofdm_symbol_size)
 {
   void (*idft)(int16_t *,int16_t *, int);
@@ -791,18 +793,6 @@ int pss_search_time_nr(int **rxdata, ///rx data in time domain
   /* Correlation computation is based on a a dot product which is realized thank to SIMS extensions */
   for (n=0; n < length; n+=4) {
 
-#ifdef RTAI_ENABLED
-
-    // This is necessary since the sync takes a long time and it seems to block all other threads thus screwing up RTAI. If we pause it for a little while during its execution we give RTAI a chance to catch up with its other tasks.
-    if ((n%frame_parms->samples_per_subframe == 0) && (n>0) && (openair_daq_vars.sync_state==0)) {
-#ifdef DEBUG_PHY
-      msg("[SYNC TIME] pausing for 1000ns, n=%d\n",n);
-#endif
-      rt_sleep(nano2count(1000));
-    }
-
-#endif
-
     for (int pss_index = 0; pss_index < NUMBER_PSS_SEQUENCE; pss_index++) {
 
       pss_corr_ue[pss_index][n] = 0; /* clean correlation for position n */
diff --git a/openair1/PHY/defs_NR.h b/openair1/PHY/defs_NR.h
new file mode 100644
index 0000000000000000000000000000000000000000..80d3cd978adc1f177dce9b289522443acd979141
--- /dev/null
+++ b/openair1/PHY/defs_NR.h
@@ -0,0 +1,492 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#ifndef __INIT_DEFS_NR__H__
+#define __INIT_DEFS_NR__H__
+
+/*
+#define _GNU_SOURCE
+#include <sched.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <linux/sched.h>
+#include <signal.h>
+#include <execinfo.h>
+#include <getopt.h>
+#include <sys/sysinfo.h>
+#include <malloc.h>
+#include <string.h>
+#include <math.h>
+
+#include "types.h"
+#include "defs.h"
+#include "assertions.h"*/
+#include "impl_defs_nr.h"
+#include "defs_nr_common.h"
+
+#define MAX_NUM_SUBCARRIER_SPACING 5
+
+#define NR_SYMBOLS_PER_SLOT 14
+
+#define NR_PSS_LENGTH 127
+#define NR_SSS_LENGTH 127
+
+#define ONE_OVER_SQRT2_Q15 23170
+#define ONE_OVER_TWO_Q15 16384
+
+#define MOD_TABLE_SIZE_SHORT 6
+#define MOD_TABLE_BPSK_OFFSET 1
+
+ /*
+typedef enum {
+  NR_MU_0=0,
+  NR_MU_1,
+  NR_MU_2,
+  NR_MU_3,
+  NR_MU_4,
+} nr_numerology_index_e;
+
+//NR types temporarily placed here
+typedef struct {
+  uint32_t subcarrier_spacing;
+  /// 3/4 sampling
+  uint8_t threequarter_fs;
+  /// Size of FFT
+  uint16_t ofdm_symbol_size;
+  /// Number of prefix samples in all but first symbol of slot
+  uint16_t nb_prefix_samples;
+  /// Number of prefix samples in first symbol of slot
+  uint16_t nb_prefix_samples0;
+  /// Carrier offset in FFT buffer for first RE in PRB0
+  uint16_t first_carrier_offset;
+  /// Number of OFDM/SC-FDMA symbols in one slot
+  uint16_t symbols_per_slot;
+  /// Number of slots per subframe
+  uint16_t slots_per_subframe;
+  /// Number of samples in a subframe
+  uint32_t samples_per_subframe;
+  /// Number of samples in a radio frame
+  uint32_t samples_per_frame;
+  /// Number of samples in a subframe without CP
+  uint32_t samples_per_subframe_wCP;
+  /// Number of samples in a radio frame without CP
+  uint32_t samples_per_frame_wCP;
+
+} NR_DL_FRAME_PARMS;
+ */
+
+/// Top-level PHY Data Structure for gNB
+typedef struct PHY_VARS_gNB_s {
+  /// Module ID indicator for this instance
+  module_id_t          Mod_id;
+  uint8_t              CC_id;
+  uint8_t              configured;
+  gNB_proc_t           proc;
+  int                  single_thread_flag;
+  int                  abstraction_flag;
+  int                  num_RU;
+  RU_t                 *RU_list[MAX_NUM_RU_PER_eNB];
+  /// Ethernet parameters for northbound midhaul interface
+  eth_params_t         eth_params_n;
+  /// Ethernet parameters for fronthaul interface
+  eth_params_t         eth_params;
+  int                  rx_total_gain_dB;
+  int                  (*td)(struct PHY_VARS_gNB_s *eNB,int UE_id,int harq_pid,int llr8_flag);
+  int                  (*te)(struct PHY_VARS_gNB_s *,uint8_t *,uint8_t,LTE_eNB_DLSCH_t *,int,uint8_t,time_stats_t *,time_stats_t *,time_stats_t *);
+  int                  (*start_if)(struct RU_t_s *ru,struct PHY_VARS_gNB_s *eNB);
+  uint8_t              local_flag;
+  nfapi_nr_config_request_t  gNB_config;
+  NR_DL_FRAME_PARMS   frame_parms;
+  PHY_MEASUREMENTS_gNB measurements;
+  NR_IF_Module_t          *if_inst;
+  NR_UL_IND_t             UL_INFO;
+  pthread_mutex_t      UL_INFO_mutex;
+  /// NFAPI RX ULSCH information
+  nfapi_rx_indication_pdu_t  rx_pdu_list[NFAPI_RX_IND_MAX_PDU];
+  /// NFAPI RX ULSCH CRC information
+  nfapi_crc_indication_pdu_t crc_pdu_list[NFAPI_CRC_IND_MAX_PDU];
+  /// NFAPI HARQ information
+  nfapi_harq_indication_pdu_t harq_pdu_list[NFAPI_HARQ_IND_MAX_PDU];
+  /// NFAPI SR information
+  nfapi_sr_indication_pdu_t sr_pdu_list[NFAPI_SR_IND_MAX_PDU];
+  /// NFAPI CQI information
+  nfapi_cqi_indication_pdu_t cqi_pdu_list[NFAPI_CQI_IND_MAX_PDU];
+  /// NFAPI CQI information (raw component)
+  nfapi_cqi_indication_raw_pdu_t cqi_raw_pdu_list[NFAPI_CQI_IND_MAX_PDU];
+  /// NFAPI PRACH information
+  nfapi_preamble_pdu_t preamble_list[MAX_NUM_RX_PRACH_PREAMBLES];
+
+  Sched_Rsp_t          Sched_INFO;
+  LTE_eNB_PDCCH        pdcch_vars[2];
+  LTE_eNB_PHICH        phich_vars[2];
+
+  NR_gNB_COMMON       common_vars;
+  LTE_eNB_UCI          uci_vars[NUMBER_OF_UE_MAX];
+  LTE_eNB_SRS          srs_vars[NUMBER_OF_UE_MAX];
+  LTE_eNB_PBCH         pbch;
+  LTE_eNB_PUSCH       *pusch_vars[NUMBER_OF_UE_MAX];
+  LTE_eNB_PRACH        prach_vars;
+  LTE_eNB_DLSCH_t     *dlsch[NUMBER_OF_UE_MAX][2];   // Nusers times two spatial streams
+  LTE_eNB_ULSCH_t     *ulsch[NUMBER_OF_UE_MAX+1];      // Nusers + number of RA
+  LTE_eNB_DLSCH_t     *dlsch_SI,*dlsch_ra,*dlsch_p;
+  LTE_eNB_DLSCH_t     *dlsch_MCH;
+  LTE_eNB_DLSCH_t     *dlsch_PCH;
+  LTE_eNB_UE_stats     UE_stats[NUMBER_OF_UE_MAX];
+  LTE_eNB_UE_stats    *UE_stats_ptr[NUMBER_OF_UE_MAX];
+
+  uint8_t pbch_configured;
+  uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE
+  char gNB_generate_rar;
+
+  /// Indicator set to 0 after first SR
+  uint8_t first_sr[NUMBER_OF_UE_MAX];
+
+  uint32_t max_peak_val;
+
+  /// \brief sinr for all subcarriers of the current link (used only for abstraction).
+  /// first index: ? [0..N_RB_DL*12[
+  double *sinr_dB;
+
+  /// N0 (used for abstraction)
+  double N0;
+
+  unsigned char first_run_timing_advance[NUMBER_OF_UE_MAX];
+  unsigned char first_run_I0_measurements;
+
+  
+  unsigned char    is_secondary_gNB; // primary by default
+  unsigned char    is_init_sync;     /// Flag to tell if initial synchronization is performed. This affects how often the secondary eNB will listen to the PSS from the primary system.
+  unsigned char    has_valid_precoder; /// Flag to tell if secondary eNB has channel estimates to create NULL-beams from, and this B/F vector is created.
+  unsigned char    PgNB_id;          /// id of Primary eNB
+
+  /// hold the precoder for NULL beam to the primary user
+  int              **dl_precoder_SgNB[3];
+  char             log2_maxp; /// holds the maximum channel/precoder coefficient
+
+  /// if ==0 enables phy only test mode
+  int mac_enabled;
+  /// counter to average prach energh over first 100 prach opportunities
+  int prach_energy_counter;
+
+  // PDSCH Varaibles
+  PDSCH_CONFIG_DEDICATED pdsch_config_dedicated[NUMBER_OF_UE_MAX];
+
+  // PUSCH Varaibles
+  PUSCH_CONFIG_DEDICATED pusch_config_dedicated[NUMBER_OF_UE_MAX];
+
+  // PUCCH variables
+  PUCCH_CONFIG_DEDICATED pucch_config_dedicated[NUMBER_OF_UE_MAX];
+
+  // UL-POWER-Control
+  UL_POWER_CONTROL_DEDICATED ul_power_control_dedicated[NUMBER_OF_UE_MAX];
+
+  // TPC
+  TPC_PDCCH_CONFIG tpc_pdcch_config_pucch[NUMBER_OF_UE_MAX];
+  TPC_PDCCH_CONFIG tpc_pdcch_config_pusch[NUMBER_OF_UE_MAX];
+
+  // CQI reporting
+  CQI_REPORT_CONFIG cqi_report_config[NUMBER_OF_UE_MAX];
+
+  // SRS Variables
+  SOUNDINGRS_UL_CONFIG_DEDICATED soundingrs_ul_config_dedicated[NUMBER_OF_UE_MAX];
+  uint8_t ncs_cell[20][7];
+
+  // Scheduling Request Config
+  SCHEDULING_REQUEST_CONFIG scheduling_request_config[NUMBER_OF_UE_MAX];
+
+  // Transmission mode per UE
+  uint8_t transmission_mode[NUMBER_OF_UE_MAX];
+
+  /// cba_last successful reception for each group, used for collision detection
+  uint8_t cba_last_reception[4];
+
+  // Pointers for active physicalConfigDedicated to be applied in current subframe
+  struct PhysicalConfigDedicated *physicalConfigDedicated[NUMBER_OF_UE_MAX];
+
+
+  uint32_t rb_mask_ul[4];
+
+  /// Information regarding TM5
+  MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
+
+
+  /// target_ue_dl_mcs : only for debug purposes
+  uint32_t target_ue_dl_mcs;
+  /// target_ue_ul_mcs : only for debug purposes
+  uint32_t target_ue_ul_mcs;
+  /// target_ue_dl_rballoc : only for debug purposes
+  uint32_t ue_dl_rb_alloc;
+  /// target ul PRBs : only for debug
+  uint32_t ue_ul_nb_rb;
+
+  ///check for Total Transmissions
+  uint32_t check_for_total_transmissions;
+
+  ///check for MU-MIMO Transmissions
+  uint32_t check_for_MUMIMO_transmissions;
+
+  ///check for SU-MIMO Transmissions
+  uint32_t check_for_SUMIMO_transmissions;
+
+  ///check for FULL MU-MIMO Transmissions
+  uint32_t  FULL_MUMIMO_transmissions;
+
+  /// Counter for total bitrate, bits and throughput in downlink
+  uint32_t total_dlsch_bitrate;
+  uint32_t total_transmitted_bits;
+  uint32_t total_system_throughput;
+
+  int hw_timing_advance;
+
+  time_stats_t phy_proc;
+  time_stats_t phy_proc_tx;
+  time_stats_t phy_proc_rx;
+  time_stats_t rx_prach;
+
+  time_stats_t ofdm_mod_stats;
+  time_stats_t dlsch_encoding_stats;
+  time_stats_t dlsch_modulation_stats;
+  time_stats_t dlsch_scrambling_stats;
+  time_stats_t dlsch_rate_matching_stats;
+  time_stats_t dlsch_turbo_encoding_stats;
+  time_stats_t dlsch_interleaving_stats;
+
+  time_stats_t rx_dft_stats;
+  time_stats_t ulsch_channel_estimation_stats;
+  time_stats_t ulsch_freq_offset_estimation_stats;
+  time_stats_t ulsch_decoding_stats;
+  time_stats_t ulsch_demodulation_stats;
+  time_stats_t ulsch_rate_unmatching_stats;
+  time_stats_t ulsch_turbo_decoding_stats;
+  time_stats_t ulsch_deinterleaving_stats;
+  time_stats_t ulsch_demultiplexing_stats;
+  time_stats_t ulsch_llr_stats;
+  time_stats_t ulsch_tc_init_stats;
+  time_stats_t ulsch_tc_alpha_stats;
+  time_stats_t ulsch_tc_beta_stats;
+  time_stats_t ulsch_tc_gamma_stats;
+  time_stats_t ulsch_tc_ext_stats;
+  time_stats_t ulsch_tc_intl1_stats;
+  time_stats_t ulsch_tc_intl2_stats;
+
+#ifdef LOCALIZATION
+  /// time state for localization
+  time_stats_t localization_stats;
+#endif
+
+  int32_t pucch1_stats_cnt[NUMBER_OF_UE_MAX][10];
+  int32_t pucch1_stats[NUMBER_OF_UE_MAX][10*1024];
+  int32_t pucch1_stats_thres[NUMBER_OF_UE_MAX][10*1024];
+  int32_t pucch1ab_stats_cnt[NUMBER_OF_UE_MAX][10];
+  int32_t pucch1ab_stats[NUMBER_OF_UE_MAX][2*10*1024];
+  int32_t pusch_stats_rb[NUMBER_OF_UE_MAX][10240];
+  int32_t pusch_stats_round[NUMBER_OF_UE_MAX][10240];
+  int32_t pusch_stats_mcs[NUMBER_OF_UE_MAX][10240];
+  int32_t pusch_stats_bsr[NUMBER_OF_UE_MAX][10240];
+  int32_t pusch_stats_BO[NUMBER_OF_UE_MAX][10240];
+} PHY_VARS_gNB;
+
+/// Context data structure for RX/TX portion of subframe processing
+typedef struct {
+  /// Component Carrier index
+  uint8_t              CC_id;
+  /// timestamp transmitted to HW
+  openair0_timestamp timestamp_tx;
+  /// subframe to act upon for transmission
+  int subframe_tx;
+  /// subframe to act upon for reception
+  int subframe_rx;
+  /// frame to act upon for transmission
+  int frame_tx;
+  /// frame to act upon for reception
+  int frame_rx;
+  /// \brief Instance count for RXn-TXnp4 processing thread.
+  /// \internal This variable is protected by \ref mutex_rxtx.
+  int instance_cnt_rxtx;
+  /// pthread structure for RXn-TXnp4 processing thread
+  pthread_t pthread_rxtx;
+  /// pthread attributes for RXn-TXnp4 processing thread
+  pthread_attr_t attr_rxtx;
+  /// condition variable for tx processing thread
+  pthread_cond_t cond_rxtx;
+  /// mutex for RXn-TXnp4 processing thread
+  pthread_mutex_t mutex_rxtx;
+  /// scheduling parameters for RXn-TXnp4 thread
+  struct sched_param sched_param_rxtx;
+} gNB_rxtx_proc_t;
+
+
+/// Context data structure for eNB subframe processing
+typedef struct gNB_proc_t_s {
+  /// Component Carrier index
+  uint8_t              CC_id;
+  /// thread index
+  int thread_index;
+  /// timestamp received from HW
+  openair0_timestamp timestamp_rx;
+  /// timestamp to send to "slave rru"
+  openair0_timestamp timestamp_tx;
+  /// subframe to act upon for reception
+  int subframe_rx;
+  /// subframe to act upon for PRACH
+  int subframe_prach;
+  /// frame to act upon for reception
+  int frame_rx;
+  /// frame to act upon for transmission
+  int frame_tx;
+  /// frame to act upon for PRACH
+  int frame_prach;
+  /// \internal This variable is protected by \ref mutex_td.
+  int instance_cnt_td;
+  /// \internal This variable is protected by \ref mutex_te.
+  int instance_cnt_te;
+  /// \internal This variable is protected by \ref mutex_prach.
+  int instance_cnt_prach;
+
+  // instance count for over-the-air gNB synchronization
+  int instance_cnt_synch;
+  /// \internal This variable is protected by \ref mutex_asynch_rxtx.
+  int instance_cnt_asynch_rxtx;
+  /// pthread structure for eNB single processing thread
+  pthread_t pthread_single;
+  /// pthread structure for asychronous RX/TX processing thread
+  pthread_t pthread_asynch_rxtx;
+  /// flag to indicate first RX acquisition
+  int first_rx;
+  /// flag to indicate first TX transmission
+  int first_tx;
+  /// pthread attributes for parallel turbo-decoder thread
+  pthread_attr_t attr_td;
+  /// pthread attributes for parallel turbo-encoder thread
+  pthread_attr_t attr_te;
+  /// pthread attributes for single eNB processing thread
+  pthread_attr_t attr_single;
+  /// pthread attributes for prach processing thread
+  pthread_attr_t attr_prach;
+  /// pthread attributes for asynchronous RX thread
+  pthread_attr_t attr_asynch_rxtx;
+  /// scheduling parameters for parallel turbo-decoder thread
+  struct sched_param sched_param_td;
+  /// scheduling parameters for parallel turbo-encoder thread
+  struct sched_param sched_param_te;
+  /// scheduling parameters for single eNB thread
+  struct sched_param sched_param_single;
+  /// scheduling parameters for prach thread
+  struct sched_param sched_param_prach;
+  /// scheduling parameters for asynch_rxtx thread
+  struct sched_param sched_param_asynch_rxtx;
+  /// pthread structure for parallel turbo-decoder thread
+  pthread_t pthread_td;
+  /// pthread structure for parallel turbo-encoder thread
+  pthread_t pthread_te;
+  /// pthread structure for PRACH thread
+  pthread_t pthread_prach;
+  /// condition variable for parallel turbo-decoder thread
+  pthread_cond_t cond_td;
+  /// condition variable for parallel turbo-encoder thread
+  pthread_cond_t cond_te;
+  /// condition variable for PRACH processing thread;
+  pthread_cond_t cond_prach;
+  /// condition variable for asynch RX/TX thread
+  pthread_cond_t cond_asynch_rxtx;
+  /// mutex for parallel turbo-decoder thread
+  pthread_mutex_t mutex_td;
+  /// mutex for parallel turbo-encoder thread
+  pthread_mutex_t mutex_te;
+  /// mutex for PRACH thread
+  pthread_mutex_t mutex_prach;
+  /// mutex for asynch RX/TX thread
+  pthread_mutex_t mutex_asynch_rxtx;
+  /// mutex for RU access to eNB processing (PDSCH/PUSCH)
+  pthread_mutex_t mutex_RU;
+  /// mutex for RU access to eNB processing (PRACH)
+  pthread_mutex_t mutex_RU_PRACH;
+  /// mutex for RU access to eNB processing (PRACH BR)
+  pthread_mutex_t mutex_RU_PRACH_br;
+  /// mask for RUs serving eNB (PDSCH/PUSCH)
+  int RU_mask;
+  /// mask for RUs serving eNB (PRACH)
+  int RU_mask_prach;
+  /// parameters for turbo-decoding worker thread
+  td_params tdp;
+  /// parameters for turbo-encoding worker thread
+  te_params tep;
+  /// set of scheduling variables RXn-TXnp4 threads
+  gNB_rxtx_proc_t proc_rxtx[2];
+} gNB_proc_t;
+
+typedef struct {
+  // common measurements
+  //! estimated noise power (linear)
+  unsigned int   n0_power[MAX_NUM_RU_PER_eNB];
+  //! estimated noise power (dB)
+  unsigned short n0_power_dB[MAX_NUM_RU_PER_eNB];
+  //! total estimated noise power (linear)
+  unsigned int   n0_power_tot;
+  //! estimated avg noise power (dB)
+  unsigned short n0_power_tot_dB;
+  //! estimated avg noise power (dB)
+  short n0_power_tot_dBm;
+  //! estimated avg noise power per RB per RX ant (lin)
+  unsigned short n0_subband_power[MAX_NUM_RU_PER_eNB][100];
+  //! estimated avg noise power per RB per RX ant (dB)
+  unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_eNB][100];
+  //! estimated avg noise power per RB (dB)
+  short n0_subband_power_tot_dB[100];
+  //! estimated avg noise power per RB (dBm)
+  short n0_subband_power_tot_dBm[100];
+  // gNB measurements (per user)
+  //! estimated received spatial signal power (linear)
+  unsigned int   rx_spatial_power[NUMBER_OF_UE_MAX][2][2];
+  //! estimated received spatial signal power (dB)
+  unsigned short rx_spatial_power_dB[NUMBER_OF_UE_MAX][2][2];
+  //! estimated rssi (dBm)
+  short          rx_rssi_dBm[NUMBER_OF_UE_MAX];
+  //! estimated correlation (wideband linear) between spatial channels (computed in dlsch_demodulation)
+  int            rx_correlation[NUMBER_OF_UE_MAX][2];
+  //! estimated correlation (wideband dB) between spatial channels (computed in dlsch_demodulation)
+  int            rx_correlation_dB[NUMBER_OF_UE_MAX][2];
+
+  /// Wideband CQI (= SINR)
+  int            wideband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB];
+  /// Wideband CQI in dB (= SINR dB)
+  int            wideband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB];
+  /// Wideband CQI (sum of all RX antennas, in dB)
+  char           wideband_cqi_tot[NUMBER_OF_UE_MAX];
+  /// Subband CQI per RX antenna and RB (= SINR)
+  int            subband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB][100];
+  /// Total Subband CQI and RB (= SINR)
+  int            subband_cqi_tot[NUMBER_OF_UE_MAX][100];
+  /// Subband CQI in dB and RB (= SINR dB)
+  int            subband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB][100];
+  /// Total Subband CQI and RB
+  int            subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100];
+  /// PRACH background noise level
+  int            prach_I0;
+} PHY_MEASUREMENTS_gNB;
+
+
+#endif
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index 91d0791b835b34a1ddb271d650d8c6554746f08b..064cf07544a1a15fe76eff71150f883caf07ce43 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -53,9 +53,12 @@
 #define ONE_OVER_SQRT2_Q15 23170
 #define ONE_OVER_TWO_Q15 16384
 
-#define NR_MOD_TABLE_SIZE_SHORT 14
+#define NR_MOD_TABLE_SIZE_SHORT 686
 #define NR_MOD_TABLE_BPSK_OFFSET 1
 #define NR_MOD_TABLE_QPSK_OFFSET 3
+#define NR_MOD_TABLE_QAM16_OFFSET 7
+#define NR_MOD_TABLE_QAM64_OFFSET 23
+#define NR_MOD_TABLE_QAM256_OFFSET 87
 
 #define NR_PSS_LENGTH 127
 #define NR_SSS_LENGTH 127
diff --git a/openair1/PHY/phy_extern.h b/openair1/PHY/phy_extern.h
index fe888c8d2e51dae350fa521188d6861412eb5078..623a4bb0c615309274e9b8f13047939692051a4b 100644
--- a/openair1/PHY/phy_extern.h
+++ b/openair1/PHY/phy_extern.h
@@ -38,6 +38,7 @@ extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX];
 extern unsigned int DAQ_MBOX;
 extern int number_of_cards;
 
+extern short conjugate[8],conjugate2[8];
 
 #ifndef OCP_FRAMEWORK
 //extern PHY_VARS_eNB ***PHY_vars_eNB_g;
diff --git a/openair1/PHY/phy_extern_nr_ue.h b/openair1/PHY/phy_extern_nr_ue.h
index 4636f7739aa90dc06d6d7fb56f1bd48eecfd5d4d..5f9d91df5fe5efbb1b135e235fded6292bf8adf0 100644
--- a/openair1/PHY/phy_extern_nr_ue.h
+++ b/openair1/PHY/phy_extern_nr_ue.h
@@ -19,8 +19,8 @@
  *      contact@openairinterface.org
  */
 
-#ifndef __PHY_EXTERN_UE__H__
-#define __PHY_EXTERN_UE__H__
+#ifndef __PHY_EXTERN_NR_UE__H__
+#define __PHY_EXTERN_NR_UE__H__
 
 #include "PHY/defs_nr_UE.h"
 //#include "common/ran_context.h"
diff --git a/openair1/PHY/phy_extern_ue.h b/openair1/PHY/phy_extern_ue.h
index 8ae424f5f7b42fa5394f7d9441291c24885946dc..596686f261a31a64aa93572a2956e03aa55be465 100644
--- a/openair1/PHY/phy_extern_ue.h
+++ b/openair1/PHY/phy_extern_ue.h
@@ -36,6 +36,7 @@ extern unsigned int TX_DMA_BUFFER[4][NB_ANTENNAS_TX];
 
 extern int number_of_cards;
 
+extern short conjugate[8],conjugate2[8];
 
 #ifndef OCP_FRAMEWORK
 extern PHY_VARS_UE ***PHY_vars_UE_g;
diff --git a/openair1/PHY/phy_vars.h b/openair1/PHY/phy_vars.h
index ebc6fc1c9f62d11d00e72bbaae16070c501ed991..65ae68b7844eb5650b26a032738507104a290d4a 100644
--- a/openair1/PHY/phy_vars.h
+++ b/openair1/PHY/phy_vars.h
@@ -61,7 +61,8 @@ unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048]
 
 char mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
 
-
+short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 
 #include "SIMULATION/ETH_TRANSPORT/vars.h"
diff --git a/openair1/PHY/phy_vars_nr_ue.h b/openair1/PHY/phy_vars_nr_ue.h
index 04522d56b57784c10f6a8aa107a74004ecaa32ac..55a2c65cce3d1ce52825f933a67284089ebe38a8 100644
--- a/openair1/PHY/phy_vars_nr_ue.h
+++ b/openair1/PHY/phy_vars_nr_ue.h
@@ -57,6 +57,8 @@ unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048]
 
 char mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
 
+short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 
 #include "SIMULATION/ETH_TRANSPORT/vars.h"
diff --git a/openair1/PHY/phy_vars_ue.h b/openair1/PHY/phy_vars_ue.h
index 79448164d33bac6ab6c7e4bc68dac788051a233d..cbcf6d0ad85b3ce0ebf7d987b90b531e5baad8f5 100644
--- a/openair1/PHY/phy_vars_ue.h
+++ b/openair1/PHY/phy_vars_ue.h
@@ -56,6 +56,8 @@ unsigned short rev256[256],rev512[512],rev1024[1024],rev4096[4096],rev2048[2048]
 
 char mode_string[4][20] = {"NOT SYNCHED","PRACH","RAR","PUSCH"};
 
+short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
+short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
 
 
 #include "SIMULATION/ETH_TRANSPORT/vars.h"
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index b6e1a95a82a35f9eadd09e628b28ab4d1fef3763..e6fda71d39b9ae4f4ae92eb759092ce9418ec688 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -42,8 +42,8 @@ void handle_nr_nfapi_bch_pdu(PHY_VARS_gNB *gNB,
                              uint8_t *sdu)
 {
 
-  AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel15.length == 3, "BCH PDU has length %d != 3\n",
-              dl_config_pdu->bch_pdu.bch_pdu_rel15.length);
+  AssertFatal(dl_config_pdu->bch_pdu_rel15.length == 3, "BCH PDU has length %d != 3\n",
+              dl_config_pdu->bch_pdu_rel15.length);
 
   LOG_I(PHY,"pbch_pdu[0]: %x,pbch_pdu[1]: %x,gNB->pbch_pdu[2]: %x\n",sdu[0],sdu[1],sdu[2]);
   gNB->pbch_pdu[0] = sdu[2];
@@ -108,9 +108,9 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
     //LOG_D(PHY,"NFAPI: dl_pdu %d : type %d\n",i,dl_config_pdu->pdu_type);
     switch (dl_config_pdu->pdu_type) {
       case NFAPI_NR_DL_CONFIG_BCH_PDU_TYPE:
-        AssertFatal(dl_config_pdu->bch_pdu.bch_pdu_rel15.pdu_index < TX_req->tx_request_body.number_of_pdus,
+        AssertFatal(dl_config_pdu->bch_pdu_rel15.pdu_index < TX_req->tx_request_body.number_of_pdus,
                     "bch_pdu_rel8.pdu_index>=TX_req->number_of_pdus (%d>%d)\n",
-                    dl_config_pdu->bch_pdu.bch_pdu_rel15.pdu_index,
+                    dl_config_pdu->bch_pdu_rel15.pdu_index,
                     TX_req->tx_request_body.number_of_pdus);
         gNB->pbch_configured=1;
         do_oai=1;
@@ -118,7 +118,7 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
         handle_nr_nfapi_bch_pdu(gNB,
                                 proc,
                                 dl_config_pdu,
-                                TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu.bch_pdu_rel15.pdu_index].segments[0].segment_data);
+                                TX_req->tx_request_body.tx_pdu_list[dl_config_pdu->bch_pdu_rel15.pdu_index].segments[0].segment_data);
       break;
 
       case NFAPI_NR_DL_CONFIG_DCI_DL_PDU_TYPE:
diff --git a/openair1/SCHED_NR/sched_nr.h b/openair1/SCHED_NR/sched_nr.h
index 1e27c926f1ce2b07dac1a3ea3b18354c93951c4a..f962575a2a18250ccae87c73d4d5366586228e00 100644
--- a/openair1/SCHED_NR/sched_nr.h
+++ b/openair1/SCHED_NR/sched_nr.h
@@ -37,6 +37,7 @@
 lte_subframe_t nr_subframe_select (nfapi_nr_config_request_t *cfg, unsigned char subframe);
 void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PARMS *fp);
 void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB, gNB_rxtx_proc_t *proc, int do_meas);
+void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe);
 void nr_init_feptx_thread(RU_t *ru,pthread_attr_t *attr_feptx);
 void nr_feptx_ofdm(RU_t *ru);
 void nr_feptx_ofdm_2thread(RU_t *ru);
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
new file mode 100644
index 0000000000000000000000000000000000000000..1d9151030449ac7ec9f16f8c72d5a75af1803625
--- /dev/null
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -0,0 +1,486 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#include <string.h>
+#include <math.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+
+#include "SIMULATION/TOOLS/sim.h"
+#include "SIMULATION/RF/rf.h"
+#include "PHY/types.h"
+#include "PHY/defs_nr_common.h"
+#include "PHY/defs_nr_UE.h"
+#include "PHY/defs_gNB.h"
+
+#include "PHY/INIT/phy_init.h"
+#include "SCHED_NR/sched_nr.h"
+
+#include "PHY/MODULATION/modulation_common.h"
+
+#include "common/ran_context.h" 
+
+PHY_VARS_gNB *gNB;
+PHY_VARS_NR_UE *UE;
+RAN_CONTEXT_t RC;
+
+
+double cpuf;
+
+// dummy functions
+int nfapi_mode=0;
+int oai_nfapi_hi_dci0_req(nfapi_hi_dci0_request_t *hi_dci0_req) { return(0);}
+int oai_nfapi_tx_req(nfapi_tx_request_t *tx_req) { return(0); }
+
+int oai_nfapi_dl_config_req(nfapi_dl_config_request_t *dl_config_req) { return(0); }
+
+int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { return(0); }
+
+int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) {return(0);}
+
+uint32_t from_earfcn(int eutra_bandP,uint32_t dl_earfcn) {return(0);}
+int32_t get_uldl_offset(int eutra_bandP) {return(0);}
+
+NR_IF_Module_t *NR_IF_Module_init(int Mod_id){return(NULL);}
+
+void exit_fun(const char *s) { exit(-1); }
+
+// needed for some functions
+PHY_VARS_NR_UE * PHY_vars_UE_g[1][1]={NULL};
+
+int main(int argc, char **argv)
+{
+
+  char c;
+
+  int i,l,aa;
+  double sigma2, sigma2_dB=10,SNR,snr0=-2.0,snr1=2.0;
+  uint8_t snr1set=0;
+  int **txdata;
+  double **s_re,**s_im,**r_re,**r_im;
+  double iqim = 0.0;
+  unsigned char pbch_pdu[6];
+  //  int sync_pos, sync_pos_slot;
+  //  FILE *rx_frame_file;
+  FILE *output_fd = NULL;
+  uint8_t write_output_file=0;
+  //int result;
+  int freq_offset;
+  //  int subframe_offset;
+  //  char fname[40], vname[40];
+  int trial,n_trials=1,n_errors,n_errors2,n_alamouti;
+  uint8_t transmission_mode = 1,n_tx=1,n_rx=1;
+  uint16_t Nid_cell=0;
+
+  channel_desc_t *gNB2UE;
+  uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0;
+  uint8_t extended_prefix_flag=0;
+  int8_t interf1=-21,interf2=-21;
+
+  FILE *input_fd=NULL,*pbch_file_fd=NULL;
+  char input_val_str[50],input_val_str2[50];
+
+  uint8_t frame_mod4,num_pdcch_symbols = 0;
+  uint16_t NB_RB=25;
+
+  SCM_t channel_model=AWGN;//Rayleigh1_anticorr;
+
+  double pbch_sinr;
+  int pbch_tx_ant;
+  uint8_t N_RB_DL=106,mu=1;
+
+  unsigned char frame_type = 0;
+  unsigned char pbch_phase = 0;
+
+  int frame=0,subframe=0;
+  int frame_length_complex_samples;
+  int frame_length_complex_samples_no_prefix;
+  NR_DL_FRAME_PARMS *frame_parms;
+  nfapi_nr_config_request_t *gNB_config;
+
+  int ret;
+  
+  cpuf = get_cpu_freq_GHz();
+
+  if ( load_configmodule(argc,argv) == 0) {
+    exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
+  }
+
+  logInit();
+  randominit(0);
+
+  while ((c = getopt (argc, argv, "f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:dP:")) != -1) {
+    switch (c) {
+    case 'f':
+      write_output_file=1;
+      output_fd = fopen(optarg,"w");
+
+      if (output_fd==NULL) {
+        printf("Error opening %s\n",optarg);
+        exit(-1);
+      }
+
+      break;
+
+    case 'd':
+      frame_type = 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:
+        msg("Unsupported channel model!\n");
+        exit(-1);
+      }
+
+      break;
+
+    case 'i':
+      interf1=atoi(optarg);
+      break;
+
+    case 'j':
+      interf2=atoi(optarg);
+      break;
+
+    case 'n':
+      n_trials = atoi(optarg);
+      break;
+
+    case 's':
+      snr0 = atof(optarg);
+      msg("Setting SNR0 to %f\n",snr0);
+      break;
+
+    case 'S':
+      snr1 = atof(optarg);
+      snr1set=1;
+      msg("Setting SNR1 to %f\n",snr1);
+      break;
+
+      /*
+      case 't':
+      Td= atof(optarg);
+      break;
+      */
+    case 'p':
+      extended_prefix_flag=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);
+
+      if ((transmission_mode!=1) &&
+          (transmission_mode!=2) &&
+          (transmission_mode!=6)) {
+        msg("Unsupported transmission mode %d\n",transmission_mode);
+        exit(-1);
+      }
+
+      break;
+
+    case 'y':
+      n_tx=atoi(optarg);
+
+      if ((n_tx==0) || (n_tx>2)) {
+        msg("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)) {
+        msg("Unsupported number of rx antennas %d\n",n_rx);
+        exit(-1);
+      }
+
+      break;
+
+    case 'N':
+      Nid_cell = atoi(optarg);
+      break;
+
+    case 'R':
+      N_RB_DL = atoi(optarg);
+      break;
+
+    case 'F':
+      input_fd = fopen(optarg,"r");
+
+      if (input_fd==NULL) {
+        printf("Problem with filename %s\n",optarg);
+        exit(-1);
+      }
+
+      break;
+
+    case 'P':
+      pbch_phase = atoi(optarg);
+
+      if (pbch_phase>3)
+        printf("Illegal PBCH phase (0-3) got %d\n",pbch_phase);
+
+      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("-h This message\n");
+      printf("-p Use extended prefix mode\n");
+      printf("-d Use TDD\n");
+      printf("-n Number of frames to simulate\n");
+      printf("-s Starting SNR, runs from SNR0 to SNR0 + 5 dB.  If n_frames is 1 then just SNR is simulated\n");
+      printf("-S Ending SNR, runs from SNR0 to SNR1\n");
+      printf("-t Delay spread for multipath channel\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("-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("-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("-N Nid_cell\n");
+      printf("-R N_RB_DL\n");
+      printf("-O oversampling factor (1,2,4,8,16)\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 Output filename (.txt format) for Pe/SNR results\n");
+      printf("-F Input filename (.txt format) for RX conformance testing\n");
+      exit (-1);
+      break;
+    }
+  }
+
+  if (snr1set==0)
+    snr1 = snr0+10;
+
+  gNB2UE = new_channel_desc_scm(n_tx,
+                                n_rx,
+                                channel_model,
+ 				61.44e6, //N_RB2sampling_rate(N_RB_DL),
+				40e6, //N_RB2channel_bandwidth(N_RB_DL),
+                                0,
+                                0,
+                                0);
+
+  if (gNB2UE==NULL) {
+    msg("Problem generating channel model. Exiting.\n");
+    exit(-1);
+  }
+
+  RC.gNB = (PHY_VARS_gNB***) malloc(sizeof(PHY_VARS_gNB **));
+  RC.gNB[0] = (PHY_VARS_gNB**) malloc(sizeof(PHY_VARS_gNB *));
+  RC.gNB[0][0] = malloc(sizeof(PHY_VARS_gNB));
+  gNB = RC.gNB[0][0];
+  gNB_config = &gNB->gNB_config;
+  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;
+
+  nr_phy_config_request_sim(gNB);
+  phy_init_nr_gNB(gNB,0,0);
+
+  frame_length_complex_samples = frame_parms->samples_per_subframe;
+  frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP;
+
+  s_re = malloc(2*sizeof(double*));
+  s_im = malloc(2*sizeof(double*));
+  r_re = malloc(2*sizeof(double*));
+  r_im = malloc(2*sizeof(double*));
+  txdata = malloc(2*sizeof(int*));
+
+  for (i=0; i<2; i++) {
+
+    s_re[i] = malloc(frame_length_complex_samples*sizeof(double));
+    bzero(s_re[i],frame_length_complex_samples*sizeof(double));
+    s_im[i] = malloc(frame_length_complex_samples*sizeof(double));
+    bzero(s_im[i],frame_length_complex_samples*sizeof(double));
+
+    r_re[i] = malloc(frame_length_complex_samples*sizeof(double));
+    bzero(r_re[i],frame_length_complex_samples*sizeof(double));
+    r_im[i] = malloc(frame_length_complex_samples*sizeof(double));
+    bzero(r_im[i],frame_length_complex_samples*sizeof(double));
+
+    txdata[i] = malloc(frame_length_complex_samples*sizeof(int));
+    bzero(r_re[i],frame_length_complex_samples*sizeof(int));
+  
+  }
+
+  if (pbch_file_fd!=NULL) {
+    load_pbch_desc(pbch_file_fd);
+  }
+
+
+  //configure UE
+  UE = malloc(sizeof(PHY_VARS_NR_UE));
+  memcpy(&UE->frame_parms,frame_parms,sizeof(NR_DL_FRAME_PARMS));
+  phy_init_nr_top(frame_parms);
+  if (init_nr_ue_signal(UE, 1, 0) != 0)
+  {
+    printf("Error at UE NR initialisation\n");
+    exit(-1);
+  }
+
+
+  // generate signal
+  if (input_fd==NULL) {
+    nr_common_signal_procedures (gNB,frame,subframe);
+  }
+
+  LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,1);
+  if (gNB->frame_parms.nb_antennas_tx>1)
+    LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);
+
+  //TODO: loop over slots
+  for (aa=0; aa<gNB->frame_parms.nb_antennas_tx; aa++) {
+    if (gNB_config->subframe_config.dl_cyclic_prefix_type.value == 1) {
+      PHY_ofdm_mod(gNB->common_vars.txdataF[aa],
+		   txdata[aa],
+		   frame_parms->ofdm_symbol_size,
+		   12,
+		   frame_parms->nb_prefix_samples,
+		   CYCLIC_PREFIX);
+    } else {
+      nr_normal_prefix_mod(gNB->common_vars.txdataF[aa],
+			   txdata[aa],
+			   14,
+			   frame_parms);
+    }
+  }
+
+  LOG_M("txsig0.m","txs0", txdata[0],frame_length_complex_samples,1,1);
+  if (gNB->frame_parms.nb_antennas_tx>1)
+    LOG_M("txsig1.m","txs1", txdata[1],frame_length_complex_samples,1,1);
+
+
+  for (i=0; i<frame_length_complex_samples; i++) {
+    for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+      r_re[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)]);
+      r_im[aa][i] = ((double)(((short *)txdata[aa]))[(i<<1)+1]);
+      }
+    }
+  
+  for (SNR=snr0; SNR<snr1; SNR+=.2) {
+
+    n_errors = 0;
+    n_errors2 = 0;
+    n_alamouti = 0;
+
+    for (trial=0; trial<n_trials; trial++) {
+
+      // multipath channel
+      //multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
+      
+      //AWGN
+      sigma2_dB = SNR;
+      sigma2 = pow(10,sigma2_dB/10);
+      for (i=0; i<frame_length_complex_samples; i++) {
+	for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
+	  
+	  ((short*) UE->common_vars.rxdata[aa])[2*i] = (short) ((r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+	  ((short*) UE->common_vars.rxdata[aa])[2*i+1] = (short) ((r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+	}
+      }
+
+      if (n_trials==1) {
+	LOG_M("rxsig0.m","rxs0", UE->common_vars.rxdata[0],frame_length_complex_samples,1,1);
+	if (gNB->frame_parms.nb_antennas_tx>1)
+	  LOG_M("rxsig1.m","rxs1", UE->common_vars.rxdata[1],frame_length_complex_samples,1,1);
+      }
+
+      ret = nr_initial_sync(UE, normal_txrx);
+      printf("nr_initial_sync1 returns %d\n",ret);
+      
+    } //noise trials
+
+    printf("SNR %f : n_errors = %d/%d\n", SNR,n_errors,n_trials);
+
+    if (n_trials==1)
+      break;
+
+  } // NSR
+
+  for (i=0; i<2; i++) {
+    free(s_re[i]);
+    free(s_im[i]);
+    free(r_re[i]);
+    free(r_im[i]);
+    free(txdata[i]);
+  }
+
+  free(s_re);
+  free(s_im);
+  free(r_re);
+  free(r_im);
+  free(txdata);
+
+  if (write_output_file)
+    fclose(output_fd);
+
+  return(n_errors);
+
+}
+
+
+
diff --git a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c
index f1913f0371815b07641f2902c54499fea4a83f33..fc5360848c7ee95ac72bba77acd9dc0593bd1956 100644
--- a/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c
+++ b/openair1/SIMULATION/NR_UE_PHY/unit_tests/src/pbch_test.c
@@ -39,9 +39,10 @@ typedef int nfapi_nr_pfcch_commonSearchSpaces_t;
 #include "../nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h"
 
 #include "PHY/defs_nr_UE.h"
-#include "PHY/INIT/init_extern.h"
 #include "PHY/phy_extern_nr_ue.h"
-#include "PHY/NR_TRANSPORT/nr_transport.h"
+#include "PHY/INIT/init_extern.h"
+#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
+#include "PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h"
 
 #include "PHY/NR_REFSIG/ss_pbch_nr.h"
 #include "PHY/NR_REFSIG/pss_nr.h"
@@ -222,7 +223,7 @@ void set_sequence_sss(PHY_VARS_NR_UE *PHY_vars_UE, int offset, int slot_offset)
   }
 #else
 
-  insert_sss_nr(&tmp, frame_parms);
+ insert_sss_nr(tmp, frame_parms);
 
 #endif
 }
@@ -393,7 +394,7 @@ int main(int argc, char *argv[])
   int size_test_position;
 
   /* this is a pointer to the function in charge of the test */
-  int (*p_test_synchro_pss_sss)(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int sequence_number, test_t *test) = test_synchro_pss_sss;
+  int (*p_test_synchro_pss_sss)(PHY_VARS_NR_UE *PHY_vars_UE, int position_symbol, int sequence_number) = test_synchro_pss_sss_nr;
 
 #if 0
   int Nid_cell[] = { (3*0+0), (3*71+0), (3*21+2), (3*21+2), (3*55+1), (3*111+2) };
@@ -413,21 +414,19 @@ int main(int argc, char *argv[])
   size_test_position = sizeof(test_position)/sizeof(int);
 
   printf("***********************************\n");
-  printf("    %s Test NR synchronisation \n", test.test_current);
+  printf("    %s Test NR synchroisation \n", test.test_current);
   printf("***********************************\n");
 
   for (unsigned int index = 0; index < (sizeof(Nid_cell)/sizeof(int)); index++) {
 
-    PHY_vars_eNB->frame_parms.Nid_cell = Nid_cell[index];
-
-    Nid2 = GET_NID2(PHY_vars_eNB->frame_parms.Nid_cell);
-    Nid1 = GET_NID1(PHY_vars_eNB->frame_parms.Nid_cell);
+    Nid2 = GET_NID2(Nid_cell[index]);
+    Nid1 = GET_NID1(Nid_cell[index]);
 
     for (int position = 0; position < size_test_position; position++) {
 
       PHY_vars_UE->frame_parms.Nid_cell = (3 * N_ID_1_NUMBER) + N_ID_2_NUMBER; /* set to unvalid value */
 
-      decoded_pbch = (*p_test_synchro_pss_sss)(PHY_vars_UE, test_position[position], Nid2, &test); /* return phase index which gives phase error from an array */
+      decoded_pbch = (*p_test_synchro_pss_sss)(PHY_vars_UE, test_position[position], Nid2); /* return phase index which gives phase error from an array */
 
       test.number_of_tests++;
       printf("\n%s ", test.test_current);
diff --git a/openair1/SIMULATION/TOOLS/sim.h b/openair1/SIMULATION/TOOLS/sim.h
index bde7b9250633858f8e628a0230d66dc7cfe0d197..1cfc096a33b953a2047ae15533e984df8c464a4f 100644
--- a/openair1/SIMULATION/TOOLS/sim.h
+++ b/openair1/SIMULATION/TOOLS/sim.h
@@ -398,7 +398,7 @@ void multipath_tv_channel(channel_desc_t *desc,
 double N_RB2sampling_rate(uint16_t N_RB);
 double N_RB2channel_bandwidth(uint16_t N_RB);
 
-#include "targets/RT/USER/rfsim.h"
+//#include "targets/RT/USER/rfsim.h"
 
 void do_DL_sig(sim_t *sim,
                uint16_t subframe,
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index e6283e9cd44dbf3f2749495bfb379e5974c127ce..ca41f2dc6c272240faca69546632af80a70517b2 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -624,7 +624,7 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
   paramdef_t GNBParams[]  = GNBPARAMS_DESC;
   paramlist_def_t GNBParamList = {GNB_CONFIG_STRING_GNB_LIST,NULL,0};
   ////////// Physical parameters
-  //checkedparam_t config_check_CCparams[] = NRCCPARAMS_CHECK;
+  checkedparam_t config_check_CCparams[] = NRCCPARAMS_CHECK;
   paramdef_t CCsParams[] = NRCCPARAMS_DESC;
   paramlist_def_t CCsParamList = {GNB_CONFIG_STRING_COMPONENT_CARRIERS,NULL,0};
   
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 85530e984191d5a2b647c44b611db4ee12b0c74e..95f685a536851d5eb07e614b12d562538cc32a08 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -97,10 +97,10 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t subfram
       memset((void *) dl_config_pdu, 0,sizeof(nfapi_nr_dl_config_request_pdu_t));
       dl_config_pdu->pdu_type      = NFAPI_NR_DL_CONFIG_BCH_PDU_TYPE;
       dl_config_pdu->pdu_size      =2 + sizeof(nfapi_nr_dl_config_bch_pdu_rel15_t);
-      dl_config_pdu->bch_pdu.bch_pdu_rel15.tl.tag             = NFAPI_NR_DL_CONFIG_REQUEST_BCH_PDU_REL15_TAG;
-      dl_config_pdu->bch_pdu.bch_pdu_rel15.length             = mib_sdu_length;
-      dl_config_pdu->bch_pdu.bch_pdu_rel15.pdu_index          = gNB->pdu_index[CC_id];
-      dl_config_pdu->bch_pdu.bch_pdu_rel15.transmission_power = 6000;
+      dl_config_pdu->bch_pdu_rel15.tl.tag             = NFAPI_NR_DL_CONFIG_REQUEST_BCH_PDU_REL15_TAG;
+      dl_config_pdu->bch_pdu_rel15.length             = mib_sdu_length;
+      dl_config_pdu->bch_pdu_rel15.pdu_index          = gNB->pdu_index[CC_id];
+      dl_config_pdu->bch_pdu_rel15.transmission_power = 6000;
       dl_req->tl.tag                            = NFAPI_DL_CONFIG_REQUEST_BODY_TAG;
       dl_req->number_pdu++;
       dl_config_request->header.message_id = NFAPI_DL_CONFIG_REQUEST;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 4a5054b52a120c648ff956b1db466204819b8cb2..8b099914d8ba11ba40dedcbb2dfc84690f07e451 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -67,7 +67,7 @@ void nr_schedule_css_dlsch_phytest(module_id_t   module_idP,
     nr_configure_css_dci_from_mib(&gNB->pdcch_type0_params,
                                kHz30, kHz30, nr_FR1, 0, 0,
                                fp->slots_per_frame,
-                               cfg->rf_config.dl_channel_bandwidth.value);
+                               cfg->rf_config.dl_carrier_bandwidth.value);
     memcpy((void*)params_rel15, (void*)&gNB->pdcch_type0_params, sizeof(nfapi_nr_dl_config_pdcch_parameters_rel15_t));
 
     pdu_rel15->frequency_domain_assignment = 5;
diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c
index 89e811761ffcf2b3e5535b762cb863785b3282ce..802fe3fdfc0d183d1d67f7228fc20b7a9d5ea001 100644
--- a/targets/RT/USER/nr-ru.c
+++ b/targets/RT/USER/nr-ru.c
@@ -806,10 +806,10 @@ void tx_rf(RU_t *ru) {
     for (i=0; i<ru->nb_tx; i++)
       txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_subframe)-sf_extension];
 
-    /*if (proc->subframe_tx == 0){
+    if (proc->subframe_tx == 0){
       write_output("txdataF_frame.m","txdataF_frame",&ru->common.txdataF_BF[i],fp->samples_per_subframe_wCP, 1, 1);
       write_output("txdata_frame.m","txdata_frame",&ru->common.txdata[i],fp->samples_per_subframe, 1, 1);
-    }*/
+    }
     
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance)&0xffffffff );
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c
index ddbc77ed64d3342dd17895402fe2dba58050bf88..570bc8677b47f412165de8ced79e7d5d7aae48db 100644
--- a/targets/RT/USER/nr-softmodem.c
+++ b/targets/RT/USER/nr-softmodem.c
@@ -94,8 +94,6 @@ unsigned short config_frames[4] = {2,9,11,13};
 // current status is that every UE has a DL scope for a SINGLE eNB (gnb_id=0)
 // at eNB 0, an UL scope for every UE
 
-short nr_mod_table[NR_MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170};
-
 FD_lte_phy_scope_ue  *form_ue[NUMBER_OF_UE_MAX];
 FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
 FD_stats_form                  *form_stats=NULL,*form_stats_l2=NULL;
diff --git a/targets/RT/USER/nr-uesoftmodem.c b/targets/RT/USER/nr-uesoftmodem.c
index 56a1f9bae0ab8a86f9276a5657dbc2464fd5640a..a2b6c6ea4c11fdb54f9251c8f561d7495b16920d 100644
--- a/targets/RT/USER/nr-uesoftmodem.c
+++ b/targets/RT/USER/nr-uesoftmodem.c
@@ -634,66 +634,6 @@ void set_default_frame_parms(NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
 
 }
 
-void set_default_frame_parms_single(nfapi_nr_config_request_t *config, NR_DL_FRAME_PARMS *frame_parms) {
-
-  //int CC_id;
-
-  //for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-        /* Set some default values that may be overwritten while reading options */
-        frame_parms = (NR_DL_FRAME_PARMS*) malloc(sizeof(NR_DL_FRAME_PARMS));
-        config = (nfapi_nr_config_request_t*) malloc(sizeof(nfapi_nr_config_request_t));
-        config->subframe_config.numerology_index_mu.value =1;
-        config->subframe_config.duplex_mode.value = 1; //FDD
-        config->subframe_config.dl_cyclic_prefix_type.value = 0; //NORMAL
-        config->rf_config.dl_carrier_bandwidth.value = 106;
-        config->rf_config.ul_carrier_bandwidth.value = 106;
-        config->rf_config.tx_antenna_ports.value = 1;
-        config->rf_config.rx_antenna_ports.value = 1;
-        config->sch_config.physical_cell_id.value = 0;
-
-        frame_parms->frame_type          = FDD;
-        frame_parms->tdd_config          = 3;
-        //frame_parms[CC_id]->tdd_config_S        = 0;
-        frame_parms->N_RB_DL             = 106;
-        frame_parms->N_RB_UL             = 106;
-        frame_parms->Ncp                 = NORMAL;
-        //frame_parms[CC_id]->Ncp_UL              = NORMAL;
-        frame_parms->Nid_cell            = 0;
-        //frame_parms[CC_id]->num_MBSFN_config    = 0;
-        frame_parms->nb_antenna_ports_eNB  = 1;
-        frame_parms->nb_antennas_tx      = 1;
-        frame_parms->nb_antennas_rx      = 1;
-
-        //frame_parms[CC_id]->nushift             = 0;
-
-        ///frame_parms[CC_id]->phich_config_common.phich_resource = oneSixth;
-        //frame_parms[CC_id]->phich_config_common.phich_duration = normal;
-	
-	// UL RS Config
-        /*frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 1;//n_DMRS1 set to 0
-        frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
-        frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
-        frame_parms[CC_id]->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
-
-	frame_parms[CC_id]->pusch_config_common.n_SB = 1;
-	frame_parms[CC_id]->pusch_config_common.hoppingMode = 0;
-	frame_parms[CC_id]->pusch_config_common.pusch_HoppingOffset = 0;
-	frame_parms[CC_id]->pusch_config_common.enable64QAM = 0;
-		
-        frame_parms[CC_id]->prach_config_common.rootSequenceIndex=22;
-        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1;
-        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
-        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.highSpeedFlag=0;
-        frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;*/
-
-        // NR: Init to legacy LTE 20Mhz params
-        frame_parms->numerology_index	= 0;
-        frame_parms->ttis_per_subframe	= 1;
-        frame_parms->slots_per_tti		= 2;
-
-    //}
-
-}
 void init_openair0(void);
 void init_openair0() {