diff --git a/openair-cn/OAI_EPC/oai_epc.c b/openair-cn/OAI_EPC/oai_epc.c
index b8eff1ca8c233520612857339e304362a8fdf964..05f5944b0499f6e6095c85946c5e16e8ee576a9a 100644
--- a/openair-cn/OAI_EPC/oai_epc.c
+++ b/openair-cn/OAI_EPC/oai_epc.c
@@ -74,7 +74,9 @@ int main(int argc, char *argv[])
 
     /* Calling each layer init function */
     CHECK_INIT_RETURN(log_init(&mme_config, oai_epc_log_specific));
-    CHECK_INIT_RETURN(itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, NULL));
+    CHECK_INIT_RETURN(itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX,
+                                tasks_info, messages_info, messages_definition_xml,
+                                mme_config.itti_config.log_file));
 
     CHECK_INIT_RETURN(nas_init(&mme_config));
     CHECK_INIT_RETURN(sctp_init(&mme_config));
diff --git a/openair-cn/S1AP/s1ap_eNB_itti_messaging.c b/openair-cn/S1AP/s1ap_eNB_itti_messaging.c
index 0e1cef7027396d36d07e9eac08bd8dc4247f1118..3531d2c38d659f6590ce13c90f779277a2d75f12 100644
--- a/openair-cn/S1AP/s1ap_eNB_itti_messaging.c
+++ b/openair-cn/S1AP/s1ap_eNB_itti_messaging.c
@@ -20,7 +20,10 @@ void s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uin
     itti_send_msg_to_task(TASK_SCTP, instance, message_p);
 }
 
-void s1ap_eNB_itti_send_nas_downlink_ind(instance_t instance, uint8_t *nas_pdu,
+void s1ap_eNB_itti_send_nas_downlink_ind(instance_t instance,
+                                         uint16_t ue_initial_id,
+                                         uint32_t eNB_ue_s1ap_id,
+                                         uint8_t *nas_pdu,
                                          uint32_t nas_pdu_length)
 {
     MessageDef          *message_p;
@@ -30,6 +33,8 @@ void s1ap_eNB_itti_send_nas_downlink_ind(instance_t instance, uint8_t *nas_pdu,
 
     s1ap_downlink_nas = &message_p->msg.s1ap_downlink_nas;
 
+    s1ap_downlink_nas->ue_initial_id  = ue_initial_id;
+    s1ap_downlink_nas->eNB_ue_s1ap_id = eNB_ue_s1ap_id;
     s1ap_downlink_nas->nas_pdu.buffer = nas_pdu;
     s1ap_downlink_nas->nas_pdu.length = nas_pdu_length;
 
diff --git a/openair-cn/S1AP/s1ap_eNB_itti_messaging.h b/openair-cn/S1AP/s1ap_eNB_itti_messaging.h
index 1b20423e73ed0c215f98ca127adfef055bfb0e02..e6fbcce11463c6a5f05701b801d1271527471834 100644
--- a/openair-cn/S1AP/s1ap_eNB_itti_messaging.h
+++ b/openair-cn/S1AP/s1ap_eNB_itti_messaging.h
@@ -4,7 +4,10 @@
 void s1ap_eNB_itti_send_sctp_data_req(instance_t instance, int32_t assoc_id, uint8_t *buffer,
                                       uint32_t buffer_length, uint16_t stream);
 
-void s1ap_eNB_itti_send_nas_downlink_ind(instance_t instance, uint8_t *nas_pdu,
+void s1ap_eNB_itti_send_nas_downlink_ind(instance_t instance,
+                                         uint16_t ue_initial_id,
+                                         uint32_t eNB_ue_s1ap_id,
+                                         uint8_t *nas_pdu,
                                          uint32_t nas_pdu_length);
 
 #endif /* S1AP_ENB_ITTI_MESSAGING_H_ */
diff --git a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
index 9c6b97f842fbcc061362a93a1827888ecd0f59eb..29214cde8dd4f6aec7d941b23d1e5c2d72f8bc4e 100644
--- a/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
+++ b/openair-cn/S1AP/s1ap_eNB_nas_procedures.c
@@ -258,6 +258,8 @@ int s1ap_eNB_handle_nas_downlink(uint32_t               assoc_id,
 
     /* Forward the NAS PDU to RRC */
     s1ap_eNB_itti_send_nas_downlink_ind(s1ap_eNB_instance->instance,
+                                        ue_desc_p->ue_initial_id,
+                                        ue_desc_p->eNB_ue_s1ap_id,
                                         downlink_NAS_transport_p->nas_pdu.buf,
                                         downlink_NAS_transport_p->nas_pdu.size);
 
diff --git a/openair-cn/UTILS/mme_config.c b/openair-cn/UTILS/mme_config.c
index 5529a2e731839f0852db372ca5b53b4dd6354368..36ee5309f047dfa25a6cd35a54e7f22944ff9acd 100644
--- a/openair-cn/UTILS/mme_config.c
+++ b/openair-cn/UTILS/mme_config.c
@@ -86,7 +86,9 @@ void config_init(mme_config_t *mme_config_p)
     mme_config_p->ipv4.sgw_ip_netmask_for_S11               = DEFAULT_SGW_IP_NETMASK_FOR_S11;
 
     mme_config_p->s6a_config.conf_file    = S6A_CONF_FILE;
+
     mme_config_p->itti_config.queue_size  = ITTI_QUEUE_SIZE_MAX;
+    mme_config_p->itti_config.log_file    = NULL;
 
     mme_config_p->sctp_config.in_streams  = SCTP_IN_STREAMS;
     mme_config_p->sctp_config.out_streams = SCTP_OUT_STREAMS;
@@ -199,6 +201,7 @@ static void config_display(mme_config_t *mme_config_p)
             mme_config_p->ipv4.mme_ip_netmask_for_S11);
     fprintf(stdout, "- ITTI:\n");
     fprintf(stdout, "    queue size .....: %u (bytes)\n", mme_config_p->itti_config.queue_size);
+    fprintf(stdout, "    log file .......: %s\n", mme_config_p->itti_config.log_file);
     fprintf(stdout, "- SCTP:\n");
     fprintf(stdout, "    in streams .....: %u\n", mme_config_p->sctp_config.in_streams);
     fprintf(stdout, "    out streams ....: %u\n", mme_config_p->sctp_config.out_streams);
@@ -227,6 +230,8 @@ static void usage(void)
     fprintf(stdout, "-c<path>\n");
     fprintf(stdout, "        Set the configuration file for mme\n");
     fprintf(stdout, "        See template in UTILS/CONF\n");
+    fprintf(stdout, "-K<file>\n");
+    fprintf(stdout, "        Output intertask messages to provided file\n");
     fprintf(stdout, "-V      Print %s version and return\n", PACKAGE_NAME);
     fprintf(stdout, "-v[1-2] Debug level:\n");
     fprintf(stdout, "            1 -> ASN1 XER printf on and ASN1 debug off\n");
@@ -241,7 +246,7 @@ int config_parse_opt_line(int argc, char *argv[], mme_config_t *mme_config_p)
     int c;
     config_init(mme_config_p);
     /* Parsing command line */
-    while ((c = getopt (argc, argv, "c:hi:v:V")) != -1) {
+    while ((c = getopt (argc, argv, "c:hi:K:v:V")) != -1) {
         switch (c) {
             case 'c': {
                 /* Store the given configuration file. If no file is given,
@@ -272,6 +277,9 @@ int config_parse_opt_line(int argc, char *argv[], mme_config_t *mme_config_p)
                 exit(0);
                 nwGtpv1uDisplayBanner();
             } break;
+            case 'K':
+                mme_config_p->itti_config.log_file = strdup(optarg);
+                break;
             case 'h': /* Fall through */
             default:
                 usage();
diff --git a/openair-cn/UTILS/mme_config.h b/openair-cn/UTILS/mme_config.h
index bb587356d8da5008b83582cb169cc0f261af52f6..0c8501d9083c18d204e539ee4d08b90ac315db01 100644
--- a/openair-cn/UTILS/mme_config.h
+++ b/openair-cn/UTILS/mme_config.h
@@ -111,6 +111,7 @@ typedef struct mme_config_s {
     } s6a_config;
     struct {
         uint32_t  queue_size;
+        char     *log_file;
     } itti_config;
 } mme_config_t;
 
diff --git a/openair2/COMMON/s1ap_messages_types.h b/openair2/COMMON/s1ap_messages_types.h
index 82356edb65fb27e8d80ac8063f4f4432e51393d0..680668f49999443611c267c49651d55df633e7c7 100644
--- a/openair2/COMMON/s1ap_messages_types.h
+++ b/openair2/COMMON/s1ap_messages_types.h
@@ -245,7 +245,16 @@ typedef struct s1ap_uplink_nas_s {
     nas_pdu_t nas_pdu;
 } s1ap_uplink_nas_t;
 
-typedef s1ap_uplink_nas_t s1ap_downlink_nas_t;
+typedef struct s1ap_downlink_nas_s {
+    /* UE id for initial connection to S1AP */
+    uint16_t ue_initial_id;
+
+    /* Unique UE identifier within an eNB */
+    unsigned eNB_ue_s1ap_id:24;
+
+    /* NAS pdu */
+    nas_pdu_t nas_pdu;
+} s1ap_downlink_nas_t;
 
 typedef struct s1ap_initial_context_setup_req_s {
     /* UE id for initial connection to S1AP */