diff --git a/openair-cn/COMMON/nas_messages_def.h b/openair-cn/COMMON/nas_messages_def.h
index 3e5a7031e135a26a0ddd3306bf095e2656fdd237..ddd7ca392c2af8a9d2f4b43145dcb604e7634868 100644
--- a/openair-cn/COMMON/nas_messages_def.h
+++ b/openair-cn/COMMON/nas_messages_def.h
@@ -54,7 +54,7 @@ MESSAGE_DEF(NAS_CONNECTION_RELEASE_IND,         MESSAGE_PRIORITY_MED,   nas_conn
 MESSAGE_DEF(NAS_UPLINK_DATA_IND,                MESSAGE_PRIORITY_MED,   nas_ul_data_ind_t,          nas_ul_data_ind)
 MESSAGE_DEF(NAS_DOWNLINK_DATA_REQ,              MESSAGE_PRIORITY_MED,   nas_dl_data_req_t,          nas_dl_data_req)
 MESSAGE_DEF(NAS_DOWNLINK_DATA_CNF,              MESSAGE_PRIORITY_MED,   nas_dl_data_cnf_t,          nas_dl_data_cnf)
-MESSAGE_DEF(NAS_NON_DELIVERY_IND,               MESSAGE_PRIORITY_MED,   nas_non_del_ind_t,          nas_non_del_ind)
+MESSAGE_DEF(NAS_DOWNLINK_DATA_REJ,              MESSAGE_PRIORITY_MED,   nas_dl_data_rej_t,          nas_dl_data_rej)
 MESSAGE_DEF(NAS_RAB_ESTABLISHMENT_REQ,          MESSAGE_PRIORITY_MED,   nas_rab_est_req_t,          nas_rab_est_req)
 MESSAGE_DEF(NAS_RAB_ESTABLISHMENT_RESP,         MESSAGE_PRIORITY_MED,   nas_rab_est_rsp_t,          nas_rab_est_rsp)
 MESSAGE_DEF(NAS_RAB_RELEASE_REQ,                MESSAGE_PRIORITY_MED,   nas_rab_rel_req_t,          nas_rab_rel_req)
diff --git a/openair-cn/COMMON/nas_messages_types.h b/openair-cn/COMMON/nas_messages_types.h
index 1ff54f163207fb6919cd8e8e24c329e7c287fd8e..7e5b49f22880505b499cf120b13fc16092b6b752 100644
--- a/openair-cn/COMMON/nas_messages_types.h
+++ b/openair-cn/COMMON/nas_messages_types.h
@@ -51,7 +51,7 @@
 #define NAS_UL_DATA_IND(mSGpTR)                     (mSGpTR)->ittiMsg.nas_ul_data_ind
 #define NAS_DL_DATA_REQ(mSGpTR)                     (mSGpTR)->ittiMsg.nas_dl_data_req
 #define NAS_DL_DATA_CNF(mSGpTR)                     (mSGpTR)->ittiMsg.nas_dl_data_cnf
-#define NAS_DL_DATA_REJ(mSGpTR)                     (mSGpTR)->ittiMsg.nas_non_del_ind
+#define NAS_DL_DATA_REJ(mSGpTR)                     (mSGpTR)->ittiMsg.nas_dl_data_rej
 #define NAS_PDN_CONNECTIVITY_REQ(mSGpTR)            (mSGpTR)->ittiMsg.nas_pdn_connectivity_req
 #define NAS_PDN_CONNECTIVITY_RSP(mSGpTR)            (mSGpTR)->ittiMsg.nas_pdn_connectivity_rsp
 #define NAS_PDN_CONNECTIVITY_FAIL(mSGpTR)           (mSGpTR)->ittiMsg.nas_pdn_connectivity_fail
@@ -260,9 +260,10 @@ typedef dl_info_transfer_req_t nas_dl_data_req_t;
 typedef dl_info_transfer_cnf_t nas_dl_data_cnf_t;
 
 
-typedef struct nas_non_del_ind_s {
-	uint32_t         UEid;      /* UE lower layer identifier        */
-} nas_non_del_ind_t;
+typedef struct nas_dl_data_rej_s {
+	uint32_t UEid;          /* UE lower layer identifier        */
+	  as_nas_info_t nasMsg;   /* Uplink NAS message           */
+} nas_dl_data_rej_t;
 
 typedef struct nas_rab_est_req_s {
 
diff --git a/openair-cn/NAS/nas_main.c b/openair-cn/NAS/nas_main.c
index 7dcbdbb1bcf8f0bf290066c669eb1f043e7ce580..e2f9000285aa9b39273010b11e6e889afca66e43 100644
--- a/openair-cn/NAS/nas_main.c
+++ b/openair-cn/NAS/nas_main.c
@@ -129,7 +129,7 @@ next_message:
       nas_proc_dl_transfer_cnf(NAS_DL_DATA_CNF(received_message_p).UEid);
     } break;
 
-    case NAS_NON_DELIVERY_IND: {
+    case NAS_DOWNLINK_DATA_REJ: {
       nas_proc_dl_transfer_rej(NAS_DL_DATA_REJ(received_message_p).UEid);
     } break;
 
diff --git a/openair-cn/S1AP/s1ap_mme_itti_messaging.h b/openair-cn/S1AP/s1ap_mme_itti_messaging.h
index 16dd514ea47d74c6ba2c0719835f1f136d8a4dba..807e4d6ca825a95a9bb4967ebc9da1e276368d0d 100644
--- a/openair-cn/S1AP/s1ap_mme_itti_messaging.h
+++ b/openair-cn/S1AP/s1ap_mme_itti_messaging.h
@@ -118,4 +118,33 @@ static inline void s1ap_mme_itti_nas_establish_ind(
   itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p);
 }
 
+static inline void s1ap_mme_itti_nas_non_delivery_ind(
+  const uint32_t ue_id, uint8_t * const nas_msg, const uint32_t nas_msg_length)
+{
+  MessageDef     *message_p;
+
+  message_p = itti_alloc_new_message(TASK_S1AP, NAS_DOWNLINK_DATA_REJ);
+
+  NAS_DL_DATA_REJ(message_p).UEid                 = ue_id;
+  /* Mapping between asn1 definition and NAS definition */
+  //NAS_NON_DELIVERY_IND(message_p).asCause              = cause + 1;
+  NAS_DL_DATA_REJ(message_p).nasMsg.length = nas_msg_length;
+
+  NAS_DL_DATA_REJ(message_p).nasMsg.data = malloc(sizeof(uint8_t) * nas_msg_length);
+  memcpy(NAS_DL_DATA_REJ(message_p).nasMsg.data, nas_msg, nas_msg_length);
+
+
+  MSC_LOG_TX_MESSAGE(
+  		MSC_S1AP_MME,
+  		MSC_NAS_MME,
+  		NULL,0,
+  		"0 NAS_DOWNLINK_DATA_REJ ue_id %u len %u",
+  		ue_id,
+  		NAS_DL_DATA_REJ(message_p).nasMsg.length);
+
+  // should be sent to MME_APP, but this one would forward it to NAS_MME, so send it directly to NAS_MME
+  // but let's see
+  itti_send_msg_to_task(TASK_NAS_MME, INSTANCE_DEFAULT, message_p);
+}
+
 #endif /* S1AP_MME_ITTI_MESSAGING_H_ */
diff --git a/openair-cn/S1AP/s1ap_mme_nas_procedures.c b/openair-cn/S1AP/s1ap_mme_nas_procedures.c
index 737461d7c066fe7ea97761a406997691c509ae6a..e94b7e57ef57b29a6ce7bcf8caff5a6b5a9569d1 100644
--- a/openair-cn/S1AP/s1ap_mme_nas_procedures.c
+++ b/openair-cn/S1AP/s1ap_mme_nas_procedures.c
@@ -200,14 +200,49 @@ int s1ap_mme_handle_uplink_nas_transport(uint32_t assoc_id, uint32_t stream,
 int s1ap_mme_handle_nas_non_delivery(uint32_t assoc_id, uint32_t stream,
                                      struct s1ap_message_s *message)
 {
+  S1ap_NASNonDeliveryIndication_IEs_t *nasNonDeliveryIndication_p = NULL;
+  ue_description_t *ue_ref = NULL;
+
   /* UE associated signalling on stream == 0 is not valid. */
   if (stream == 0) {
     S1AP_DEBUG("Received new nas non delivery on stream == 0\n");
     return -1;
   }
 
+  nasNonDeliveryIndication_p = &message->msg.s1ap_NASNonDeliveryIndication_IEs;
+/*
+ *     S1ap_MME_UE_S1AP_ID_t mme_ue_s1ap_id;
+    S1ap_ENB_UE_S1AP_ID_t eNB_UE_S1AP_ID;
+    S1ap_NAS_PDU_t        nas_pdu;
+    S1ap_Cause_t          cause;
+ */
+  MSC_LOG_RX_MESSAGE(
+	  	MSC_S1AP_MME,
+	    MSC_S1AP_ENB,
+  		NULL,0,
+  		"0 UPLINK_NAS_TRANSPORT mme_ue_s1ap_id %u eNB_ue_s1ap_id %u cause %u nas len %u",
+  		nasNonDeliveryIndication_p->mme_ue_s1ap_id,
+  		nasNonDeliveryIndication_p->eNB_UE_S1AP_ID,
+  		nasNonDeliveryIndication_p->cause,
+  		nasNonDeliveryIndication_p->nas_pdu.size);
+
+  if ((ue_ref = s1ap_is_ue_mme_id_in_list(nasNonDeliveryIndication_p->mme_ue_s1ap_id))
+      == NULL) {
+    S1AP_DEBUG("No UE is attached to this mme UE s1ap id: %d\n",
+               (int)nasNonDeliveryIndication_p->mme_ue_s1ap_id);
+    return -1;
+  }
+
+  if (ue_ref->s1_ue_state != S1AP_UE_CONNECTED) {
+    S1AP_DEBUG("Received uplink NASNonDeliveryIndication while UE in state != S1AP_UE_CONNECTED\n");
+    return -1;
+  }
+
   //TODO: forward NAS PDU to NAS
-  DevMessage("TODO: forward NAS PDU to NAS\n");
+  s1ap_mme_itti_nas_non_delivery_ind(
+		  nasNonDeliveryIndication_p->mme_ue_s1ap_id,
+		  nasNonDeliveryIndication_p->nas_pdu.buf,
+		  nasNonDeliveryIndication_p->nas_pdu.size);
   return 0;
 }