diff --git a/crypto/src/dap_sign.c b/crypto/src/dap_sign.c
index 062874889b71d28ba7cea0455c81771b8cf4e516..81633980a97f581bd385ad976c462cdd35d69e0a 100755
--- a/crypto/src/dap_sign.c
+++ b/crypto/src/dap_sign.c
@@ -213,6 +213,7 @@ int dap_sign_create_output(dap_enc_key_t *a_key, const void * a_data, const size
 dap_sign_t * dap_sign_create(dap_enc_key_t *a_key, const void * a_data,
         const size_t a_data_size, size_t a_output_wish_size)
 {
+    dap_return_val_if_pass(!a_key, NULL);
     const void * l_sign_data;
     size_t l_sign_data_size;
 
diff --git a/global-db/dap_global_db_driver_mdbx.c b/global-db/dap_global_db_driver_mdbx.c
index af54feb3ea55c8bceeb5f90bd745f578effc822b..abe69741743f4420376e72654605901f9c5ee1a2 100644
--- a/global-db/dap_global_db_driver_mdbx.c
+++ b/global-db/dap_global_db_driver_mdbx.c
@@ -1069,8 +1069,9 @@ static int s_db_mdbx_apply_store_obj_with_txn(dap_store_obj_t *a_store_obj, MDBX
         DAP_DELETE(l_record);
     } else {
         /* Delete record */
+        dap_global_db_driver_hash_t l_driver_key = {};
         if (a_store_obj->crc && a_store_obj->timestamp) {
-            dap_global_db_driver_hash_t l_driver_key = dap_global_db_driver_hash_get(a_store_obj);
+            l_driver_key = dap_global_db_driver_hash_get(a_store_obj);
             l_key.iov_base = &l_driver_key;
             l_key.iov_len = sizeof(l_driver_key);
             rc = MDBX_SUCCESS;
diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c
index 80b5b9a59abc7348c898a96bfd2d592e629a856f..60db0a59483ec2de395630b2e3f217609aae200f 100644
--- a/net/link_manager/dap_link_manager.c
+++ b/net/link_manager/dap_link_manager.c
@@ -66,7 +66,7 @@ static void s_client_connect(dap_link_t *a_link, void *a_callback_arg);
 static void s_client_connected_callback(dap_client_t *a_client, void *a_arg);
 static void s_client_error_callback(dap_client_t *a_client, void *a_arg);
 static void s_accounting_uplink_in_net(dap_link_t *a_link, dap_managed_net_t *a_net);
-static void s_link_delete(dap_link_t *a_link, bool a_force, bool a_client_preserve);
+static void s_link_delete(dap_link_t **a_link, bool a_force, bool a_client_preserve);
 static void s_link_delete_all(bool a_force);
 static void s_links_wake_up(dap_link_manager_t *a_link_manager);
 static void s_links_request(dap_link_manager_t *a_link_manager);
@@ -240,7 +240,7 @@ void dap_link_manager_deinit()
     dap_link_t *l_link = NULL, *l_link_tmp;
     pthread_rwlock_wrlock(&s_link_manager->links_lock);
     HASH_ITER(hh, s_link_manager->links, l_link, l_link_tmp)
-        s_link_delete(l_link, true, false);
+        s_link_delete(&l_link, true, false);
     pthread_rwlock_unlock(&s_link_manager->links_lock);
     dap_list_t *it = NULL, *tmp;
     DL_FOREACH_SAFE(s_link_manager->nets, it, tmp)
@@ -419,7 +419,7 @@ void dap_link_manager_set_net_condition(uint64_t a_net_id, bool a_new_condition)
             if (l_net_it->data == l_net) {
                 l_link_it->uplink.associated_nets = dap_list_delete_link(l_link_it->uplink.associated_nets, l_net_it);
                 if (!l_link_it->uplink.associated_nets)
-                    s_link_delete(l_link_it, false, false);
+                    s_link_delete(&l_link_it, false, false);
                 break;
             }
         }
@@ -529,10 +529,11 @@ void s_link_drop(dap_link_t *a_link, bool a_disconnected)
             }
         }
         if (!a_link->active_clusters && !a_link->uplink.associated_nets && !a_link->static_clusters) {
-            s_link_delete(a_link, false, false);
-        } else
+            s_link_delete(&a_link, false, false);
+        } else 
             dap_client_go_stage(a_link->uplink.client, STAGE_BEGIN, NULL);
-        a_link->uplink.attempts_count = 0;
+        if (a_link)
+            a_link->uplink.attempts_count = 0;
     } else if (a_link->link_manager->callbacks.error) {// TODO make different error codes
         for (dap_list_t *it = a_link->uplink.associated_nets; it; it = it->next) {
             // if dynamic link call callback
@@ -541,7 +542,7 @@ void s_link_drop(dap_link_t *a_link, bool a_disconnected)
         }
         if (a_link->uplink.state == LINK_STATE_ESTABLISHED) {
             a_link->stream_is_destroyed = true;
-            s_link_delete(a_link, false, true);
+            s_link_delete(&a_link, false, true);
         } else if (a_link->active_clusters) {
             dap_client_go_stage(a_link->uplink.client, STAGE_BEGIN, NULL);
             a_link->uplink.state = LINK_STATE_DISCONNECTED;
@@ -589,38 +590,39 @@ void s_client_error_callback(dap_client_t *a_client, void *a_arg)
  * @param a_link - link to delet
  * @param a_force - only del dynamic, if true - all links types memory free
  */
-void s_link_delete(dap_link_t *a_link, bool a_force, bool a_client_preserve)
+void s_link_delete(dap_link_t **a_link, bool a_force, bool a_client_preserve)
 {
 // sanity check
-    dap_return_if_pass(!a_link);
+    dap_return_if_pass(!a_link || !*a_link);
+    dap_link_t *l_link = *a_link;
 // func work
     debug_if(s_debug_more, L_DEBUG, "%seleting link %s node " NODE_ADDR_FP_STR "", a_force ? "Force d" : "D",
-                a_link->is_uplink || !a_link->active_clusters ? "to" : "from", NODE_ADDR_FP_ARGS_S(a_link->addr));
+                l_link->is_uplink || !l_link->active_clusters ? "to" : "from", NODE_ADDR_FP_ARGS_S(l_link->addr));
 
-    if (a_link->active_clusters)
-        dap_cluster_link_delete_from_all(a_link->active_clusters, &a_link->addr);
-    assert(a_link->active_clusters == NULL);
+    if (l_link->active_clusters)
+        dap_cluster_link_delete_from_all(l_link->active_clusters, &l_link->addr);
+    assert(l_link->active_clusters == NULL);
 
-    bool l_link_preserve = (a_client_preserve || a_link->static_clusters) && !a_force;
-    if (!a_link->stream_is_destroyed || !l_link_preserve) {
+    bool l_link_preserve = (a_client_preserve || l_link->static_clusters) && !a_force;
+    if (!l_link->stream_is_destroyed || !l_link_preserve) {
         // Drop uplink
         dap_events_socket_uuid_t l_client_uuid = 0;
-        if (a_link->uplink.client) {
-            l_client_uuid = a_link->uplink.es_uuid;
-            if (a_link->uplink.associated_nets) {
-                dap_list_free(a_link->uplink.associated_nets);
-                a_link->uplink.associated_nets = NULL;
+        if (l_link->uplink.client) {
+            l_client_uuid = l_link->uplink.es_uuid;
+            if (l_link->uplink.associated_nets) {
+                dap_list_free(l_link->uplink.associated_nets);
+                l_link->uplink.associated_nets = NULL;
             }
             if (l_link_preserve) {
-                if (a_link->uplink.state != LINK_STATE_DISCONNECTED) {
-                    dap_client_go_stage(a_link->uplink.client, STAGE_BEGIN, NULL);
-                    a_link->uplink.state = LINK_STATE_DISCONNECTED;
+                if (l_link->uplink.state != LINK_STATE_DISCONNECTED) {
+                    dap_client_go_stage(l_link->uplink.client, STAGE_BEGIN, NULL);
+                    l_link->uplink.state = LINK_STATE_DISCONNECTED;
                 }
             } else
-                dap_client_delete_mt(a_link->uplink.client);
+                dap_client_delete_mt(l_link->uplink.client);
         }
         // Drop downlinks if any
-        dap_list_t *l_connections_for_addr = dap_stream_find_all_by_addr(&a_link->addr);
+        dap_list_t *l_connections_for_addr = dap_stream_find_all_by_addr(&l_link->addr);
         for (dap_list_t *it = l_connections_for_addr; it; it = it->next) {
             dap_events_socket_uuid_ctrl_t *l_uuid_ctrl = it->data;
             if (l_uuid_ctrl->uuid != l_client_uuid)
@@ -630,9 +632,9 @@ void s_link_delete(dap_link_t *a_link, bool a_force, bool a_client_preserve)
     }
     if (l_link_preserve)
         return;
-    dap_list_free(a_link->static_clusters);
-    HASH_DEL(s_link_manager->links, a_link);
-    DAP_DELETE(a_link);
+    dap_list_free(l_link->static_clusters);
+    HASH_DEL(s_link_manager->links, l_link);
+    DAP_DEL_Z(*a_link);
     if (s_debug_more)
         s_link_manager_print_links_info(s_link_manager);
 }
@@ -1057,7 +1059,7 @@ static bool s_stream_delete_callback(void *a_arg)
     l_link->stream_is_destroyed = true;
     dap_cluster_link_delete_from_all(l_link->active_clusters, l_node_addr);
     if (!l_link->uplink.client)
-        s_link_delete(l_link, false, false);
+        s_link_delete(&l_link, false, false);
     pthread_rwlock_unlock(&s_link_manager->links_lock);
     return false;
 }
@@ -1124,7 +1126,7 @@ static bool s_link_accounting_callback(void *a_arg)
         l_link->uplink.associated_nets = dap_list_remove(l_link->uplink.associated_nets, l_net);
         l_net->uplinks--;
         if (l_link->uplink.client && !l_link->uplink.associated_nets && !l_link->static_clusters)
-            s_link_delete(l_link, false, false);
+            s_link_delete(&l_link, false, false);
     }
     pthread_rwlock_unlock(&s_link_manager->links_lock);
     DAP_DELETE(l_args);
@@ -1223,7 +1225,7 @@ void dap_link_manager_remove_static_links_cluster(dap_cluster_member_t *a_member
     }
     l_link->static_clusters = dap_list_remove(l_link->static_clusters, l_cluster);
     if (!l_link->static_clusters && !l_link->active_clusters)
-        s_link_delete(l_link, false, true);
+        s_link_delete(&l_link, false, true);
     pthread_rwlock_unlock(&s_link_manager->links_lock);
     s_debug_cluster_adding_removing(true, false, l_cluster, l_node_addr);
 }