diff --git a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m
index ad03bc7d70327b636bc8229b5656b8b727d9497d..a081ad1baa1331cb94dd48b9dd96a3342dda4453 100644
--- a/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m
+++ b/openair1/PHY/NR_REFSIG/nr_gen_mod_table.m
@@ -6,12 +6,22 @@
 % Amplitude for BPSK (\f$ 2^15 \times 1/\sqrt{2}\f$)
 BPSK = 23170;
 
+% Amplitude for QPSK (\f$ 2^15 \times 1/\sqrt{2}\f$)
+QPSK = 23170;
+
 % BPSK
 for b = 0:1
 bpsk_table(b+1) = (1 - 2*b)*BPSK + 1j*(1-2*b)*BPSK;
 end
 
-table = [ 0; bpsk_table(:) ];
+%% QPSK
+for r=0:1 %0 -- 1 LS
+for j=0:1 %0 -- 1 MS
+qpsk_table(2*r+j+1) = ((1-r*2)*QPSK +  1j*(1-2*j)*QPSK);
+end
+end
+
+table = [ 0; bpsk_table(:); qpsk_table(:) ];
 
 save mod_table.mat table
 
@@ -20,10 +30,10 @@ table2(1:2:end) = real(table);
 table2(2:2:end) = imag(table);
 
 fd = fopen("nr_mod_table.h","w");
-fprintf(fd,"#define MOD_TABLE_SIZE_SHORT %d\n", length(table)*2);
-fprintf(fd,"#define MOD_TABLE_BPSK_OFFSET %d\n", 1);
+fprintf(fd,"#define NR_MOD_TABLE_SIZE_SHORT %d\n", length(table)*2);
+fprintf(fd,"#define NR_MOD_TABLE_BPSK_OFFSET %d\n", 1);
+fprintf(fd,"#define NR_MOD_TABLE_QPSK_OFFSET %d\n", 3);
 fprintf(fd,"short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {");
 fprintf(fd,"%d,",table2(1:end-1));
 fprintf(fd,"%d};\n",table2(end));
 fclose(fd);
-
diff --git a/openair1/PHY/NR_REFSIG/nr_mod_table.h b/openair1/PHY/NR_REFSIG/nr_mod_table.h
index 513276e62084b12cd200cb4f11e402d25eebff3e..75d8262147c3bccf9b2cde236061a406610f968d 100644
--- a/openair1/PHY/NR_REFSIG/nr_mod_table.h
+++ b/openair1/PHY/NR_REFSIG/nr_mod_table.h
@@ -1,3 +1,4 @@
-#define MOD_TABLE_SIZE_SHORT 6
-#define MOD_TABLE_BPSK_OFFSET 1
-short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170};
+#define NR_MOD_TABLE_SIZE_SHORT 14
+#define NR_MOD_TABLE_BPSK_OFFSET 1
+#define NR_MOD_TABLE_QPSK_OFFSET 3
+short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170,23170,23170,23170,-23170,-23170,23170,-23170,-23170};
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pbch.c b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
index fc70b201598bb9fbab138f94d275eda46b10891f..e068e6e644fc558787f8dc66f2f87f22636d7b19 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pbch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pbch.c
@@ -20,7 +20,7 @@
  */
 
 /*! \file PHY/NR_TRANSPORT/nr_pbch.c
-* \brief Top-level routines for generating and decoding  the PBCH/BCH physical/transport channel V15.1 03/2018
+* \brief Top-level routines for generating the PBCH/BCH physical/transport channel V15.1 03/2018
 * \author Guy De Souza
 * \date 2018
 * \version 0.1
@@ -35,7 +35,7 @@
 
 //#define DEBUG_PBCH
 
-short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,23170,23170,-23170,-23170};
+extern short *nr_mod_table;
 
 int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
                           int32_t **txdataF,
@@ -53,8 +53,8 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
 
   /// BPSK modulation
   for (m=0; m<NR_PBCH_DMRS_LENGTH; m++) {
-    mod_dmrs[m<<1] = nr_mod_table[((1 + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)];
-    mod_dmrs[(m<<1)+1] = nr_mod_table[((1 + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1];
+    mod_dmrs[m<<1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1)];
+    mod_dmrs[(m<<1)+1] = nr_mod_table[((NR_MOD_TABLE_BPSK_OFFSET + ((gold_pbch_dmrs[m>>5]&(1<<(m&0x1f)))>>(m&0x1f)))<<1) + 1];
 #ifdef DEBUG_PBCH
   printf("m %d  mod_dmrs %d %d\n", m, mod_dmrs[2*m], mod_dmrs[2*m+1]);
 #endif
@@ -121,5 +121,26 @@ int nr_generate_pbch_dmrs(uint32_t *gold_pbch_dmrs,
 #ifdef DEBUG_PBCH
   write_output("txdataF.m", "txdataF", txdataF[0], frame_parms->samples_per_frame_wCP>>1, 1, 1);
 #endif
-  return (0);
+  return 0;
+}
+
+#define NR_PBCH_LENGTH 1000
+
+int nr_generate_pbch(NR_gNB_PBCH *pbch,
+                     uint8_t *pbch_pdu,
+                     int32_t **txdataF,
+                     int16_t amp,
+                     uint8_t ssb_start_symbol,
+                     uint8_t nu,
+                     nfapi_config_request_t* config,
+                     NR_DL_FRAME_PARMS *frame_parms)
+{
+
+  int m,k,l;
+  int a, aa;
+  int16_t mod_payload[2 * NR_PBCH_LENGTH];
+
+  LOG_I(PHY, "PBCH generation started\n");
+
+  return 0;
 }
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c
index bce2d05b2bbbc86bd7cc6e15f435b706b8340fe7..88ab34b8e6393ed792c6e80c33fca3126080b43f 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pss.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c
@@ -23,8 +23,6 @@
 
 //#define NR_PSS_DEBUG
 
-//short nr_mod_table[MOD_TABLE_SIZE_SHORT] = {0,0,768,768,-768,-768};
-
 int nr_generate_pss(  int16_t *d_pss,
                       int32_t **txdataF,
                       int16_t amp,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_sss.c b/openair1/PHY/NR_TRANSPORT/nr_sss.c
index 7674fafd4f142588bf3eee88048dfaeded4c5052..5ec7d4e3202499fc4564f7260bb5548447a7e720 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_sss.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_sss.c
@@ -21,8 +21,6 @@
 
 #include "PHY/defs_gNB.h"
 
-extern short nr_mod_table[MOD_TABLE_SIZE_SHORT];
-
 //#define NR_SSS_DEBUG
 
 int nr_generate_sss(  int16_t *d_sss,
diff --git a/openair1/PHY/defs_RU.h b/openair1/PHY/defs_RU.h
index 02165f14b41ed73713b01160c472a843fd21ea7e..fb91d00e551dad4359c6bd60751ac25f630d6567 100644
--- a/openair1/PHY/defs_RU.h
+++ b/openair1/PHY/defs_RU.h
@@ -35,6 +35,7 @@
 
 
 #define MAX_BANDS_PER_RRU 4
+#define MAX_NUM_RU_PER_gNB MAX_NUM_RU_PER_eNB
 
 
 #ifdef OCP_FRAMEWORK
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 7706a6642580a29ed5abd9685268b9729a53114d..0d12dcb1628bd424e2fad8ccd56a2d5c550e7c83 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -36,6 +36,10 @@
 #include "defs_nr_common.h"
 
 
+typedef struct {
+  uint8_t pbch_d[100];
+} NR_gNB_PBCH;
+
 typedef struct {
   /// \brief Pointers (dynamic) to the received data in the time domain.
   /// - first index: rx antenna [0..nb_antennas_rx[
@@ -169,9 +173,9 @@ typedef struct gNB_proc_t_s {
 typedef struct {
   // common measurements
   //! estimated noise power (linear)
-  unsigned int   n0_power[MAX_NUM_RU_PER_eNB];
+  unsigned int   n0_power[MAX_NUM_RU_PER_gNB];
   //! estimated noise power (dB)
-  unsigned short n0_power_dB[MAX_NUM_RU_PER_eNB];
+  unsigned short n0_power_dB[MAX_NUM_RU_PER_gNB];
   //! total estimated noise power (linear)
   unsigned int   n0_power_tot;
   //! estimated avg noise power (dB)
@@ -179,9 +183,9 @@ typedef struct {
   //! 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];
+  unsigned short n0_subband_power[MAX_NUM_RU_PER_gNB][100];
   //! estimated avg noise power per RB per RX ant (dB)
-  unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_eNB][100];
+  unsigned short n0_subband_power_dB[MAX_NUM_RU_PER_gNB][100];
   //! estimated avg noise power per RB (dB)
   short n0_subband_power_tot_dB[100];
   //! estimated avg noise power per RB (dBm)
@@ -199,17 +203,17 @@ typedef struct {
   int            rx_correlation_dB[NUMBER_OF_UE_MAX][2];
 
   /// Wideband CQI (= SINR)
-  int            wideband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB];
+  int            wideband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB];
   /// Wideband CQI in dB (= SINR dB)
-  int            wideband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_eNB];
+  int            wideband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB];
   /// 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];
+  int            subband_cqi[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB][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];
+  int            subband_cqi_dB[NUMBER_OF_UE_MAX][MAX_NUM_RU_PER_gNB][100];
   /// Total Subband CQI and RB
   int            subband_cqi_tot_dB[NUMBER_OF_UE_MAX][100];
   /// PRACH background noise level
@@ -226,7 +230,7 @@ typedef struct PHY_VARS_gNB_s {
   int                  single_thread_flag;
   int                  abstraction_flag;
   int                  num_RU;
-  RU_t                 *RU_list[MAX_NUM_RU_PER_eNB];
+  RU_t                 *RU_list[MAX_NUM_RU_PER_gNB];
   /// Ethernet parameters for northbound midhaul interface
   eth_params_t         eth_params_n;
   /// Ethernet parameters for fronthaul interface
@@ -262,7 +266,7 @@ typedef struct PHY_VARS_gNB_s {
   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;
+  NR_gNB_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
diff --git a/openair1/PHY/defs_nr_common.h b/openair1/PHY/defs_nr_common.h
index b5b3943509dcbbfd6acbf89551ee85d194f512d7..0be8a2db5aff1575a393d5f2e31911ab2455c4b5 100644
--- a/openair1/PHY/defs_nr_common.h
+++ b/openair1/PHY/defs_nr_common.h
@@ -51,8 +51,9 @@
 #define ONE_OVER_SQRT2_Q15 23170
 #define ONE_OVER_TWO_Q15 16384
 
-#define MOD_TABLE_SIZE_SHORT 6
-#define MOD_TABLE_BPSK_OFFSET 1
+#define NR_MOD_TABLE_SIZE_SHORT 14
+#define NR_MOD_TABLE_BPSK_OFFSET 1
+#define NR_MOD_TABLE_QPSK_OFFSET 3
 
 typedef enum {
   NR_MU_0=0,
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 9ecb02e5646f1bee119c78071394e7a839abab76..4c2ea0b76793fcac5334a17a5e08342d9a6999ca 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -138,6 +138,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe) {
     nr_generate_pss(gNB->d_pss, txdataF, AMP, ssb_start_symbol, cfg, fp);
     nr_generate_sss(gNB->d_sss, txdataF, AMP_OVER_2, ssb_start_symbol, cfg, fp);
     nr_generate_pbch_dmrs(gNB->nr_gold_pbch_dmrs[n_hf][ssb_index],txdataF, AMP_OVER_2, ssb_start_symbol, nu, cfg, fp);
+    nr_generate_pbch(&gNB->pbch, pbch_pdu, txdataF, AMP_OVER_2, ssb_start_symbol, nu, cfg, fp);
   }
 
 }
diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c
index cca572f108832c5f9874419034e697cabb0b2fc6..506a34d81abfe332582cc21894e88610e129a2f7 100644
--- a/targets/RT/USER/nr-softmodem.c
+++ b/targets/RT/USER/nr-softmodem.c
@@ -94,6 +94,8 @@ 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;