diff --git a/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf b/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
index 5b2c90a714d773e456215098095edfd569a428fd..2c7481612d5ecaccb7d8ef72fcf78a97d7385876 100755
--- a/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
+++ b/ci-scripts/conf_files/enb.band7.tm1.fr1.25PRB.usrpb210.conf
@@ -144,6 +144,8 @@ eNBs =
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused  = 0;
 
+      //SSB central frequency of NR secondary cell group (for ENDC NSA)
+      nr_scg_ssb_freq = 641272;
     }
   );
 
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 549c8342e2def778c44a9057d827c2a5cd253008..2c098fd6b16ee3b8a2b742b07a201aa117702bd8 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -2772,7 +2772,7 @@ if (NOT ${NOS1})
 endif()
 target_link_libraries (lte-uesoftmodem
   -Wl,--start-group
-  RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
+  RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP F1AP_LIB
   GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT MME_APP UDP SCHED_RU_LIB SCHED_UE_LIB PHY_COMMON
   PHY_UE PHY_RU LFDS L2_UE L2_LTE LFDS7 SIMU_COMMON SIMU NFAPI_COMMON_LIB NFAPI_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${ATLAS_LIBRARIES}
diff --git a/openair2/COMMON/rrc_messages_types.h b/openair2/COMMON/rrc_messages_types.h
index 0b143fe07edb40174f14bb6a0fe4fdfeae329ae4..6f37c8be1cca9e0d079551c336ad342b086930d3 100644
--- a/openair2/COMMON/rrc_messages_types.h
+++ b/openair2/COMMON/rrc_messages_types.h
@@ -323,6 +323,8 @@ typedef struct RrcConfigurationReq_s {
   char                          *discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_buf[MAX_NUM_CCs];
   long                           discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_size[MAX_NUM_CCs];
   long                           discRxPoolPS_ResourceConfig_subframeBitmap_choice_bs_bits_unused[MAX_NUM_CCs];
+  //Nr secondary cell group SSB central frequency (for ENDC NSA)
+  int                            nr_scg_ssb_freq;
 } RrcConfigurationReq;
 
 #define MAX_NUM_NBIOT_CELEVELS    3
diff --git a/openair2/COMMON/x2ap_messages_def.h b/openair2/COMMON/x2ap_messages_def.h
index 8438fd1037c6e46856d0a6e42a4ad4e28ecdc7d6..b0f0190c19859f0bdd0c0a44281781b5d52aee3c 100644
--- a/openair2/COMMON/x2ap_messages_def.h
+++ b/openair2/COMMON/x2ap_messages_def.h
@@ -52,6 +52,7 @@ MESSAGE_DEF(X2AP_UE_CONTEXT_RELEASE             , MESSAGE_PRIORITY_MED, x2ap_ue_
 MESSAGE_DEF(X2AP_SENB_ADDITION_REQ              , MESSAGE_PRIORITY_MED, x2ap_senb_addition_req_t         , x2ap_senb_addition_req)
 
 /*SGnb bearer addition messages X2AP <-> RRC */
+MESSAGE_DEF(X2AP_ENDC_SETUP_REQ                      , MESSAGE_PRIORITY_MED, x2ap_ENDC_setup_req_t                 , x2ap_ENDC_setup_req)
 MESSAGE_DEF(X2AP_ENDC_SGNB_ADDITION_REQ              , MESSAGE_PRIORITY_MED, x2ap_ENDC_sgnb_addition_req_t         , x2ap_ENDC_sgnb_addition_req)
 MESSAGE_DEF(X2AP_ENDC_SGNB_ADDITION_REQ_ACK              , MESSAGE_PRIORITY_MED, x2ap_ENDC_sgnb_addition_req_ACK_t         , x2ap_ENDC_sgnb_addition_req_ACK)
 MESSAGE_DEF(X2AP_ENDC_SGNB_RECONF_COMPLETE              , MESSAGE_PRIORITY_MED, x2ap_ENDC_reconf_complete_t         , x2ap_ENDC_sgnb_reconf_complete)
diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h
index f0743e60a52daaedd91cfc3afdb225f4eac8e856..05e316114d3c08d9351c8278b351339311ea88d5 100644
--- a/openair2/COMMON/x2ap_messages_types.h
+++ b/openair2/COMMON/x2ap_messages_types.h
@@ -37,6 +37,7 @@
 #define X2AP_DEREGISTERED_ENB_IND(mSGpTR)       		(mSGpTR)->ittiMsg.x2ap_deregistered_enb_ind
 #define X2AP_UE_CONTEXT_RELEASE(mSGpTR)         		(mSGpTR)->ittiMsg.x2ap_ue_context_release
 #define X2AP_HANDOVER_CANCEL(mSGpTR)            		(mSGpTR)->ittiMsg.x2ap_handover_cancel
+#define X2AP_ENDC_SETUP_REQ(mSGpTR)                     (mSGpTR)->ittiMsg.x2ap_ENDC_setup_req
 #define X2AP_SENB_ADDITION_REQ(mSGpTR)              	(mSGpTR)->ittiMsg.x2ap_senb_addition_req
 #define X2AP_ENDC_SGNB_ADDITION_REQ(mSGpTR)         	(mSGpTR)->ittiMsg.x2ap_ENDC_sgnb_addition_req
 #define X2AP_ENDC_SGNB_ADDITION_REQ_ACK(mSGpTR)         (mSGpTR)->ittiMsg.x2ap_ENDC_sgnb_addition_req_ACK
@@ -288,10 +289,6 @@ typedef struct x2ap_senb_addition_req_s {
 
 }x2ap_senb_addition_req_t;
 
-
-
-
-//Panos: Have to see what should be the additional/different elements comparing to handover req ack
 typedef struct x2ap_senb_addition_req_ack_s {
 
   int MeNB_UE_X2_id;
@@ -313,6 +310,13 @@ typedef struct x2ap_senb_addition_req_ack_s {
 
 } x2ap_senb_addition_req_ack_t;
 
+
+typedef struct x2ap_ENDC_setup_req_s {
+  uint32_t Nid_cell[MAX_NUM_CCs];
+  int num_cc;
+  uint32_t servedNrCell_band[MAX_NUM_CCs];
+} x2ap_ENDC_setup_req_t;
+
 typedef struct x2ap_ENDC_sgnb_addition_req_s {
   int ue_x2_id;
   LTE_PhysCellId_t target_physCellId; 
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 4c6a7885c3e1168a50a1f1a9aff119d1665d6461..bba96762cd5e752bc847c98e82d1334bb20cbcca 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -1576,6 +1576,8 @@ int RCconfig_RRC(uint32_t i, eNB_RRC_INST *rrc, int macrlc_has_f1) {
             } // !NODE_IS_DU(node_type)
           }
 
+          RRC_CONFIGURATION_REQ (msg_p).nr_scg_ssb_freq = ccparams_lte.nr_scg_ssb_freq;
+
           if (!NODE_IS_DU(rrc->node_type)) {
             char srb1path[MAX_OPTNAME_SIZE*2 + 8];
             sprintf(srb1path,"%s.%s",enbpath,ENB_CONFIG_STRING_SRB1);
diff --git a/openair2/ENB_APP/enb_paramdef.h b/openair2/ENB_APP/enb_paramdef.h
index 344214a1f176bb56686619eb2238b1bd930530d5..d2372c944c945611155320ed3c2912ec119a1716 100644
--- a/openair2/ENB_APP/enb_paramdef.h
+++ b/openair2/ENB_APP/enb_paramdef.h
@@ -429,6 +429,9 @@ typedef enum {
 //SIB1-MBMS
 #define ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL       "mbms_dedicated_serving_cell"
 
+//NSA NR Cell SSB Absolute Frequency
+#define ENB_CONFIG_STRING_NR_SCG_SSB_FREQ                         "nr_scg_ssb_freq"
+
 
 
 #define ENB_CONFIG_STRING_PDSCH_MAX_NUM_REPETITION_CE_MODE_A_R13        "pdsch_maxNumRepetitionCEmodeA_r13"
@@ -577,6 +580,7 @@ typedef struct ccparams_lte_s {
   int32_t           srb1_poll_pdu;
   int32_t           srb1_poll_byte;
   int32_t           srb1_max_retx_threshold;
+  int32_t           nr_scg_ssb_freq;
 } ccparams_lte_t;
 
 #define CCPARAMS_CHECK {                             \
@@ -780,7 +784,8 @@ typedef struct ccparams_lte_s {
   {ENB_CONFIG_STRING_UETIMERS_N311,                                NULL,   0,           iptr:&ccparams.ue_TimersAndConstants_n311,               defintval:1,               TYPE_UINT,       0},  \
   {ENB_CONFIG_STRING_UE_TRANSMISSION_MODE,                         NULL,   0,           iptr:&ccparams.ue_TransmissionMode,                      defintval:1,               TYPE_UINT,       0},  \
   {ENB_CONFIG_STRING_UE_MULTIPLE_MAX,                              NULL,   0,           iptr:&ccparams.ue_multiple_max,                          defintval:4,               TYPE_UINT,       0},  \
-  {ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL,                  NULL,   0,           strptr:&ccparams.mbms_dedicated_serving_cell,  defstrval:"DISABLE",       TYPE_STRING,       0}  \
+  {ENB_CONFIG_STRING_MBMS_DEDICATED_SERVING_CELL,                  NULL,   0,           strptr:&ccparams.mbms_dedicated_serving_cell,            defstrval:"DISABLE",       TYPE_STRING,     0},  \
+  {ENB_CONFIG_STRING_NR_SCG_SSB_FREQ,                              NULL,   0,           iptr:&ccparams.nr_scg_ssb_freq,                        defintval:641272,          TYPE_INT,        0}   \
 }
 
 
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
index 09e6245fec1e0c6d75df85989f9a30b02241cbcd..61bce26b2c1cc2d006ad67bcba98b06630f3ef16 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
@@ -99,6 +99,7 @@
 
 
 #include "intertask_interface.h"
+#include "NR_FreqBandList.h"
 
 
 #include "common/ran_context.h"
@@ -3199,9 +3200,13 @@ uint8_t do_SecurityModeCommand(
 //------------------------------------------------------------------------------
 uint8_t do_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
                                 uint8_t               *const buffer,
-                                const uint8_t                Transaction_id)
+                                const uint8_t                Transaction_id,
+                                int16_t              eutra_band,
+                                uint32_t              nr_band)
 //------------------------------------------------------------------------------
 {
+  NR_FreqBandList_t *nsa_band_list;
+  NR_FreqBandInformation_t *nsa_band;
   LTE_DL_DCCH_Message_t dl_dcch_msg;
   LTE_RAT_Type_t rat=LTE_RAT_Type_eutra;
   asn_enc_rval_t enc_rval;
@@ -3238,8 +3243,36 @@ uint8_t do_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
 
   /* TODO: no hardcoded values here */
 
+  nsa_band_list = (NR_FreqBandList_t *)calloc(1, sizeof(NR_FreqBandList_t));
+
+  nsa_band = (NR_FreqBandInformation_t *) calloc(1,sizeof(NR_FreqBandInformation_t));
+  nsa_band->present = NR_FreqBandInformation_PR_bandInformationEUTRA;
+  nsa_band->choice.bandInformationEUTRA = (NR_FreqBandInformationEUTRA_t *) calloc(1, sizeof(NR_FreqBandInformationEUTRA_t));
+  nsa_band->choice.bandInformationEUTRA->bandEUTRA = eutra_band;
+  ASN_SEQUENCE_ADD(&nsa_band_list->list, nsa_band);
+
+  nsa_band = (NR_FreqBandInformation_t *) calloc(1,sizeof(NR_FreqBandInformation_t));
+  nsa_band->present = NR_FreqBandInformation_PR_bandInformationNR;
+  nsa_band->choice.bandInformationNR = (NR_FreqBandInformationNR_t *) calloc(1, sizeof(NR_FreqBandInformationNR_t));
+  if(nr_band > 0)
+    nsa_band->choice.bandInformationNR->bandNR = nr_band;
+  else
+    nsa_band->choice.bandInformationNR->bandNR = 78;
+  ASN_SEQUENCE_ADD(&nsa_band_list->list, nsa_band);
+
   OCTET_STRING_t req_freq;
-  unsigned char req_freq_buf[5] = { 0x00, 0x20, 0x1a, 0x02, 0x68 };  // bands 7 & nr78
+  //unsigned char req_freq_buf[5] = { 0x00, 0x20, 0x1a, 0x02, 0x68 };  // bands 7 & nr78
+  unsigned char req_freq_buf[1024];
+  enc_rval = uper_encode_to_buffer(&asn_DEF_NR_FreqBandList,
+                              NULL,
+                              (void *)nsa_band_list,
+                              req_freq_buf,
+                              1024);
+
+  xer_fprint(stdout, &asn_DEF_NR_FreqBandList, (void *)nsa_band_list);
+
+
+
   //unsigned char req_freq_buf[5] = { 0x00, 0x20, 0x1a, 0x08, 0x18 };  // bands 7 & nr260
 
   //unsigned char req_freq_buf[13] = { 0x00, 0xc0, 0x18, 0x01, 0x01, 0x30, 0x4b, 0x04, 0x0e, 0x08, 0x24, 0x04, 0xd0 };
@@ -3248,7 +3281,7 @@ uint8_t do_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
 //  };
 
   req_freq.buf = req_freq_buf;
-  req_freq.size = 5;
+  req_freq.size = (enc_rval.encoded+7)/8;
 //  req_freq.size = 21;
 
   r15_10.requestedFreqBandsNR_MRDC_r15 = &req_freq;
@@ -3287,9 +3320,13 @@ uint8_t do_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
 //------------------------------------------------------------------------------
 uint8_t do_NR_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
                                    uint8_t               *const buffer,
-                                   const uint8_t                Transaction_id)
+                                   const uint8_t                Transaction_id,
+                                   int16_t              eutra_band,
+                                   uint32_t             nr_band)
 //------------------------------------------------------------------------------
 {
+  NR_FreqBandList_t *nsa_band_list;
+  NR_FreqBandInformation_t *nsa_band;
   LTE_DL_DCCH_Message_t dl_dcch_msg;
   LTE_RAT_Type_t rat_nr=LTE_RAT_Type_nr;
   LTE_RAT_Type_t rat_eutra_nr=LTE_RAT_Type_eutra_nr;
@@ -3329,8 +3366,32 @@ uint8_t do_NR_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
 
   /* TODO: no hardcoded values here */
 
+  nsa_band_list = (NR_FreqBandList_t *)calloc(1, sizeof(NR_FreqBandList_t));
+
+  nsa_band = (NR_FreqBandInformation_t *) calloc(1,sizeof(NR_FreqBandInformation_t));
+  nsa_band->present = NR_FreqBandInformation_PR_bandInformationEUTRA;
+  nsa_band->choice.bandInformationEUTRA = (NR_FreqBandInformationEUTRA_t *) calloc(1, sizeof(NR_FreqBandInformationEUTRA_t));
+  nsa_band->choice.bandInformationEUTRA->bandEUTRA = eutra_band;
+  ASN_SEQUENCE_ADD(&nsa_band_list->list, nsa_band);
+
+  nsa_band = (NR_FreqBandInformation_t *) calloc(1,sizeof(NR_FreqBandInformation_t));
+  nsa_band->present = NR_FreqBandInformation_PR_bandInformationNR;
+  nsa_band->choice.bandInformationNR = (NR_FreqBandInformationNR_t *) calloc(1, sizeof(NR_FreqBandInformationNR_t));
+  if(nr_band > 0)
+    nsa_band->choice.bandInformationNR->bandNR = nr_band;
+  else
+    nsa_band->choice.bandInformationNR->bandNR = 78;
+  ASN_SEQUENCE_ADD(&nsa_band_list->list, nsa_band);
+
   OCTET_STRING_t req_freq;
-  unsigned char req_freq_buf[5] = { 0x00, 0x20, 0x1a, 0x02, 0x68 };  // bands 7 & nr78
+  //unsigned char req_freq_buf[5] = { 0x00, 0x20, 0x1a, 0x02, 0x68 };  // bands 7 & nr78
+  unsigned char req_freq_buf[100];
+  enc_rval = uper_encode_to_buffer(&asn_DEF_NR_FreqBandList,
+      NULL,
+      (void *)nsa_band_list,
+      req_freq_buf,
+      1024);
+
   //unsigned char req_freq_buf[5] = { 0x00, 0x20, 0x1a, 0x08, 0x18 };  // bands 7 & nr260
 
   //unsigned char req_freq_buf[13] = { 0x00, 0xc0, 0x18, 0x01, 0x01, 0x30, 0x4b, 0x04, 0x0e, 0x08, 0x24, 0x04, 0xd0 };
@@ -3339,7 +3400,7 @@ uint8_t do_NR_UECapabilityEnquiry( const protocol_ctxt_t *const ctxt_pP,
 //  };
 
   req_freq.buf = req_freq_buf;
-  req_freq.size = 5;
+  req_freq.size = (enc_rval.encoded+7)/8;
 //  req_freq.size = 21;
 
   r15_10.requestedFreqBandsNR_MRDC_r15 = &req_freq;
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.h b/openair2/RRC/LTE/MESSAGES/asn1_msg.h
index 640d18a61f92942a6fcb66c0d52981c2d29e0c75..0d9fe65aeb0a03ed3e6eb49ac36e574f887d40cc 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.h
@@ -359,15 +359,17 @@ uint8_t
 do_UECapabilityEnquiry(
   const protocol_ctxt_t *const ctxt_pP,
   uint8_t               *const buffer,
-  const uint8_t                Transaction_id
-);
+  const uint8_t                Transaction_id,
+  int16_t              eutra_band,
+  uint32_t              nr_band);
 
 uint8_t
 do_NR_UECapabilityEnquiry(
   const protocol_ctxt_t *const ctxt_pP,
   uint8_t               *const buffer,
-  const uint8_t                Transaction_id
-);
+  const uint8_t                Transaction_id,
+  int16_t              eutra_band,
+  uint32_t             nr_band);
 
 uint8_t do_SecurityModeCommand(
   const protocol_ctxt_t *const ctxt_pP,
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index c498e3c6fe369ede99649040b4993ba527dd8c00..7e548a82d86584c20ec00af79d45d8d1992a36f2 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -791,6 +791,10 @@ typedef struct eNB_RRC_INST_s {
   int num_neigh_cells_cc[MAX_NUM_CCs];
   uint32_t neigh_cells_id[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs];
 
+  // Nr scc freq band and SSB absolute frequency
+  uint32_t nr_neigh_freq_band[MAX_NUM_NEIGH_CELLs][MAX_NUM_CCs];
+  int nr_scg_ssb_freq;
+
   // other RAN parameters
   int srb1_timer_poll_retransmit;
   int srb1_poll_pdu;
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index a6775bbf8a4b0f0d197da8620460a251d4993d83..4e61bd82bb0f411077e89b33aa8d66075219f25e 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -1282,10 +1282,14 @@ rrc_eNB_generate_UECapabilityEnquiry(
   uint8_t                             size;
   T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
     T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
+  int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
+  uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_neigh_freq_band[0][0];
   size = do_UECapabilityEnquiry(
            ctxt_pP,
            buffer,
-           rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id));
+           rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id),
+           eutra_band,
+           nr_band);
   LOG_I(RRC,
         PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate UECapabilityEnquiry (bytes %d)\n",
         PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
@@ -1328,10 +1332,14 @@ rrc_eNB_generate_NR_UECapabilityEnquiry(
   uint8_t                             size;
   T(T_ENB_RRC_UE_CAPABILITY_ENQUIRY, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
     T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
+  int16_t eutra_band = RC.rrc[ctxt_pP->module_id]->configuration.eutra_band[0];
+  uint32_t nr_band = RC.rrc[ctxt_pP->module_id]->nr_neigh_freq_band[0][0];
   size = do_NR_UECapabilityEnquiry(
            ctxt_pP,
            buffer,
-           rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id));
+           rrc_eNB_get_next_transaction_identifier(ctxt_pP->module_id),
+           eutra_band,
+           nr_band);
   LOG_I(RRC,
         PROTOCOL_RRC_CTXT_UE_FMT" Logical Channel DL-DCCH, Generate NR UECapabilityEnquiry (bytes %d)\n",
         PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
@@ -3283,8 +3291,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
 
     MeasObj2->measObjectId = 2;
     MeasObj2->measObject.present = LTE_MeasObjectToAddMod__measObject_PR_measObjectNR_r15;
-    MeasObj2->measObject.choice.measObjectNR_r15.carrierFreq_r15 = 641272;
-    //634000; //(634000 = 3.51GHz) (640000 = 3.6GHz) (641272 = 3619.08MHz = 3600 + 30/1000*106*12/2) (642256 is for 3.6GHz and absoluteFrequencySSB = 642016)
+    MeasObj2->measObject.choice.measObjectNR_r15.carrierFreq_r15 = rrc_inst->nr_scg_ssb_freq; //641272; //634000; //(634000 = 3.51GHz) (640000 = 3.6GHz) (641272 = 3619.08MHz = 3600 + 30/1000*106*12/2) (642256 is for 3.6GHz and absoluteFrequencySSB = 642016)
     MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.measTimingConfig_r15.periodicityAndOffset_r15.present = LTE_MTC_SSB_NR_r15__periodicityAndOffset_r15_PR_sf20_r15;
     MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.measTimingConfig_r15.periodicityAndOffset_r15.choice.sf20_r15 = 0;
     MeasObj2->measObject.choice.measObjectNR_r15.rs_ConfigSSB_r15.measTimingConfig_r15.ssb_Duration_r15 = LTE_MTC_SSB_NR_r15__ssb_Duration_r15_sf4;
@@ -7029,6 +7036,8 @@ char openair_rrc_eNB_configuration(
     openair_rrc_top_init_eNB(RC.rrc[ctxt.module_id]->carrier[CC_id].MBMS_flag,0);
   }
 
+  RC.rrc[ctxt.module_id]->nr_scg_ssb_freq = configuration->nr_scg_ssb_freq;
+
   openair_rrc_on(&ctxt);
 
   /*
@@ -9032,6 +9041,27 @@ void rrc_subframe_process(protocol_ctxt_t *const ctxt_pP, const int CC_id) {
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_RX_TX, VCD_FUNCTION_OUT);
 }
 
+void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m) {
+  if (RC.rrc[mod_id]->num_neigh_cells > MAX_NUM_NEIGH_CELLs) {
+    LOG_E(RRC, "Error: number of neighbouring cells is exceeded \n");
+    return;
+  }
+
+  if (m->num_cc > MAX_NUM_CCs) {
+    LOG_E(RRC, "Error: number of neighbouring cells carriers is exceeded \n");
+    return;
+  }
+
+  RC.rrc[mod_id]->num_neigh_cells++;
+  RC.rrc[mod_id]->num_neigh_cells_cc[RC.rrc[mod_id]->num_neigh_cells-1] = m->num_cc;
+
+  for (int i=0; i<m->num_cc; i++) {
+    RC.rrc[mod_id]->neigh_cells_id[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->Nid_cell[i];
+    RC.rrc[mod_id]->nr_neigh_freq_band[RC.rrc[mod_id]->num_neigh_cells-1][i] = m->servedNrCell_band[i];
+  }
+
+}
+
 void rrc_eNB_process_AdditionResponseInformation(const module_id_t enb_mod_idP, x2ap_ENDC_sgnb_addition_req_ACK_t *m) {
   NR_CG_Config_t *CG_Config = NULL;
   {
@@ -9421,6 +9451,10 @@ void *rrc_enb_process_itti_msg(void *notUsed) {
       break;
     }
 
+    case X2AP_ENDC_SETUP_REQ:
+      rrc_eNB_process_ENDC_x2_setup_request(instance, &X2AP_ENDC_SETUP_REQ(msg_p));
+      break;
+
     case X2AP_ENDC_SGNB_ADDITION_REQ_ACK: {
       rrc_eNB_process_AdditionResponseInformation(ENB_INSTANCE_TO_MODULE_ID(instance), &X2AP_ENDC_SGNB_ADDITION_REQ_ACK(msg_p));
       break;
diff --git a/openair2/RRC/LTE/rrc_proto.h b/openair2/RRC/LTE/rrc_proto.h
index 8f6baabcbf4d02d2adaadbce16038049fc79f606..c50ddf3189e9fcb3e7d463835871d065baefa0ce 100644
--- a/openair2/RRC/LTE/rrc_proto.h
+++ b/openair2/RRC/LTE/rrc_proto.h
@@ -360,6 +360,8 @@ void rrc_eNB_process_x2_setup_response(int mod_id, x2ap_setup_resp_t *m);
 
 void rrc_eNB_process_handoverPreparationInformation(int mod_id, x2ap_handover_req_t *m);
 
+void rrc_eNB_process_ENDC_x2_setup_request(int mod_id, x2ap_ENDC_setup_req_t *m);
+
 /**\brief Generate/decode the handover RRCConnectionReconfiguration at eNB
    \param module_idP Instance ID for eNB/CH
    \param frame Frame index
diff --git a/openair2/X2AP/x2ap_eNB_defs.h b/openair2/X2AP/x2ap_eNB_defs.h
index 6ab62ebf98fff24817fad7838ca9bb120aded4b6..3d8efd8cd4161c4865e85340d3fc549c8315bd1d 100644
--- a/openair2/X2AP/x2ap_eNB_defs.h
+++ b/openair2/X2AP/x2ap_eNB_defs.h
@@ -119,6 +119,8 @@ typedef struct x2ap_eNB_data_s {
   /* Nid cells */
   uint32_t                Nid_cell[MAX_NUM_CCs];
   int                     num_cc;
+  /*Frequency band of NR neighbor cell supporting ENDC NSA */
+  uint32_t                servedNrCell_band[MAX_NUM_CCs];
 
   /* Only meaningfull in virtual mode */
   struct x2ap_eNB_instance_s *x2ap_eNB_instance;
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
index a96fa14f48e037f46ff460e2c3f67581dfcc2a80..81eecf1128532bae850255f14a2421f8ff7f3318 100644
--- a/openair2/X2AP/x2ap_eNB_generate_messages.c
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -1317,7 +1317,7 @@ MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length
             freq_band = calloc(1, sizeof(X2AP_FreqBandNrItem_t));
             if (freq_band == NULL)
                exit(1);
-            freq_band->freqBandIndicatorNr = 1; /* TODO: put correct value */
+            freq_band->freqBandIndicatorNr = instance_p->eutra_band[0];
 
             SULFreqBandItem = calloc(1, sizeof(X2AP_SupportedSULFreqBandItem_t));
             SULFreqBandItem->freqBandIndicatorNr=80; /* TODO: put correct value */
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index 1c6c98cd81ec27dd43321de86f6058d7bd88fe3f..e5cf174cafa0e8e8d7d757e8a12fa13935878c19 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -44,6 +44,7 @@
 #include "msc.h"
 #include "assertions.h"
 #include "conversions.h"
+#include "X2AP_FreqBandNrItem.h"
 
 static
 int x2ap_eNB_handle_x2_setup_request (instance_t instance,
@@ -1354,13 +1355,13 @@ x2ap_eNB_handle_ENDC_x2_setup_request(instance_t instance,
   ServedNRcellsENDCX2ManagementList__Member                *servedCellMember;
 
   x2ap_eNB_instance_t                *instance_p;
+  MessageDef                         *msg;
   x2ap_eNB_data_t                    *x2ap_eNB_data;
   uint32_t                           gNB_id = 0;
 
   x2ap_eNB_data = NULL;
   DevAssert (pdu != NULL);
   x2_ENDC_SetupRequest = &pdu->choice.initiatingMessage.value.choice.ENDCX2SetupRequest;
-
   /*
    * We received a new valid X2 Setup Request on a stream != 0.
    * * * * This should not happen -> reject eNB x2 setup request.
@@ -1385,103 +1386,110 @@ x2ap_eNB_handle_ENDC_x2_setup_request(instance_t instance,
 		  X2AP_ProtocolIE_ID_id_InitiatingNodeType_EndcX2Setup, true);
 
 
+  msg = itti_alloc_new_message(TASK_X2AP, X2AP_ENDC_SETUP_REQ);
 
   if (ie == NULL ) {
     X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
     return -1;
   } else {
 	  if (ie->value.choice.InitiatingNodeType_EndcX2Setup.choice.init_en_gNB.list.count > 0) {
+	    for (int i=0; i<ie->value.choice.InitiatingNodeType_EndcX2Setup.choice.init_en_gNB.list.count;i++) {
+	      ie_GNB_ENDC = (X2AP_En_gNB_ENDCX2SetupReqIEs_t*) ie->value.choice.InitiatingNodeType_EndcX2Setup.choice.init_eNB.list.array[i];
+	      if (ie_GNB_ENDC == NULL ) {
+	        X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
+	        return -1;
+	      }
 
-		  for (int i=0; i<ie->value.choice.InitiatingNodeType_EndcX2Setup.choice.init_en_gNB.list.count;i++) {
-
-			  ie_GNB_ENDC = (X2AP_En_gNB_ENDCX2SetupReqIEs_t*) ie->value.choice.InitiatingNodeType_EndcX2Setup.choice.init_eNB.list.array[i];
-			  if (ie_GNB_ENDC == NULL ) {
-				  X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
-				  return -1;
-			  }
-
-			  else if (ie_GNB_ENDC->id == X2AP_ProtocolIE_ID_id_Globalen_gNB_ID) {
-				  if (ie_GNB_ENDC->value.choice.GlobalGNB_ID.gNB_ID.choice.gNB_ID.size!= 28) {
-					  //TODO: handle case were size != 28 -> notify ? reject ?
-				  }
-				  OCTET_STRING_TO_INT32(&ie_GNB_ENDC->value.choice.GlobalGNB_ID.gNB_ID.choice.gNB_ID,gNB_id);
-				  X2AP_DEBUG("gNB id: %07x\n", gNB_id);
-
-				  X2AP_DEBUG("Adding gNB to the list of associated gNBs\n");
-				  if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (gNB_id)) == NULL) {
-					  /*
-				       * eNB has not been found in list of associated eNB,
-				       * * * * Add it to the tail of list and initialize data
-				       */
-					  if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
-						  /*
-						   * ??
-						   */
-						  return -1;
-					  } else {
-						  x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
-						  x2ap_eNB_data->eNB_id = gNB_id;
-					  }
-				  } else {
-					  x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
-
-					  /*
-					   * eNB has been found in list, consider the x2 setup request as a reset connection,
-					   * * * * reseting any previous UE state if sctp association is != than the previous one
-					   */
-					  if (x2ap_eNB_data->assoc_id != assoc_id) {
-						  /*
-						   * ??: Send an overload cause...
-						   */
-						  X2AP_ERROR("Rejecting x2 setup request as eNB id %d is already associated to an active sctp association" "Previous known: %d, new one: %d\n", gNB_id, x2ap_eNB_data->assoc_id, assoc_id);
-
-						  // Panos: Here we should be calling an ENDC specific setup_failure function instead
-						  x2ap_eNB_generate_x2_setup_failure (instance,
-				                                          assoc_id,
-				                                          X2AP_Cause_PR_protocol,
-				                                          X2AP_CauseProtocol_unspecified,
-				                                          -1);
-						  return -1;
-					  }
-					  /*
-					   *  * TODO: call the reset procedure
-					   */
-				  }
-			  }
-			  else if (ie_GNB_ENDC->id == X2AP_ProtocolIE_ID_id_ServedNRcellsENDCX2ManagementList){
-				  if (ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.count > 0) {
-				      x2ap_eNB_data->num_cc = ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.count;
-				      for (int i=0; i<ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.count;i++) {
-				    	  servedCellMember = (ServedNRcellsENDCX2ManagementList__Member *)ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.array[i];
-				    	  x2ap_eNB_data->Nid_cell[i] = servedCellMember->servedNRCellInfo.nrpCI;
-				    	  //servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[0]
-                                          if (servedCellMember->servedNRCellInfo.fiveGS_TAC != NULL) {
-				    	    X2AP_INFO("TAC: %02x%02x%02x\n",
-				    			    servedCellMember->servedNRCellInfo.fiveGS_TAC->buf[0],
-				    			    servedCellMember->servedNRCellInfo.fiveGS_TAC->buf[1],
-				    			    servedCellMember->servedNRCellInfo.fiveGS_TAC->buf[2]);
-                                          } else {
-				    	    X2AP_INFO("TAC: (NULL)\n");
-                                          }
-
-				    	  X2AP_INFO("PLMN: %02x%02x%02x\n",
-				    			  servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[0],
-				    			  servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[1],
-				    			  servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[2]);
-				      }
-				  }
-			  }
-		  }
+	      else if (ie_GNB_ENDC->id == X2AP_ProtocolIE_ID_id_Globalen_gNB_ID) {
+	        if (ie_GNB_ENDC->value.choice.GlobalGNB_ID.gNB_ID.choice.gNB_ID.size!= 28) {
+	          //TODO: handle case were size != 28 -> notify ? reject ?
+	        }
+	        OCTET_STRING_TO_INT32(&ie_GNB_ENDC->value.choice.GlobalGNB_ID.gNB_ID.choice.gNB_ID,gNB_id);
+	        X2AP_DEBUG("gNB id: %07x\n", gNB_id);
+
+	        X2AP_DEBUG("Adding gNB to the list of associated gNBs\n");
+	        if ((x2ap_eNB_data = x2ap_is_eNB_id_in_list (gNB_id)) == NULL) {
+	          /*
+	           * eNB has not been found in list of associated eNB,
+	           * * * * Add it to the tail of list and initialize data
+	           */
+	          if ((x2ap_eNB_data = x2ap_is_eNB_assoc_id_in_list (assoc_id)) == NULL) {
+	            /*
+	             * ??
+	             */
+	            return -1;
+	          } else {
+	              x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+	              x2ap_eNB_data->eNB_id = gNB_id;
+	          }
+	        } else {
+	            x2ap_eNB_data->state = X2AP_ENB_STATE_RESETTING;
+	            /*
+	             * eNB has been found in list, consider the x2 setup request as a reset connection,
+	             * * * * reseting any previous UE state if sctp association is != than the previous one
+	             */
+	            if (x2ap_eNB_data->assoc_id != assoc_id) {
+	              /*
+	               * ??: Send an overload cause...
+	               */
+	              X2AP_ERROR("Rejecting x2 setup request as eNB id %d is already associated to an active sctp association" "Previous known: %d, new one: %d\n", gNB_id, x2ap_eNB_data->assoc_id, assoc_id);
+
+	              // Here we should be calling an ENDC specific setup_failure function instead
+	              x2ap_eNB_generate_x2_setup_failure (instance,
+	                  assoc_id,
+	                  X2AP_Cause_PR_protocol,
+	                  X2AP_CauseProtocol_unspecified,
+	                  -1);
+	              return -1;
+	            }
+	            /*
+	             *  * TODO: call the reset procedure
+	             */
+	        }
+	      }
+	      else if (ie_GNB_ENDC->id == X2AP_ProtocolIE_ID_id_ServedNRcellsENDCX2ManagementList){
+	        if (ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.count > 0) {
+	          x2ap_eNB_data->num_cc = ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.count;
+	          X2AP_ENDC_SETUP_REQ(msg).num_cc = x2ap_eNB_data->num_cc;
+	          for (int i=0; i<ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.count;i++) {
+	            servedCellMember = (ServedNRcellsENDCX2ManagementList__Member *)ie_GNB_ENDC->value.choice.ServedNRcellsENDCX2ManagementList.list.array[i];
+	            x2ap_eNB_data->Nid_cell[i] = servedCellMember->servedNRCellInfo.nrpCI;
+	            X2AP_ENDC_SETUP_REQ(msg).Nid_cell[i] = x2ap_eNB_data->Nid_cell[i];
+	            //servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[0]
+	            if (servedCellMember->servedNRCellInfo.fiveGS_TAC != NULL) {
+	              X2AP_INFO("TAC: %02x%02x%02x\n",
+	                  servedCellMember->servedNRCellInfo.fiveGS_TAC->buf[0],
+	                  servedCellMember->servedNRCellInfo.fiveGS_TAC->buf[1],
+	                  servedCellMember->servedNRCellInfo.fiveGS_TAC->buf[2]);
+	            } else {
+	                X2AP_INFO("TAC: (NULL)\n");
+	            }
+
+	            X2AP_INFO("PLMN: %02x%02x%02x\n",
+	                servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[0],
+	                servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[1],
+	                servedCellMember->servedNRCellInfo.nrCellID.pLMN_Identity.buf[2]);
+	            if(servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nRFreqInfo.freqBandListNr.list.count > 0){
+	                X2AP_FreqBandNrItem_t *FreqBandItem = servedCellMember->servedNRCellInfo.nrModeInfo.choice.tdd.nRFreqInfo.freqBandListNr.list.array[0];
+	                x2ap_eNB_data->servedNrCell_band[i] = FreqBandItem->freqBandIndicatorNr;
+	                X2AP_ENDC_SETUP_REQ(msg).servedNrCell_band[i] = x2ap_eNB_data->servedNrCell_band[i];
+	            }
+	          }
+	        }
+	      }
+	    }
 	  }
 	  else {
-		  X2AP_ERROR("%s %d: init_eNB list is empty \n",__FILE__,__LINE__);
-		  return -1;
+	    X2AP_ERROR("%s %d: init_eNB list is empty \n",__FILE__,__LINE__);
+	    return -1;
 	  }
   }
 
   instance_p = x2ap_eNB_get_instance(instance);
   DevAssert(instance_p != NULL);
 
+  itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg);
+
   return x2ap_eNB_generate_ENDC_x2_setup_response(instance_p, x2ap_eNB_data);
 }
 
diff --git a/openair3/S1AP/s1ap_eNB_handlers.c b/openair3/S1AP/s1ap_eNB_handlers.c
index 28ee11187ee6f0cbe588ffd555a290c6cfd09e9d..79501a1a0969c38fd6aa69dcd232b11d584e84a9 100644
--- a/openair3/S1AP/s1ap_eNB_handlers.c
+++ b/openair3/S1AP/s1ap_eNB_handlers.c
@@ -1736,7 +1736,7 @@ int s1ap_eNB_handle_s1_ENDC_e_rab_modification_confirm(uint32_t               as
     uint32_t               stream,
     S1AP_S1AP_PDU_t       *pdu){
 
-	LOG_W(S1AP, "Implementation of S1AP E-RAB Modification confirm handler is pending...\n");
+	LOG_I(S1AP, "Received S1AP E-RAB Modification confirm message \n");
 	return 0;
 }
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_enb.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_enb.conf
index 4c0d346360ed17a9e95a262e984fa3602e318ce9..96584fd9108751e67c876e29cbc599daa88d7a19 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_enb.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/testing_enb.conf
@@ -140,6 +140,9 @@ eNBs =
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_buf          = "f0ffffffff";
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_size         = 5;
       discRxPool_ResourceConfig_subframeBitmap_choice_bs_bits_unused  = 0;
+      
+      //SSB central frequency of NR secondary cell group (for ENDC NSA) 
+      nr_scg_ssb_freq												  = 641272;	
 
 			 }
 			 );