diff --git a/openair-cn/COMMON/s1ap_messages_def.h b/openair-cn/COMMON/s1ap_messages_def.h
index cf7fd64054f9b45728ea74c5e648d285dee3ef0b..d13a5902f48dade7a9aaa60a6b2873708046402b 100644
--- a/openair-cn/COMMON/s1ap_messages_def.h
+++ b/openair-cn/COMMON/s1ap_messages_def.h
@@ -1,3 +1,5 @@
 //WARNING: Do not include this header directly. Use intertask_interface.h instead.
 
-MESSAGE_DEF(S1AP_UE_CAPABILITIES_IND,     MESSAGE_PRIORITY_MED, s1ap_ue_cap_ind_t,       s1ap_ue_cap_ind)
+MESSAGE_DEF(S1AP_UE_CAPABILITIES_IND,     MESSAGE_PRIORITY_MED, s1ap_ue_cap_ind_t,           s1ap_ue_cap_ind)
+MESSAGE_DEF(S1AP_ENB_DEREGISTERED_IND,    MESSAGE_PRIORITY_MED, s1ap_eNB_deregistered_ind_t, s1ap_eNB_deregistered_ind)
+MESSAGE_DEF(S1AP_DEREGISTER_UE_REQ,       MESSAGE_PRIORITY_MED, s1ap_deregister_ue_req_t,    s1ap_deregister_ue_req)
diff --git a/openair-cn/COMMON/s1ap_messages_types.h b/openair-cn/COMMON/s1ap_messages_types.h
index 1c847188b7c37432c6f2792bdc7759efa359db51..035c00cc7bef0fc196354d1493448722099ed14b 100644
--- a/openair-cn/COMMON/s1ap_messages_types.h
+++ b/openair-cn/COMMON/s1ap_messages_types.h
@@ -1,6 +1,9 @@
 #ifndef S1AP_MESSAGES_TYPES_H_
 #define S1AP_MESSAGES_TYPES_H_
 
+#define S1AP_ENB_DEREGISTERED_IND(mSGpTR) (mSGpTR)->ittiMsg.s1ap_eNB_deregistered_ind
+#define S1AP_DEREGISTER_UE_REQ(mSGpTR)    (mSGpTR)->ittiMsg.s1ap_deregister_ue_req
+
 typedef struct s1ap_initial_ue_message_s {
     unsigned eNB_ue_s1ap_id:24;
     uint32_t mme_ue_s1ap_id;
@@ -39,4 +42,14 @@ typedef struct s1ap_ue_cap_ind_s {
     uint32_t radio_capabilities_length;
 } s1ap_ue_cap_ind_t;
 
+#define S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE 20
+typedef struct s1ap_eNB_deregistered_ind_s {
+    uint8_t  nb_ue_to_deregister;
+    uint32_t mme_ue_s1ap_id[S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE];
+} s1ap_eNB_deregistered_ind_t;
+
+typedef struct s1ap_deregister_ue_req_s {
+    uint32_t mme_ue_s1ap_id;
+} s1ap_deregister_ue_req_t;
+
 #endif /* S1AP_MESSAGES_TYPES_H_ */
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 090a94584c0a6eb8ccd5d05106971f5d82c77e9d..21122359e4a07240629c42ef38f5e76ef0582cec 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
@@ -34,8 +34,9 @@ Description
  * String representation of EMMCN-SAP primitives
  */
 static const char *_emm_cn_primitive_str[] = {
-    "EMMCN_AUTHENTICATION_PARAM_RES",
-    "EMMCN_AUTHENTICATION_PARAM_FAIL",
+    "EMM_CN_AUTHENTICATION_PARAM_RES",
+    "EMM_CN_AUTHENTICATION_PARAM_FAIL",
+    "EMM_CN_DEREGISTER_UE",
 };
 
 static int _emm_cn_authentication_res(const emm_cn_auth_res_t *msg)
@@ -101,6 +102,15 @@ static int _emm_cn_authentication_fail(const emm_cn_auth_fail_t *msg)
     LOG_FUNC_RETURN (rc);
 }
 
+static int _emm_cn_deregister_ue(const UInt32_t ue_id)
+{
+    int rc = RETURNok;
+
+    LOG_FUNC_IN;
+
+    LOG_FUNC_RETURN (rc);
+}
+
 int emm_cn_send(const emm_cn_t *msg)
 {
     int rc = RETURNerror;
@@ -120,6 +130,10 @@ int emm_cn_send(const emm_cn_t *msg)
             rc = _emm_cn_authentication_fail(msg->u.auth_fail);
             break;
 
+        case EMMCN_DEREGISTER_UE:
+            rc = _emm_cn_deregister_ue(msg->u.deregister.UEid);
+            break;
+
         default:
             /* Other primitives are forwarded to the Access Stratum */
             rc = RETURNerror;
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cnDef.h b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cnDef.h
index 77041967c690408de49b3a3576b502252e09e45a..c31454bedc4328582aa7f2adf49a306ff6cfc2f4 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cnDef.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_cnDef.h
@@ -30,6 +30,7 @@ typedef enum emmcn_primitive_s {
 #if defined(EPC_BUILD)
     _EMMCN_AUTHENTICATION_PARAM_RES,
     _EMMCN_AUTHENTICATION_PARAM_FAIL,
+    _EMMCN_DEREGISTER_UE,
 #endif
     _EMMCN_END
 } emm_cn_primitive_t;
@@ -38,11 +39,16 @@ typedef enum emmcn_primitive_s {
 typedef nas_auth_param_rsp_t  emm_cn_auth_res_t;
 typedef nas_auth_param_fail_t emm_cn_auth_fail_t;
 
+typedef struct emm_cn_deregister_ue_s {
+    UInt32_t UEid;
+} emm_cn_deregister_ue_t;
+
 typedef struct emm_mme_ul_s {
     emm_cn_primitive_t primitive;
     union {
-        emm_cn_auth_res_t  *auth_res;
-        emm_cn_auth_fail_t *auth_fail;
+        emm_cn_auth_res_t       *auth_res;
+        emm_cn_auth_fail_t      *auth_fail;
+        emm_cn_deregister_ue_t   deregister;
     } u;
 } emm_cn_t;
 #endif
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_sap.h b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_sap.h
index e5291572c21363d3bdc7802a0aab0bdd717db5ea..a6d814c2dcce7ba58ff06c286f84f20b1e923157 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_sap.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_sap.h
@@ -109,6 +109,7 @@ typedef enum {
 #ifdef EPC_BUILD
     EMMCN_AUTHENTICATION_PARAM_RES      = _EMMCN_AUTHENTICATION_PARAM_RES,
     EMMCN_AUTHENTICATION_PARAM_FAIL     = _EMMCN_AUTHENTICATION_PARAM_FAIL,
+    EMMCN_DEREGISTER_UE                 = _EMMCN_DEREGISTER_UE
 #endif
 } emm_primitive_t;
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c
index d4f5fdfd3562ad14fb3279019a887a88be4b99fb..f4328bbc783f1ef501f0a730000f5dfb6dc4b941 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.c
@@ -1474,6 +1474,21 @@ int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail)
 
     LOG_FUNC_RETURN (rc);
 }
+
+int nas_proc_deregister_ue(UInt32_t ue_id)
+{
+    int rc = RETURNerror;
+    emm_sap_t emm_sap;
+
+    LOG_FUNC_IN;
+
+    emm_sap.primitive = EMMCN_DEREGISTER_UE;
+    emm_sap.u.emm_cn.u.deregister.UEid = ue_id;
+
+    rc = emm_sap_send(&emm_sap);
+
+    LOG_FUNC_RETURN (rc);
+}
 # endif
 #endif // NAS_MME
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h
index 158a8540d548fb192dc683e745d3553b9a765c69..eea36c4249084b05829993b5c64f8e50ef657a50 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/nas_proc.h
@@ -136,8 +136,8 @@ int nas_proc_ul_transfer_ind(UInt32_t ueid, const Byte_t *data, UInt32_t len);
  */
 #if defined(NAS_MME) && defined(EPC_BUILD)
 int nas_proc_auth_param_res(emm_cn_auth_res_t *emm_cn_auth_res);
-
 int nas_proc_auth_param_fail(emm_cn_auth_fail_t *emm_cn_auth_fail);
+int nas_proc_deregister_ue(UInt32_t ue_id);
 #endif
 
 #endif /* __NAS_PROC_H__*/
diff --git a/openair-cn/NAS/nas_main.c b/openair-cn/NAS/nas_main.c
index 521589d179f7053ef57511320f058a2da54ce47f..fc4c93f970abfe37b899a305611b4f1667d6bda8 100644
--- a/openair-cn/NAS/nas_main.c
+++ b/openair-cn/NAS/nas_main.c
@@ -60,6 +60,7 @@ static void *nas_intertask_interface(void *args_p)
 
 next_message:
         itti_receive_msg(TASK_NAS, &received_message_p);
+
         switch (ITTI_MSG_ID(received_message_p))
         {
             case NAS_CONNECTION_ESTABLISHMENT_IND: {
@@ -142,6 +143,21 @@ next_message:
 #endif
             } break;
 
+            case S1AP_ENB_DEREGISTERED_IND: {
+#if !defined(DISABLE_USE_NAS)
+                int i;
+                for (i = 0; i < S1AP_ENB_DEREGISTERED_IND(received_message_p).nb_ue_to_deregister; i ++) {
+                    nas_proc_deregister_ue(S1AP_ENB_DEREGISTERED_IND(received_message_p).mme_ue_s1ap_id[i]);
+                }
+#endif
+            } break;
+
+            case S1AP_DEREGISTER_UE_REQ: {
+#if !defined(DISABLE_USE_NAS)
+                nas_proc_deregister_ue(S1AP_DEREGISTER_UE_REQ(received_message_p).mme_ue_s1ap_id);
+#endif
+            } break;
+
             case TERMINATE_MESSAGE: {
                 itti_exit_task();
             } break;
diff --git a/openair-cn/S1AP/s1ap_mme_handlers.c b/openair-cn/S1AP/s1ap_mme_handlers.c
index 8bbc95fa705954483ed720c14ef655be8fb6eef6..599b26f301a52b770382092b55c17efbbf728ca1 100644
--- a/openair-cn/S1AP/s1ap_mme_handlers.c
+++ b/openair-cn/S1AP/s1ap_mme_handlers.c
@@ -697,20 +697,51 @@ int s1ap_mme_handle_path_switch_request(uint32_t assoc_id, uint32_t stream,
     return 0;
 }
 
-////////////////////////////////////////////////////////////////////////////////
-//************************* E-RAB management *********************************//
-////////////////////////////////////////////////////////////////////////////////
-
 int s1ap_handle_sctp_deconnection(uint32_t assoc_id)
 {
+    int current_ue_index = 0;
+    int handled_ues      = 0;
+    int i;
+
+    MessageDef *message_p   = NULL;
+
+    ue_description_t  *ue_ref = NULL;
     eNB_description_t *eNB_association;
 
     /* Checking that the assoc id has a valid eNB attached to. */
-    if ((eNB_association = s1ap_is_eNB_assoc_id_in_list(assoc_id)) == NULL) {
-        S1AP_DEBUG("No eNB attached to this assoc_id: %d\n",
+    eNB_association = s1ap_is_eNB_assoc_id_in_list(assoc_id);
+    if (eNB_association == NULL) {
+        S1AP_ERROR("No eNB attached to this assoc_id: %d\n",
                    assoc_id);
         return -1;
     }
+
+    STAILQ_FOREACH(ue_ref, &eNB_association->ue_list_head, ue_entries)
+    {
+        /* Ask for a release of each UE context associated to the eNB */
+        if (current_ue_index == 0) {
+            message_p = itti_alloc_new_message(TASK_S1AP, S1AP_ENB_DEREGISTERED_IND);
+        }
+
+        S1AP_ENB_DEREGISTERED_IND(message_p).mme_ue_s1ap_id[current_ue_index] = ue_ref->mme_ue_s1ap_id;
+
+        if (current_ue_index == 0 && handled_ues > 0) {
+            S1AP_ENB_DEREGISTERED_IND(message_p).nb_ue_to_deregister = S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE;
+            itti_send_msg_to_task(TASK_NAS, INSTANCE_DEFAULT, message_p);
+        }
+
+        handled_ues++;
+        current_ue_index = handled_ues % S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE;
+    }
+
+    if ((handled_ues % S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE) != 0) {
+        S1AP_ENB_DEREGISTERED_IND(message_p).nb_ue_to_deregister = current_ue_index;
+        for (i = current_ue_index; i < S1AP_ITTI_UE_PER_DEREGISTER_MESSAGE; i++) {
+            S1AP_ENB_DEREGISTERED_IND(message_p).mme_ue_s1ap_id[current_ue_index] = 0;
+        }
+        itti_send_msg_to_task(TASK_NAS, INSTANCE_DEFAULT, message_p);
+    }
+
     s1ap_remove_eNB(eNB_association);
     s1ap_dump_eNB_list();
 
@@ -756,6 +787,10 @@ int s1ap_handle_new_association(sctp_new_peer_t *sctp_new_peer_p)
     return 0;
 }
 
+////////////////////////////////////////////////////////////////////////////////
+//************************* E-RAB management *********************************//
+////////////////////////////////////////////////////////////////////////////////
+
 int s1ap_handle_create_session_response(SgwCreateSessionResponse
                                         *session_response_p)
 {