diff --git a/openair2/ENB_APP/enb_agent_common.c b/openair2/ENB_APP/enb_agent_common.c
index f4f8c333d0cfac1f2f0e751eeb1f20dd4170db01..4a175c244e5aef3f1b4551edbfbdd7e1a4e9c2db 100644
--- a/openair2/ENB_APP/enb_agent_common.c
+++ b/openair2/ENB_APP/enb_agent_common.c
@@ -47,6 +47,7 @@
 void * enb[NUM_MAX_ENB];
 void * enb_ue[NUM_MAX_ENB];
 void * enb_rrc[NUM_MAX_ENB];
+void * enb_ue_rrc[NUM_MAX_ENB];
 /*
  * message primitives
  */
@@ -296,170 +297,6 @@ int enb_agent_destroy_enb_config_reply(Protocol__ProgranMessage *msg) {
 	return -1;
 }
 
-int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__ProgranMessage **msg) {
-
-  xid_t xid;
-  Protocol__ProgranMessage *input = (Protocol__ProgranMessage *)params;
-  Protocol__PrpUeConfigRequest *ue_config_request_msg = input->ue_config_request_msg;
-  xid = (ue_config_request_msg->header)->xid;
-
-  int i;
-  
-  Protocol__PrpHeader *header;
-  if(prp_create_header(xid, PROTOCOL__PRP_TYPE__PRPT_GET_UE_CONFIG_REPLY, &header) != 0)
-    goto error;
-
-  Protocol__PrpUeConfigReply *ue_config_reply_msg;
-  ue_config_reply_msg = malloc(sizeof(Protocol__PrpUeConfigReply));
-  if(ue_config_reply_msg == NULL)
-    goto error;
-  protocol__prp_enb_config_reply__init(ue_config_reply_msg);
-  ue_config_reply_msg->header = header;
-
-  //TODO: Fill in the actual number of UEs that are currently connected
-  ue_config_reply_msg->n_ue_config = 1;
-
-  Protocol__PrpUeConfig **ue_config;
-  if (ue_config_reply_msg->n_ue_config > 0) {
-    ue_config = malloc(sizeof(Protocol__PrpUeConfig *) * ue_config_reply_msg->n_ue_config);
-    if (ue_config == NULL) {
-      goto error;
-    }
-    for (i = 0; i < ue_config_reply_msg->n_ue_config; i++) {
-      ue_config[i] = malloc(sizeof(Protocol__PrpUeConfig));
-      protocol__prp_ue_config__init(ue_config[i]);
-      //TODO: Set the RNTI of the ue with id i
-      ue_config[i]->rnti = 1;
-      ue_config[i]->has_rnti = 1;
-      //TODO: Set the DRX configuration (optional)
-      //Not supported for now, so we do not set it
-
-      //TODO: Set the time_alignment_timer
-      ue_config[i]->time_alignment_timer = 1;
-      ue_config[i]->has_time_alignment_timer = 1;
-      //TODO: Set the measurement gap configuration pattern
-      ue_config[i]->meas_gap_config_pattern = 1;
-      ue_config[i]->has_meas_gap_config_pattern = 1;
-      //TODO: Set the measurement gap offset if applicable
-      ue_config[i]->meas_gap_config_sf_offset = 1;
-      ue_config[i]->has_meas_gap_config_sf_offset = 1;
-      //TODO: Set the SPS configuration (Optional)
-      //Not supported for noe, so we do not set it
-
-      //TODO: Set the SR configuration (Optional)
-      //We do not set it for now
-
-      //TODO: Set the CQI configuration (Optional)
-      //We do not set it for now
-
-      //TODO: Set the transmission mode
-      ue_config[i]->transmission_mode = 1;
-      ue_config[i]->has_transmission_mode = 1;
-
-      //TODO: Set the aggregated bit-rate of the non-gbr bearer (UL)
-      ue_config[i]->ue_aggregated_max_bitrate_ul = 1;
-      ue_config[i]->has_ue_aggregated_max_bitrate_ul = 1;
-
-      //TODO: Set the aggregated bit-rate of the non-gbr bearer (DL)
-      ue_config[i]->ue_aggregated_max_bitrate_dl = 1;
-      ue_config[i]->has_ue_aggregated_max_bitrate_dl = 1;
-
-      //TODO: Set the UE capabilities
-      Protocol__PrpUeCapabilities *capabilities;
-      capabilities = malloc(sizeof(Protocol__PrpUeCapabilities));
-      protocol__prp_ue_capabilities__init(capabilities);
-      //TODO: Set half duplex (FDD operation)
-      capabilities->has_half_duplex = 1;
-      capabilities->half_duplex = 1;
-      //TODO: Set intra-frame hopping flag
-      capabilities->has_intra_sf_hopping = 1;
-      capabilities->intra_sf_hopping = 1;
-      //TODO: Set support for type 2 hopping with n_sb > 1
-      capabilities->has_type2_sb_1 = 1;
-      capabilities->type2_sb_1 = 1;
-      //TODO: Set ue category
-      capabilities->has_ue_category = 1;
-      capabilities->ue_category = 1;
-      //TODO: Set UE support for resource allocation type 1
-      capabilities->has_res_alloc_type1 = 1;
-      capabilities->res_alloc_type1 = 1;
-      //Set the capabilites to the message
-      ue_config[i]->capabilities = capabilities;
-      //TODO: Set UE transmission antenna. One of the PRUTA_* values
-      ue_config[i]->has_ue_transmission_antenna = 1;
-      ue_config[i]->ue_transmission_antenna = PROTOCOL__PRP_UE_TRANSMISSION_ANTENNA__PRUTA_OPEN_LOOP;
-      //TODO: Set tti bundling flag (See ts 36.321)
-      ue_config[i]->has_tti_bundling = 1;
-      ue_config[i]->tti_bundling = 1;
-      //TODO: Set the max HARQ retransmission for the UL
-      ue_config[i]->has_max_harq_tx = 1;
-      ue_config[i]->max_harq_tx = 1;
-      //TODO: Fill beta_offset_ack_index (TS 36.213)
-      ue_config[i]->has_beta_offset_ack_index = 1;
-      ue_config[i]->beta_offset_ack_index = 1;
-      //TODO: Fill beta_offset_ri_index (TS 36.213)
-      ue_config[i]->has_beta_offset_ri_index = 1;
-      ue_config[i]->beta_offset_ri_index = 1;
-      //TODO: Fill beta_offset_cqi_index (TS 36.213)
-      ue_config[i]->has_beta_offset_cqi_index = 1;
-      ue_config[i]->beta_offset_cqi_index = 1;
-      //TODO: Fill ack_nack_simultaneous_trans (TS 36.213)
-      ue_config[i]->has_ack_nack_simultaneous_trans = 1;
-      ue_config[i]->ack_nack_simultaneous_trans = 1;
-      //TODO: Fill simultaneous_ack_nack_cqi (TS 36.213)
-      ue_config[i]->has_simultaneous_ack_nack_cqi = 1;
-      ue_config[i]->simultaneous_ack_nack_cqi = 1;
-      //TODO: Set PRACRM_* value regarding aperiodic cqi report mode
-      ue_config[i]->has_aperiodic_cqi_rep_mode = 1;
-      ue_config[i]->aperiodic_cqi_rep_mode = PROTOCOL__PRP_APERIODIC_CQI_REPORT_MODE__PRACRM_RM12;
-      //TODO: Set tdd_ack_nack_feedback
-      ue_config[i]->has_tdd_ack_nack_feedback = 1;
-      ue_config[i]->tdd_ack_nack_feedback = 1;
-      //TODO: Set ack_nack_repetition factor
-      ue_config[i]->has_ack_nack_repetition_factor = 1;
-      ue_config[i]->ack_nack_repetition_factor = 1;
-      //TODO: Set extended BSR size
-      ue_config[i]->has_extended_bsr_size = 1;
-      ue_config[i]->extended_bsr_size = 1;
-      //TODO: Set carrier aggregation support (boolean)
-      ue_config[i]->has_ca_support = 1;
-      ue_config[i]->ca_support = 0;
-      //TODO: Set cross carrier scheduling support (boolean)
-      ue_config[i]->has_cross_carrier_sched_support = 1;
-      ue_config[i]->cross_carrier_sched_support = 0;
-      //TODO: Set index of primary cell
-      ue_config[i]->has_pcell_carrier_index = 1;
-      ue_config[i]->pcell_carrier_index = 1;
-      //TODO: Set secondary cells configuration
-      // We do not set it for now. No carrier aggregation support
-      
-      //TODO: Set deactivation timer for secondary cell
-      ue_config[i]->has_scell_deactivation_timer = 1;
-      ue_config[i]->scell_deactivation_timer = 1;
-    }
-    ue_config_reply_msg->ue_config = ue_config;
-  }
-  *msg = malloc(sizeof(Protocol__ProgranMessage));
-  if (*msg == NULL)
-    goto error;
-  protocol__progran_message__init(*msg);
-  (*msg)->msg_case = PROTOCOL__PROGRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG;
-  (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__SUCCESSFUL_OUTCOME;
-  (*msg)->ue_config_reply_msg = ue_config_reply_msg;
-  return 0;
-  
- error:
-  // TODO: Need to make proper error handling
-  if (header != NULL)
-    free(header);
-  if (ue_config_reply_msg != NULL)
-    free(ue_config_reply_msg);
-  if(*msg != NULL)
-    free(*msg);
-  //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
-  return -1;
-}
-
 int enb_agent_destroy_ue_config_reply(Protocol__ProgranMessage *msg) {
   if(msg->msg_case != PROTOCOL__PROGRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG)
     goto error;
@@ -481,110 +318,6 @@ int enb_agent_destroy_ue_config_reply(Protocol__ProgranMessage *msg) {
   return -1;
 }
 
-int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__ProgranMessage **msg) {
-
-  xid_t xid;
-  Protocol__ProgranMessage *input = (Protocol__ProgranMessage *)params;
-  Protocol__PrpLcConfigRequest *lc_config_request_msg = input->lc_config_request_msg;
-  xid = (lc_config_request_msg->header)->xid;
-
-  int i, j;
-  Protocol__PrpHeader *header;
-  if(prp_create_header(xid, PROTOCOL__PRP_TYPE__PRPT_GET_LC_CONFIG_REPLY, &header) != 0)
-    goto error;
-
-  Protocol__PrpLcConfigReply *lc_config_reply_msg;
-  lc_config_reply_msg = malloc(sizeof(Protocol__PrpLcConfigReply));
-  if(lc_config_reply_msg == NULL)
-    goto error;
-  protocol__prp_lc_config_reply__init(lc_config_reply_msg);
-  lc_config_reply_msg->header = header;
-  
-  //TODO: Fill in the actual number of UEs that we are going to report LC configs about
-  lc_config_reply_msg->n_lc_ue_config = 1;
-  
-  Protocol__PrpLcUeConfig **lc_ue_config;
-  if (lc_config_reply_msg->n_lc_ue_config > 0) {
-    lc_ue_config = malloc(sizeof(Protocol__PrpLcUeConfig *) * lc_config_reply_msg->n_lc_ue_config);
-    if (lc_ue_config == NULL) {
-      goto error;
-    }
-    // Fill the config for each UE
-    for (i = 0; i < lc_config_reply_msg->n_lc_ue_config; i++) {
-      lc_ue_config[i] = malloc(sizeof(Protocol__PrpLcUeConfig));
-      protocol__prp_lc_ue_config__init(lc_ue_config[i]);
-      //TODO: Set the RNTI of the UE
-      lc_ue_config[i]->has_rnti = 1;
-      lc_ue_config[i]->rnti = 1;
-      //TODO: Set the number of LC configurations that will be reported for this UE
-      lc_ue_config[i]->n_lc_config = 3;
-      Protocol__PrpLcConfig **lc_config;
-      if (lc_ue_config[i]->n_lc_config > 0) {
-	lc_config = malloc(sizeof(Protocol__PrpLcConfig *) * lc_ue_config[i]->n_lc_config);
-	if (lc_config == NULL) {
-	  goto error;
-	}
-	for (j = 0; j < lc_ue_config[i]->n_lc_config; j++) {
-	  lc_config[j] = malloc(sizeof(Protocol__PrpLcConfig));
-	  protocol__prp_lc_config__init(lc_config[j]);
-	  //TODO: Set the LC id
-	  lc_config[j]->has_lcid = 1;
-	  lc_config[j]->lcid = 1;
-	  //TODO: Set the LCG of the channel
-	  lc_config[j]->has_lcg = 1;
-	  lc_config[j]->lcg = 1;
-	  //TODO: Set the LC direction
-	  lc_config[j]->has_direction = 1;
-	  lc_config[j]->direction = PROTOCOL__PRP_LC_DIRECTION__PRLCD_BOTH;
-	  //TODO: Bearer type. One of PRQBT_* values
-	  lc_config[j]->has_qos_bearer_type = 1;
-	  lc_config[j]->qos_bearer_type = PROTOCOL__PRP_QOS_BEARER_TYPE__PRQBT_NON_GBR;
-	  //TODO: Set the QCI defined in TS 23.203, coded as defined in TS 36.413
-	  // One less than the actual QCI value
-	  lc_config[j]->has_qci = 1;
-	  lc_config[j]->qci = 1;
-	  if (lc_config[j]->direction == PROTOCOL__PRP_QOS_BEARER_TYPE__PRQBT_GBR) {
-	    //TODO: Set the max bitrate (UL)
-	    lc_config[j]->has_e_rab_max_bitrate_ul = 1;
-	    lc_config[j]->e_rab_max_bitrate_ul = 1;
-	    //TODO: Set the max bitrate (DL)
-	    lc_config[j]->has_e_rab_max_bitrate_dl = 1;
-	    lc_config[j]->e_rab_max_bitrate_dl = 1;
-	    //TODO: Set the guaranteed bitrate (UL)
-	    lc_config[j]->has_e_rab_guaranteed_bitrate_ul = 1;
-	    lc_config[j]->e_rab_guaranteed_bitrate_ul = 1;
-	    //TODO: Set the guaranteed bitrate (DL)
-	    lc_config[j]->has_e_rab_guaranteed_bitrate_dl = 1;
-	    lc_config[j]->e_rab_guaranteed_bitrate_dl = 1;
-	  }
-	}
-	lc_ue_config[i]->lc_config = lc_config;
-      }
-    } // end for UE
-    lc_config_reply_msg->lc_ue_config = lc_ue_config;
-  } // lc_config_reply_msg->n_lc_ue_config > 0
-  *msg = malloc(sizeof(Protocol__ProgranMessage));
-  if (*msg == NULL)
-    goto error;
-  protocol__progran_message__init(*msg);
-  (*msg)->msg_case = PROTOCOL__PROGRAN_MESSAGE__MSG_LC_CONFIG_REPLY_MSG;
-  (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__SUCCESSFUL_OUTCOME;
-  (*msg)->lc_config_reply_msg = lc_config_reply_msg;
-  
-  return 0;
-  
- error:
-  // TODO: Need to make proper error handling
-  if (header != NULL)
-    free(header);
-  if (lc_config_reply_msg != NULL)
-    free(lc_config_reply_msg);
-  if(*msg != NULL)
-    free(*msg);
-  //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
-  return -1;
-}
-
 int enb_agent_destroy_lc_config_reply(Protocol__ProgranMessage *msg) {
   if(msg->msg_case != PROTOCOL__PROGRAN_MESSAGE__MSG_LC_CONFIG_REPLY_MSG)
     goto error;
@@ -788,6 +521,7 @@ void set_enb_vars(mid_t mod_id, ran_name_t ran){
     enb[mod_id] =  (void *)&eNB_mac_inst[mod_id];
     enb_ue[mod_id] = (void *)&eNB_mac_inst[mod_id].UE_list;
     enb_rrc[mod_id] = (void *)&eNB_rrc_inst[mod_id];
+    enb_ue_rrc[mod_id] = (void *)&UE_rrc_inst[mod_id];
     break;
   default :
     goto error;
@@ -1158,9 +892,448 @@ int get_num_pdcch_symb(mid_t mod_id, int CC_id)
 }
 
 /*
- * timer primitives
+ * ************************************
+ * Get Messages for UE Configuration Reply
+ * ************************************
  */
 
+int get_time_alignment_timer(mid_t mod_id, mid_t ue_id)
+{
+	return	(((UE_RRC_INST *)enb_ue_rrc[ue_id])->mac_MainConfig[mod_id]->timeAlignmentTimerDedicated);
+}
+
+int get_meas_gap_config(mid_t mod_id, mid_t ue_id)
+{
+	if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->measGapConfig[mod_id]->present == MeasGapConfig_PR_NOTHING)
+		return 2;
+	else if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->measGapConfig[mod_id]->present == MeasGapConfig_PR_release)
+		return 0;
+	else if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->measGapConfig[mod_id]->present == MeasGapConfig_PR_setup)
+		return 1;
+
+	return -1;
+}
+
+int get_meas_gap_config_offset(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->measGapConfig[mod_id]->choice.setup.gapOffset.present);
+}
+
+int get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id)
+{
+	return ((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ue_AggregatedMaximumBitrateDL;
+}
+
+int get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id)
+{
+	return ((UE_list_t *)enb_ue[mod_id])->UE_sched_ctrl[ue_id].ue_AggregatedMaximumBitrateUL;
+}
+
+int get_half_duplex(mid_t ue_id)
+{
+	int halfduplex = 0;
+	int bands_to_scan = ((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.count;
+	for (int i =0; i < bands_to_scan; i++){
+		if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->rf_Parameters.supportedBandListEUTRA.list.array[i]->halfDuplex > 0)
+			halfduplex = 1;
+	}
+	return halfduplex;
+}
+
+int get_intra_sf_hopping(mid_t ue_id)
+{
+	uint8_t temp = 0;
+	temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf);
+	return (temp & ( 1 << (31)));
+}
+
+int get_type2_sb_1(mid_t ue_id)
+{
+	uint8_t temp = 0;
+	temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf);
+	return (temp & ( 1 << (11)));
+}
+
+int get_ue_category(mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->ue_Category);
+}
+
+int get_res_alloc_type1(mid_t ue_id)
+{
+	uint8_t temp = 0;
+	temp = (((UE_RRC_INST *)enb_ue_rrc[ue_id])->UECap->UE_EUTRA_Capability->featureGroupIndicators->buf);
+	return (temp & ( 1 << (30)));
+}
+
+int get_ue_transmission_mode(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->antennaInfo->choice.explicitValue.transmissionMode);
+}
+
+int get_tti_bundling(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->mac_MainConfig[mod_id]->ul_SCH_Config->ttiBundling);
+}
+
+int get_maxHARQ_TX(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->mac_MainConfig[mod_id]->ul_SCH_Config->maxHARQ_Tx);
+}
+
+int get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->pusch_ConfigDedicated->betaOffset_ACK_Index);
+}
+
+int get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->pusch_ConfigDedicated->betaOffset_RI_Index);
+}
+
+int get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->pusch_ConfigDedicated->betaOffset_CQI_Index);
+}
+
+int get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.simultaneousAckNackAndCQI);
+}
+
+int get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->sib2[mod_id]->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.setup.ackNackSRS_SimultaneousTransmission);
+}
+
+int get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->cqi_ReportConfig->cqi_ReportModeAperiodic);
+}
+
+int get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->pucch_ConfigDedicated->tdd_AckNackFeedbackMode);
+}
+
+int get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id)
+{
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->pucch_ConfigDedicated->ackNackRepetition.choice.setup.repetitionFactor);
+}
+
+int get_extended_bsr_size(mid_t mod_id, mid_t ue_id)
+{
+	//TODO: need to double check
+	return (((UE_RRC_INST *)enb_ue_rrc[ue_id])->mac_MainConfig[mod_id]->ext2->mac_MainConfig_v1020->extendedBSR_Sizes_r10);
+}
+
+int get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id)
+{
+	if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_closedLoop)
+		return 2;
+	else if(((UE_RRC_INST *)enb_ue_rrc[ue_id])->physicalConfigDedicated[mod_id]->antennaInfo->choice.explicitValue.ue_TransmitAntennaSelection.choice.setup == AntennaInfoDedicated__ue_TransmitAntennaSelection__setup_openLoop)
+		return 1;
+	else
+		return 0;
+}
+
+int get_lcg(mid_t ue_id, mid_t lc_id)
+{
+	return &UE_mac_inst[ue_id].logicalChannelConfig[lc_id]->ul_SpecificParameters->logicalChannelGroup;
+}
+
+int get_direction(mid_t ue_id, mid_t lc_id)
+{
+	/*TODO: fill with the value for the rest of LCID*/
+
+	if(lc_id == CCCH | lc_id == DCCH)
+		return 2;
+	else if(lc_id == DTCH)
+		return 1;
+}
+
+
+/*
+ * timer primitives
+ */
+
+int enb_agent_lc_config_reply(mid_t mod_id, const void *params, Protocol__ProgranMessage **msg) {
+
+  xid_t xid;
+  Protocol__ProgranMessage *input = (Protocol__ProgranMessage *)params;
+  Protocol__PrpLcConfigRequest *lc_config_request_msg = input->lc_config_request_msg;
+  xid = (lc_config_request_msg->header)->xid;
+
+  int i, j;
+  Protocol__PrpHeader *header;
+  if(prp_create_header(xid, PROTOCOL__PRP_TYPE__PRPT_GET_LC_CONFIG_REPLY, &header) != 0)
+    goto error;
+
+  Protocol__PrpLcConfigReply *lc_config_reply_msg;
+  lc_config_reply_msg = malloc(sizeof(Protocol__PrpLcConfigReply));
+  if(lc_config_reply_msg == NULL)
+    goto error;
+  protocol__prp_lc_config_reply__init(lc_config_reply_msg);
+  lc_config_reply_msg->header = header;
+
+  //TODO: Fill in the actual number of UEs that we are going to report LC configs about
+  lc_config_reply_msg->n_lc_ue_config = get_num_ues(mod_id);
+
+  Protocol__PrpLcUeConfig **lc_ue_config;
+  if (lc_config_reply_msg->n_lc_ue_config > 0) {
+    lc_ue_config = malloc(sizeof(Protocol__PrpLcUeConfig *) * lc_config_reply_msg->n_lc_ue_config);
+    if (lc_ue_config == NULL) {
+      goto error;
+    }
+    // Fill the config for each UE
+    for (i = 0; i < lc_config_reply_msg->n_lc_ue_config; i++) {
+      lc_ue_config[i] = malloc(sizeof(Protocol__PrpLcUeConfig));
+      protocol__prp_lc_ue_config__init(lc_ue_config[i]);
+      //TODO: Set the RNTI of the UE
+      lc_ue_config[i]->has_rnti = 1;
+      lc_ue_config[i]->rnti = get_ue_crnti(mod_id,i);
+      //TODO: Set the number of LC configurations that will be reported for this UE
+      lc_ue_config[i]->n_lc_config = 3;
+      Protocol__PrpLcConfig **lc_config;
+      if (lc_ue_config[i]->n_lc_config > 0) {
+	lc_config = malloc(sizeof(Protocol__PrpLcConfig *) * lc_ue_config[i]->n_lc_config);
+	if (lc_config == NULL) {
+	  goto error;
+	}
+	for (j = 0; j < lc_ue_config[i]->n_lc_config; j++) {
+	  lc_config[j] = malloc(sizeof(Protocol__PrpLcConfig));
+	  protocol__prp_lc_config__init(lc_config[j]);
+	  //TODO: Set the LC id
+	  lc_config[j]->has_lcid = 1;
+	  lc_config[j]->lcid = j+1;
+	  //TODO: Set the LCG of the channel
+	  lc_config[j]->has_lcg = 1;
+	  lc_config[j]->lcg = get_lcg(i,j+1);
+	  //TODO: Set the LC direction
+	  lc_config[j]->has_direction = 1;
+	  lc_config[j]->direction = get_direction(i,j+1);
+	  //TODO: Bearer type. One of PRQBT_* values
+	  lc_config[j]->has_qos_bearer_type = 1;
+	  lc_config[j]->qos_bearer_type = PROTOCOL__PRP_QOS_BEARER_TYPE__PRQBT_NON_GBR;
+	  //TODO: Set the QCI defined in TS 23.203, coded as defined in TS 36.413
+	  // One less than the actual QCI value
+	  lc_config[j]->has_qci = 1;
+	  lc_config[j]->qci = 1;
+	  if (lc_config[j]->direction == PROTOCOL__PRP_QOS_BEARER_TYPE__PRQBT_GBR) {
+	    //TODO: Set the max bitrate (UL)
+	    lc_config[j]->has_e_rab_max_bitrate_ul = 1;
+	    lc_config[j]->e_rab_max_bitrate_ul = 1;
+	    //TODO: Set the max bitrate (DL)
+	    lc_config[j]->has_e_rab_max_bitrate_dl = 1;
+	    lc_config[j]->e_rab_max_bitrate_dl = 1;
+	    //TODO: Set the guaranteed bitrate (UL)
+	    lc_config[j]->has_e_rab_guaranteed_bitrate_ul = 1;
+	    lc_config[j]->e_rab_guaranteed_bitrate_ul = 1;
+	    //TODO: Set the guaranteed bitrate (DL)
+	    lc_config[j]->has_e_rab_guaranteed_bitrate_dl = 1;
+	    lc_config[j]->e_rab_guaranteed_bitrate_dl = 1;
+	  }
+	}
+	lc_ue_config[i]->lc_config = lc_config;
+      }
+    } // end for UE
+    lc_config_reply_msg->lc_ue_config = lc_ue_config;
+  } // lc_config_reply_msg->n_lc_ue_config > 0
+  *msg = malloc(sizeof(Protocol__ProgranMessage));
+  if (*msg == NULL)
+    goto error;
+  protocol__progran_message__init(*msg);
+  (*msg)->msg_case = PROTOCOL__PROGRAN_MESSAGE__MSG_LC_CONFIG_REPLY_MSG;
+  (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__SUCCESSFUL_OUTCOME;
+  (*msg)->lc_config_reply_msg = lc_config_reply_msg;
+
+  return 0;
+
+ error:
+  // TODO: Need to make proper error handling
+  if (header != NULL)
+    free(header);
+  if (lc_config_reply_msg != NULL)
+    free(lc_config_reply_msg);
+  if(*msg != NULL)
+    free(*msg);
+  //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
+  return -1;
+}
+
+/*
+ * ************************************
+ * UE Configuration Reply
+ * ************************************
+ */
+
+int enb_agent_ue_config_reply(mid_t mod_id, const void *params, Protocol__ProgranMessage **msg) {
+
+  xid_t xid;
+  Protocol__ProgranMessage *input = (Protocol__ProgranMessage *)params;
+  Protocol__PrpUeConfigRequest *ue_config_request_msg = input->ue_config_request_msg;
+  xid = (ue_config_request_msg->header)->xid;
+
+  int i;
+
+  Protocol__PrpHeader *header;
+  if(prp_create_header(xid, PROTOCOL__PRP_TYPE__PRPT_GET_UE_CONFIG_REPLY, &header) != 0)
+    goto error;
+
+  Protocol__PrpUeConfigReply *ue_config_reply_msg;
+  ue_config_reply_msg = malloc(sizeof(Protocol__PrpUeConfigReply));
+  if(ue_config_reply_msg == NULL)
+    goto error;
+  protocol__prp_ue_config_reply__init(ue_config_reply_msg);
+  ue_config_reply_msg->header = header;
+
+  //TODO: Fill in the actual number of UEs that are currently connected
+  ue_config_reply_msg->n_ue_config = get_num_ues(mod_id);
+
+  Protocol__PrpUeConfig **ue_config;
+  if (ue_config_reply_msg->n_ue_config > 0) {
+    ue_config = malloc(sizeof(Protocol__PrpUeConfig *) * ue_config_reply_msg->n_ue_config);
+    if (ue_config == NULL) {
+      goto error;
+    }
+    for (i = 0; i < ue_config_reply_msg->n_ue_config; i++) {
+      ue_config[i] = malloc(sizeof(Protocol__PrpUeConfig *));
+      protocol__prp_ue_config__init(ue_config[i]);
+      //TODO: Set the RNTI of the ue with id i
+      ue_config[i]->rnti = get_ue_crnti(mod_id,i);
+      ue_config[i]->has_rnti = 1;
+      //TODO: Set the DRX configuration (optional)
+      //Not supported for now, so we do not set it
+
+      //TODO: Set the time_alignment_timer
+      ue_config[i]->time_alignment_timer = get_time_alignment_timer(mod_id,i);
+      ue_config[i]->has_time_alignment_timer = 1;
+      //TODO: Set the measurement gap configuration pattern
+      ue_config[i]->meas_gap_config_pattern = get_meas_gap_config(mod_id,i);
+      ue_config[i]->has_meas_gap_config_pattern = 1;
+      //TODO: Set the measurement gap offset if applicable
+      ue_config[i]->meas_gap_config_sf_offset = get_meas_gap_config_offset(mod_id,i);
+      ue_config[i]->has_meas_gap_config_sf_offset = 1;
+      //TODO: Set the SPS configuration (Optional)
+      //Not supported for noe, so we do not set it
+
+      //TODO: Set the SR configuration (Optional)
+      //We do not set it for now
+
+      //TODO: Set the CQI configuration (Optional)
+      //We do not set it for now
+
+      //TODO: Set the transmission mode
+      ue_config[i]->transmission_mode = get_ue_transmission_mode(mod_id,i);
+      ue_config[i]->has_transmission_mode = 1;
+
+      //TODO: Set the aggregated bit-rate of the non-gbr bearer (UL)
+      ue_config[i]->ue_aggregated_max_bitrate_ul = get_ue_aggregated_max_bitrate_ul(mod_id,i);
+      ue_config[i]->has_ue_aggregated_max_bitrate_ul = 1;
+
+      //TODO: Set the aggregated bit-rate of the non-gbr bearer (DL)
+      ue_config[i]->ue_aggregated_max_bitrate_dl = get_ue_aggregated_max_bitrate_dl(mod_id,i);
+      ue_config[i]->has_ue_aggregated_max_bitrate_dl = 1;
+
+      //TODO: Set the UE capabilities
+      Protocol__PrpUeCapabilities *capabilities;
+      capabilities = malloc(sizeof(Protocol__PrpUeCapabilities));
+      protocol__prp_ue_capabilities__init(capabilities);
+      //TODO: Set half duplex (FDD operation)
+      capabilities->has_half_duplex = 1;
+      capabilities->half_duplex = get_half_duplex(i);
+      //TODO: Set intra-frame hopping flag
+      capabilities->has_intra_sf_hopping = 1;
+      capabilities->intra_sf_hopping = get_intra_sf_hopping(i);
+      //TODO: Set support for type 2 hopping with n_sb > 1
+      capabilities->has_type2_sb_1 = 1;
+      capabilities->type2_sb_1 = get_type2_sb_1(i);
+      //TODO: Set ue category
+      capabilities->has_ue_category = 1;
+      capabilities->ue_category = get_ue_category(i);
+      //TODO: Set UE support for resource allocation type 1
+      capabilities->has_res_alloc_type1 = 1;
+      capabilities->res_alloc_type1 = get_res_alloc_type1(i);
+      //Set the capabilites to the message
+      ue_config[i]->capabilities = capabilities;
+      //TODO: Set UE transmission antenna. One of the PRUTA_* values
+      ue_config[i]->has_ue_transmission_antenna = 1;
+      ue_config[i]->ue_transmission_antenna = get_ue_transmission_antenna(mod_id,i);
+      //TODO: Set tti bundling flag (See ts 36.321)
+      ue_config[i]->has_tti_bundling = 1;
+      ue_config[i]->tti_bundling = get_tti_bundling(mod_id,i);
+      //TODO: Set the max HARQ retransmission for the UL
+      ue_config[i]->has_max_harq_tx = 1;
+      ue_config[i]->max_harq_tx = get_maxHARQ_TX(mod_id,i);
+      //TODO: Fill beta_offset_ack_index (TS 36.213)
+      ue_config[i]->has_beta_offset_ack_index = 1;
+      ue_config[i]->beta_offset_ack_index = get_beta_offset_ack_index(mod_id,i);
+      //TODO: Fill beta_offset_ri_index (TS 36.213)
+      ue_config[i]->has_beta_offset_ri_index = 1;
+      ue_config[i]->beta_offset_ri_index = get_beta_offset_ri_index(mod_id,i);
+      //TODO: Fill beta_offset_cqi_index (TS 36.213)
+      ue_config[i]->has_beta_offset_cqi_index = 1;
+      ue_config[i]->beta_offset_cqi_index = get_beta_offset_cqi_index(mod_id,i);
+      //TODO: Fill ack_nack_simultaneous_trans (TS 36.213)
+      ue_config[i]->has_ack_nack_simultaneous_trans = 1;
+      ue_config[i]->ack_nack_simultaneous_trans = get_ack_nack_simultaneous_trans(mod_id,i);
+      //TODO: Fill simultaneous_ack_nack_cqi (TS 36.213)
+      ue_config[i]->has_simultaneous_ack_nack_cqi = 1;
+      ue_config[i]->simultaneous_ack_nack_cqi = get_simultaneous_ack_nack_cqi(mod_id,i);
+      //TODO: Set PRACRM_* value regarding aperiodic cqi report mode
+      ue_config[i]->has_aperiodic_cqi_rep_mode = 1;
+      ue_config[i]->aperiodic_cqi_rep_mode = get_aperiodic_cqi_rep_mode(mod_id,i);
+      //TODO: Set tdd_ack_nack_feedback
+      ue_config[i]->has_tdd_ack_nack_feedback = 1;
+      ue_config[i]->tdd_ack_nack_feedback = get_tdd_ack_nack_feedback(mod_id,i);
+      //TODO: Set ack_nack_repetition factor
+      ue_config[i]->has_ack_nack_repetition_factor = 1;
+      ue_config[i]->ack_nack_repetition_factor = get_ack_nack_repetition_factor(mod_id,i);
+      //TODO: Set extended BSR size
+      ue_config[i]->has_extended_bsr_size = 1;
+      ue_config[i]->extended_bsr_size = get_extended_bsr_size(mod_id,i);
+      //TODO: Set carrier aggregation support (boolean)
+      ue_config[i]->has_ca_support = 0;
+      ue_config[i]->ca_support = 0;
+      if(ue_config[i]->has_ca_support){
+		  //TODO: Set cross carrier scheduling support (boolean)
+		  ue_config[i]->has_cross_carrier_sched_support = 1;
+		  ue_config[i]->cross_carrier_sched_support = 0;
+		  //TODO: Set index of primary cell
+		  ue_config[i]->has_pcell_carrier_index = 1;
+		  ue_config[i]->pcell_carrier_index = 1;
+		  //TODO: Set secondary cells configuration
+		  // We do not set it for now. No carrier aggregation support
+
+		  //TODO: Set deactivation timer for secondary cell
+		  ue_config[i]->has_scell_deactivation_timer = 1;
+		  ue_config[i]->scell_deactivation_timer = 1;
+      }
+    }
+    ue_config_reply_msg->ue_config = ue_config;
+  }
+  *msg = malloc(sizeof(Protocol__ProgranMessage));
+  if (*msg == NULL)
+    goto error;
+  protocol__progran_message__init(*msg);
+  (*msg)->msg_case = PROTOCOL__PROGRAN_MESSAGE__MSG_UE_CONFIG_REPLY_MSG;
+  (*msg)->msg_dir = PROTOCOL__PROGRAN_DIRECTION__SUCCESSFUL_OUTCOME;
+  (*msg)->ue_config_reply_msg = ue_config_reply_msg;
+  return 0;
+
+ error:
+  // TODO: Need to make proper error handling
+  if (header != NULL)
+    free(header);
+  if (ue_config_reply_msg != NULL)
+    free(ue_config_reply_msg);
+  if(*msg != NULL)
+    free(*msg);
+  //LOG_E(MAC, "%s: an error occured\n", __FUNCTION__);
+  return -1;
+}
+
+
 /*
  * ************************************
  * eNB Configuration Request and Reply
diff --git a/openair2/ENB_APP/enb_agent_common.h b/openair2/ENB_APP/enb_agent_common.h
index 73ce0ec788400fd7624ac6f29ffbdb42ae3fb103..76c68437d05627ec86e43cccf32b92963fc89ff5 100644
--- a/openair2/ENB_APP/enb_agent_common.h
+++ b/openair2/ENB_APP/enb_agent_common.h
@@ -210,6 +210,62 @@ int get_tpc(mid_t mod_id, mid_t ue_id);
 int get_harq(const mid_t mod_id, const uint8_t CC_id, const mid_t ue_id,
 	     const int frame, const uint8_t subframe, int *id, int *status);
 
+/*
+ * ************************************
+ * Get Messages for UE Configuration Reply
+ * ************************************
+ */
+
+int get_time_alignment_timer(mid_t mod_id, mid_t ue_id);
+
+int get_meas_gap_config(mid_t mod_id, mid_t ue_id);
+
+int get_meas_gap_config_offset(mid_t mod_id, mid_t ue_id);
+
+int get_ue_aggregated_max_bitrate_dl (mid_t mod_id, mid_t ue_id);
+
+int get_ue_aggregated_max_bitrate_ul (mid_t mod_id, mid_t ue_id);
+
+int get_half_duplex(mid_t ue_id);
+
+int get_intra_sf_hopping(mid_t ue_id);
+
+int get_type2_sb_1(mid_t ue_id);
+
+int get_ue_category(mid_t ue_id);
+
+int get_res_alloc_type1(mid_t ue_id);
+
+int get_ue_transmission_mode(mid_t mod_id, mid_t ue_id);
+
+int get_tti_bundling(mid_t mod_id, mid_t ue_id);
+
+int get_maxHARQ_TX(mid_t mod_id, mid_t ue_id);
+
+int get_beta_offset_ack_index(mid_t mod_id, mid_t ue_id);
+
+int get_beta_offset_ri_index(mid_t mod_id, mid_t ue_id);
+
+int get_beta_offset_cqi_index(mid_t mod_id, mid_t ue_id);
+
+int get_simultaneous_ack_nack_cqi(mid_t mod_id, mid_t ue_id);
+
+int get_ack_nack_simultaneous_trans(mid_t mod_id,mid_t ue_id);
+
+int get_aperiodic_cqi_rep_mode(mid_t mod_id,mid_t ue_id);
+
+int get_tdd_ack_nack_feedback(mid_t mod_id, mid_t ue_id);
+
+int get_ack_nack_repetition_factor(mid_t mod_id, mid_t ue_id);
+
+int get_extended_bsr_size(mid_t mod_id, mid_t ue_id);
+
+int get_ue_transmission_antenna(mid_t mod_id, mid_t ue_id);
+
+int get_lcg(mid_t ue_id, mid_t lc_id);
+
+int get_direction(mid_t ue_id, mid_t lc_id);
+
 /*******************
  * timer primitves
  *******************/
diff --git a/openair2/LAYER2/MAC/extern.h b/openair2/LAYER2/MAC/extern.h
index 281023525500b948e58972c0aa0abfb879024c44..c2a3c7874175827dee2d1dc81ff1ac975cae964c 100644
--- a/openair2/LAYER2/MAC/extern.h
+++ b/openair2/LAYER2/MAC/extern.h
@@ -58,6 +58,8 @@ extern const uint32_t BSR_TABLE[BSR_TABLE_SIZE];
 extern UE_MAC_INST *UE_mac_inst;
 extern eNB_MAC_INST *eNB_mac_inst;
 extern eNB_RRC_INST *eNB_rrc_inst;
+extern UE_RRC_INST *UE_rrc_inst;
+extern UE_MAC_INST *ue_mac_inst;
 extern MAC_RLC_XFACE *Mac_rlc_xface;
 extern uint8_t Is_rrc_registered;