diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1ed392ef0647193896da498a7033b84921b35f81
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+cmake_targets/log/
+cmake_targets/ran_build/
+targets/bin/
+
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index 222db54456c0d96cd8c976200265caeb2fc8d599..ad4dcc349b9e853733e372cc67cfc04e3095bbfb 100755
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -370,12 +370,17 @@ typedef struct {
     } fapi_nr_pucch_config_common_t;
 
     typedef struct {
+
         uint8_t subcarrier_spacing_common;
         uint8_t ssb_subcarrier_offset;
         uint8_t dmrs_type_a_position;
         uint8_t pdcch_config_sib1;
         uint8_t cell_barred;
         uint8_t intra_frquency_reselection;
+
+        uint16_t system_frame_number;
+        uint8_t ssb_index;
+        uint8_t half_frame_bit;
     } fapi_nr_pbch_config_t;
 
     typedef struct {
@@ -716,11 +721,18 @@ typedef struct {
         
     } fapi_nr_ul_bwp_dedicated_config_t;
 
+#define FAPI_NR_CONFIG_REQUEST_MASK_PBCH                0x01
+#define FAPI_NR_CONFIG_REQUEST_MASK_DL_BWP_COMMON       0x02
+#define FAPI_NR_CONFIG_REQUEST_MASK_UL_BWP_COMMON       0x04
+#define FAPI_NR_CONFIG_REQUEST_MASK_DL_BWP_DEDICATED    0x08
+#define FAPI_NR_CONFIG_REQUEST_MASK_UL_BWP_DEDICATED    0x10
+
 typedef struct {
     fapi_nr_p4_p5_message_header_t header;
     uint8_t num_tlv;
+    uint32_t config_mask;
 
-    fapi_nr_pbch_config_t pbch_config_common;  //  MIB
+    fapi_nr_pbch_config_t pbch_config;  //  MIB
 
     fapi_nr_dl_bwp_common_config_t     dl_bwp_common;
     fapi_nr_dl_bwp_dedicated_config_t  dl_bwp_dedicated;
diff --git a/openair2/LAYER2/NR_MAC_UE/defs.h b/openair2/LAYER2/NR_MAC_UE/defs.h
index 303f1220a78f11b5f1365021b5a06954d2fbd60a..1a00dfbd92094f800ef47952d501fe5a9537917b 100755
--- a/openair2/LAYER2/NR_MAC_UE/defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/defs.h
@@ -58,6 +58,8 @@
 #include "NR_SpCellConfig.h"
 
 #include "NR_ServingCellConfig.h"
+#include "fapi_nr_ue_interface.h"
+#include "NR_IF_Module.h"
 
 #define NB_NR_UE_MAC_INST 1
 
@@ -75,6 +77,16 @@ typedef struct {
 
 	NR_MIB_t 			*mib;
 
+	////	FAPI-like interface
+	fapi_nr_tx_request_t tx_request;
+	fapi_nr_ul_config_request_t ul_config_request;
+	fapi_nr_dl_config_request_t dl_config_request;
+	fapi_nr_dci_indication_t dci_indication;
+	fapi_nr_rx_indication_t rx_indication;
+
+	nr_ue_if_module_t *if_module;
+	nr_scheduled_response_t	scheduled_response;
+	nr_phy_config_t phy_config;
 } NR_UE_MAC_INST_t;
 
 /*@}*/
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index c82e39f640066337719c5124ce84c8a968634fbf..24622c2d91464867a9901337657ca2b4f1e476a2 100755
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -37,31 +37,53 @@ int8_t nr_ue_decode_mib(
 	uint8_t 	gNB_index,
 	uint8_t 	extra_bits,	//	8bits 38.212 c7.1.1
 	uint32_t    l_ssb_equal_64,
-	uint32_t 	*ssb_index,	//	from decoded MIB
-	uint32_t 	*frameP,	//	10 bits = 6(in decoded MIB)+4(in extra bits from L1)
+	//uint32_t 	*ssb_index,	//	from decoded MIB
+	//uint32_t 	*frameP,	//	10 bits = 6(in decoded MIB)+4(in extra bits from L1)
 	void 		*pduP,		//	encoded MIB
 	uint16_t 	pdu_len){
 
 	NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
 
-    nr_mac_rrc_data_ind_ue( module_id, CC_id, gNB_index, frameP,
+    nr_mac_rrc_data_ind_ue( module_id, CC_id, gNB_index,
 		     NR_BCCH_BCH, (uint8_t *) pduP, pdu_len );
     
 
     uint32_t frame = mac->mib->systemFrameNumber.buf[0];
-    uint32_t frame_number_4lsb = (uint32_t)(extra_bits & 0xf);
-    uint32_t ssb_subcarrier_offset_msb = (uint32_t)(( extra_bits >> 4 ) & 0x1 );
+    uint32_t frame_number_4lsb = (uint32_t)(extra_bits & 0xf);                      //	extra bits[0:3]
+    uint32_t half_frame_bit = (uint32_t)(( extra_bits >> 4 ) & 0x1 );               //	extra bits[4]
+    uint32_t ssb_subcarrier_offset_msb = (uint32_t)(( extra_bits >> 5 ) & 0x1 );    //	extra bits[5]
+    
+    uint32_t ssb_subcarrier_offset = mac->mib->subCarrierSpacingCommon;
+
+    uint32_t ssb_index;
 
     frame = frame << 4;
     frame = frame | frame_number_4lsb;
 
-    *frameP = frame;
-
     if(l_ssb_equal_64){
-    	*ssb_index = (( extra_bits >> 4 ) & 0x7 );
+    	ssb_index = (( extra_bits >> 5 ) & 0x7 );                                   //	extra bits[5:7]
+    	mac->phy_config.config_req.pbch_config.ssb_index = ssb_index;
+    }else{
+        if(ssb_subcarrier_offset_msb){
+            ssb_subcarrier_offset = ssb_subcarrier_offset | 0x10;
+        }
     }
 
 
+    // fill in the elements in config request inside P5 message
+    mac->phy_config.config_req.pbch_config.system_frame_number = frame;    //  after calculation
+    mac->phy_config.config_req.pbch_config.subcarrier_spacing_common = mac->mib->subCarrierSpacingCommon;
+    mac->phy_config.config_req.pbch_config.ssb_subcarrier_offset = ssb_subcarrier_offset;  //  after calculation
+    mac->phy_config.config_req.pbch_config.dmrs_type_a_position = mac->mib->dmrs_TypeA_Position;
+    mac->phy_config.config_req.pbch_config.pdcch_config_sib1 = mac->mib->pdcch_ConfigSIB1;
+    mac->phy_config.config_req.pbch_config.cell_barred = mac->mib->cellBarred;
+    mac->phy_config.config_req.pbch_config.intra_frquency_reselection = mac->mib->intraFreqReselection;
+    mac->phy_config.config_req.pbch_config.half_frame_bit = half_frame_bit;
+    mac->phy_config.config_req.config_mask |= FAPI_NR_CONFIG_REQUEST_MASK_PBCH;
+
+    if(mac->if_module != NULL && mac->if_module->phy_config_request != NULL){
+        mac->if_module->phy_config_request(&mac->phy_config);
+    }
 
     return 0;
 }
diff --git a/openair2/LAYER2/NR_MAC_UE/proto.h b/openair2/LAYER2/NR_MAC_UE/proto.h
index c69eacee72bbfc496904fcd26f014481168b8360..ffab06a43f74619fb6f43f3a55d37e3057e874f1 100755
--- a/openair2/LAYER2/NR_MAC_UE/proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/proto.h
@@ -36,12 +36,10 @@
    \param CC_id          component carrier id
    \param gNB_index      gNB index
    \param extra_bits     extra bits for frame calculation
-   \param l_ssb_equal_64 check if ssb number of candicate is equal 64, 1=equal; 0=non equal. Reference 38.212 c7.1.1
-   \param ssb_index      SSB index for frame calculation
-   \param frameP         pointer to frame for revising after frame calculation
+   \param l_ssb_equal_64 check if ssb number of candicate is equal 64, 1=equal; 0=non equal. Reference 38.212 7.1.1
    \param pduP           pointer to pdu
    \param pdu_length     length of pdu*/
-int8_t nr_ue_decode_mib(module_id_t module_id, int CC_id, uint8_t gNB_index, uint8_t extra_bits, uint32_t l_ssb_equal_64, uint32_t *ssb_index, uint32_t *frameP, void *pduP, uint16_t pdu_len);
+int8_t nr_ue_decode_mib(module_id_t module_id, int CC_id, uint8_t gNB_index, uint8_t extra_bits, uint32_t l_ssb_equal_64, void *pduP, uint16_t pdu_len);
 
 
 /**\brief primitive from RRC layer to MAC layer for configuration L1/L2, now supported 4 rrc messages: MIB, cell_group_config for MAC/PHY, spcell_config(serving cell config)
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index 9a797489d672873873034e1274c085da7ce6786a..d77759e3dfd7f5a81481898abfe2ef915524b9ef 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -44,19 +44,16 @@ int8_t handle_bcch_bch(uint32_t pdu_len, uint8_t *pduP){
 
     //  pdu_len = 4, 32bits
     uint8_t extra_bits = pduP[3];
-    uint32_t ssb_index;
-    uint32_t frame;
     nr_ue_decode_mib(   (module_id_t)0,
                         0,
                         0,
                         extra_bits,
                         0,  //  Lssb = 64 is not support
-                        &ssb_index,
-                        &frame,
                         pduP,
                         3 );
 
 
+
     return 0;
 }
 
@@ -66,6 +63,12 @@ int8_t handle_bcch_dlsch(uint32_t pdu_len, uint8_t *pduP){
 }
 
 int8_t nr_ue_dl_indication(nr_downlink_indication_t *dl_info){
+    
+    module_id_t module_id = dl_info->module_id;
+    NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
+
+    //  clean up scheduled_response structure
+
     if(dl_info->rx_ind != NULL){
         switch(dl_info->rx_ind->rx_request_body.pdu_index){
             case FAPI_NR_RX_PDU_BCCH_BCH_TYPE:
@@ -84,10 +87,13 @@ int8_t nr_ue_dl_indication(nr_downlink_indication_t *dl_info){
 
     }
 
-    return 0;
-}
+    if(nr_ue_if_module_inst[module_id] != NULL){
+        nr_ue_if_module_inst[module_id]->scheduled_response(&mac->scheduled_response);
+    }
 
 
+    return 0;
+}
 
 nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id){
 
@@ -102,36 +108,6 @@ nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id){
     return nr_ue_if_module_inst[module_id];
 }
 
-int8_t nr_ue_if_module_register_dl_indication(uint32_t module_id, nr_ue_dl_indication_f *f){
-    if (nr_ue_if_module_inst[module_id] == NULL) {
-        nr_ue_if_module_inst[module_id]->dl_indication = f;
-    }else{
-        return -1;
-    }
-
-    return 0;
-}
-
-int8_t nr_ue_if_module_register_phy_config_request(uint32_t module_id, nr_ue_phy_config_request_f *f){
-    if (nr_ue_if_module_inst[module_id] == NULL) {
-        nr_ue_if_module_inst[module_id]->phy_config_request = f;
-    }else{
-        return -1;
-    }
-
-    return 0;
-}
-
-int8_t nr_ue_if_module_register_scheduled_response(uint32_t module_id, nr_ue_scheduled_response_f *f){
-    if (nr_ue_if_module_inst[module_id] == NULL) {
-        nr_ue_if_module_inst[module_id]->scheduled_response = f;
-    }else{
-        return -1;
-    }
-
-    return 0;
-}
-
 int8_t nr_ue_if_module_kill(uint32_t module_id) {
 
     if (nr_ue_if_module_inst[module_id] != NULL){
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
index bba8666af852a93ac6effd6015af87b2ab6f8225..f407428ee6a7ff50351e54e178158e9e317c0055 100755
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h
@@ -91,7 +91,7 @@ typedef struct {
     
     /// NR UE FAPI-like P5 message
     /// physical layer configuration request structure
-    fapi_nr_config_request_t *config_req;
+    fapi_nr_config_request_t config_req;
 
 } nr_phy_config_t;
 
@@ -127,7 +127,7 @@ typedef int8_t(nr_ue_dl_indication_f)(nr_downlink_indication_t *dl_info);
 
 
 //  TODO check this stuff can be reuse of need modification
-typedef struct IF_Module_s {
+typedef struct nr_ue_if_module_s {
     nr_ue_scheduled_response_f *scheduled_response;
     nr_ue_phy_config_request_f *phy_config_request;
     nr_ue_dl_indication_f      *dl_indication;
@@ -154,21 +154,6 @@ int8_t nr_ue_if_module_kill(uint32_t module_id);
 int8_t nr_ue_dl_indication(nr_downlink_indication_t *dl_info);
 
 
-/**\brief register dl_indication into certain if_module_inst by module_id
-   \param f function pointer to dl_indication*/
-int8_t nr_ue_if_module_register_dl_indication(uint32_t module_id, nr_ue_dl_indication_f *f);
-
-
-/**\brief register phy_config_request into certain if_module_inst by module_id
-   \param f function pointer to phy_config_request*/
-int8_t nr_ue_if_module_register_phy_config_request(uint32_t module_id, nr_ue_phy_config_request_f *f);
-
-
-/**\brief register scheduled_response into certain if_module_inst by module_id
-   \param f function pointer to scheduled_response*/
-int8_t nr_ue_if_module_register_scheduled_response(uint32_t module_id, nr_ue_scheduled_response_f *f);
-
-
 /**\brief handle BCCH-BCH message from dl_indication
    \param pdu_len   length(bytes) of pdu
    \param pduP      pointer to pdu*/
diff --git a/openair2/RRC/NR_UE/L2_interface_ue.c b/openair2/RRC/NR_UE/L2_interface_ue.c
index 2c51fe4c6cd88c1eb19523195e38dc25c75d9f9c..f5a5670eae846bce5a397cfb2153f5b31cfce53f 100644
--- a/openair2/RRC/NR_UE/L2_interface_ue.c
+++ b/openair2/RRC/NR_UE/L2_interface_ue.c
@@ -38,7 +38,6 @@ nr_mac_rrc_data_ind_ue(
     const module_id_t     module_id,
     const int             CC_id,
     const uint8_t         gNB_index,
-    const uint32_t*       frameP,
     const channel_t       channel,
     const uint8_t*        pduP,
     const sdu_size_t      pdu_len){
diff --git a/openair2/RRC/NR_UE/rrc_proto.h b/openair2/RRC/NR_UE/rrc_proto.h
index e3ff9b0d3d77ae50ae810ab6953f2260728d97c3..3885767865c5936ae3c4eca6665db0bbfbc688c4 100644
--- a/openair2/RRC/NR_UE/rrc_proto.h
+++ b/openair2/RRC/NR_UE/rrc_proto.h
@@ -97,11 +97,10 @@ int8_t nr_rrc_ue_decode_NR_DL_DCCH_Message(const module_id_t module_id, const ui
    \param module_id  module id
    \param CC_id      component carrier id
    \param gNB_index  gNB index
-   \param frameP     pointer to frame for calculation
    \param channel    indicator for channel of the pdu
    \param pduP       pointer to pdu
    \param pdu_len    data length of pdu*/
-int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const uint32_t *frameP, const channel_t channel, const uint8_t* pduP, const sdu_size_t pdu_len);
+int8_t nr_mac_rrc_data_ind_ue(const module_id_t module_id, const int CC_id, const uint8_t gNB_index, const channel_t channel, const uint8_t* pduP, const sdu_size_t pdu_len);
 
 /** @}*/
 #endif
\ No newline at end of file