diff --git a/dap-sdk b/dap-sdk
index 58f19c320f0beca68c84d0974ba0edca35a7ecdd..f11590342d80e1de304de380e6ad082b1d898046 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 58f19c320f0beca68c84d0974ba0edca35a7ecdd
+Subproject commit f11590342d80e1de304de380e6ad082b1d898046
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 58c8e8a517688d22afdce37c1375aeab8141a7d1..b362c7cf2e5f75981b3f8ca1fde89e7db680b252 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -402,13 +402,12 @@ int dap_chain_net_state_go_to(dap_chain_net_t *a_net, dap_chain_net_state_t a_ne
         dap_link_manager_set_net_condition(a_net->pub.id.uint64, true);
         for (uint16_t i = 0; i < PVT(a_net)->permanent_links_count; ++i) {
             dap_link_info_t *l_permalink_info = PVT(a_net)->permanent_links[i];
-            dap_link_t *l_link = dap_link_manager_link_create(&l_permalink_info->node_addr, true, a_net->pub.id.uint64);
-            if (!l_link) {
+            if (dap_link_manager_link_create(&l_permalink_info->node_addr, a_net->pub.id.uint64)) {
                 log_it(L_ERROR, "Can't create permanent link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_permalink_info->node_addr));
                 continue;
             }
             if (l_permalink_info->uplink_port)
-                dap_link_manager_link_update(l_link, l_permalink_info->uplink_addr, l_permalink_info->uplink_port);
+                dap_link_manager_link_update(&l_permalink_info->node_addr, l_permalink_info->uplink_addr, l_permalink_info->uplink_port);
         }
         if (a_new_state == NET_STATE_ONLINE)
             dap_chain_esbocs_start_timer(a_net->pub.id);
@@ -451,13 +450,14 @@ dap_stream_node_addr_t *dap_chain_net_get_authorized_nodes(dap_chain_net_t *a_ne
 
 static int s_net_link_add(dap_chain_net_t *a_net, dap_stream_node_addr_t *a_addr, const char *a_host, uint16_t a_port)
 {
-    dap_link_t *l_link = dap_link_manager_link_create(a_addr, true, a_net->pub.id.uint64);
-    if (!l_link) {
-        if (a_addr->uint64 != g_node_addr.uint64)
-            log_it(L_ERROR, "Can't create link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_addr));
+    bool l_is_link_present = dap_link_manager_link_find(a_addr, a_net->pub.id.uint64);
+    if (l_is_link_present || a_addr->uint64 == g_node_addr.uint64)
+        return -3; // Link is already found for this net or link is to yourself
+    if (dap_link_manager_link_create(a_addr, a_net->pub.id.uint64)) {
+        log_it(L_ERROR, "Can't create link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_addr));
         return -1;
     }
-    int rc = dap_link_manager_link_update(l_link, a_host, a_port);
+    int rc = dap_link_manager_link_update(a_addr, a_host, a_port);
     if (rc)
         log_it(L_ERROR, "Can't update link to addr " NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_addr));
     return rc;
@@ -647,7 +647,10 @@ int s_link_manager_link_request(uint64_t a_net_id)
     dap_chain_net_links_t *l_links = dap_chain_net_balancer_get_node(l_net->pub.name, l_required_links_count);
     if (l_links) {
         s_balancer_link_prepare_success(l_net, l_links);
-        return 0;
+        if (l_links->count_node >= l_required_links_count)
+            return 0;
+        else
+            l_required_links_count -= l_links->count_node;
     }
     // dynamic links from http balancer request
     struct balancer_link_request *l_balancer_request = NULL;
@@ -719,7 +722,9 @@ int s_link_manager_fill_net_info(dap_link_t *a_link)
             break;
     if (!l_node_info)
         return -3;
-    dap_link_manager_link_update(a_link, l_node_info->ext_host, l_node_info->ext_port);
+    a_link->uplink.ready = true;
+    if (dap_link_manager_link_update(&a_link->addr, l_node_info->ext_host, l_node_info->ext_port))
+        a_link->uplink.ready = true;
     DAP_DELETE(l_node_info);
     return 0;
 }