diff --git a/openair2/COMMON/x2ap_messages_types.h b/openair2/COMMON/x2ap_messages_types.h
index d43057dbdf621625681ac95dffdaa282a14c76a0..b5e73db3ae2aed2a98c49f5ba46a66d9e490943b 100644
--- a/openair2/COMMON/x2ap_messages_types.h
+++ b/openair2/COMMON/x2ap_messages_types.h
@@ -45,6 +45,7 @@ typedef struct x2ap_ue_context_release_s {
   int old_eNB_ue_x2ap_id;
   int new_eNB_ue_x2ap_id;
   int target_mod_id;
+  int source_assoc_id;
 } x2ap_ue_context_release_t;
 
 typedef struct x2ap_register_enb_req_s {
@@ -178,6 +179,7 @@ typedef struct x2ap_handover_req_s {
 
   /* TODO: this parameter has to be removed */
   int target_mod_id;
+  int source_assoc_id;
 } x2ap_handover_req_t;
 
 typedef struct x2ap_handover_req_ack_s {
@@ -185,6 +187,7 @@ typedef struct x2ap_handover_req_ack_s {
   int source_x2id;                       /* TODO: to be fixed/remove */
   /* TODO: this parameter has to be removed */
   int target_mod_id;
+  int source_assoc_id;
 
   uint8_t nb_e_rabs_tobesetup;
 
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index d5faf89bc744106035cea45793f34800220704a8..e9edce2f21d74bd3bcd7e5b2d69a52ccfd612079 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -451,6 +451,7 @@ typedef struct HANDOVER_INFO_s {
   HO_STATE_t state; //current state of handover
   uint32_t modid_s; //module_idP of serving cell
   uint32_t modid_t; //module_idP of target cell
+  int source_assoc_id;
   uint8_t ueid_s; //UE index in serving cell
   uint8_t ueid_t; //UE index in target cell
   LTE_AS_Config_t as_config; /* these two parameters are taken from 36.331 section 10.2.2: HandoverPreparationInformation-r8-IEs */
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index 7fab592448386214e154eed62b01cbc398d172c4..16a26fbed84947531d3bdc4b173e64100feaa4c2 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -4113,8 +4113,9 @@ void rrc_eNB_process_handoverPreparationInformation(int mod_id, x2ap_handover_re
   ue_context_target_p->ue_context.Status = RRC_HO_EXECUTION;
   ue_context_target_p->ue_context.handover_info->state = HO_ACK;
   /* TODO: remove this hack */
+  ue_context_target_p->ue_context.handover_info->source_assoc_id = m->source_assoc_id;
   //ue_context_target_p->ue_context.handover_info->modid_t = mod_id;
-  ue_context_target_p->ue_context.handover_info->modid_t = m->target_mod_id;
+  //ue_context_target_p->ue_context.handover_info->modid_t = m->target_mod_id;
   //ue_context_target_p->ue_context.handover_info->modid_s = 1-mod_id;
   //ue_context_target_p->ue_context.handover_info->ueid_s  = m->source_rnti;
   memset (ue_context_target_p->ue_context.nh, 0, 32);
@@ -4328,8 +4329,10 @@ check_handovers(
         rrc_eNB_configure_rbs_handover(ue_context_p,ctxt_pP);
         /* TODO: remove this hack */
         //X2AP_HANDOVER_REQ_ACK(msg).target_mod_id = 1 - ctxt_pP->module_id;
-        X2AP_HANDOVER_REQ_ACK(msg).target_mod_id = ue_context_p->ue_context.handover_info->modid_t;
+        //X2AP_HANDOVER_REQ_ACK(msg).target_mod_id = ue_context_p->ue_context.handover_info->modid_t;
         //X2AP_HANDOVER_REQ_ACK(msg).source_x2id = ue_context_p->ue_context.handover_info->source_x2id;
+
+        X2AP_HANDOVER_REQ_ACK(msg).source_assoc_id = ue_context_p->ue_context.handover_info->source_assoc_id;
         /* Call admission control not implemented yet */
         X2AP_HANDOVER_REQ_ACK(msg).nb_e_rabs_tobesetup = ue_context_p->ue_context.setup_e_rabs;
 
diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c
index ce5bdc7d5462cea3c42dedc4f84fa707859597e7..e2e434feb7b1bf873e260a10668265eb81b6f382 100644
--- a/openair2/RRC/LTE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c
@@ -2104,7 +2104,7 @@ int rrc_eNB_send_X2AP_UE_CONTEXT_RELEASE(const protocol_ctxt_t* const ctxt_pP, r
 
   X2AP_UE_CONTEXT_RELEASE (msg_p).old_eNB_ue_x2ap_id = 0;
   X2AP_UE_CONTEXT_RELEASE (msg_p).new_eNB_ue_x2ap_id = 0;
-  X2AP_UE_CONTEXT_RELEASE (msg_p).target_mod_id = ue_context_pP->ue_context.handover_info->modid_t;
+  X2AP_UE_CONTEXT_RELEASE (msg_p).source_assoc_id = ue_context_pP->ue_context.handover_info->source_assoc_id;
   itti_send_msg_to_task (TASK_X2AP, ctxt_pP->instance, msg_p);
   return (0);
 }
diff --git a/openair2/X2AP/x2ap_eNB.c b/openair2/X2AP/x2ap_eNB.c
index eb79401153e83bc36134f29d6b82f7b5f7f0603a..19031bceaff5f22d7ffce5ba3326f247edddfdf3 100644
--- a/openair2/X2AP/x2ap_eNB.c
+++ b/openair2/X2AP/x2ap_eNB.c
@@ -135,7 +135,7 @@ void x2ap_eNB_handle_sctp_association_resp(instance_t instance, sctp_new_associa
               sctp_new_association_resp->sctp_state,
               instance,
               sctp_new_association_resp->ulp_cnx_id);
-    x2ap_handle_x2_setup_message(x2ap_enb_data_p,
+    x2ap_handle_x2_setup_message(instance_p, x2ap_enb_data_p,
                                  sctp_new_association_resp->sctp_state == SCTP_STATE_SHUTDOWN);
     return;
   }
@@ -386,20 +386,17 @@ void x2ap_eNB_handle_handover_req(instance_t instance,
   x2ap_eNB_instance_t *instance_p;
   x2ap_eNB_data_t     *target;
 
-  int target_enb_id = x2ap_handover_req->target_physCellId;
+  int target_pci = x2ap_handover_req->target_physCellId;
 
-  instance_p = x2ap_eNB_pci_get_instance(target_enb_id);
+  instance_p = x2ap_eNB_get_instance(instance);
   DevAssert(instance_p != NULL);
 
-  //instance_p = x2ap_eNB_get_instance(instance);
-  //DevAssert(instance_p != NULL);
-
-  target = x2ap_is_eNB_id_in_list(instance_p->eNB_id);
+  target = x2ap_is_eNB_pci_in_list(target_pci);
   DevAssert(target != NULL);
 
   /* store rnti at index 0 */
   //x2id_to_source_rnti[0] = x2ap_handover_req->source_rnti;
-  x2ap_eNB_generate_x2_handover_request(target, x2ap_handover_req);
+  x2ap_eNB_generate_x2_handover_request(instance_p, target, x2ap_handover_req);
 }
 
 static
@@ -415,15 +412,15 @@ void x2ap_eNB_handle_handover_req_ack(instance_t instance,
    */
   x2ap_eNB_instance_t *instance_p;
   x2ap_eNB_data_t     *target;
-  int target_enb_id = x2ap_handover_req_ack->target_mod_id;
+  int source_assoc_id = x2ap_handover_req_ack->source_assoc_id;
 
   instance_p = x2ap_eNB_get_instance(instance);
   DevAssert(instance_p != NULL);
 
-  target = x2ap_is_eNB_id_in_list(target_enb_id);
+  target = x2ap_get_eNB(NULL, source_assoc_id, 0);
   DevAssert(target != NULL);
 
-  x2ap_eNB_generate_x2_handover_request_ack(target, x2ap_handover_req_ack);
+  x2ap_eNB_generate_x2_handover_request_ack(instance_p, target, x2ap_handover_req_ack);
   //x2ap_eNB_generate_x2_handover_req_ack(instance_p, target, x2ap_handover_req_ack->source_x2id,
           //x2ap_handover_req_ack->rrc_buffer, x2ap_handover_req_ack->rrc_buffer_size);
 }
@@ -434,15 +431,15 @@ void x2ap_eNB_handle_ue_context_release(instance_t instance,
 {
   x2ap_eNB_instance_t *instance_p;
   x2ap_eNB_data_t     *target;
-  int target_enb_id = x2ap_ue_context_release->target_mod_id;
+  int source_assoc_id = x2ap_ue_context_release->source_assoc_id;
 
   instance_p = x2ap_eNB_get_instance(instance);
   DevAssert(instance_p != NULL);
 
-  target = x2ap_is_eNB_id_in_list(target_enb_id);
+  target = x2ap_get_eNB(NULL, source_assoc_id, 0);
   DevAssert(target != NULL);
 
-  x2ap_eNB_generate_x2_ue_context_release(target, x2ap_ue_context_release);
+  x2ap_eNB_generate_x2_ue_context_release(instance_p, target, x2ap_ue_context_release);
 }
 
 void *x2ap_task(void *arg) {
diff --git a/openair2/X2AP/x2ap_eNB_defs.h b/openair2/X2AP/x2ap_eNB_defs.h
index a5558c42a5307d7f55c64be8eca6cf788e37b3c8..f90176430cf598a128262858d98d4a00a4303298 100644
--- a/openair2/X2AP/x2ap_eNB_defs.h
+++ b/openair2/X2AP/x2ap_eNB_defs.h
@@ -114,6 +114,10 @@ typedef struct x2ap_eNB_data_s {
   /* SCTP association id */
   int32_t  assoc_id;
 
+  /* Nid cells */
+  uint32_t                Nid_cell[MAX_NUM_CCs];
+  int                     num_cc;
+
   /* Only meaningfull in virtual mode */
   struct x2ap_eNB_instance_s *x2ap_eNB_instance;
 } x2ap_eNB_data_t;
@@ -163,7 +167,6 @@ typedef struct x2ap_eNB_instance_s {
   uint32_t                downlink_frequency[MAX_NUM_CCs];
   int32_t                 uplink_frequency_offset[MAX_NUM_CCs];
   uint32_t                Nid_cell[MAX_NUM_CCs];
-  uint32_t                Nid_target_cell[MAX_NUM_CCs];
   int16_t                 N_RB_DL[MAX_NUM_CCs];
   lte_frame_type_t        frame_type[MAX_NUM_CCs];
   uint32_t                fdd_earfcn_DL[MAX_NUM_CCs];
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.c b/openair2/X2AP/x2ap_eNB_generate_messages.c
index 65dc3ae9d8c841919877bf7b168c774837748be8..27fd766614182ba552212e2893cd051d9cf1d761 100644
--- a/openair2/X2AP/x2ap_eNB_generate_messages.c
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.c
@@ -180,7 +180,7 @@ int x2ap_eNB_generate_x2_setup_request(
   return ret;
 }
 
-int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_eNB_data_p)
+int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p)
 {
   X2AP_X2AP_PDU_t                     pdu;
   X2AP_X2SetupResponse_t              *out;
@@ -189,18 +189,12 @@ int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_eNB_data_p)
   ServedCells__Member                 *servedCellMember;
   X2AP_GU_Group_ID_t                  *gu;
 
-  x2ap_eNB_instance_t                 *instance_p;
-
   uint8_t  *buffer;
   uint32_t  len;
   int       ret = 0;
 
-  DevAssert(x2ap_eNB_data_p != NULL);
-
-  /* get the eNB instance */
-  instance_p = x2ap_eNB_data_p->x2ap_eNB_instance;
-
   DevAssert(instance_p != NULL);
+  DevAssert(x2ap_eNB_data_p != NULL);
 
   /* Prepare the X2AP message to encode */
   memset(&pdu, 0, sizeof(pdu));
@@ -414,7 +408,7 @@ int x2ap_eNB_set_cause (X2AP_Cause_t * cause_p,
   return 0;
 }
 
-int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_data_t *x2ap_eNB_data_p,
+int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p,
                                            x2ap_handover_req_t *x2ap_handover_req)
 {
 
@@ -425,19 +419,12 @@ int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_data_t *x2ap_eNB_data_p,
   X2AP_E_RABs_ToBeSetup_Item_t        *e_RABs_ToBeSetup_Item;
   X2AP_LastVisitedCell_Item_t         *lastVisitedCell_Item;
 
-  x2ap_eNB_instance_t                 *instance_p;
-
   uint8_t  *buffer;
   uint32_t  len;
   int       ret = 0;
 
-  DevAssert(x2ap_eNB_data_p != NULL);
-
-  /* get the eNB instance */
-  instance_p = x2ap_eNB_data_p->x2ap_eNB_instance;
-
   DevAssert(instance_p != NULL);
-
+  DevAssert(x2ap_eNB_data_p != NULL);
 
   /* Prepare the X2AP handover message to encode */
   memset(&pdu, 0, sizeof(pdu));
@@ -471,7 +458,7 @@ int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_data_t *x2ap_eNB_data_p,
   ie->value.present = X2AP_HandoverRequest_IEs__value_PR_ECGI;
   MCC_MNC_TO_PLMNID(instance_p->mcc, instance_p->mnc, instance_p->mnc_digit_length,
                        &ie->value.choice.ECGI.pLMN_Identity);
-  MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id, 0, &ie->value.choice.ECGI.eUTRANcellIdentifier);
+  MACRO_ENB_ID_TO_CELL_IDENTITY(x2ap_eNB_data_p->eNB_id, 0, &ie->value.choice.ECGI.eUTRANcellIdentifier);
   ASN_SEQUENCE_ADD(&out->protocolIEs.list, ie);
 
   /* mandatory */
@@ -576,7 +563,7 @@ int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_data_t *x2ap_eNB_data_p,
   return ret;
 }
 
-int x2ap_eNB_generate_x2_handover_request_ack (x2ap_eNB_data_t *x2ap_eNB_data_p,
+int x2ap_eNB_generate_x2_handover_request_ack (x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p,
                                                x2ap_handover_req_ack_t *x2ap_handover_req_ack)
 {
 
@@ -586,18 +573,12 @@ int x2ap_eNB_generate_x2_handover_request_ack (x2ap_eNB_data_t *x2ap_eNB_data_p,
   X2AP_E_RABs_Admitted_ItemIEs_t         *e_RABS_Admitted_ItemIEs;
   X2AP_E_RABs_Admitted_Item_t            *e_RABs_Admitted_Item;
 
-  x2ap_eNB_instance_t                 *instance_p;
-
   uint8_t  *buffer;
   uint32_t  len;
   int       ret = 0;
 
-  DevAssert(x2ap_eNB_data_p != NULL);
-
-  /* get the eNB instance */
-  instance_p = x2ap_eNB_data_p->x2ap_eNB_instance;
-
   DevAssert(instance_p != NULL);
+  DevAssert(x2ap_eNB_data_p != NULL);
 
   /* Prepare the X2AP handover message to encode */
   memset(&pdu, 0, sizeof(pdu));
@@ -668,25 +649,19 @@ int x2ap_eNB_generate_x2_handover_request_ack (x2ap_eNB_data_t *x2ap_eNB_data_p,
   return ret;
 }
 
-int x2ap_eNB_generate_x2_ue_context_release (x2ap_eNB_data_t *x2ap_eNB_data_p, x2ap_ue_context_release_t *x2ap_ue_context_release)
+int x2ap_eNB_generate_x2_ue_context_release (x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p, x2ap_ue_context_release_t *x2ap_ue_context_release)
 {
 
   X2AP_X2AP_PDU_t                pdu;
   X2AP_UEContextRelease_t        *out;
   X2AP_UEContextRelease_IEs_t    *ie;
 
-  x2ap_eNB_instance_t               *instance_p;
-
   uint8_t  *buffer;
   uint32_t  len;
   int       ret = 0;
 
-  DevAssert(x2ap_eNB_data_p != NULL);
-
-  /* get the eNB instance */
-  instance_p = x2ap_eNB_data_p->x2ap_eNB_instance;
-
   DevAssert(instance_p != NULL);
+  DevAssert(x2ap_eNB_data_p != NULL);
 
   /* Prepare the X2AP ue context relase message to encode */
   memset(&pdu, 0, sizeof(pdu));
diff --git a/openair2/X2AP/x2ap_eNB_generate_messages.h b/openair2/X2AP/x2ap_eNB_generate_messages.h
index df599c60ab779b56036e7356549870f597bfc62e..6636413fc617326f797b02076ab03fc68ac008fd 100644
--- a/openair2/X2AP/x2ap_eNB_generate_messages.h
+++ b/openair2/X2AP/x2ap_eNB_generate_messages.h
@@ -35,7 +35,7 @@
 int x2ap_eNB_generate_x2_setup_request(x2ap_eNB_instance_t *instance_p,
 				       x2ap_eNB_data_t *x2ap_eNB_data_p);
 
-int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data_t *x2ap_eNB_data_p);
+int x2ap_eNB_generate_x2_setup_response(x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p);
 
 int x2ap_eNB_generate_x2_setup_failure(instance_t instance,
                                        uint32_t assoc_id,
@@ -47,13 +47,13 @@ int x2ap_eNB_set_cause (X2AP_Cause_t * cause_p,
                         X2AP_Cause_PR cause_type,
                         long cause_value);
 
-int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_data_t *x2ap_eNB_data_p,
+int x2ap_eNB_generate_x2_handover_request (x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p,
                                            x2ap_handover_req_t *x2ap_handover_req);
 
-int x2ap_eNB_generate_x2_handover_request_ack (x2ap_eNB_data_t *x2ap_eNB_data_p,
+int x2ap_eNB_generate_x2_handover_request_ack (x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p,
                                                x2ap_handover_req_ack_t *x2ap_handover_req_ack);
 
-int x2ap_eNB_generate_x2_ue_context_release (x2ap_eNB_data_t *x2ap_eNB_data_p,
+int x2ap_eNB_generate_x2_ue_context_release (x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *x2ap_eNB_data_p,
                                              x2ap_ue_context_release_t *x2ap_ue_context_release);
 #endif /*  X2AP_ENB_GENERATE_MESSAGES_H_ */
 
diff --git a/openair2/X2AP/x2ap_eNB_handler.c b/openair2/X2AP/x2ap_eNB_handler.c
index c7512390953fe0b010f97d58af90f4fb8b2eb709..cb216dfc81e6be4e35c71f7ea90a905028263b0c 100644
--- a/openair2/X2AP/x2ap_eNB_handler.c
+++ b/openair2/X2AP/x2ap_eNB_handler.c
@@ -118,7 +118,7 @@ static char *x2ap_direction_String[] = {
 return(x2ap_direction_String[x2ap_dir]);
 }
 
-void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown)
+void x2ap_handle_x2_setup_message(x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown)
 {
   if (sctp_shutdown) {
     /* A previously connected eNB has been shutdown */
@@ -127,38 +127,38 @@ void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *enb_desc_p, int sctp_shutdown
     if (enb_desc_p->state == X2AP_ENB_STATE_CONNECTED) {
       enb_desc_p->state = X2AP_ENB_STATE_DISCONNECTED;
 
-      if (enb_desc_p->x2ap_eNB_instance-> x2_target_enb_associated_nb > 0) {
+      if (instance_p-> x2_target_enb_associated_nb > 0) {
         /* Decrease associated eNB number */
-        enb_desc_p->x2ap_eNB_instance-> x2_target_enb_associated_nb --;
+        instance_p-> x2_target_enb_associated_nb --;
       }
 
       /* If there are no more associated eNB, inform eNB app */
-      if (enb_desc_p->x2ap_eNB_instance->x2_target_enb_associated_nb == 0) {
+      if (instance_p->x2_target_enb_associated_nb == 0) {
         MessageDef                 *message_p;
 
         message_p = itti_alloc_new_message(TASK_X2AP, X2AP_DEREGISTERED_ENB_IND);
         X2AP_DEREGISTERED_ENB_IND(message_p).nb_x2 = 0;
-        itti_send_msg_to_task(TASK_ENB_APP, enb_desc_p->x2ap_eNB_instance->instance, message_p);
+        itti_send_msg_to_task(TASK_ENB_APP, instance_p->instance, message_p);
       }
     }
   } else {
     /* Check that at least one setup message is pending */
-    DevCheck(enb_desc_p->x2ap_eNB_instance->x2_target_enb_pending_nb > 0,
-             enb_desc_p->x2ap_eNB_instance->instance,
-             enb_desc_p->x2ap_eNB_instance->x2_target_enb_pending_nb, 0);
+    DevCheck(instance_p->x2_target_enb_pending_nb > 0,
+             instance_p->instance,
+             instance_p->x2_target_enb_pending_nb, 0);
 
-    if (enb_desc_p->x2ap_eNB_instance->x2_target_enb_pending_nb > 0) {
+    if (instance_p->x2_target_enb_pending_nb > 0) {
       /* Decrease pending messages number */
-      enb_desc_p->x2ap_eNB_instance->x2_target_enb_pending_nb --;
+      instance_p->x2_target_enb_pending_nb --;
     }
 
     /* If there are no more pending messages, inform eNB app */
-    if (enb_desc_p->x2ap_eNB_instance->x2_target_enb_pending_nb == 0) {
+    if (instance_p->x2_target_enb_pending_nb == 0) {
       MessageDef                 *message_p;
 
       message_p = itti_alloc_new_message(TASK_X2AP, X2AP_REGISTER_ENB_CNF);
-      X2AP_REGISTER_ENB_CNF(message_p).nb_x2 = enb_desc_p->x2ap_eNB_instance->x2_target_enb_associated_nb;
-      itti_send_msg_to_task(TASK_ENB_APP, enb_desc_p->x2ap_eNB_instance->instance, message_p);
+      X2AP_REGISTER_ENB_CNF(message_p).nb_x2 = instance_p->x2_target_enb_associated_nb;
+      itti_send_msg_to_task(TASK_ENB_APP, instance_p->instance, message_p);
     }
   }
 }
@@ -282,6 +282,7 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance,
   X2AP_X2SetupRequest_IEs_t          *ie;
   ServedCells__Member                *servedCellMember;
 
+  x2ap_eNB_instance_t                *instance_p;
   x2ap_eNB_data_t                    *x2ap_eNB_data;
   uint32_t                           eNB_id = 0;
 
@@ -364,8 +365,7 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance,
        */
       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", eNB_id, x2ap_eNB_data->assoc_id, assoc_id);
 
-      DevAssert(x2ap_eNB_data->x2ap_eNB_instance != NULL);
-      x2ap_eNB_generate_x2_setup_failure (x2ap_eNB_data->x2ap_eNB_instance->instance,
+      x2ap_eNB_generate_x2_setup_failure (instance,
                                           assoc_id,
                                           X2AP_Cause_PR_protocol,
                                           X2AP_CauseProtocol_unspecified,
@@ -380,19 +380,22 @@ x2ap_eNB_handle_x2_setup_request(instance_t instance,
   /* Set proper pci */
   X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupRequest_IEs_t, ie, x2SetupRequest,
                              X2AP_ProtocolIE_ID_id_ServedCells, true);
-
   if (ie == NULL ) {
     X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
     return -1;
-  } else if (ie->value.choice.ServedCells.list.count > 0) {
-    x2ap_eNB_data->x2ap_eNB_instance->num_cc = ie->value.choice.ServedCells.list.count;
+  }
+  if (ie->value.choice.ServedCells.list.count > 0) {
+    x2ap_eNB_data->num_cc = ie->value.choice.ServedCells.list.count;
     for (int i=0; i<ie->value.choice.ServedCells.list.count;i++) {
       servedCellMember = (ServedCells__Member *)ie->value.choice.ServedCells.list.array[i];
-      x2ap_eNB_data->x2ap_eNB_instance->Nid_target_cell[i] = servedCellMember->servedCellInfo.pCI;
+      x2ap_eNB_data->Nid_cell[i] = servedCellMember->servedCellInfo.pCI;
     }
   }
 
-  return x2ap_eNB_generate_x2_setup_response(x2ap_eNB_data);
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  return x2ap_eNB_generate_x2_setup_response(instance_p, x2ap_eNB_data);
 }
 
 static
@@ -406,6 +409,7 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance,
   X2AP_X2SetupResponse_IEs_t          *ie;
   ServedCells__Member                 *servedCellMember;
 
+  x2ap_eNB_instance_t                 *instance_p;
   x2ap_eNB_data_t                     *x2ap_eNB_data;
   uint32_t                            eNB_id = 0;
 
@@ -484,15 +488,16 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance,
   /* Set proper pci */
   X2AP_FIND_PROTOCOLIE_BY_ID(X2AP_X2SetupResponse_IEs_t, ie, x2SetupResponse,
                              X2AP_ProtocolIE_ID_id_ServedCells, true);
-
   if (ie == NULL ) {
     X2AP_ERROR("%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
     return -1;
-  } else if (ie->value.choice.ServedCells.list.count > 0) {
-    x2ap_eNB_data->x2ap_eNB_instance->num_cc = ie->value.choice.ServedCells.list.count;
+  }
+
+  if (ie->value.choice.ServedCells.list.count > 0) {
+    x2ap_eNB_data->num_cc = ie->value.choice.ServedCells.list.count;
     for (int i=0; i<ie->value.choice.ServedCells.list.count;i++) {
       servedCellMember = (ServedCells__Member *)ie->value.choice.ServedCells.list.array[i];
-      x2ap_eNB_data->x2ap_eNB_instance->Nid_target_cell[i] = servedCellMember->servedCellInfo.pCI;
+      x2ap_eNB_data->Nid_cell[i] = servedCellMember->servedCellInfo.pCI;
     }
   }
 
@@ -502,8 +507,12 @@ int x2ap_eNB_handle_x2_setup_response(instance_t instance,
    * Mark the association as connected.
    */
   x2ap_eNB_data->state = X2AP_ENB_STATE_READY;
-  x2ap_eNB_data->x2ap_eNB_instance->x2_target_enb_associated_nb ++;
-  x2ap_handle_x2_setup_message(x2ap_eNB_data, 0);
+
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  instance_p->x2_target_enb_associated_nb ++;
+  x2ap_handle_x2_setup_message(instance_p, x2ap_eNB_data, 0);
 
   return 0;
 }
@@ -518,6 +527,7 @@ int x2ap_eNB_handle_x2_setup_failure(instance_t instance,
   X2AP_X2SetupFailure_t              *x2SetupFailure;
   X2AP_X2SetupFailure_IEs_t          *ie;
 
+  x2ap_eNB_instance_t                *instance_p;
   x2ap_eNB_data_t                    *x2ap_eNB_data;
 
   DevAssert(pdu != NULL);
@@ -558,7 +568,11 @@ int x2ap_eNB_handle_x2_setup_failure(instance_t instance,
   }
 
   x2ap_eNB_data->state = X2AP_ENB_STATE_WAITING;
-  x2ap_handle_x2_setup_message(x2ap_eNB_data, 0);
+
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  x2ap_handle_x2_setup_message(instance_p, x2ap_eNB_data, 0);
 
   return 0;
 }
@@ -576,6 +590,7 @@ int x2ap_eNB_handle_handover_preparation (instance_t instance,
   X2AP_E_RABs_ToBeSetup_ItemIEs_t    *e_RABS_ToBeSetup_ItemIEs;
   X2AP_E_RABs_ToBeSetup_Item_t       *e_RABs_ToBeSetup_Item;
 
+  x2ap_eNB_instance_t                *instance_p;
   x2ap_eNB_data_t                    *x2ap_eNB_data;
   MessageDef                         *msg;
 
@@ -625,7 +640,11 @@ int x2ap_eNB_handle_handover_preparation (instance_t instance,
   }
 
   X2AP_HANDOVER_REQ(msg).mme_ue_s1ap_id = ie->value.choice.UE_ContextInformation.mME_UE_S1AP_ID;
-  X2AP_HANDOVER_REQ(msg).target_mod_id = x2ap_eNB_data->x2ap_eNB_instance->eNB_id;
+
+  /* TODO: properly store Target Cell ID */
+
+  X2AP_HANDOVER_REQ(msg).source_assoc_id = assoc_id;
+
   X2AP_HANDOVER_REQ(msg).security_capabilities.encryption_algorithms =
     BIT_STRING_to_uint16(&ie->value.choice.UE_ContextInformation.uESecurityCapabilities.encryptionAlgorithms);
   X2AP_HANDOVER_REQ(msg).security_capabilities.integrity_algorithms =
@@ -680,7 +699,10 @@ int x2ap_eNB_handle_handover_preparation (instance_t instance,
   memcpy(X2AP_HANDOVER_REQ(msg).rrc_buffer, c->buf, c->size);
   X2AP_HANDOVER_REQ(msg).rrc_buffer_size = c->size;
 
-  itti_send_msg_to_task(TASK_RRC_ENB, x2ap_eNB_data->x2ap_eNB_instance->instance, msg);
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg);
 
   return 0;
 }
@@ -694,6 +716,7 @@ int x2ap_eNB_handle_handover_response (instance_t instance,
   X2AP_HandoverRequestAcknowledge_t             *x2HandoverRequestAck;
   X2AP_HandoverRequestAcknowledge_IEs_t         *ie;
 
+  x2ap_eNB_instance_t                           *instance_p;
   x2ap_eNB_data_t                               *x2ap_eNB_data;
   MessageDef                                    *msg;
 
@@ -729,7 +752,10 @@ int x2ap_eNB_handle_handover_response (instance_t instance,
   memcpy(X2AP_HANDOVER_REQ_ACK(msg).rrc_buffer, c->buf, c->size);
   X2AP_HANDOVER_REQ_ACK(msg).rrc_buffer_size = c->size;
 
-  itti_send_msg_to_task(TASK_RRC_ENB, x2ap_eNB_data->x2ap_eNB_instance->instance, msg);
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg);
   return 0;
 }
 
@@ -743,6 +769,7 @@ int x2ap_eNB_handle_ue_context_release (instance_t instance,
   X2AP_UEContextRelease_t             *x2UEContextRelease;
   X2AP_UEContextRelease_IEs_t         *ie;
 
+  x2ap_eNB_instance_t                 *instance_p;
   x2ap_eNB_data_t                     *x2ap_eNB_data;
   MessageDef                          *msg;
 
@@ -772,7 +799,10 @@ int x2ap_eNB_handle_ue_context_release (instance_t instance,
 
   X2AP_UE_CONTEXT_RELEASE(msg).new_eNB_ue_x2ap_id = ie->value.choice.UE_X2AP_ID;
 
-  itti_send_msg_to_task(TASK_RRC_ENB, x2ap_eNB_data->x2ap_eNB_instance->instance, msg);
+  instance_p = x2ap_eNB_get_instance(instance);
+  DevAssert(instance_p != NULL);
+
+  itti_send_msg_to_task(TASK_RRC_ENB, instance_p->instance, msg);
 
   return 0;
 }
diff --git a/openair2/X2AP/x2ap_eNB_handler.h b/openair2/X2AP/x2ap_eNB_handler.h
index e4dac14e8e637078880ac10dd25b442a81cce51f..402212f62d78e453777d4bfa40d5fda7dbd0a741 100644
--- a/openair2/X2AP/x2ap_eNB_handler.h
+++ b/openair2/X2AP/x2ap_eNB_handler.h
@@ -31,7 +31,7 @@
 
 #include "x2ap_eNB_defs.h"
 
-void x2ap_handle_x2_setup_message(x2ap_eNB_data_t *eNB_desc_p, int sctp_shutdown);
+void x2ap_handle_x2_setup_message(x2ap_eNB_instance_t *instance_p, x2ap_eNB_data_t *eNB_desc_p, int sctp_shutdown);
 
 int x2ap_eNB_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
                             const uint8_t * const data, const uint32_t data_length);
diff --git a/openair2/X2AP/x2ap_eNB_management_procedures.c b/openair2/X2AP/x2ap_eNB_management_procedures.c
index 670581406b9e2190ac0233bd9b5b797fc66ef521..137bad40add81872cb8641270131f0f0f97cb345 100644
--- a/openair2/X2AP/x2ap_eNB_management_procedures.c
+++ b/openair2/X2AP/x2ap_eNB_management_procedures.c
@@ -169,23 +169,6 @@ x2ap_eNB_instance_t *x2ap_eNB_get_instance(instance_t instance)
   return NULL;
 }
 
-x2ap_eNB_instance_t *x2ap_eNB_pci_get_instance(uint32_t pci)
-{
-  x2ap_eNB_instance_t *temp = NULL;
-
-  STAILQ_FOREACH(temp, &x2ap_eNB_internal_data.x2ap_eNB_instances_head,
-                 x2ap_eNB_entries) {
-    for (int i=0; i<temp->num_cc;i++) {
-      if (temp->Nid_target_cell[i] == pci) {
-        /* Matching occurence */
-        return temp;
-      }
-    }
-  }
-
-  return NULL;
-}
-
 /// utility functions 
 
 void x2ap_dump_eNB (x2ap_eNB_data_t  * eNB_ref);
@@ -222,6 +205,22 @@ void x2ap_dump_eNB (x2ap_eNB_data_t  * eNB_ref) {
   indent--;
 }
 
+x2ap_eNB_data_t  * x2ap_is_eNB_pci_in_list (const uint32_t pci)
+{
+  x2ap_eNB_instance_t    *inst;
+  struct x2ap_eNB_data_s *elm;
+
+  STAILQ_FOREACH(inst, &x2ap_eNB_internal_data.x2ap_eNB_instances_head, x2ap_eNB_entries) {
+    RB_FOREACH(elm, x2ap_enb_map, &inst->x2ap_enb_head) {
+      for (int i = 0; i<elm->num_cc; i++) {
+        if (elm->Nid_cell[i] == pci) {
+          return elm;
+        }
+      }
+    }
+  }
+  return NULL;
+}
 
 x2ap_eNB_data_t  * x2ap_is_eNB_id_in_list (const uint32_t eNB_id)
 {
diff --git a/openair2/X2AP/x2ap_eNB_management_procedures.h b/openair2/X2AP/x2ap_eNB_management_procedures.h
index 80234159515f401f439b47ed0695b9223963cc69..bcad728aaaf328fd7b15965c229c6392eabb83b5 100644
--- a/openair2/X2AP/x2ap_eNB_management_procedures.h
+++ b/openair2/X2AP/x2ap_eNB_management_procedures.h
@@ -37,8 +37,6 @@ void x2ap_eNB_insert_new_instance(x2ap_eNB_instance_t *new_instance_p);
 
 x2ap_eNB_instance_t *x2ap_eNB_get_instance(uint8_t mod_id);
 
-x2ap_eNB_instance_t *x2ap_eNB_pci_get_instance(uint32_t pci);
-
 uint16_t x2ap_eNB_fetch_add_global_cnx_id(void);
 
 void x2ap_eNB_prepare_internal_data(void);
@@ -47,6 +45,8 @@ x2ap_eNB_data_t* x2ap_is_eNB_id_in_list(uint32_t eNB_id);
 
 x2ap_eNB_data_t* x2ap_is_eNB_assoc_id_in_list(uint32_t sctp_assoc_id);
 
+x2ap_eNB_data_t* x2ap_is_eNB_pci_in_list (const uint32_t pci);
+
 struct x2ap_eNB_data_s *x2ap_get_eNB(x2ap_eNB_instance_t *instance_p,
                                      int32_t assoc_id,
                                      uint16_t cnx_id);