diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach.c b/openair1/PHY/NR_TRANSPORT/nr_prach.c
index db1452d97030bb8c4564c1f29b17962c50ae0820..822efba69dee4b46cb3cda4e01020eae43d02862 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach.c
@@ -34,13 +34,6 @@
 #include "PHY/NR_TRANSPORT/nr_transport.h"
 #include "PHY/NR_TRANSPORT/nr_transport_proto_common.h"
 
-extern uint16_t NCS_unrestricted_delta_f_RA_125[16];
-extern uint16_t NCS_restricted_TypeA_delta_f_RA_125[15];
-extern uint16_t NCS_restricted_TypeB_delta_f_RA_125[13];
-extern uint16_t NCS_unrestricted_delta_f_RA_5[16];
-extern uint16_t NCS_restricted_TypeA_delta_f_RA_5[16];
-extern uint16_t NCS_restricted_TypeB_delta_f_RA_5[14];
-extern uint16_t NCS_unrestricted_delta_f_RA_15[16];
 extern uint16_t prach_root_sequence_map_0_3[838];
 extern uint16_t prach_root_sequence_map_abc[138];
 extern uint16_t nr_du[838];
diff --git a/openair1/PHY/NR_TRANSPORT/nr_prach_common.c b/openair1/PHY/NR_TRANSPORT/nr_prach_common.c
index 67534ccce7e094b1f5293f25cddf51852c07fd72..65da6fc49f5e7cf2974b15d962854d312d3843bf 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_prach_common.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_prach_common.c
@@ -37,10 +37,10 @@
 #include "PHY/NR_TRANSPORT/nr_transport_proto_common.h"
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
-
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h"
 #include "T.h"
 
-void init_nr_prach_tables(int N_ZC);
+
 
 void dump_nr_prach_config(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe) {
 
@@ -79,20 +79,10 @@ void dump_nr_prach_config(NR_DL_FRAME_PARMS *frame_parms,uint8_t subframe) {
 }
 
 // This function computes the du
-void nr_fill_du(uint8_t prach_fmt)
+void nr_fill_du(uint16_t N_ZC,uint16_t *prach_root_sequence_map)
 {
 
   uint16_t iu,u,p;
-  uint16_t N_ZC;
-  uint16_t *prach_root_sequence_map;
-
-  if (prach_fmt<4) {
-    N_ZC = 839;
-    prach_root_sequence_map = prach_root_sequence_map_0_3;
-  } else {
-    N_ZC = 139;
-    prach_root_sequence_map = prach_root_sequence_map_abc;
-  }
 
   for (iu=0; iu<(N_ZC-1); iu++) {
 
@@ -107,97 +97,39 @@ void nr_fill_du(uint8_t prach_fmt)
 
 }
 
-int is_nr_prach_subframe(NR_DL_FRAME_PARMS *frame_parms,uint32_t frame, uint8_t subframe) {
-
-  uint8_t prach_ConfigIndex  = frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
 
-/*  // For FR1 paired
-  if (frame_parms->frame_type == FDD && frame_parms->freq_range == nr_FR1){
-    if (((frame%table_6_3_3_2_2_prachConfig_Index[prach_ConfigIndex][2]) == table_6_3_3_2_2_prachConfig_Index[prach_ConfigIndex][3]) &&
-    ((table_6_3_3_2_2_prachConfig_Index[prach_ConfigIndex][4]&(1<<subframe)) == 1)) {
-    // using table 6.3.3.2-2: Random access configurations for FR1 and paired spectrum/supplementary uplink
-    return 1;
-    } else {
-    return 0;
-    }
-  } else if (frame_parms->frame_type == TDD && frame_parms->freq_range == nr_FR1) {
-  // For FR1 unpaired
-    if (((frame%table_6_3_3_2_3_prachConfig_Index[prach_ConfigIndex][2]) == table_6_3_3_2_3_prachConfig_Index[prach_ConfigIndex][3]) &&
-        ((table_6_3_3_2_3_prachConfig_Index[prach_ConfigIndex][4]&(1<<subframe)) == 1)) {
-      // using table 6.3.3.2-2: Random access configurations for FR1 and unpaired
-      return 1;
-    } else {
-      return 0;
-    }
-  }
-  
-  // For FR2: FIXME
-  if ((((frame%table_6_3_3_2_4_prachConfig_Index[prach_ConfigIndex][2]) == table_6_3_3_2_4_prachConfig_Index[prach_ConfigIndex][3]) ||
-  ((frame%table_6_3_3_2_4_prachConfig_Index[prach_ConfigIndex][2]) == table_6_3_3_2_4_prachConfig_Index[prach_ConfigIndex][4]))
-  &&
-  ((table_6_3_3_2_4_prachConfig_Index[prach_ConfigIndex][5]&(1<<subframe)) == 1)) {
-  // using table 6.3.3.2-2: Random access configurations for FR1 and unpaired
-  return(1);
-  } else {
-  return(0);
-  }
-  */
-}
-
-
-int do_prach_rx(NR_DL_FRAME_PARMS *fp,int frame,int slot) {
-
-  int subframe = slot / fp->slots_per_subframe;
-  // when were in the last slot of the subframe and this is a PRACH subframe ,return 1
-  if (((slot%fp->slots_per_subframe) == fp->slots_per_subframe-1)&&
-      (is_nr_prach_subframe(fp,frame,subframe))) return (1);
-  else return(0);
-}
-
-uint16_t get_nr_prach_fmt(int prach_ConfigIndex,lte_frame_type_t frame_type, nr_frequency_range_e fr)
-{
-
- /* if (frame_type==FDD) return (table_6_3_3_2_2_prachConfig_Index[prach_ConfigIndex][0]); // if using table 6.3.3.2-2: Random access configurations for FR1 and paired spectrum/supplementary uplink
-  else if (fr==nr_FR1) return (table_6_3_3_2_3_prachConfig_Index[prach_ConfigIndex][0]); // if using table 6.3.3.2-3: Random access configurations for FR1 and unpaired spectrum
-  else AssertFatal(1==0,"FR2 prach configuration not supported yet\n");*/
-  // For FR2 not implemented. FIXME
-}
-
-void compute_nr_prach_seq(uint16_t rootSequenceIndex,
-			  uint8_t prach_ConfigIndex,
-			  uint8_t zeroCorrelationZoneConfig,
-			  uint8_t highSpeedFlag,
-			  lte_frame_type_t frame_type,
-			  nr_frequency_range_e fr,
-			  uint32_t X_u[64][839])
+void compute_nr_prach_seq(nfapi_nr_config_request_scf_t *config,
+			  uint8_t fd_occasion,
+			  uint32_t **X_u)
 {
-
   // Compute DFT of x_u => X_u[k] = x_u(inv(u)*k)^* X_u[k] = exp(j\pi u*inv(u)*k*(inv(u)*k+1)/N_ZC)
-  unsigned int k,inv_u,i,NCS=0,num_preambles;
+  nfapi_nr_prach_config_t prach_config = config->prach_config;
+  unsigned int k,inv_u,i;
   int N_ZC;
-  uint8_t prach_fmt = get_nr_prach_fmt(prach_ConfigIndex,frame_type,fr);
+
   uint16_t *prach_root_sequence_map;
-  uint16_t u, preamble_offset;
-  uint16_t n_shift_ra,n_shift_ra_bar, d_start,numshift;
-  uint8_t not_found;
+  uint16_t u;
+  uint8_t short_sequence = prach_config.prach_sequence_length.value;
+  uint8_t num_sequences = prach_config.num_prach_fd_occasions_list[fd_occasion].num_root_sequences.value;
+  uint8_t rootSequenceIndex = prach_config.num_prach_fd_occasions_list[fd_occasion].prach_root_sequence_index.value;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH, VCD_FUNCTION_IN);
 
 #ifdef NR_PRACH_DEBUG
-  LOG_I(PHY,"compute_prach_seq: NCS_config %d, prach_fmt %x\n",zeroCorrelationZoneConfig, prach_fmt);
+  LOG_I(PHY,"compute_prach_seq: NCS_config %d, prach short sequence? %x\n",zeroCorrelationZoneConfig, prach_c);
 #endif
 
 
-  N_ZC = (prach_fmt < 4) ? 839 : 139;
+  N_ZC = (short_sequence) ? 139 : 839;
   //init_prach_tables(N_ZC); //moved to phy_init_lte_ue/eNB, since it takes to long in real-time
   
   init_nr_prach_tables(N_ZC);
 
-  if (prach_fmt < 4) {
-    prach_root_sequence_map = prach_root_sequence_map_0_3;
-  } else {
+  if (short_sequence) {
     // FIXME cannot be reached
     prach_root_sequence_map = prach_root_sequence_map_abc;
+  } else {
+    prach_root_sequence_map = prach_root_sequence_map_0_3;
   }
 
 
@@ -205,114 +137,15 @@ void compute_nr_prach_seq(uint16_t rootSequenceIndex,
   LOG_I( PHY, "compute_prach_seq: done init prach_tables\n" );
 #endif
 
+  for (i=0; i<num_sequences; i++) {
+    int index = (rootSequenceIndex+i) % (N_ZC-1);
 
-
-
-  int restricted_Type = 0; //this is hardcoded ('0' for restricted_TypeA; and '1' for restricted_TypeB). FIXME
-
-  if (highSpeedFlag== 0) {
-    
-#ifdef PRACH_DEBUG
-    LOG_I(PHY,"Low speed prach : NCS_config %d\n",zeroCorrelationZoneConfig);
-#endif
-    
-    AssertFatal(zeroCorrelationZoneConfig<=15,
-		"FATAL, Illegal Ncs_config for unrestricted format %"PRIu8"\n", zeroCorrelationZoneConfig );
-   /* if (prach_fmt<3)  NCS = NCS_unrestricted_delta_f_RA_125[zeroCorrelationZoneConfig];
-    if (prach_fmt==3) NCS = NCS_unrestricted_delta_f_RA_5[zeroCorrelationZoneConfig];
-    if (prach_fmt>3)  NCS = NCS_unrestricted_delta_f_RA_15[zeroCorrelationZoneConfig];*/
-    
-    num_preambles = (NCS==0) ? 64 : ((64*NCS)/N_ZC);
-
-    if (NCS>0) num_preambles++;
-
-    preamble_offset = 0;
-  } else {
-
-#ifdef PRACH_DEBUG
-    LOG_I( PHY, "high speed prach : NCS_config %"PRIu8"\n", zeroCorrelationZoneConfig );
-#endif
-
-    AssertFatal(zeroCorrelationZoneConfig<=14,
-		"FATAL, Illegal Ncs_config for restricted format %"PRIu8"\n", zeroCorrelationZoneConfig );
- /*   if (prach_fmt<3){
-      if (restricted_Type == 0) NCS = NCS_restricted_TypeA_delta_f_RA_125[zeroCorrelationZoneConfig]; // for TypeA, this is hardcoded. FIXME
-      if (restricted_Type == 1) NCS = NCS_restricted_TypeB_delta_f_RA_125[zeroCorrelationZoneConfig]; // for TypeB, this is hardcoded. FIXME
-    }
-    if (prach_fmt==3){
-      if (restricted_Type == 0) NCS = NCS_restricted_TypeA_delta_f_RA_5[zeroCorrelationZoneConfig]; // for TypeA, this is hardcoded. FIXME
-      if (restricted_Type == 1) NCS = NCS_restricted_TypeB_delta_f_RA_5[zeroCorrelationZoneConfig]; // for TypeB, this is hardcoded. FIXME
-    }
-    if (prach_fmt>3){
-
-    }*/
-
-    nr_fill_du(prach_fmt);
-
-    num_preambles = 64; // compute ZC sequence for 64 possible roots
-    // find first non-zero shift root (stored in preamble_offset)
-    not_found = 1;
-    preamble_offset = 0;
-
-    while (not_found == 1) {
-      // current root depending on rootSequenceIndex
-      int index = (rootSequenceIndex + preamble_offset) % N_ZC;
-
-      if (prach_fmt<4) {
-        // prach_root_sequence_map points to prach_root_sequence_map0_3
-        DevAssert( index < sizeof(prach_root_sequence_map_0_3) / sizeof(prach_root_sequence_map_0_3[0]) );
-      } else {
-        // prach_root_sequence_map points to prach_root_sequence_map4
-        DevAssert( index < sizeof(prach_root_sequence_map_abc) / sizeof(prach_root_sequence_map_abc[0]) );
-      }
-
-      u = prach_root_sequence_map[index];
-
-      uint16_t n_group_ra = 0;
-
-      if ( (nr_du[u]<(N_ZC/3)) && (nr_du[u]>=NCS) ) {
-        n_shift_ra     = nr_du[u]/NCS;
-        d_start        = (nr_du[u]<<1) + (n_shift_ra * NCS);
-        n_group_ra     = N_ZC/d_start;
-        n_shift_ra_bar = max(0,(N_ZC-(nr_du[u]<<1)-(n_group_ra*d_start))/N_ZC);
-      } else if  ( (nr_du[u]>=(N_ZC/3)) && (nr_du[u]<=((N_ZC - NCS)>>1)) ) {
-        n_shift_ra     = (N_ZC - (nr_du[u]<<1))/NCS;
-        d_start        = N_ZC - (nr_du[u]<<1) + (n_shift_ra * NCS);
-        n_group_ra     = nr_du[u]/d_start;
-        n_shift_ra_bar = min(n_shift_ra,max(0,(nr_du[u]- (n_group_ra*d_start))/NCS));
-      } else {
-        n_shift_ra     = 0;
-        n_shift_ra_bar = 0;
-      }
-
-      // This is the number of cyclic shifts for the current root u
-      numshift = (n_shift_ra*n_group_ra) + n_shift_ra_bar;
-
-      // skip to next root and recompute parameters if numshift==0
-      if (numshift>0)
-        not_found = 0;
-      else
-        preamble_offset++;
-    }
-  }
-
-#ifdef PRACH_DEBUG
-
-  if (NCS>0)
-    LOG_I( PHY, "Initializing %u preambles for PRACH (NCS_config %"PRIu8", NCS %u, N_ZC/NCS %u)\n",
-           num_preambles, zeroCorrelationZoneConfig, NCS, N_ZC/NCS );
-
-#endif
-
-  for (i=0; i<num_preambles; i++) {
-    int index = (rootSequenceIndex+i+preamble_offset) % N_ZC;
-
-    if (prach_fmt<4) {
-      // prach_root_sequence_map points to prach_root_sequence_map0_3
-      DevAssert( index < sizeof(prach_root_sequence_map_0_3) / sizeof(prach_root_sequence_map_0_3[0]) );
-    } else {
+    if (short_sequence) {
       // prach_root_sequence_map points to prach_root_sequence_map4
       DevAssert( index < sizeof(prach_root_sequence_map_abc) / sizeof(prach_root_sequence_map_abc[0]) );
+    } else {
+      // prach_root_sequence_map points to prach_root_sequence_map0_3
+      DevAssert( index < sizeof(prach_root_sequence_map_0_3) / sizeof(prach_root_sequence_map_0_3[0]) );
     }
 
     u = prach_root_sequence_map[index];
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
index 5b5c40d6527cc180cd4cd78765ae520bbbf318c8..d613dccedeffafc23c2613f86f834d0528e039d2 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
@@ -213,6 +213,11 @@ uint32_t nr_get_code_rate_ul(uint8_t Imcs, uint8_t table_idx);
 
 uint32_t nr_get_code_rate_dl(uint8_t Imcs, uint8_t table_idx);
 
+void nr_fill_prach(PHY_VARS_gNB *gNB,
+		   int SFN,
+		   int Slot,
+		   nfapi_nr_prach_pdu_t *prach_pdu);
+
 void rx_nr_prach(PHY_VARS_gNB *gNB,
 		 nfapi_nr_prach_pdu_t *prach_pdu,
 		 int frame,
diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h
index dd37455e2629898363ed1184151f7959200da1cd..cd5bc3ccdd40829aba958cd3496b48bd423ad00d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto_common.h
@@ -1648,8 +1648,6 @@ uint8_t get_num_prach_tdd(module_id_t Mod_id);
 */
 uint8_t get_prach_fmt(uint8_t prach_ConfigIndex,lte_frame_type_t frame_type);
 
-uint16_t get_nr_prach_fmt(int prach_ConfigIndex,lte_frame_type_t frame_type, nr_frequency_range_e fr);
-
 /*!
   \brief Helper for MAC, returns frequency index of PRACH resource in TDD for a particular configuration index
   @param frame_parms Pointer to NR_DL_FRAME_PARMS structure
@@ -1673,8 +1671,13 @@ void compute_prach_seq(uint16_t rootSequenceIndex,
 		       lte_frame_type_t frame_type,
 		       uint32_t X_u[64][839]);
 
+void compute_nr_prach_seq(nfapi_nr_config_request_scf_t *config,
+			  uint8_t highSpeedFlag,
+			  uint32_t **X_u);
+
 
 void init_prach_tables(int N_ZC);
+void init_nr_prach_tables(int N_ZC);
 
 void init_unscrambling_lut(void);
 void init_scrambling_lut(void);
diff --git a/openair1/SCHED_NR/fapi_nr_l1.c b/openair1/SCHED_NR/fapi_nr_l1.c
index 2d58cadb1067574d4dc7e1275a88328861f65db1..1f658f23061647272abf43d661219b46b98c65e7 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.c
+++ b/openair1/SCHED_NR/fapi_nr_l1.c
@@ -212,7 +212,8 @@ void nr_schedule_response(NR_Sched_Rsp_t *Sched_INFO){
         break;
       case NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE:
 	LOG_D(PHY,"frame %d, slot %d, Got NFAPI_NR_UL_CONFIG_PRACH_PDU_TYPE for %d.%d\n",frame,slot,UL_tti_req->SFN,UL_tti_req->Slot);
-        nr_fill_prach(gNB,UL_tti_req->SFN,UL_tti_req->Slot,UL_tti_req->pdus_list[i].prach_pdu);
+        nfapi_nr_prach_pdu_t *prach_pdu = &UL_tti_req->pdus_list[i].prach_pdu;
+        nr_fill_prach(gNB,UL_tti_req->SFN,UL_tti_req->Slot,prach_pdu);
         break;
     }
   }
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 8fbe7c8ba8b145fbf28a41d4ce6731ed8bd7ac65..75daf0d5ab0bf1dd52fd3ae062e66b91b5a43f30 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -208,8 +208,6 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
 
   //  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
 
-
-  if (do_prach_rx(fp,frame,slot)) L1_nr_prach_procedures(gNB,frame,slot/fp->slots_per_subframe);
 */
 
 void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH_id, uint8_t harq_pid)
diff --git a/openair2/GNB_APP/RRC_nr_paramsvalues.h b/openair2/GNB_APP/RRC_nr_paramsvalues.h
index 82873f22b4bcdbf8ab68b3ca73e023c12b91a832..f94990d4d8b73c3e0128b98b898cd0b89b368c59 100644
--- a/openair2/GNB_APP/RRC_nr_paramsvalues.h
+++ b/openair2/GNB_APP/RRC_nr_paramsvalues.h
@@ -311,7 +311,7 @@
 {GNB_CONFIG_STRING_RSRPTHRESHOLDSSB,NULL,0,i64ptr:scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rsrp_ThresholdSSB,defint64val:19,TYPE_INT64,0/*82*/},\
 {GNB_CONFIG_STRING_PRACHROOTSEQUENCEINDEXPR,NULL,0,uptr:&scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present,defuintval:NR_RACH_ConfigCommon__prach_RootSequenceIndex_PR_l139,TYPE_UINT,0/*83*/},\
 {GNB_CONFIG_STRING_PRACHROOTSEQUENCEINDEX,NULL,0,i64ptr:&scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.choice.l139,defint64val:0,TYPE_INT64,0/*84*/},\
-{GNB_CONFIG_STRING_MSG1SUBCARRIERSPACING,NULL,0,i64ptr:&scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig,defintval:NR_RACH_ConfigCommon__restrictedSetConfig_unrestrictedSet,TYPE_INT64,0/*85*/}, \
+{GNB_CONFIG_STRING_RESTRICTEDSETCONFIG,NULL,0,i64ptr:&scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig,defintval:NR_RACH_ConfigCommon__restrictedSetConfig_unrestrictedSet,TYPE_INT64,0/*85*/}, \
 {GNB_CONFIG_STRING_INITIALULBWPK2_0,NULL,0,i64ptr:scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->k2,defint64val:-1,TYPE_INT64,0/*86*/},\
 {GNB_CONFIG_STRING_INITIALULBWPMAPPINGTYPE_0,NULL,0,i64ptr:&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->mappingType,defint64val:NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeB,TYPE_INT64,/*87*/},\
 {GNB_CONFIG_STRING_INITIALULBWPSTARTSYMBOLANDLENGTH_0,NULL,0,i64ptr:&scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[0]->startSymbolAndLength,defint64val:55,TYPE_INT64,0/*88*/},\
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 8c6e5f1d56d717ed61e0a858c4ead1f6df97f8bb..f6fac735ddd33a5e27a5cc6879150fd23a640fa1 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -863,6 +863,19 @@ int64_t table_6_3_3_2_4_prachConfig_Index [256][10] = {
 };
 
 
+int get_format0(uint8_t index,
+                uint8_t unpaired){
+
+  uint16_t format;
+  if (unpaired)
+    format = table_6_3_3_2_3_prachConfig_Index[index][0];
+  else
+    format = table_6_3_3_2_2_prachConfig_Index[index][0];
+
+  return format;
+}
+                
+
 int get_nr_prach_info_from_index(uint8_t index,
                                  int frame,
                                  int slot,
@@ -962,6 +975,111 @@ int get_nr_prach_info_from_index(uint8_t index,
   }
 }
 
+//Table 6.3.3.1-3: Mapping from logical index i to sequence number u for preamble formats with L_RA = 839
+uint16_t table_63313[838] = {
+129, 710, 140, 699, 120, 719, 210, 629, 168, 671, 84 , 755, 105, 734, 93 , 746, 70 , 769, 60 , 779,
+2  , 837, 1  , 838, 56 , 783, 112, 727, 148, 691, 80 , 759, 42 , 797, 40 , 799, 35 , 804, 73 , 766,
+146, 693, 31 , 808, 28 , 811, 30 , 809, 27 , 812, 29 , 810, 24 , 815, 48 , 791, 68 , 771, 74 , 765,
+178, 661, 136, 703, 86 , 753, 78 , 761, 43 , 796, 39 , 800, 20 , 819, 21 , 818, 95 , 744, 202, 637,
+190, 649, 181, 658, 137, 702, 125, 714, 151, 688, 217, 622, 128, 711, 142, 697, 122, 717, 203, 636,
+118, 721, 110, 729, 89 , 750, 103, 736, 61 , 778, 55 , 784, 15 , 824, 14 , 825, 12 , 827, 23 , 816,
+34 , 805, 37 , 802, 46 , 793, 207, 632, 179, 660, 145, 694, 130, 709, 223, 616, 228, 611, 227, 612,
+132, 707, 133, 706, 143, 696, 135, 704, 161, 678, 201, 638, 173, 666, 106, 733, 83 , 756, 91 , 748,
+66 , 773, 53 , 786, 10 , 829, 9  , 830, 7  , 832, 8  , 831, 16 , 823, 47 , 792, 64 , 775, 57 , 782,
+104, 735, 101, 738, 108, 731, 208, 631, 184, 655, 197, 642, 191, 648, 121, 718, 141, 698, 149, 690,
+216, 623, 218, 621, 152, 687, 144, 695, 134, 705, 138, 701, 199, 640, 162, 677, 176, 663, 119, 720,
+158, 681, 164, 675, 174, 665, 171, 668, 170, 669, 87 , 752, 169, 670, 88 , 751, 107, 732, 81 , 758,
+82 , 757, 100, 739, 98 , 741, 71 , 768, 59 , 780, 65 , 774, 50 , 789, 49 , 790, 26 , 813, 17 , 822,
+13 , 826, 6  , 833, 5  , 834, 33 , 806, 51 , 788, 75 , 764, 99 , 740, 96 , 743, 97 , 742, 166, 673,
+172, 667, 175, 664, 187, 652, 163, 676, 185, 654, 200, 639, 114, 725, 189, 650, 115, 724, 194, 645,
+195, 644, 192, 647, 182, 657, 157, 682, 156, 683, 211, 628, 154, 685, 123, 716, 139, 700, 212, 627,
+153, 686, 213, 626, 215, 624, 150, 689, 225, 614, 224, 615, 221, 618, 220, 619, 127, 712, 147, 692,
+124, 715, 193, 646, 205, 634, 206, 633, 116, 723, 160, 679, 186, 653, 167, 672, 79 , 760, 85 , 754,
+77 , 762, 92 , 747, 58 , 781, 62 , 777, 69 , 770, 54 , 785, 36 , 803, 32 , 807, 25 , 814, 18 , 821,
+11 , 828, 4  , 835, 3  , 836, 19 , 820, 22 , 817, 41 , 798, 38 , 801, 44 , 795, 52 , 787, 45 , 794,
+63 , 776, 67 , 772, 72 , 767, 76 , 763, 94 , 745, 102, 737, 90 , 749, 109, 730, 165, 674, 111, 728,
+209, 630, 204, 635, 117, 722, 188, 651, 159, 680, 198, 641, 113, 726, 183, 656, 180, 659, 177, 662,
+196, 643, 155, 684, 214, 625, 126, 713, 131, 708, 219, 620, 222, 617, 226, 613, 230, 609, 232, 607,
+262, 577, 252, 587, 418, 421, 416, 423, 413, 426, 411, 428, 376, 463, 395, 444, 283, 556, 285, 554,
+379, 460, 390, 449, 363, 476, 384, 455, 388, 451, 386, 453, 361, 478, 387, 452, 360, 479, 310, 529,
+354, 485, 328, 511, 315, 524, 337, 502, 349, 490, 335, 504, 324, 515, 323, 516, 320, 519, 334, 505,
+359, 480, 295, 544, 385, 454, 292, 547, 291, 548, 381, 458, 399, 440, 380, 459, 397, 442, 369, 470,
+377, 462, 410, 429, 407, 432, 281, 558, 414, 425, 247, 592, 277, 562, 271, 568, 272, 567, 264, 575,
+259, 580, 237, 602, 239, 600, 244, 595, 243, 596, 275, 564, 278, 561, 250, 589, 246, 593, 417, 422,
+248, 591, 394, 445, 393, 446, 370, 469, 365, 474, 300, 539, 299, 540, 364, 475, 362, 477, 298, 541,
+312, 527, 313, 526, 314, 525, 353, 486, 352, 487, 343, 496, 327, 512, 350, 489, 326, 513, 319, 520,
+332, 507, 333, 506, 348, 491, 347, 492, 322, 517, 330, 509, 338, 501, 341, 498, 340, 499, 342, 497,
+301, 538, 366, 473, 401, 438, 371, 468, 408, 431, 375, 464, 249, 590, 269, 570, 238, 601, 234, 605,
+257, 582, 273, 566, 255, 584, 254, 585, 245, 594, 251, 588, 412, 427, 372, 467, 282, 557, 403, 436,
+396, 443, 392, 447, 391, 448, 382, 457, 389, 450, 294, 545, 297, 542, 311, 528, 344, 495, 345, 494,
+318, 521, 331, 508, 325, 514, 321, 518, 346, 493, 339, 500, 351, 488, 306, 533, 289, 550, 400, 439,
+378, 461, 374, 465, 415, 424, 270, 569, 241, 598, 231, 608, 260, 579, 268, 571, 276, 563, 409, 430,
+398, 441, 290, 549, 304, 535, 308, 531, 358, 481, 316, 523, 293, 546, 288, 551, 284, 555, 368, 471,
+253, 586, 256, 583, 263, 576, 242, 597, 274, 565, 402, 437, 383, 456, 357, 482, 329, 510, 317, 522,
+307, 532, 286, 553, 287, 552, 266, 573, 261, 578, 236, 603, 303, 536, 356, 483, 355, 484, 405, 434,
+404, 435, 406, 433, 235, 604, 267, 572, 302, 537, 309, 530, 265, 574, 233, 606, 367, 472, 296, 543,
+336, 503, 305, 534, 373, 466, 280, 559, 279, 560, 419, 420, 240, 599, 258, 581, 229, 610
+};
+
+uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
+                            uint8_t nb_preambles,
+                            uint8_t unpaired) {
+
+  uint8_t config_index = rach_config->rach_ConfigGeneric.prach_ConfigurationIndex;
+  uint8_t ncs_index = rach_config->rach_ConfigGeneric.zeroCorrelationZoneConfig;
+  uint16_t format0 = get_format0(config_index, unpaired);
+  uint16_t NCS = get_NCS(ncs_index, format0, rach_config->restrictedSetConfig);
+  uint16_t L_ra = (rach_config->prach_RootSequenceIndex.present) ? 139 : 839;
+  uint16_t r,u,index,q,d_u,n_shift_ra,n_shift_ra_bar,d_start;
+  uint32_t w;
+  uint8_t found_preambles = 0;
+  uint8_t found_sequences = 0;
+
+  if (rach_config->restrictedSetConfig == 0) {
+    if (NCS == 0) return nb_preambles;
+    else {
+      r = L_ra/NCS;
+      return (nb_preambles/r);
+    }
+  }
+  else{
+    index = rach_config->prach_RootSequenceIndex.choice.l839;
+    while (found_preambles < nb_preambles) {
+      u = table_63313[index%(L_ra-1)];
+
+      q = 0;
+      while (((q*u)%L_ra) != 1) q++;
+      if (q < 420) d_u = q;
+      else d_u = L_ra - q;
+
+      uint16_t n_group_ra = 0;
+      if (rach_config->restrictedSetConfig == 1) {
+        if ( (d_u<280) && (d_u>=NCS) ) {
+          n_shift_ra     = d_u/NCS;
+          d_start        = (d_u<<1) + (n_shift_ra * NCS);
+          n_group_ra     = L_ra/d_start;
+          n_shift_ra_bar = max(0,(L_ra-(d_u<<1)-(n_group_ra*d_start))/L_ra);
+        } else if  ( (d_u>=280) && (d_u<=((L_ra - NCS)>>1)) ) {
+          n_shift_ra     = (L_ra - (d_u<<1))/NCS;
+          d_start        = L_ra - (d_u<<1) + (n_shift_ra * NCS);
+          n_group_ra     = d_u/d_start;
+          n_shift_ra_bar = min(n_shift_ra,max(0,(d_u- (n_group_ra*d_start))/NCS));
+        } else {
+          n_shift_ra     = 0;
+          n_shift_ra_bar = 0;
+        }
+        w = n_shift_ra*n_group_ra + n_shift_ra_bar;
+        found_preambles += w;
+        found_sequences++;
+      }
+      else {
+        AssertFatal(1==0,"Procedure to find nb of sequences for restricted type B not implemented yet");
+      }
+    }
+    return found_sequences;
+  }
+}
+
 
 nr_bandentry_t nr_bandtable[] = {
   {1,   1920000, 1980000, 2110000, 2170000, 20, 422000, 100},
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index eb9771d94399ba1097458e6cae50ee0ab1962d20..48bd701157472151fbddc6c0352b8b464971785a 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -53,6 +53,12 @@ int get_nr_prach_info_from_index(uint8_t index,
                                  uint8_t *N_t_slot,
                                  uint8_t *N_dur);
 
+uint8_t compute_nr_root_seq(NR_RACH_ConfigCommon_t *rach_config,
+                            uint8_t nb_preambles,
+                            uint8_t unpaired);
+
+int get_format0(uint8_t index, uint8_t unpaired);
+
 uint16_t get_NCS(uint8_t index, uint16_t format, uint8_t restricted_set_config);
 
 typedef enum {
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index 0e3dccbe52ea2f3e24edf73dcc7775391565bc88..33bd0adc6cc7fa46c2787567c2ddd6c0742255fc 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -154,6 +154,10 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
 
   // PRACH configuration
 
+  uint8_t nb_preambles = 64;
+  if(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles != NULL)
+     nb_preambles = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->totalNumberOfRA_Preambles;
+
   cfg->prach_config.prach_sequence_length.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present;
   cfg->prach_config.prach_sequence_length.tl.tag = NFAPI_NR_CONFIG_PRACH_SEQUENCE_LENGTH_TAG;
   cfg->num_tlv++;  
@@ -164,7 +168,6 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
     cfg->prach_config.prach_sub_c_spacing.value = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
   cfg->prach_config.prach_sub_c_spacing.tl.tag = NFAPI_NR_CONFIG_PRACH_SUB_C_SPACING_TAG;
   cfg->num_tlv++;
-
   cfg->prach_config.restricted_set_config.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->restrictedSetConfig;
   cfg->prach_config.restricted_set_config.tl.tag = NFAPI_NR_CONFIG_RESTRICTED_SET_CONFIG_TAG;
   cfg->num_tlv++;
@@ -203,6 +206,10 @@ void config_common(int Mod_idP, int pdsch_AntennaPorts, NR_ServingCellConfigComm
     cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.value = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.zeroCorrelationZoneConfig;
     cfg->prach_config.num_prach_fd_occasions_list[i].prach_zero_corr_conf.tl.tag = NFAPI_NR_CONFIG_PRACH_ZERO_CORR_CONF_TAG;
     cfg->num_tlv++;
+    cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences.value = compute_nr_root_seq(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup,
+                                                                                                    nb_preambles, frame_type);
+    cfg->prach_config.num_prach_fd_occasions_list[i].num_root_sequences.tl.tag = NFAPI_NR_CONFIG_NUM_ROOT_SEQUENCES_TAG;
+    cfg->num_tlv++;
     //cfg->prach_config.num_prach_fd_occasions_list[i].num_unused_root_sequences.value = ???
   }
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
index 4564907fa873c7f37412d5e6335b146c7882c1b4..db88115cb0848da6aef185af578b21c2a0972a2c 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
@@ -105,8 +105,8 @@ gNBs =
 #1,2,4,8,10,20,40,80
         ra_ResponseWindow                                           = 4;
 #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
-#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
-        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
 #oneHalf (0..15) 4,8,12,16,...60,64
         ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
 #ra_ContentionResolutionTimer
@@ -114,16 +114,16 @@ gNBs =
         ra_ContentionResolutionTimer                                = 7;
         rsrp_ThresholdSSB                                           = 19;
 #prach-RootSequenceIndex_PR
-#0 = 839, 1 = 139
-        prach_RootSequenceIndex_PR                                  = 1;
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
         prach_RootSequenceIndex                                     = 1;
         # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
         #  
         msg1_SubcarrierSpacing                                      = 1,
-
 # restrictedSetConfig
 # 0=unrestricted, 1=restricted type A, 2=restricted type B
         restrictedSetConfig                                         = 0,
+
       # pusch-ConfigCommon (up to 16 elements)
         initialULBWPk2_0                      = 2;
         initialULBWPmappingType_0             = 1
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
index 06aa4f6f9f69eb3fc6cebcfca30391e1c6b91340..bd8c5740dd0200c58426cdf8747f48fa5f8d4f6e 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpx300.conf
@@ -105,8 +105,8 @@ gNBs =
 #1,2,4,8,10,20,40,80
         ra_ResponseWindow                                           = 4;
 #ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
-#0=oneeighth,1=onefourth,2=half,3=one,4=two,5=four,6=eight,7=sixteen
-        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 3;
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+        ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR                = 4;
 #oneHalf (0..15) 4,8,12,16,...60,64
         ssb_perRACH_OccasionAndCB_PreamblesPerSSB                   = 15;
 #ra_ContentionResolutionTimer
@@ -114,8 +114,8 @@ gNBs =
         ra_ContentionResolutionTimer                                = 7;
         rsrp_ThresholdSSB                                           = 19;
 #prach-RootSequenceIndex_PR
-#0 = 839, 1 = 139
-        prach_RootSequenceIndex_PR                                  = 1;
+#1 = 839, 2 = 139
+        prach_RootSequenceIndex_PR                                  = 2;
         prach_RootSequenceIndex                                     = 1;
         # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
         #