diff --git a/openair-cn/S1AP/s1ap_eNB_handlers.c b/openair-cn/S1AP/s1ap_eNB_handlers.c
index 56528f13bbdc5db5c94181ff62aac21005767ca5..9b5ee1b789fbdf02484cbcd416f3d9d25f65c009 100644
--- a/openair-cn/S1AP/s1ap_eNB_handlers.c
+++ b/openair-cn/S1AP/s1ap_eNB_handlers.c
@@ -67,6 +67,11 @@ int s1ap_eNB_handle_s1_setup_failure(uint32_t               assoc_id,
                                      uint32_t               stream,
                                      struct s1ap_message_s *message_p);
 
+static
+int s1ap_eNB_handle_error_indication(uint32_t               assoc_id,
+    uint32_t               stream,
+    struct s1ap_message_s *message_p);
+
 static
 int s1ap_eNB_handle_initial_context_request(uint32_t               assoc_id,
     uint32_t               stream,
@@ -94,7 +99,7 @@ s1ap_message_decoded_callback messages_callback[][3] = {
   { 0, 0, 0 }, /* initialUEMessage */
   { 0, 0, 0 }, /* uplinkNASTransport */
   { 0, 0, 0 }, /* Reset */
-  { 0, 0, 0 }, /* ErrorIndication */
+  { s1ap_eNB_handle_error_indication, 0, 0 }, /* ErrorIndication */
   { 0, 0, 0 }, /* NASNonDeliveryIndication */
   { 0, s1ap_eNB_handle_s1_setup_response, s1ap_eNB_handle_s1_setup_failure }, /* S1Setup */
   { 0, 0, 0 }, /* UEContextReleaseRequest */
@@ -418,6 +423,264 @@ int s1ap_eNB_handle_s1_setup_response(uint32_t               assoc_id,
   return 0;
 }
 
+
+static
+int s1ap_eNB_handle_error_indication(uint32_t               assoc_id,
+                                     uint32_t               stream,
+                                     struct s1ap_message_s *message_p)
+{
+  S1ap_ErrorIndicationIEs_t   *s1_error_indication_p;
+  s1ap_eNB_mme_data_t        *mme_desc_p;
+
+  DevAssert(message_p != NULL);
+
+  s1_error_indication_p = &message_p->msg.s1ap_ErrorIndicationIEs;
+
+  /* S1 Setup Failure == Non UE-related procedure -> stream 0 */
+  if (stream != 0) {
+    S1AP_WARN("[SCTP %d] Received s1 Error indication on stream != 0 (%d)\n",
+              assoc_id, stream);
+  }
+
+  if ((mme_desc_p = s1ap_eNB_get_MME(NULL, assoc_id, 0)) == NULL) {
+    S1AP_ERROR("[SCTP %d] Received S1 Error indication for non existing "
+               "MME context\n", assoc_id);
+    return -1;
+  }
+  if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_MME_UE_S1AP_ID_PRESENT) {
+	  	S1AP_WARN("Received S1 Error indication MME UE S1AP ID 0x%x\n", s1_error_indication_p->mme_ue_s1ap_id);
+  }
+  if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_ENB_UE_S1AP_ID_PRESENT) {
+  	S1AP_WARN("Received S1 Error indication eNB UE S1AP ID 0x%x\n", s1_error_indication_p->eNB_UE_S1AP_ID);
+  }
+
+  if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_CAUSE_PRESENT) {
+    switch(s1_error_indication_p->cause.present) {
+      case S1ap_Cause_PR_NOTHING:
+    	S1AP_WARN("Received S1 Error indication cause NOTHING\n");
+      break;
+      case S1ap_Cause_PR_radioNetwork:
+      	switch (s1_error_indication_p->cause.choice.radioNetwork) {
+	      case S1ap_CauseRadioNetwork_unspecified:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unspecified\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_tx2relocoverall_expiry:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_tx2relocoverall_expiry\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_successful_handover:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_successful_handover\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_release_due_to_eutran_generated_reason:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_release_due_to_eutran_generated_reason\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_handover_cancelled:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_handover_cancelled\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_partial_handover:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_partial_handover\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_ho_failure_in_target_EPC_eNB_or_target_system\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_ho_target_not_allowed:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_ho_target_not_allowed\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_tS1relocoverall_expiry:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_tS1relocoverall_expiry\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_tS1relocprep_expiry:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_tS1relocprep_expiry\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_cell_not_available:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_cell_not_available\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_unknown_targetID:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_targetID\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_no_radio_resources_available_in_target_cell:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_no_radio_resources_available_in_target_cell\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_mme_ue_s1ap_id\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_unknown_enb_ue_s1ap_id:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_enb_ue_s1ap_id\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_unknown_pair_ue_s1ap_id:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_pair_ue_s1ap_id\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_handover_desirable_for_radio_reason:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_handover_desirable_for_radio_reason\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_time_critical_handover:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_time_critical_handover\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_resource_optimisation_handover:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_resource_optimisation_handover\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_reduce_load_in_serving_cell:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_reduce_load_in_serving_cell\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_user_inactivity:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_user_inactivity\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_radio_connection_with_ue_lost:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_radio_connection_with_ue_lost\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_load_balancing_tau_required:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_load_balancing_tau_required\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_cs_fallback_triggered:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_cs_fallback_triggered\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_ue_not_available_for_ps_service:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_ue_not_available_for_ps_service\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_radio_resources_not_available:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_radio_resources_not_available\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_failure_in_radio_interface_procedure:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_failure_in_radio_interface_procedure\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_invals1ap_id_qos_combination:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_invals1ap_id_qos_combination\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_interrat_redirection:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_interrat_redirection\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_interaction_with_other_procedure:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_interaction_with_other_procedure\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_unknown_E_RAB_ID:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_unknown_E_RAB_ID\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_multiple_E_RAB_ID_instances\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_encryption_and_or_integrity_protection_algorithms_not_supported\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_s1_intra_system_handover_triggered:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_s1_intra_system_handover_triggered\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_s1_inter_system_handover_triggered:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_s1_inter_system_handover_triggered\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_x2_handover_triggered:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_x2_handover_triggered\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_redirection_towards_1xRTT:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_redirection_towards_1xRTT\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_not_supported_QCI_value:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_not_supported_QCI_value\n");
+            break;
+  	      case S1ap_CauseRadioNetwork_invals1ap_id_CSG_Id:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseRadioNetwork_invals1ap_id_CSG_Id\n");
+            break;
+      	  default:
+            S1AP_WARN("Received S1 Error indication cause radio network case not handled\n");
+      	}
+      break;
+
+      case S1ap_Cause_PR_transport:
+      	switch (s1_error_indication_p->cause.choice.transport) {
+    	  case S1ap_CauseTransport_transport_resource_unavailable:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseTransport_transport_resource_unavailable\n");
+            break;
+    	  case S1ap_CauseTransport_unspecified:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseTransport_unspecified\n");
+            break;
+      	  default:
+            S1AP_WARN("Received S1 Error indication cause transport case not handled\n");
+      	}
+      break;
+
+      case S1ap_Cause_PR_nas:
+      	switch (s1_error_indication_p->cause.choice.nas) {
+    	  case S1ap_CauseNas_normal_release:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseNas_normal_release\n");
+            break;
+      	  case S1ap_CauseNas_authentication_failure:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseNas_authentication_failure\n");
+            break;
+      	  case S1ap_CauseNas_detach:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseNas_detach\n");
+            break;
+      	  case S1ap_CauseNas_unspecified:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseNas_unspecified\n");
+            break;
+      	  case S1ap_CauseNas_csg_subscription_expiry:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseNas_csg_subscription_expiry\n");
+            break;
+      	  default:
+            S1AP_WARN("Received S1 Error indication cause nas case not handled\n");
+      	}
+      break;
+
+      case S1ap_Cause_PR_protocol:
+      	switch (s1_error_indication_p->cause.choice.protocol) {
+      	  case S1ap_CauseProtocol_transfer_syntax_error:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_transfer_syntax_error\n");
+            break;
+      	  case S1ap_CauseProtocol_abstract_syntax_error_reject:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_abstract_syntax_error_reject\n");
+            break;
+      	  case S1ap_CauseProtocol_abstract_syntax_error_ignore_and_notify:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_abstract_syntax_error_ignore_and_notify\n");
+            break;
+      	  case S1ap_CauseProtocol_message_not_compatible_with_receiver_state:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_message_not_compatible_with_receiver_state\n");
+            break;
+      	  case S1ap_CauseProtocol_semantic_error:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_semantic_error\n");
+            break;
+      	  case S1ap_CauseProtocol_abstract_syntax_error_falsely_constructed_message:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_abstract_syntax_error_falsely_constructed_message\n");
+            break;
+      	  case S1ap_CauseProtocol_unspecified:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseProtocol_unspecified\n");
+            break;
+      	  default:
+            S1AP_WARN("Received S1 Error indication cause protocol case not handled\n");
+      	}
+      break;
+
+      case S1ap_Cause_PR_misc:
+        switch (s1_error_indication_p->cause.choice.protocol) {
+          case S1ap_CauseMisc_control_processing_overload:
+            S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_control_processing_overload\n");
+            break;
+          case S1ap_CauseMisc_not_enough_user_plane_processing_resources:
+        	S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_not_enough_user_plane_processing_resources\n");
+        	break;
+          case S1ap_CauseMisc_hardware_failure:
+        	S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_hardware_failure\n");
+        	break;
+          case S1ap_CauseMisc_om_intervention:
+        	S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_om_intervention\n");
+        	break;
+          case S1ap_CauseMisc_unspecified:
+        	S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_unspecified\n");
+        	break;
+          case S1ap_CauseMisc_unknown_PLMN:
+        	S1AP_WARN("Received S1 Error indication S1ap_CauseMisc_unknown_PLMN\n");
+        	break;
+          default:
+            S1AP_WARN("Received S1 Error indication cause misc case not handled\n");
+        }
+      break;
+    }
+  }
+  if ( s1_error_indication_p->presenceMask & S1AP_ERRORINDICATIONIES_CRITICALITYDIAGNOSTICS_PRESENT) {
+    // TODO continue
+  }
+  // TODO continue
+
+  return 0;
+}
+
+
 static
 int s1ap_eNB_handle_initial_context_request(uint32_t               assoc_id,
     uint32_t               stream,
diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
index 41eacac88924e735dfcfb14e81cd47f799389a90..41db38a40a89f2504dea9836fb8d07cc38725d70 100644
--- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
+++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
@@ -155,7 +155,7 @@ int s1ap_eNB_handle_nas_first_req(
   initial_ue_message_p->rrC_Establishment_Cause = s1ap_nas_first_req_p->establishment_cause;
 
   if (s1ap_nas_first_req_p->ue_identity.presenceMask & UE_IDENTITIES_s_tmsi) {
-    S1AP_DEBUG("S_TMSI_PRESENT");
+    S1AP_DEBUG("S_TMSI_PRESENT\n");
     initial_ue_message_p->presenceMask |= S1AP_INITIALUEMESSAGEIES_S_TMSI_PRESENT;
 
     MME_CODE_TO_OCTET_STRING(s1ap_nas_first_req_p->ue_identity.s_tmsi.mme_code,
@@ -165,7 +165,7 @@ int s1ap_eNB_handle_nas_first_req(
   }
 
   if (s1ap_nas_first_req_p->ue_identity.presenceMask & UE_IDENTITIES_gummei) {
-    S1AP_DEBUG("GUMMEI_ID_PRESENT");
+    S1AP_DEBUG("GUMMEI_ID_PRESENT\n");
     initial_ue_message_p->presenceMask |= S1AP_INITIALUEMESSAGEIES_GUMMEI_ID_PRESENT;
 
     MCC_MNC_TO_PLMNID(
@@ -191,8 +191,10 @@ int s1ap_eNB_handle_nas_first_req(
    * The cell identity is defined on 28 bits but as we use macro enb id,
    * we have to pad.
    */
+#warning "TODO get cell id from RRC"
   MACRO_ENB_ID_TO_CELL_IDENTITY(instance_p->eNB_id,
-                                &initial_ue_message_p->eutran_cgi.cell_ID);
+		  0, // Cell ID
+          &initial_ue_message_p->eutran_cgi.cell_ID);
   MCC_MNC_TO_TBCD(instance_p->mcc,
                   instance_p->mnc,
                   instance_p->mnc_digit_length,
@@ -389,8 +391,10 @@ int s1ap_eNB_nas_uplink(instance_t instance, s1ap_uplink_nas_t *s1ap_uplink_nas_
     s1ap_eNB_instance_p->mnc_digit_length,
     &uplink_NAS_transport_p->eutran_cgi.pLMNidentity);
 
+#warning "TODO get cell id from RRC"
   MACRO_ENB_ID_TO_CELL_IDENTITY(s1ap_eNB_instance_p->eNB_id,
-                                &uplink_NAS_transport_p->eutran_cgi.cell_ID);
+          0,
+          &uplink_NAS_transport_p->eutran_cgi.cell_ID);
 
   /* MCC/MNC should be repeated in TAI and EUTRAN CGI */
   MCC_MNC_TO_PLMNID(
diff --git a/openair-cn/UTILS/conversions.h b/openair-cn/UTILS/conversions.h
index 6d35833eaf24cb5009f516d0b72c13de3b94ee8c..4762f93873327d0c0203d3738dcb7fa05c8d38c4 100644
--- a/openair-cn/UTILS/conversions.h
+++ b/openair-cn/UTILS/conversions.h
@@ -259,6 +259,13 @@ do {                                                                    \
           + pLMN.MNCdigit2 * 10 + pLMN.MNCdigit1;                       \
 } while(0)
 
+/* TS 36.413 v10.9.0 section 9.2.1.37:
+ * Macro eNB ID:
+ * Equal to the 20 leftmost bits of the Cell
+ * Identity IE contained in the E-UTRAN CGI
+ * IE (see subclause 9.2.1.38) of each cell
+ * served by the eNB.
+ */
 #define MACRO_ENB_ID_TO_BIT_STRING(mACRO, bITsTRING)    \
 do {                                                    \
     (bITsTRING)->buf = calloc(3, sizeof(uint8_t));      \
@@ -268,14 +275,20 @@ do {                                                    \
     (bITsTRING)->size = 3;                              \
     (bITsTRING)->bits_unused = 4;                       \
 } while(0)
-
-#define MACRO_ENB_ID_TO_CELL_IDENTITY(mACRO, bITsTRING) \
+/*
+/* TS 36.413 v10.9.0 section 9.2.1.38:
+ * E-UTRAN CGI/Cell Identity
+ * The leftmost bits of the Cell
+ * Identity correspond to the eNB
+ * ID (defined in subclause 9.2.1.37).
+ */
+#define MACRO_ENB_ID_TO_CELL_IDENTITY(mACRO, cELL_iD, bITsTRING) \
 do {                                                    \
     (bITsTRING)->buf = calloc(4, sizeof(uint8_t));      \
-    (bITsTRING)->buf[0] = 0;                            \
-    (bITsTRING)->buf[1] = ((mACRO) >> 12);              \
-    (bITsTRING)->buf[2] = (mACRO) >> 4;                 \
-    (bITsTRING)->buf[3] = ((mACRO) & 0x0f) << 4;        \
+    (bITsTRING)->buf[0] = ((mACRO) >> 12);              \
+    (bITsTRING)->buf[1] = (mACRO) >> 4;                 \
+    (bITsTRING)->buf[2] = (((mACRO) & 0x0f) << 4) | ((cELL_iD) >> 4);        \
+    (bITsTRING)->buf[3] = ((cELL_iD) & 0x0f) << 4;        \
     (bITsTRING)->size = 4;                              \
     (bITsTRING)->bits_unused = 4;                       \
 } while(0)