diff --git a/openair-cn/MME_APP/mme_app_context.c b/openair-cn/MME_APP/mme_app_context.c
index 9d555a47dde6feffa9e14075f27450bc6e9e9200..43c6628fb4a4a945a062bba69186a9e6c057dabd 100644
--- a/openair-cn/MME_APP/mme_app_context.c
+++ b/openair-cn/MME_APP/mme_app_context.c
@@ -461,7 +461,7 @@ void mme_app_handle_s1ap_ue_context_release_req(const s1ap_ue_context_release_re
   if (ue_context_p == NULL) {
 	MSC_LOG_EVENT(
    		MSC_MMEAPP_MME,
-   		"S1AP_UE_CONTEXT_RELEASE_REQ Unknown ue %u",s1ap_ue_context_release_req->mme_ue_s1ap_id);
+   		"0 S1AP_UE_CONTEXT_RELEASE_REQ Unknown mme_ue_s1ap_id 0x%06"PRIX32" ",s1ap_ue_context_release_req->mme_ue_s1ap_id);
     MME_APP_ERROR("UE context doesn't exist for UE 0x%06"PRIX32"/dec%u\n",
     		s1ap_ue_context_release_req->mme_ue_s1ap_id,
     		s1ap_ue_context_release_req->mme_ue_s1ap_id);
@@ -469,3 +469,41 @@ void mme_app_handle_s1ap_ue_context_release_req(const s1ap_ue_context_release_re
   }
   mme_app_send_s11_release_access_bearers_req(ue_context_p);
 }
+
+
+//------------------------------------------------------------------------------
+void mme_app_handle_s1ap_ue_context_release_complete(const s1ap_ue_context_release_complete_t const *s1ap_ue_context_release_complete)
+//------------------------------------------------------------------------------
+{
+  struct ue_context_s     *ue_context_p  = NULL;
+  MessageDef              *message_p     = NULL;
+
+  MME_APP_DEBUG("Received S1AP_UE_CONTEXT_RELEASE_COMPLETE from S1AP\n");
+
+  ue_context_p = mme_ue_context_exists_nas_ue_id(&mme_app_desc.mme_ue_contexts, s1ap_ue_context_release_complete->mme_ue_s1ap_id);
+
+  if (ue_context_p == NULL) {
+	MSC_LOG_EVENT(
+   		MSC_MMEAPP_MME,
+   		"0 S1AP_UE_CONTEXT_RELEASE_COMPLETE Unknown mme_ue_s1ap_id 0x%06"PRIX32" ",s1ap_ue_context_release_complete->mme_ue_s1ap_id);
+    MME_APP_ERROR("UE context doesn't exist for mme_ue_s1ap_id 0x%06"PRIX32"/dec%u\n",
+    		s1ap_ue_context_release_complete->mme_ue_s1ap_id,
+    		s1ap_ue_context_release_complete->mme_ue_s1ap_id);
+    return;
+  }
+  message_p  = itti_alloc_new_message(TASK_MME_APP, S1AP_DEREGISTER_UE_REQ);
+  memset((void*)&message_p->ittiMsg.s1ap_deregister_ue_req,
+	         0,
+	         sizeof(s1ap_deregister_ue_req_t));
+
+  S1AP_DEREGISTER_UE_REQ(message_p).mme_ue_s1ap_id = s1ap_ue_context_release_complete->mme_ue_s1ap_id;
+
+
+  MSC_LOG_TX_MESSAGE(
+  		MSC_MMEAPP_MME,
+  		MSC_NAS_MME,
+  		NULL,0,
+  		"0 S1AP_DEREGISTER_UE_REQ");
+
+  itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p);
+}
diff --git a/openair-cn/MME_APP/mme_app_main.c b/openair-cn/MME_APP/mme_app_main.c
index 15807140c93ec5da1f377d8ec08554a829c51669..22ebe296584374fd65f1037bf420c4a9d36f3b77 100644
--- a/openair-cn/MME_APP/mme_app_main.c
+++ b/openair-cn/MME_APP/mme_app_main.c
@@ -157,6 +157,10 @@ void *mme_app_thread(void *args)
     }
     break;
 
+    case S1AP_UE_CONTEXT_RELEASE_COMPLETE: {
+        mme_app_handle_s1ap_ue_context_release_complete(&received_message_p->ittiMsg.s1ap_ue_context_release_complete);
+    }
+    break;
     default: {
       MME_APP_DEBUG("Unkwnon message ID %d:%s\n",
                     ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p));
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h b/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h
index e6824b433964ec8060e2b59d0f671fe2c2fc4a9c..f1eb78d5173792410a189d10fa25bee8b7d0a667 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h
@@ -122,14 +122,14 @@ typedef enum {
 } emm_ksi_t;
 
 /* EPS NAS security context structure */
-typedef struct {
+typedef struct emm_security_context_s {
   emm_ksi_t type;     /* Type of security context        */
   int eksi;           /* NAS key set identifier for E-UTRAN      */
   OctetString kasme;      /* ASME security key (native context)      */
   //OctetString ksgsn;    /* SGSN security key (mapped context)      */
   OctetString knas_enc;   /* NAS cyphering key               */
   OctetString knas_int;   /* NAS integrity key               */
-  struct {
+  struct count_s{
     UInt32_t spare:8;
     UInt32_t overflow:16;
     UInt32_t seq_num:8;
@@ -205,7 +205,7 @@ typedef enum {
  *   for PLMN selection, cell selection/re-selection and handover.
  *   The maximum number of possible entries in the stored list is 16.
  */
-typedef struct {
+typedef struct emm_nvdata_s {
   imsi_t imsi;
   plmn_t rplmn;   /* The registered PLMN  */
   /* List of equivalent PLMNs         */
@@ -217,7 +217,7 @@ typedef struct {
  * Structure of the EMM data
  * -------------------------
  */
-typedef struct {
+typedef struct emm_data_s {
   int                 usim_is_valid;  /* Indication of USIM data validity   */
 
   imei_t             *imei;   /* IMEI read from the UE's non-volatile memory*/
@@ -425,6 +425,9 @@ struct emm_data_context_s *emm_data_context_remove(
   emm_data_t *_emm_data, struct emm_data_context_s *elm);
 
 void emm_data_context_add(emm_data_t *emm_data, struct emm_data_context_s *elm);
+void emm_data_context_dump(struct emm_data_context_s *elm_pP);
+
+void emm_data_context_dump_all(void);
 
 #endif // NAS_MME
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_data_ctx.c b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_data_ctx.c
index 97e5754699154a9aece3bece381f421c97da8c3c..9fead509fadbed021ca5289d971cdccc8fbbe399 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_data_ctx.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_data_ctx.c
@@ -35,6 +35,7 @@
 #include "tree.h"
 #include "emmData.h"
 #include "nas_log.h"
+#include "security_types.h"
 
 static inline
 int emm_data_ctxt_compare_ueid(struct emm_data_context_s *p1,
@@ -89,4 +90,96 @@ void emm_data_context_add(emm_data_t *emm_data, struct emm_data_context_s *elm)
   RB_INSERT(emm_data_context_map, &emm_data->ctx_map, elm);
 }
 
+void emm_data_context_dump(struct emm_data_context_s *elm_pP)
+{
+  if (elm_pP != NULL) {
+	    char imsi_str[16];
+	    char guti_str[22];
+	    int k, size, remaining_size;
+        char key_string[KASME_LENGTH_OCTETS*2];
+	    LOG_TRACE(INFO, "EMM-CTX: ue id:            0x%06"PRIX32" (UE identifier)",                     elm_pP->ueid);
+	    LOG_TRACE(INFO, "         is_dynamic:       %u      (Dynamically allocated context indicator)", elm_pP->is_dynamic);
+	    LOG_TRACE(INFO, "         is_attached:      %u      (Attachment indicator)",                    elm_pP->is_attached);
+	    LOG_TRACE(INFO, "         is_emergency:     %u      (Emergency bearer services indicator)",     elm_pP->is_emergency);
+	    NAS_IMSI2STR(elm_pP->imsi, imsi_str, 16);
+	    LOG_TRACE(INFO, "         imsi:             %s      (The IMSI provided by the UE or the MME)",  imsi_str);
+	    LOG_TRACE(INFO, "         imei:             TODO    (The IMEI provided by the UE)");
+	    LOG_TRACE(INFO, "         guti_is_new:      %u      (New GUTI indicator)",                      elm_pP->guti_is_new);
+	    GUTI2STR(elm_pP->guti, guti_str, 22);
+	    LOG_TRACE(INFO, "         guti:             %s      (The GUTI assigned to the UE)",             guti_str);
+	    GUTI2STR(elm_pP->old_guti, guti_str, 22);
+	    LOG_TRACE(INFO, "         old_guti:         %s      (The old GUTI)",                            guti_str);
+	    LOG_TRACE(INFO, "         n_tacs:           %u      (Number of consecutive tracking areas the UE is registered to)", elm_pP->n_tacs);
+	    LOG_TRACE(INFO, "         tac:              0x%04x  (Code of the first tracking area the UE is registered to)",      elm_pP->n_tacs);
+	    LOG_TRACE(INFO, "         ksi:              %u      (Security key set identifier provided by the UE)",               elm_pP->ksi);
+
+	    LOG_TRACE(INFO, "         auth_vector:              (EPS authentication vector)");
+	    LOG_TRACE(INFO, "             kasme: "KASME_FORMAT""KASME_FORMAT, KASME_DISPLAY_1(elm_pP->vector.kasme), KASME_DISPLAY_2(elm_pP->vector.kasme));
+	    LOG_TRACE(INFO, "             rand:  "RAND_FORMAT, RAND_DISPLAY(elm_pP->vector.rand));
+	    LOG_TRACE(INFO, "             autn:  "AUTN_FORMAT, AUTN_DISPLAY(elm_pP->vector.autn));
+        for (k = 0; k < XRES_LENGTH_MAX; k++) {sprintf(&key_string[k * 3], "%02x,", elm_pP->vector.xres[k]);}
+        key_string[k * 3 - 1] = '\0';
+	    LOG_TRACE(INFO, "             xres:  %s\n", key_string);
+
+	    if (elm_pP->security != NULL) {
+		  LOG_TRACE(INFO, "         security context:          (Current EPS NAS security context)");
+	      LOG_TRACE(INFO, "             type:  %s              (Type of security context)",
+	    		(elm_pP->security->type == EMM_KSI_NOT_AVAILABLE)?"KSI_NOT_AVAILABLE":(elm_pP->security->type == EMM_KSI_NATIVE)?"KSI_NATIVE":"KSI_MAPPED");
+	      LOG_TRACE(INFO, "             eksi:  %u              (NAS key set identifier for E-UTRAN)", elm_pP->security->eksi);
+
+	      if (elm_pP->security->kasme.length > 0) {
+	    	size = 0;
+		    size = 0;remaining_size=KASME_LENGTH_OCTETS*2;
+	        for (k = 0; k < elm_pP->security->kasme.length; k++) {
+	          size +=snprintf(&key_string[size], remaining_size, "0x%x ", elm_pP->security->kasme.value[k]);
+	          remaining_size -= size;
+	        }
+	      } else {
+	          size +=snprintf(&key_string[0], remaining_size, "None");
+	      }
+		  LOG_TRACE(INFO, "             kasme: %s     (ASME security key (native context))", key_string);
+	      if (elm_pP->security->knas_enc.length > 0) {
+		    size = 0;
+		    size = 0;remaining_size=KASME_LENGTH_OCTETS*2;
+	        for (k = 0; k < elm_pP->security->knas_enc.length; k++) {
+	          size +=snprintf(&key_string[size], remaining_size, "0x%x ", elm_pP->security->knas_enc.value[k]);
+	          remaining_size -= size;
+	        }
+	      } else {
+	          size +=snprintf(&key_string[0], remaining_size, "None");
+	      }
+		  LOG_TRACE(INFO, "             knas_enc: %s     (NAS cyphering key)", key_string);
+	      if (elm_pP->security->knas_int.length > 0) {
+		    size = 0;remaining_size=KASME_LENGTH_OCTETS*2;
+	        for (k = 0; k < elm_pP->security->knas_int.length; k++) {
+	          size +=snprintf(&key_string[size], remaining_size, "0x%x ", elm_pP->security->knas_int.value[k]);
+	          remaining_size -= size;
+	        }
+	      } else {
+	          size +=snprintf(&key_string[0], remaining_size, "None");
+	      }
+		  LOG_TRACE(INFO, "             knas_int: %s     (NAS integrity key)", key_string);
+	      LOG_TRACE(INFO, "             dl_count.overflow: %u     ", elm_pP->security->dl_count.overflow);
+	      LOG_TRACE(INFO, "             dl_count.seq_num:  %u     ", elm_pP->security->dl_count.seq_num);
+	      LOG_TRACE(INFO, "             ul_count.overflow: %u     ", elm_pP->security->ul_count.overflow);
+	      LOG_TRACE(INFO, "             ul_count.seq_num:  %u     ", elm_pP->security->ul_count.seq_num);
+	      LOG_TRACE(INFO, "             TODO  capability");
+	      LOG_TRACE(INFO, "             selected_algorithms.encryption:  %x     ", elm_pP->security->selected_algorithms.encryption);
+	      LOG_TRACE(INFO, "             selected_algorithms.integrity:   %x     ", elm_pP->security->selected_algorithms.integrity);
+	    } else {
+		  LOG_TRACE(INFO, "         No security context");
+	    }
+	    LOG_TRACE(INFO, "         _emm_fsm_status     %u   ", elm_pP->_emm_fsm_status);
+	    LOG_TRACE(INFO, "         TODO  esm_data_ctx");
+  }
+}
+
+void emm_data_context_dump_all(void)
+{
+  struct emm_data_context_s *elm_p = NULL;
+  LOG_TRACE(INFO, "EMM-CTX - Dump all contexts:");
+  RB_FOREACH(elm_p, emm_data_context_map,&_emm_data.ctx_map) {
+	  emm_data_context_dump(elm_p);
+  }
+}
 #endif
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cn.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cn.c
index 3798332f89d141985e3a84047acec9e1b8a97564..abb2d3e1ffb9a6594ed49d16fdb97ba0fb151c35 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cn.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cn.c
@@ -171,7 +171,11 @@ static int _emm_cn_deregister_ue(const UInt32_t ue_id)
   int rc = RETURNok;
 
   LOG_FUNC_IN;
-
+  LOG_TRACE(WARNING, "EMM-PROC  - "
+            "TODO deregister UE %u, following procedure is a test");
+  emm_proc_detach_request(ue_id, EMM_DETACH_TYPE_EPS /* ??? emm_proc_detach_type_t*/,
+                              1 /*switch_off*/, 0 /*native_ksi*/, 0 /*ksi*/,
+                              NULL /*guti*/, NULL /*imsi*/, NULL /*imei*/);
   LOG_FUNC_RETURN (rc);
 }
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.c b/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.c
index c9aac7ad4e25b3d019a8e169d1ed48c5d6fde750..5479122b5f9fceabeb3025230514e92dbef54a63 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/util/nas_log.c
@@ -85,7 +85,7 @@ int nas_log_func_indent;
  *        or disable specific logging traces)
  */
 typedef struct {
-#define LOG_PREFIX_SIZE 96
+#define LOG_PREFIX_SIZE 118
   char prefix[LOG_PREFIX_SIZE];
   unsigned char filter;
   int indent;
@@ -157,7 +157,17 @@ void nas_log_init(char filter)
  ***************************************************************************/
 void log_data(const char* filename, int line)
 {
-  snprintf(_log_context.prefix, LOG_PREFIX_SIZE, "%s[%d]", filename, line);
+  int len = strlen(filename) + 2 + 1; //2:[], 1:/0
+  if (line > 9999)     len+=5;
+  else if (line > 999) len+=4;
+  else if (line > 99)  len+=3;
+  else if (line > 9)   len+=2;
+  else                 len+=1;
+  if (len > LOG_PREFIX_SIZE) {
+	snprintf(_log_context.prefix, LOG_PREFIX_SIZE, "%s:%d", &filename[len - LOG_PREFIX_SIZE], line);
+  } else {
+    snprintf(_log_context.prefix, LOG_PREFIX_SIZE, "%s:%d", filename, line);
+  }
 }
 
 /****************************************************************************
@@ -190,7 +200,7 @@ void log_trace(log_severity_t severity, const char* data, ...)
      * name and line number from where the data have been logged) and
      * the severity level.
      */
-    fprintf(stderr, "%s%-60.58s%-10s", _log_context.level[severity].color,
+    fprintf(stderr, "%s%-120.118s%-10s", _log_context.level[severity].color,
             _log_context.prefix, _log_context.level[severity].name);
     {
       /* Next, perform indentation for FUNC logging trace */
@@ -199,7 +209,7 @@ void log_trace(log_severity_t severity, const char* data, ...)
       }
 
       for (i=0; i<_log_context.indent; i++) {
-        fprintf(stderr, "\t");
+        fprintf(stderr, "  ");
       }
 
       if (severity == FUNC_IN) {
diff --git a/openair-cn/S1AP/s1ap_mme_handlers.c b/openair-cn/S1AP/s1ap_mme_handlers.c
index a26e550982bbad586578f05160121d3f376b0050..e1a9d48059bb954933634527d8b39a8cb535b5e1 100644
--- a/openair-cn/S1AP/s1ap_mme_handlers.c
+++ b/openair-cn/S1AP/s1ap_mme_handlers.c
@@ -812,7 +812,8 @@ int s1ap_mme_handle_ue_context_release_complete(uint32_t assoc_id,
 //------------------------------------------------------------------------------
 {
   S1ap_UEContextReleaseCompleteIEs_t *ueContextReleaseComplete_p;
-  ue_description_t *ue_ref = NULL;
+  ue_description_t                   *ue_ref                    = NULL;
+  MessageDef                         *message_p                 = NULL;
 
   ueContextReleaseComplete_p = &message->msg.s1ap_UEContextReleaseCompleteIEs;
   MSC_LOG_RX_MESSAGE(
@@ -839,6 +840,24 @@ int s1ap_mme_handle_ue_context_release_complete(uint32_t assoc_id,
   /* eNB has sent a release complete message. We can safely remove UE context.
    * TODO: inform NAS and remove e-RABS.
    */
+  message_p = itti_alloc_new_message(TASK_S1AP, S1AP_UE_CONTEXT_RELEASE_COMPLETE);
+
+  AssertFatal(message_p != NULL,"itti_alloc_new_message Failed");
+  memset((void*)&message_p->ittiMsg.s1ap_ue_context_release_complete,
+	         0,
+	         sizeof(s1ap_ue_context_release_complete_t));
+
+  S1AP_UE_CONTEXT_RELEASE_COMPLETE(message_p).mme_ue_s1ap_id = ue_ref->mme_ue_s1ap_id;
+
+  MSC_LOG_TX_MESSAGE(
+	  		MSC_S1AP_MME,
+	  		MSC_MMEAPP_MME,
+	  		NULL,0,
+	  		"0 S1AP_UE_CONTEXT_RELEASE_COMPLETE mme_ue_s1ap_id "S1AP_UE_ID_FMT" ",
+	  		S1AP_UE_CONTEXT_RELEASE_COMPLETE(message_p).mme_ue_s1ap_id);
+
+  itti_send_msg_to_task(TASK_MME_APP, INSTANCE_DEFAULT, message_p);
+
   s1ap_remove_ue(ue_ref);
   S1AP_DEBUG("Removed UE "S1AP_UE_ID_FMT"\n",
              (uint32_t)ueContextReleaseComplete_p->mme_ue_s1ap_id);
diff --git a/openair-cn/TEST/oaisim_mme_test_s1c.c b/openair-cn/TEST/oaisim_mme_test_s1c.c
index b26c40dafb6d9006142470238101947f67d622d2..ff271eebaff8c8eb5431c8de0d021d208eff8a80 100644
--- a/openair-cn/TEST/oaisim_mme_test_s1c.c
+++ b/openair-cn/TEST/oaisim_mme_test_s1c.c
@@ -61,256 +61,13 @@
 static void get_options (int argc, char **argv);
 static uint32_t eNB_app_register(const uint32_t enb_id_start, const uint32_t enb_id_end, const Enb_properties_array_t *enb_properties);
 static void    *eNB_app_task    (void *args_p);
+static void     mme_test_s1_start_test(instance_t instance);
 //------------------------------------------------------------------------------
 static char                    *conf_config_file_name = NULL;
 static char                    *itti_dump_file        = NULL;
 const Enb_properties_array_t   *enb_properties        = NULL;
 int16_t                         glog_level            = LOG_INFO;
 int16_t                         glog_verbosity        = LOG_MED;
-//------------------------------------------------------------------------------
-int debug          = 0;
-int error_count    = 0;
-int break_on_error = 0;
-
-/* -1 means invalid */
-static const signed char hex_digits[0x100] = {
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
-  -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-  -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-};
-
-//------------------------------------------------------------------------------
-void
-fail (const char *format, ...)
-//------------------------------------------------------------------------------
-{
-  char str[1024];
-  va_list arg_ptr;
-
-  va_start (arg_ptr, format);
-  vsnprintf ( str, sizeof(str), format, arg_ptr);
-  va_end (arg_ptr);
-  fputs(str, stderr);
-  error_count++;
-
-  if (break_on_error)
-    exit (1);
-}
-
-//------------------------------------------------------------------------------
-void
-success (const char *format, ...)
-//------------------------------------------------------------------------------
-{
-  char str[1024];
-  va_list arg_ptr;
-
-  va_start (arg_ptr, format);
-  vsnprintf ( str, sizeof(str), format, arg_ptr);
-  va_end (arg_ptr);
-  fputs(str, stderr);
-}
-
-//------------------------------------------------------------------------------
-void
-escapeprint (const char *str, size_t len)
-//------------------------------------------------------------------------------
-{
-  size_t i;
-
-  printf (" (length %d bytes):\n\t", (int) len);
-
-  for (i = 0; i < len; i++) {
-    if (((str[i] & 0xFF) >= 'A' && (str[i] & 0xFF) <= 'Z') ||
-        ((str[i] & 0xFF) >= 'a' && (str[i] & 0xFF) <= 'z') ||
-        ((str[i] & 0xFF) >= '0' && (str[i] & 0xFF) <= '9')
-        || (str[i] & 0xFF) == ' ' || (str[i] & 0xFF) == '.')
-      printf ("%c", (str[i] & 0xFF));
-    else
-      printf ("\\x%02X", (str[i] & 0xFF));
-
-    if ((i + 1) % 16 == 0 && (i + 1) < len)
-      printf ("'\n\t'");
-  }
-
-  printf ("\n");
-}
-
-//------------------------------------------------------------------------------
-void
-hexprint (const void *_str, size_t len)
-//------------------------------------------------------------------------------
-{
-  size_t i;
-  const char* str = _str;
-
-  printf ("\t;; ");
-
-  for (i = 0; i < len; i++) {
-    printf ("%02x ", (str[i] & 0xFF));
-
-    if ((i + 1) % 8 == 0)
-      printf (" ");
-
-    if ((i + 1) % 16 == 0 && i + 1 < len)
-      printf ("\n\t;; ");
-  }
-
-  printf ("\n");
-}
-
-//------------------------------------------------------------------------------
-void
-binprint (const void *_str, size_t len)
-//------------------------------------------------------------------------------
-{
-  size_t i;
-  const char* str = _str;
-
-  printf ("\t;; ");
-
-  for (i = 0; i < len; i++) {
-    printf ("%d%d%d%d%d%d%d%d ",
-            (str[i] & 0xFF) & 0x80 ? 1 : 0,
-            (str[i] & 0xFF) & 0x40 ? 1 : 0,
-            (str[i] & 0xFF) & 0x20 ? 1 : 0,
-            (str[i] & 0xFF) & 0x10 ? 1 : 0,
-            (str[i] & 0xFF) & 0x08 ? 1 : 0,
-            (str[i] & 0xFF) & 0x04 ? 1 : 0,
-            (str[i] & 0xFF) & 0x02 ? 1 : 0, (str[i] & 0xFF) & 0x01 ? 1 : 0);
-
-    if ((i + 1) % 3 == 0)
-      printf (" ");
-
-    if ((i + 1) % 6 == 0 && i + 1 < len)
-      printf ("\n\t;; ");
-  }
-
-  printf ("\n");
-}
-
-//------------------------------------------------------------------------------
-int
-compare_buffer(const uint8_t *buffer, const uint32_t length_buffer,
-               const uint8_t *pattern, const uint32_t length_pattern)
-//------------------------------------------------------------------------------
-{
-  int i;
-
-  if (length_buffer != length_pattern) {
-    printf("Length mismatch, expecting %d bytes, got %d bytes\n", length_pattern,
-           length_buffer);
-    hexprint(buffer, length_buffer);
-    return -1;
-  }
-
-  for (i = 0; i < length_buffer; i++) {
-    if (pattern[i] != buffer[i]) {
-      printf("Expecting:\n");
-      hexprint(pattern, length_pattern);
-      printf("Received:\n");
-      hexprint(buffer, length_buffer);
-      printf("Mismatch fount in byte %d\nExpecting 0x%02x, got 0x%02x\n",
-             i, pattern[i], buffer[i]);
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-//------------------------------------------------------------------------------
-unsigned
-decode_hex_length(const char *h)
-//------------------------------------------------------------------------------
-{
-  const unsigned char *hex = (const unsigned char *) h;
-  unsigned count;
-  unsigned i;
-
-  for (count = i = 0; hex[i]; i++) {
-    if (isspace(hex[i]))
-      continue;
-
-    if (hex_digits[hex[i]] < 0)
-      abort();
-
-    count++;
-  }
-
-  if (count % 2)
-    abort();
-
-  return count / 2;
-}
-
-//------------------------------------------------------------------------------
-int
-decode_hex(uint8_t *dst, const char *h)
-//------------------------------------------------------------------------------
-{
-  const unsigned char *hex = (const unsigned char *) h;
-  unsigned i = 0;
-
-  for (;;) {
-    int high, low;
-
-    while (*hex && isspace(*hex))
-      hex++;
-
-    if (!*hex)
-      return 1;
-
-    high = hex_digits[*hex++];
-
-    if (high < 0)
-      return 0;
-
-    while (*hex && isspace(*hex))
-      hex++;
-
-    if (!*hex)
-      return 0;
-
-    low = hex_digits[*hex++];
-
-    if (low < 0)
-      return 0;
-
-    dst[i++] = (high << 4) | low;
-  }
-}
-
-//------------------------------------------------------------------------------
-uint8_t *
-decode_hex_dup(const char *hex)
-//------------------------------------------------------------------------------
-{
-  uint8_t *p;
-  unsigned length = decode_hex_length(hex);
-
-  p = malloc(length * sizeof(uint8_t));
-
-  if (decode_hex(p, hex))
-    return p;
-  else {
-    free(p);
-    return NULL;
-  }
-}
 
 //------------------------------------------------------------------------------
 static void get_options (int argc, char **argv)
@@ -360,6 +117,7 @@ static uint32_t eNB_app_register(const uint32_t enb_id_start, const uint32_t enb
   struct in_addr   addr;
 
 
+  // 1 eNB should be max.
   for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
     {
       s1ap_register_enb_req_t *s1ap_register_eNB;
@@ -470,11 +228,7 @@ static void *eNB_app_task(void *args_p)
       /* Check if all register eNB requests have been processed */
       if (register_enb_pending == 0) {
         if (registered_enb == enb_nb) {
-          /* If all eNB are registered, start L2L1 task */
-          MessageDef *msg_init_p;
-
-          msg_init_p = itti_alloc_new_message (TASK_ENB_APP, INITIALIZE_MESSAGE);
-          itti_send_msg_to_task (TASK_L2L1, INSTANCE_DEFAULT, msg_init_p);
+          mme_test_s1_start_test();
 
 
         } else {
@@ -529,6 +283,18 @@ static void *eNB_app_task(void *args_p)
 }
 
 
+//------------------------------------------------------------------------------
+void mme_test_s1_start_test(instance_t instance)
+//------------------------------------------------------------------------------
+{
+	s1ap_eNB_itti_send_sctp_data_req(instance,
+			int32_t assoc_id,
+			s1ap_scenario1[scenario_message_index].buffer,
+			s1ap_scenario1[scenario_message_index].buf_len,
+			s1ap_scenario1[scenario_message_index].sctp_stream_id);
+}
+
+
 //------------------------------------------------------------------------------
 void mme_test_s1_notify_sctp_data_ind(uint32_t assoc_id, int32_t stream, const uint8_t * const data, const uint32_t data_length)
 //------------------------------------------------------------------------------
diff --git a/openair-cn/TEST/oaisim_mme_test_s1c.h b/openair-cn/TEST/oaisim_mme_test_s1c.h
index 82d60e6c7efcaee9ce75ab36f34e8f9761c8e811..107a7a6d7d77aaeb1432726e2295dbc776be4bc5 100644
--- a/openair-cn/TEST/oaisim_mme_test_s1c.h
+++ b/openair-cn/TEST/oaisim_mme_test_s1c.h
@@ -28,13 +28,4 @@
 *******************************************************************************/
 
 
-void     fail (const char *format, ...);
-void     success (const char *format, ...);
-void     escapeprint (const char *str, size_t len);
-void     hexprint (const void *_str, size_t len);
-void     binprint (const void *_str, size_t len);
-int      compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, const uint8_t *pattern, const uint32_t length_pattern);
-unsigned decode_hex_length(const char *h);
-int      decode_hex(uint8_t *dst, const char *h);
-uint8_t *decode_hex_dup(const char *hex);
 void     mme_test_s1_notify_sctp_data_ind(uint32_t assoc_id, int32_t stream, const uint8_t * const data, const uint32_t data_length);
diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h b/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h
index 018057e9d0377c7d482a5b330033f45dc6db7cd5..993b42ff8da72270ea7b71973517b5e9789a3fe7 100644
--- a/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h
+++ b/openair-cn/TEST/oaisim_mme_test_s1c_scenario.h
@@ -39,7 +39,18 @@ typedef enum entity_s{
 typedef struct s1ap_test_s{
   char    *procedure_name;
   uint8_t  buffer[MME_TEST_S1_MAX_BUF_LENGTH];
-  uint16_t dont_check[MME_TEST_S1_MAX_BYTES_TEST];
+  uint16_t dont_check[MME_TEST_S1_MAX_BYTES_TEST]; // bytes index test that can be omitted
   uint32_t buf_len;
   entity_t originating;
+  uint16_t sctp_stream_id;
 } s1ap_test_t;
+
+void     fail (const char *format, ...);
+void     success (const char *format, ...);
+void     escapeprint (const char *str, size_t len);
+void     hexprint (const void *_str, size_t len);
+void     binprint (const void *_str, size_t len);
+int      compare_buffer(const uint8_t *buffer, const uint32_t length_buffer, const uint8_t *pattern, const uint32_t length_pattern);
+unsigned decode_hex_length(const char *h);
+int      decode_hex(uint8_t *dst, const char *h);
+uint8_t *decode_hex_dup(const char *hex);
diff --git a/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c b/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c
index 8cad45b45ca993d13f6e9ffdd8ab4331348689c8..d9c775a79d914c4a223135e156290d80d6e7155a 100644
--- a/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c
+++ b/openair-cn/TEST/oaisim_mme_test_s1c_scenario1.c
@@ -47,6 +47,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 96,
+    .sctp_stream_id = 1,
     .originating = ENB,
   },
   {
@@ -63,6 +64,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 65,
+    .sctp_stream_id = 1,
     .originating = MME,
   },
   {
@@ -78,6 +80,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 62,
+    .sctp_stream_id = 1,
     .originating = ENB,
   },
   {
@@ -92,6 +95,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 42,
+    .sctp_stream_id = 1,
     .originating = MME,
   },
   {
@@ -107,6 +111,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 59,
+    .sctp_stream_id = 1,
     .originating = ENB,
   },
   {
@@ -130,6 +135,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 191,
+    .sctp_stream_id = 1,
     .originating = MME,
   },
   {
@@ -158,6 +164,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 64,
+    .sctp_stream_id = 1,
     .originating = ENB,
   },
   {
@@ -174,6 +181,7 @@ s1ap_test_t s1ap_scenario1[] = {
     		-1
     },
     .buf_len = 64,
+    .sctp_stream_id = 1,
     .originating = ENB,
   }
 };