diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index 61854e20480949a04dfc8f9b722ebbffa0ebd238..3305ffd256f0a4030c1f5fa786946194b7c6f23f 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -132,8 +132,9 @@ typedef struct f1ap_setup_req_s {
 
   // System Information
   uint8_t *mib[F1AP_MAX_NB_CELLS];
+  int     mib_length[F1AP_MAX_NB_CELLS];
   uint8_t *sib1[F1AP_MAX_NB_CELLS];
-
+  int     sib1_length[F1AP_MAX_NB_CELLS];
 
 
 } f1ap_setup_req_t;
@@ -155,6 +156,7 @@ typedef struct f1ap_setup_resp_s {
   uint8_t num_SI[F1AP_MAX_NB_CELLS];
   /// SI message containers (up to 21 messages per cell)
   uint8_t *SI_container[F1AP_MAX_NB_CELLS][21];
+  int      SI_container_length[F1AP_MAX_NB_CELLS][21];
 } f1ap_setup_resp_t;
 
 typedef struct f1ap_setup_failure_s {
@@ -171,6 +173,7 @@ typedef struct f1ap_dl_rrc_message_s {
   uint8_t  srb_id;
   uint8_t  execute_duplication;
   uint8_t *rrc_container;
+  int      rrc_container_length;
   union {
     // both map 0..255 => 1..256
     uint8_t en_dc;
@@ -188,7 +191,9 @@ typedef struct f1ap_initial_ul_rrc_message_s {
   uint8_t mnc_digit_length;
   uint16_t crnti;
   uint8_t *rrc_container;
+  int      rrc_container_length;
   uint8_t *du2cu_rrc_container;
+  int      du2cu_rrc_container_length;
 } f1ap_initial_ul_rrc_message_t;
 
 typedef struct f1ap_ul_rrc_message_s {
@@ -196,6 +201,7 @@ typedef struct f1ap_ul_rrc_message_s {
   uint32_t gNB_DU_ue_id;
   uint8_t srb_id;
   uint8_t *rrc_container;
+  int      rrc_container_length;
 } f1ap_ul_rrc_message_t;
 
 /*typedef struct f1ap_ue_context_setup_req_s {
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 3511aa021f351ca21211ac85113f6375ce3cc596..84bf7b0f2900f6e0d6f1f78ab3a6af579721249b 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -59,6 +59,9 @@
 #include "RRC_config_tools.h"
 #include "enb_paramdef.h"
 
+#include "SystemInformationBlockType1.h"
+#include "SIB-Type.h"
+
 extern uint16_t sf_ahead;
 
 void RCconfig_flexran()
@@ -2707,22 +2710,232 @@ void RCConfig(void) {
  
 }
 
+int check_plmn_identity(rrc_eNB_carrier_data_t *carrier,uint16_t mcc,uint16_t mnc,uint8_t mnc_digit_length) {
+
+  AssertFatal(carrier->sib1->cellAccessRelatedInfo.plmn_IdentityList.list.count > 0,
+	      "plmn info isn't there\n");
+  AssertFatal(mnc_digit_length ==2 || mnc_digit_length == 3,
+	      "impossible mnc_digit_length %d\n",mnc_digit_length);
+
+  PLMN_IdentityInfo_t *plmn_Identity_info = carrier->sib1->cellAccessRelatedInfo.plmn_IdentityList.list.array[0];
+
+  // check if mcc is different and return failure if so
+  if (mcc != 
+      (*plmn_Identity_info->plmn_Identity.mcc->list.array[0]*100)+
+      (*plmn_Identity_info->plmn_Identity.mcc->list.array[1]*10) +
+      (*plmn_Identity_info->plmn_Identity.mcc->list.array[2])) return(0);
+
+  // check that mnc digit length is different and return failure if so
+  if (mnc_digit_length != plmn_Identity_info->plmn_Identity.mnc.list.count) return 0;
+
+  // check that 2 digit mnc is different and return failure if so
+  if (mnc_digit_length == 2 &&
+      (mnc !=       
+       (*plmn_Identity_info->plmn_Identity.mnc.list.array[0]*10) +
+       (*plmn_Identity_info->plmn_Identity.mnc.list.array[1]))) return(0);
+  else if (mnc_digit_length == 3 &&
+	   (mnc !=       
+	    (*plmn_Identity_info->plmn_Identity.mnc.list.array[0]*100) +
+	    (*plmn_Identity_info->plmn_Identity.mnc.list.array[1]*10) +
+	    (*plmn_Identity_info->plmn_Identity.mnc.list.array[2]))) return(0);
+
+  // if we're here, the mcc/mnc match so return success
+  return(1);
+
+}
+
+void extract_and_decode_SI(int inst,int si_ind,uint8_t *si_container,int si_container_length) {
+
+  eNB_RRC_INST *rrc = RC.rrc[inst];
+  rrc_eNB_carrier_data_t *carrier = &rrc->carrier[0];
+  BCCH_DL_SCH_Message_t *bcch_message ;
+
+  AssertFatal(si_ind==0,"Can only handle a single SI block for now\n");
+
+  // point to first SI block
+  bcch_message = &carrier->systemInformation;
+  asn_dec_rval_t dec_rval = uper_decode_complete( NULL,
+						  &asn_DEF_BCCH_DL_SCH_Message,
+						  (void **)&bcch_message,
+						  (const void *)si_container,
+						  si_container_length);
+  
+  if ((dec_rval.code != RC_OK) && (dec_rval.consumed == 0)) {
+    AssertFatal(1==0, "[ENB_APP][RRC inst %"PRIu8"] Failed to decode BCCH_DLSCH_MESSAGE (%zu bits)\n",
+		inst,
+		dec_rval.consumed );
+
+    if (bcch_message->message.present == BCCH_DL_SCH_MessageType_PR_c1) {
+      switch (bcch_message->message.choice.c1.present) {
+      case BCCH_DL_SCH_MessageType__c1_PR_systemInformationBlockType1:
+	AssertFatal(1==0,"Should have received SIB1 from CU\n");
+	break;
+      case BCCH_DL_SCH_MessageType__c1_PR_systemInformation:
+	{
+	  SystemInformation_t *si = &bcch_message->message.choice.c1.choice.systemInformation;
+	  
+	  for (int i=0; i<si->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.count; i++) {
+	    struct SystemInformation_r8_IEs__sib_TypeAndInfo__Member *typeandinfo;
+	    typeandinfo = si->criticalExtensions.choice.systemInformation_r8.sib_TypeAndInfo.list.array[i];
+	    
+	    switch(typeandinfo->present) {
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib2:
+	      carrier->sib2 = &typeandinfo->choice.sib2;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB2 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib3:
+	      carrier->sib3 = &typeandinfo->choice.sib3;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB3 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib4:
+	      //carrier->sib4 = &typeandinfo->choice.sib4;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB4 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib5:
+	      //carrier->sib5 = &typeandinfo->choice.sib5;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB5 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib6:
+	      //carrier->sib6 = &typeandinfo->choice.sib6;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB6 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib7:
+	      //carrier->sib7 = &typeandinfo->choice.sib7;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB7 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib8:
+	      //carrier->sib8 = &typeandinfo->choice.sib8;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB8 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib9:
+	      //carrier->sib9 = &typeandinfo->choice.sib9;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB9 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib10:
+	      //carrier->sib10 = &typeandinfo->choice.sib10;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB10 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib11:
+	      //carrier->sib11 = &typeandinfo->choice.sib11;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB11 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+
+#if (RRC_VERSION >= MAKE_VERSION(9, 2, 0))
+
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib12_v920:
+	      //carrier->sib12 = &typeandinfo->choice.sib12;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB12 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	      
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib13_v920:
+	      carrier->sib13 = &typeandinfo->choice.sib13_v920;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB13 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+#endif
+#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
+	      //SIB18
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib18_v1250:
+	      carrier->sib18 = &typeandinfo->choice.sib18_v1250;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB18 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	      //SIB19
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib19_v1250:
+	      carrier->sib19 = &typeandinfo->choice.sib19_v1250;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB19 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+	      //SIB21
+	    case SystemInformation_r8_IEs__sib_TypeAndInfo__Member_PR_sib21_v1430:
+	      carrier->sib21 = &typeandinfo->choice.sib21_v1430;
+	      LOG_I( ENB_APP, "[RRC %"PRIu8"] Found SIB21 in CU F1AP_SETUP_RESP message\n", inst);
+	      break;
+#endif
+	    default:
+	      AssertFatal(1==0,"Shouldn't have received this SI %d\n",typeandinfo->present);
+	      break;
+	    }
+	  }
+	  break;
+	}
+      }
+    }
+    }
+  else AssertFatal(1==0,"No SI messages\n");
+
+
+}
+
+void configure_du_mac(int inst) {
+
+  eNB_RRC_INST *rrc = RC.rrc[inst];
+  rrc_eNB_carrier_data_t *carrier = &rrc->carrier[0];
+
+  rrc_mac_config_req_eNB(inst, 0,
+			 carrier->physCellId,
+			 carrier->p_eNB,
+			 carrier->Ncp,
+			 carrier->sib1->freqBandIndicator,
+			 carrier->dl_CarrierFreq,
+#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
+			 carrier->pbch_repetition,
+#endif
+			 0, // rnti
+			 (BCCH_BCH_Message_t *)
+			 NULL,
+			 (RadioResourceConfigCommonSIB_t *) &
+			 carrier->sib2->radioResourceConfigCommon,
+#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
+			 (RadioResourceConfigCommonSIB_t *) 
+			 NULL,
+#endif
+			 (struct PhysicalConfigDedicated *)NULL,
+#if (RRC_VERSION >= MAKE_VERSION(10, 0, 0))
+			 (SCellToAddMod_r10_t *)NULL,
+			 //(struct PhysicalConfigDedicatedSCell_r10 *)NULL,
+#endif
+			 (MeasObjectToAddMod_t **) NULL,
+			 (MAC_MainConfig_t *) NULL, 0,
+			 (struct LogicalChannelConfig *)NULL,
+			 (MeasGapConfig_t *) NULL,
+			 NULL,
+			 NULL,
+			 &carrier->sib1->schedulingInfoList,
+			 carrier->ul_CarrierFreq,
+			 carrier->sib2->freqInfo.ul_Bandwidth,
+			 &carrier->sib2->freqInfo.additionalSpectrumEmission,
+			 (MBSFN_SubframeConfigList_t*) carrier->sib2->mbsfn_SubframeConfigList
+#if (RRC_VERSION >= MAKE_VERSION(9, 0, 0))
+			 ,
+			 carrier->MBMS_flag,
+			 (MBSFN_AreaInfoList_r9_t*) & carrier->sib13->mbsfn_AreaInfoList_r9,
+			 (PMCH_InfoList_r9_t *) NULL
+#endif
+#if (RRC_VERSION >= MAKE_VERSION(13, 0, 0))
+			 , 
+			 NULL
+#endif
+			 );
+  
+}
+
 void handle_f1ap_setup_resp(f1ap_setup_resp_t *resp) {
 
 
   int i,j,si_ind;
-  AssertFatal(1==0, "Shouldn't get here yet\n");
-  /*
+  
   for (j=0;j<resp->num_cells_to_activate;j++) {
     for (i=0;i<RC.nb_inst;i++) {
       rrc_eNB_carrier_data_t *carrier =  &RC.rrc[i]->carrier[0];
       // identify local index of cell j by plmn identity
       if (check_plmn_identity(carrier, resp->mcc[j], resp->mnc[j], resp->mnc_digit_length[j])>0 &&
           resp->nrpci[j] == carrier->physCellId) {
-	// copy system information and decode it to perform MAC/L1 common configuration
-	for (si_ind=0;si_ind<resp->num_SI[j];si_ind++) {
-	  
-	}
+	// copy system information and decode it 
+	for (si_ind=0;si_ind<resp->num_SI[j];si_ind++)  extract_and_decode_SI(i,
+									      si_ind,
+									      resp->SI_container[j][si_ind],
+									      resp->SI_container_length[j][si_ind]);
+	// perform MAC/L1 common configuration
+	configure_du_mac(i);
       }
-  */
+    }
+  }
 }