diff --git a/dap-sdk b/dap-sdk
index 392b1c81fa0bd58e2c617ce6a379e403f72b3dd2..f86fdfaea7067cabd2c7e6fd1389f1b697f88e8d 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit 392b1c81fa0bd58e2c617ce6a379e403f72b3dd2
+Subproject commit f86fdfaea7067cabd2c7e6fd1389f1b697f88e8d
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 4e71dd369cd23b0bbae26b8c4761d145618df2eb..5e64e26c2ea2e4254832af796787f8d96745fb14 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1793,6 +1793,8 @@ static int callback_compare_prioritity_list(dap_list_t *a_item1, dap_list_t *a_i
  */
 void dap_chain_net_deinit()
 {
+    dap_link_manager_deinit();
+    dap_chain_net_balancer_deinit();
     dap_chain_net_item_t *l_current_item, *l_tmp;
     HASH_ITER(hh, s_net_ids, l_current_item, l_tmp)
         HASH_DELETE(hh2, s_net_ids, l_current_item);
diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 9d969ad754e4227c41a7084cbb1d3c39711734bc..47b69087d4512316a76dad15b3b7a8cab9366aa0 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -36,17 +36,27 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 
 #define LOG_TAG "dap_chain_net_balancer"
 
+#define DAP_CHAIN_NET_BALANCER_REQUEST_DELAY 20 // sec
+
+typedef struct dap_balancer_request_info {
+    dap_chain_net_id_t net_id;
+    dap_time_t request_time;
+    UT_hash_handle hh;
+} dap_balancer_request_info_t;
+
 typedef struct dap_balancer_link_request {
     const char* host_addr;
     uint16_t host_port;
     dap_chain_net_t *net;
     dap_worker_t *worker;
     uint16_t required_links_count;
+    dap_balancer_request_info_t *request_info;
 } dap_balancer_link_request_t;
 
 static_assert(sizeof(dap_chain_net_links_t) + sizeof(dap_chain_node_info_old_t) < DAP_BALANCER_MAX_REPLY_SIZE, "DAP_BALANCER_MAX_REPLY_SIZE cannot accommodate information minimum about 1 link");
 static const size_t s_max_links_response_count = (DAP_BALANCER_MAX_REPLY_SIZE - sizeof(dap_chain_net_links_t)) / sizeof(dap_chain_node_info_old_t);
 static const dap_time_t s_request_period = 5; // sec
+static dap_balancer_request_info_t* s_request_info_items = NULL;
 
 /**
  * @brief forming json file with balancer info: class networkName nodeAddress hostAddress hostPort
@@ -84,7 +94,7 @@ static dap_chain_net_links_t *s_get_ignored_node_addrs(dap_chain_net_t *a_net, s
         *l_uplinks = dap_link_manager_get_net_links_addrs(a_net->pub.id.uint64, &l_uplinks_count, NULL, true),
         *l_low_availability = dap_link_manager_get_ignored_addrs(&l_low_availability_count);
     if(!l_curr_addr->uint64 && !l_uplinks && !l_low_availability) {
-        log_it(L_WARNING, "Error forming ignore list, please check, should be minimum self addr");
+        log_it(L_WARNING, "Error forming ignore list in net %s, please check, should be minimum self addr", a_net->pub.name);
         return NULL;
     }
     l_size = sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * (l_uplinks_count + l_low_availability_count + 1);
@@ -143,9 +153,11 @@ void s_http_balancer_link_prepare_success(void *a_response, size_t a_response_si
 
     size_t l_response_size_need = sizeof(dap_chain_net_links_t) + (sizeof(dap_link_info_t) * l_balancer_request->required_links_count);
     if (a_response_size < sizeof(dap_chain_net_links_t) + sizeof(dap_link_info_t) || a_response_size > l_response_size_need) {
-        log_it(L_ERROR, "Invalid balancer response size %zu (expected %zu)", a_response_size, l_response_size_need);
+        log_it(L_ERROR, "Invalid balancer response size %zu (expected %zu) in net %s from %s:%u", a_response_size, l_response_size_need, l_balancer_request->net->pub.name, l_balancer_request->host_addr, l_balancer_request->host_port);
+        l_balancer_request->request_info->request_time = dap_time_now();
     } else {
         s_balancer_link_prepare_success(l_balancer_request->net, l_link_full_node_list, l_balancer_request->host_addr, l_balancer_request->host_port);
+        l_balancer_request->request_info->request_time = 0;
     }
     DAP_DELETE(l_balancer_request);
 }
@@ -161,8 +173,8 @@ static void s_balancer_link_prepare_error(dap_balancer_link_request_t *a_request
     struct json_object *l_json = s_balancer_states_json_collect(a_request->net, a_host_addr, a_host_port);
     char l_err_str[512] = { '\0' };
     snprintf(l_err_str, sizeof(l_err_str)
-                 , "Link from balancer %s can't be prepared, errno %d"
-                 , a_host_addr, a_errno);
+                 , "Link from balancer %s:%u in net %s can't be prepared, errno %d"
+                 , a_host_addr, a_host_port, a_request->net->pub.name, a_errno);
     log_it(L_WARNING, "%s", l_err_str);
     json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str));
     dap_notify_server_send_mt(json_object_get_string(l_json));
@@ -178,6 +190,7 @@ static void s_http_balancer_link_prepare_error(int a_errno, void *a_arg)
 {
     dap_balancer_link_request_t *l_balancer_request = (dap_balancer_link_request_t *)a_arg;
     s_balancer_link_prepare_error(l_balancer_request, l_balancer_request->host_addr, l_balancer_request->host_port, a_errno);
+    l_balancer_request->request_info->request_time = dap_time_now();
     DAP_DELETE(l_balancer_request);
 }
 
@@ -196,8 +209,9 @@ static dap_chain_net_links_t *s_get_node_addrs(dap_chain_net_t *a_net, uint16_t
 // preparing
     dap_list_t *l_nodes_list = dap_chain_node_get_states_list_sort(a_net, a_ignored ? (dap_chain_node_addr_t *)a_ignored->nodes_info : (dap_chain_node_addr_t *)NULL, a_ignored ? a_ignored->count_node : 0);
     if (!l_nodes_list) {
-        log_it(L_WARNING, "There isn't any nodes in net %s", a_net->pub.name);
-        return NULL;
+        log_it(L_DEBUG, "There isn't any nodes to list prepare in net %s", a_net->pub.name);
+        if (!a_external_call)
+            return NULL;
     }
     size_t l_nodes_count = dap_list_length(l_nodes_list);
     if (a_links_need) {
@@ -235,7 +249,7 @@ static dap_chain_net_links_t *s_get_node_addrs_old(dap_chain_net_t *a_net, uint1
 // preparing
     dap_list_t *l_nodes_list = dap_chain_node_get_states_list_sort(a_net, NULL, 0);
     if (!l_nodes_list) {
-        log_it(L_WARNING, "There isn't any nodes in net %s", a_net->pub.name);
+        log_it(L_WARNING, "There isn't any nodes to list prepare in net %s", a_net->pub.name);
         return NULL;
     }
     size_t l_nodes_count = dap_list_length(l_nodes_list);
@@ -276,7 +290,7 @@ static dap_chain_net_links_t *s_balancer_issue_link(const char *a_net_name, uint
 // preparing
     dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name);
     if (!l_net) {
-        log_it(L_WARNING, "There isn't any network by this name - %s", a_net_name);
+        log_it(L_WARNING, "There isn't any network by name \"%s\"", a_net_name);
         return NULL;
     }
     if(a_protocol_version == 1)
@@ -289,7 +303,10 @@ static dap_chain_net_links_t *s_balancer_issue_link(const char *a_net_name, uint
         DAP_NEW_Z_SIZE_RET_VAL(l_ignored_dec, dap_chain_net_links_t, l_ignored_size, NULL, NULL);
         dap_enc_base64_decode(a_ignored_enc, l_ignored_size, l_ignored_dec, DAP_ENC_DATA_TYPE_B64);
         if (l_ignored_size < DAP_ENC_BASE64_ENCODE_SIZE((sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node))) {
-            log_it(L_ERROR, "Can't decode ignored node list, received size %zu < expected size %zu", l_ignored_size, DAP_ENC_BASE64_ENCODE_SIZE((sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node)));
+            log_it(L_ERROR, "Can't decode ignored node list, received size %zu < expected size %zu in net %s",
+                l_ignored_size,
+                DAP_ENC_BASE64_ENCODE_SIZE((sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node)),
+                a_net_name);
             DAP_DEL_Z(l_ignored_dec);
         }
     }
@@ -299,11 +316,15 @@ static dap_chain_net_links_t *s_balancer_issue_link(const char *a_net_name, uint
 }
 
 /**
- * @brief balancer deinit
+ * @brief balancer deinit, use ONLY after dap_link_manager deinit
  */
 void dap_chain_net_balancer_deinit()
 {
-
+    dap_balancer_request_info_t
+        *l_item = NULL,
+        *l_tmp = NULL;
+    HASH_ITER(hh, s_request_info_items, l_item, l_tmp)
+        HASH_DEL(s_request_info_items, l_item);
 }
 
 /**
@@ -373,7 +394,7 @@ void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, vo
         return;
     }
     *l_return_code = Http_Status_OK;
-    size_t l_data_send_size = sizeof(uint64_t);
+    size_t l_data_send_size = sizeof(dap_chain_net_links_t);
     if (l_protocol_version == 1)
         l_data_send_size += sizeof(dap_chain_node_info_old_t) * l_link_full_node_list->count_node;
     else
@@ -414,20 +435,26 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad
 {
 // sanity check
     dap_return_val_if_pass(!a_net, -1);
-// func work
-    // request each 5 sec
-    static dap_time_t l_last_time = 0;
-    if (dap_time_now() - l_last_time < s_request_period) {
-        log_it(L_DEBUG, "Who understands life, he is in no hurry");
+// period request check
+    dap_balancer_request_info_t *l_item = NULL;
+    HASH_FIND(hh, s_request_info_items, &a_net->pub.id, sizeof(a_net->pub.id), l_item);
+    if (!l_item) {
+        DAP_NEW_Z_RET_VAL(l_item, dap_balancer_request_info_t, -2, NULL);
+        l_item->net_id = a_net->pub.id;
+        HASH_ADD(hh, s_request_info_items, net_id, sizeof(l_item->net_id), l_item);
+    }
+    if (l_item->request_time + DAP_CHAIN_NET_BALANCER_REQUEST_DELAY > dap_time_now()) {
+        log_it(L_DEBUG, "Who understands life, he is in no hurry. Dear %s, please wait few seconds", a_net->pub.name);
         return 0;
     }
-    l_last_time = dap_time_now();
+// preparing to request
     size_t
         l_ignored_addrs_size = 0,
         l_required_links_count = dap_link_manager_needed_links_count(a_net->pub.id.uint64);
     dap_chain_net_links_t
         *l_ignored_addrs = s_get_ignored_node_addrs(a_net, &l_ignored_addrs_size),
-        *l_links = s_get_node_addrs(a_net, l_required_links_count, l_ignored_addrs, false);     // links from local GDB
+        *l_links = s_get_node_addrs(a_net, l_required_links_count, l_ignored_addrs, false);
+// links from local GDB
     if (l_links) {
         s_balancer_link_prepare_success(a_net, l_links, NULL, 0);
         if (l_links->count_node >= l_required_links_count) {
@@ -437,12 +464,12 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad
         l_required_links_count -= l_links->count_node;
         DAP_DELETE(l_links);
     }
+// links from http balancer request
     if (!a_host_addr || !a_host_port) {
-        log_it(L_INFO, "Can't read seed nodes addresses, work with local balancer only");
+        log_it(L_INFO, "Can't read seed nodes addresses in net %s, work with local balancer only", a_net->pub.name);
         DAP_DEL_Z(l_ignored_addrs);
         return 0;
     }
-    // dynamic links from http balancer request
     dap_balancer_link_request_t *l_balancer_request = NULL;
     DAP_NEW_Z_RET_VAL(l_balancer_request, dap_balancer_link_request_t, -4, NULL);
     *l_balancer_request = (dap_balancer_link_request_t) {
@@ -450,10 +477,11 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad
         .host_port = a_host_port,
         .net = a_net,
         .worker = dap_events_worker_get_auto(),
-        .required_links_count = l_required_links_count
+        .required_links_count = l_required_links_count,
+        .request_info = l_item
     };
-    log_it(L_DEBUG, "Start balancer %s request to %s:%u",
-           dap_chain_net_balancer_type_to_str(a_balancer_type), l_balancer_request->host_addr, l_balancer_request->host_port);
+    log_it(L_DEBUG, "Start balancer %s request to %s:%u in net %s",
+           dap_chain_net_balancer_type_to_str(a_balancer_type), l_balancer_request->host_addr, l_balancer_request->host_port, a_net->pub.name);
     
     int ret;
     if (a_balancer_type == DAP_CHAIN_NET_BALANCER_TYPE_HTTP) {
@@ -499,7 +527,7 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad
                                                 l_balancer_request); */ -1;
     }
     if (ret) {
-        log_it(L_ERROR, "Can't process balancer link %s request", dap_chain_net_balancer_type_to_str(a_balancer_type));
+        log_it(L_ERROR, "Can't process balancer link %s request in net %s", dap_chain_net_balancer_type_to_str(a_balancer_type), a_net->pub.name);
         return -6;
     }
     return 0;