diff --git a/include/dap_client.h b/include/dap_client.h
index c9555590ec9f457f3785600eb030a79c2747a606..bad823d001dcded6802cc7a91401427b5351d997 100755
--- a/include/dap_client.h
+++ b/include/dap_client.h
@@ -38,7 +38,8 @@ typedef enum dap_client_stage {
     STAGE_STREAM_CTL=2,
     STAGE_STREAM_SESSION=3,
     STAGE_STREAM_CONNECTED=4,
-    STAGE_STREAM_STREAMING=5
+    STAGE_STREAM_STREAMING=5,
+    STAGE_STREAM_ABORT=10
 } dap_client_stage_t;
 
 typedef enum dap_client_stage_status {
@@ -69,6 +70,7 @@ typedef enum dap_client_error {
  * @brief The dap_client struct
  */
 typedef struct dap_client{
+    pthread_mutex_t mutex;
     void * _internal;
     void * _inheritor;
 } dap_client_t;
diff --git a/libdap b/libdap
index 4ab41cdcaa8087323652cd5fef702876ccc25dab..4896ad4eeda5b8d4b3ba92dfe2eb6d4cf34efcc7 160000
--- a/libdap
+++ b/libdap
@@ -1 +1 @@
-Subproject commit 4ab41cdcaa8087323652cd5fef702876ccc25dab
+Subproject commit 4896ad4eeda5b8d4b3ba92dfe2eb6d4cf34efcc7
diff --git a/libdap-crypto b/libdap-crypto
index ff63d762657f9687173db825705b8bf4b958abee..bcfcef1cd87cc6cfbc7e47887894c0fa3742a218 160000
--- a/libdap-crypto
+++ b/libdap-crypto
@@ -1 +1 @@
-Subproject commit ff63d762657f9687173db825705b8bf4b958abee
+Subproject commit bcfcef1cd87cc6cfbc7e47887894c0fa3742a218
diff --git a/libdap-server b/libdap-server
index 2cc113d3ef8234037016ac21f33731998bba6552..5c4bf1f472a48086f71822355c14197ff416831a 160000
--- a/libdap-server
+++ b/libdap-server
@@ -1 +1 @@
-Subproject commit 2cc113d3ef8234037016ac21f33731998bba6552
+Subproject commit 5c4bf1f472a48086f71822355c14197ff416831a
diff --git a/libdap-server-core b/libdap-server-core
index 1008394f0ecdbc41d995a4cc5bbc4b51ad789eaf..bbe4d2b4e00012effac21cda4c2d3554dc6173e0 160000
--- a/libdap-server-core
+++ b/libdap-server-core
@@ -1 +1 @@
-Subproject commit 1008394f0ecdbc41d995a4cc5bbc4b51ad789eaf
+Subproject commit bbe4d2b4e00012effac21cda4c2d3554dc6173e0
diff --git a/libdap-server-udp b/libdap-server-udp
index bbf1b9db2c3af9a3a59f6debb90ddc8db55ae2eb..e320774de51a831559fbeafb2dab6e7c063dcc99 160000
--- a/libdap-server-udp
+++ b/libdap-server-udp
@@ -1 +1 @@
-Subproject commit bbf1b9db2c3af9a3a59f6debb90ddc8db55ae2eb
+Subproject commit e320774de51a831559fbeafb2dab6e7c063dcc99
diff --git a/libdap-stream b/libdap-stream
index 7a53ab997e1079000d0f7477d30e4d58cf4185f7..d970b74478fc582e75c3e287fa63bec207b92598 160000
--- a/libdap-stream
+++ b/libdap-stream
@@ -1 +1 @@
-Subproject commit 7a53ab997e1079000d0f7477d30e4d58cf4185f7
+Subproject commit d970b74478fc582e75c3e287fa63bec207b92598
diff --git a/libdap-stream-ch b/libdap-stream-ch
index 268f422bde88a5f4f254a31b7d52b18d2cad71fc..09e76911c2f76c6cc1c4651a99f0e545c1c1c840 160000
--- a/libdap-stream-ch
+++ b/libdap-stream-ch
@@ -1 +1 @@
-Subproject commit 268f422bde88a5f4f254a31b7d52b18d2cad71fc
+Subproject commit 09e76911c2f76c6cc1c4651a99f0e545c1c1c840
diff --git a/src/dap_client.c b/src/dap_client.c
index 391b95b3cf45dfa00bb237f7548e034884a6828a..08051acdbae23c279b44c2bf671f46164b39c09e 100644
--- a/src/dap_client.c
+++ b/src/dap_client.c
@@ -58,6 +58,8 @@ dap_client_t * dap_client_new(dap_events_t * a_events, dap_client_callback_t a_s
     if (!l_client)
         goto MEM_ALLOC_ERR;
 
+    pthread_mutex_init(&l_client->mutex, NULL);
+
     l_client->_internal  = DAP_NEW_Z(dap_client_pvt_t);
     if (!l_client->_internal)
         goto MEM_ALLOC_ERR;
@@ -172,12 +174,19 @@ void dap_client_delete(dap_client_t * a_client)
     if(!a_client)
         return;
 
+    pthread_mutex_lock(&a_client->mutex);
+
     dap_client_disconnect(a_client);
 
+    dap_client_reset(a_client);
     if (DAP_CLIENT_PVT(a_client) )
          dap_client_pvt_delete(DAP_CLIENT_PVT(a_client));
 
-    DAP_DELETE(a_client);
+    pthread_mutex_t *l_mutex = &a_client->mutex;
+    memset(a_client, 0, sizeof(dap_client_t));
+    pthread_mutex_unlock(l_mutex);
+    // a_client will be deleted in dap_events_socket_delete() -> free( a_es->_inheritor );
+    //DAP_DELETE(a_client);
 }
 
 /**
@@ -207,7 +216,7 @@ void dap_client_go_stage(dap_client_t * a_client, dap_client_stage_t a_stage_tar
                         , dap_client_stage_str(l_client_internal->stage));
             break;
             case STAGE_STATUS_IN_PROGRESS:{
-                log_it(L_WARNING, "Aborting the stage %s"
+                log_it(L_WARNING, "Status progress the stage %s"
                         , dap_client_stage_str(l_client_internal->stage));
             }break;
             case STAGE_STATUS_DONE:
@@ -314,6 +323,8 @@ int dap_client_disconnect( dap_client_t *a_client )
     }
     //l_client_internal->stream_socket = 0;
 
+    l_client_internal->is_reconnect = false;
+
     log_it(L_DEBUG, "dap_client_disconnect( ) done" );
 
     return -1;
@@ -417,7 +428,7 @@ const char * dap_client_stage_str(dap_client_stage_t a_stage)
  */
 dap_client_stage_status_t dap_client_get_stage_status(dap_client_t * a_client)
 {
-    return DAP_CLIENT_PVT(a_client)->stage_status;
+    return (a_client && DAP_CLIENT_PVT(a_client)) ? DAP_CLIENT_PVT(a_client)->stage_status : STAGE_STATUS_NONE;
 }
 
 /**
@@ -426,7 +437,7 @@ dap_client_stage_status_t dap_client_get_stage_status(dap_client_t * a_client)
  * @return
  */
 dap_enc_key_t * dap_client_get_key_stream(dap_client_t * a_client){
-    return DAP_CLIENT_PVT(a_client)->stream_key;
+    return (a_client && DAP_CLIENT_PVT(a_client)) ? DAP_CLIENT_PVT(a_client)->stream_key : NULL;
 }
 
 
@@ -444,7 +455,7 @@ dap_stream_t * dap_client_get_stream(dap_client_t * a_client)
 dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch_id)
 {
     dap_stream_ch_t * l_ch = NULL;
-    dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client);
+    dap_client_pvt_t * l_client_internal = a_client ? DAP_CLIENT_PVT(a_client) : NULL;
     if(l_client_internal && l_client_internal->stream)
         for(int i = 0; i < l_client_internal->stream->channel_count; i++) {
             dap_stream_ch_proc_t *l_ch_id = l_client_internal->stream->channel[i]->proc;
@@ -463,8 +474,7 @@ dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch
  */
 const char * dap_client_get_stream_id(dap_client_t * a_client)
 {
-    dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client);
-    if(!l_client_internal)
+    if(!(a_client || !DAP_CLIENT_PVT(a_client)))
         return NULL;
     return DAP_CLIENT_PVT(a_client)->stream_id;
 }
diff --git a/src/dap_client_pvt.c b/src/dap_client_pvt.c
index 0c8b85145f6703b7b819baa56c47c18d02d1ad91..6529320b7139a1b4e7cc153b1ab6085af9a2e3ca 100644
--- a/src/dap_client_pvt.c
+++ b/src/dap_client_pvt.c
@@ -129,6 +129,8 @@ void dap_client_pvt_delete(dap_client_pvt_t * a_client_pvt)
 
     if (a_client_pvt->stream_key)
         dap_enc_key_delete(a_client_pvt->stream_key);
+
+    DAP_DELETE(a_client_pvt);
 }
 
 /**
@@ -310,6 +312,10 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt)
         }
     }
         break;
+//    case STAGE_STATUS_ABORTING: {
+//        log_it(L_ERROR, "Aborting state");
+//    }
+    break;
     case STAGE_STATUS_ERROR: {
         log_it(L_ERROR, "Error state, doing callback if present");
         if(a_client_pvt->stage_status_error_callback) {
@@ -318,10 +324,16 @@ static void s_stage_status_after(dap_client_pvt_t * a_client_pvt)
             //a_client_internal->stage_status_error_callback = NULL;
 
         }
-        a_client_pvt->stage = STAGE_ENC_INIT;
-        // Trying the step again
-        a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS;
-        s_stage_status_after(a_client_pvt);
+        if(a_client_pvt->stage_target == STAGE_STREAM_ABORT){
+            a_client_pvt->stage = STAGE_STREAM_ABORT;
+            a_client_pvt->stage_status = STAGE_STATUS_ABORTING;
+        }
+        else{
+            a_client_pvt->stage = STAGE_ENC_INIT;
+            // Trying the step again
+            a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS;
+            s_stage_status_after(a_client_pvt);
+        }
     }
         break;
     case STAGE_STATUS_DONE: {
@@ -845,10 +857,12 @@ void m_es_stream_delete( dap_events_socket_t *a_es, void *arg )
         log_it(L_ERROR, "dap_client is not initialized");
         return;
     }
+    pthread_mutex_lock(&l_client->mutex);
 
     dap_client_pvt_t * l_client_pvt = DAP_CLIENT_PVT(l_client);
     if( l_client_pvt == NULL ) {
         log_it(L_ERROR, "dap_client_pvt is not initialized");
+        pthread_mutex_unlock(&l_client->mutex);
         return;
     }
 
@@ -868,6 +882,8 @@ void m_es_stream_delete( dap_events_socket_t *a_es, void *arg )
 
     l_client_pvt->stream_session = NULL;
 
+    pthread_mutex_unlock(&l_client->mutex);
+
     if ( l_client_pvt->is_reconnect ) {
         log_it(L_DEBUG, "l_client_pvt->is_reconnect = true");