diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c
index 38fafff08c803f183a88740d5fdcbbaab8319917..04467ee8bf1121ea77c94a1153b06db8f9575e43 100644
--- a/net/link_manager/dap_link_manager.c
+++ b/net/link_manager/dap_link_manager.c
@@ -50,8 +50,8 @@ typedef struct dap_managed_net {
 
 static bool s_debug_more = false;
 static const char *s_init_error = "Link manager not inited";
-static uint32_t s_timer_update_states = 2000;
-static uint32_t s_max_attempts_num = 3;
+static uint32_t s_timer_update_states = 5000;
+static uint32_t s_max_attempts_num = 1;
 static uint32_t s_reconnect_delay = 20; // sec
 static dap_link_manager_t *s_link_manager = NULL;
 static dap_proc_thread_t *s_query_thread = NULL;
@@ -167,15 +167,24 @@ DAP_STATIC_INLINE void s_debug_accounting_link_in_net(bool a_uplink, dap_stream_
 DAP_STATIC_INLINE void s_link_manager_print_links_info(dap_link_manager_t *a_link_manager)
 {
     dap_link_t *l_link = NULL, *l_tmp = NULL;
-    printf("| Uplink |\tNode addr\t|Active Clusters|Static clusters|\n"
+    dap_string_t *l_report = dap_string_new("\n| Uplink |\tNode addr\t|Active Clusters|Static clusters|\tNet IDs\t\n"
             "-----------------------------------------------------------------\n");
-    HASH_ITER(hh, a_link_manager->links, l_link, l_tmp)
-        printf("| %5s  |"NODE_ADDR_FP_STR"|\t%"DAP_UINT64_FORMAT_U
-                                            "\t|\t%"DAP_UINT64_FORMAT_U"\t|\n",
+    HASH_ITER(hh, a_link_manager->links, l_link, l_tmp) {
+        dap_string_append_printf(l_report, "| %5s  |"NODE_ADDR_FP_STR"|\t%"DAP_UINT64_FORMAT_U
+                                            "\t|\t%"DAP_UINT64_FORMAT_U"\t| ",
                                  l_link->is_uplink ? "True" : "False",
                                  NODE_ADDR_FP_ARGS_S(l_link->addr),
                                  dap_list_length(l_link->active_clusters),
                                  dap_list_length(l_link->static_clusters));
+        dap_list_t *it, *tmp;
+        DL_FOREACH_SAFE(l_link->uplink.associated_nets, it, tmp) {
+            dap_managed_net_t *l_net = it->data;
+            dap_string_append_printf(l_report, " %"DAP_UINT64_FORMAT_x, l_net->id);
+        }
+        dap_string_append_printf(l_report, "%s", "\n");
+    }
+    log_it(L_DEBUG, "%s", l_report->str);
+    dap_string_free(l_report, true);
 }
 
 // General functional
@@ -400,7 +409,6 @@ void dap_link_manager_set_net_condition(uint64_t a_net_id, bool a_new_condition)
     }
     if (a_new_condition)
         return;
-    l_net->uplinks = 0;
     pthread_rwlock_wrlock(&s_link_manager->links_lock);
     dap_link_t *l_link_it, *l_link_tmp;
     HASH_ITER(hh, s_link_manager->links, l_link_it, l_link_tmp) {
@@ -514,7 +522,6 @@ void s_link_drop(dap_link_t *a_link, bool a_disconnected)
                 if (l_is_permanent_link)
                     continue;
                 DL_DELETE(a_link->uplink.associated_nets, it);
-                l_net->uplinks--;
             }
         }
         if (!a_link->active_clusters && !a_link->uplink.associated_nets && !a_link->static_clusters) {
@@ -713,9 +720,11 @@ void s_links_request(dap_link_manager_t *a_link_manager)
     dap_list_t *l_item = NULL;
     DL_FOREACH(a_link_manager->nets, l_item) {
         dap_managed_net_t *l_net = (dap_managed_net_t *)l_item->data;
-        if (l_net->active && a_link_manager->callbacks.link_request &&
-                l_net->uplinks < l_net->min_links_num)
-            a_link_manager->callbacks.link_request(l_net->id);
+        if (l_net->active ) {
+            l_net->uplinks = dap_link_manager_links_count(l_net->id);
+            if (a_link_manager->callbacks.link_request && l_net->uplinks < l_net->min_links_num)
+                    a_link_manager->callbacks.link_request(l_net->id);
+        }
     }
 }
 
@@ -760,7 +769,9 @@ static dap_link_t *s_link_manager_link_create(dap_stream_node_addr_t *a_node_add
         l_link->addr.uint64 = a_node_addr->uint64;
         l_link->link_manager = s_link_manager;
         HASH_ADD(hh, s_link_manager->links, addr, sizeof(*a_node_addr), l_link);
-    }
+    }   
+    if (s_debug_more)
+        s_link_manager_print_links_info(s_link_manager);
     if (a_with_client) {
         if (!l_link->uplink.client)
             l_link->uplink.client = dap_client_new(s_client_error_callback, NULL);
@@ -778,11 +789,8 @@ static dap_link_t *s_link_manager_link_create(dap_stream_node_addr_t *a_node_add
                     return NULL;
                 }
             l_link->uplink.associated_nets = dap_list_append(l_link->uplink.associated_nets, l_net);
-            l_net->uplinks++;
         }
     }
-    if (s_debug_more)
-        s_link_manager_print_links_info(s_link_manager);
     return l_link;
 }
 
@@ -1120,7 +1128,6 @@ 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);
     }
@@ -1234,7 +1241,7 @@ void dap_link_manager_remove_static_links_cluster(dap_cluster_member_t *a_member
  * @param a_downlinks_count output count of finded downlinks
  * @return pointer to dap_stream_node_addr_t array, first uplinks, second downlinks, or NULL
  */
-dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id, size_t *a_uplinks_count, size_t *a_downlinks_count, bool a_uplinks_only)
+dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id, size_t *a_uplinks_count, size_t *a_downlinks_count, bool a_established_only)
 {
 // sanity check
     dap_managed_net_t *l_net = s_find_net_by_id(a_net_id);
@@ -1255,13 +1262,13 @@ dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id,
     for (size_t i =  0; i < l_cur_count; ++i) {
         dap_link_t *l_link = NULL;
         HASH_FIND(hh, s_link_manager->links, l_links_addrs + i, sizeof(l_links_addrs[i]), l_link);
-        if (!l_link || (l_link->is_uplink && l_link->uplink.state != LINK_STATE_ESTABLISHED)) {
+        if (!l_link || (l_link->is_uplink && a_established_only && l_link->uplink.state != LINK_STATE_ESTABLISHED)) {
             continue;
         } else if (l_link->is_uplink) {  // first uplinks, second downlinks
             l_ret[l_uplinks_count + l_downlinks_count].uint64 = l_ret[l_uplinks_count].uint64;
             l_ret[l_uplinks_count].uint64 = l_link->addr.uint64;
             ++l_uplinks_count;
-        } else if (!a_uplinks_only) {
+        } else {
             l_ret[l_uplinks_count + l_downlinks_count].uint64 = l_link->addr.uint64;
             ++l_downlinks_count;
         }
diff --git a/net/link_manager/include/dap_link_manager.h b/net/link_manager/include/dap_link_manager.h
index 83dbafb82474b93aa415527991ce39341a44f915..6e44860c5b58f19d46cebed981ffca078667e4b8 100644
--- a/net/link_manager/include/dap_link_manager.h
+++ b/net/link_manager/include/dap_link_manager.h
@@ -111,6 +111,6 @@ size_t dap_link_manager_needed_links_count(uint64_t a_net_id);
 void dap_link_manager_set_condition(bool a_new_condition);
 bool dap_link_manager_get_condition();
 char *dap_link_manager_get_links_info();
-dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id, size_t *a_uplinks_count, size_t *a_downlinks_count, bool a_uplinks_only);
+dap_stream_node_addr_t *dap_link_manager_get_net_links_addrs(uint64_t a_net_id, size_t *a_uplinks_count, size_t *a_downlinks_count, bool a_established_only);
 dap_stream_node_addr_t *dap_link_manager_get_ignored_addrs(size_t *a_ignored_count, uint64_t a_net_id);
 void dap_link_manager_stream_replace(dap_stream_node_addr_t *a_addr, bool a_new_is_uplink);
diff --git a/net/stream/ch/dap_stream_ch_gossip.c b/net/stream/ch/dap_stream_ch_gossip.c
index 8421b49e020351cd9b7f9baafb68d33b8af4addb..592776acc45cd1ea9bff9fb804b7dd879db8dd0f 100644
--- a/net/stream/ch/dap_stream_ch_gossip.c
+++ b/net/stream/ch/dap_stream_ch_gossip.c
@@ -279,13 +279,13 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
             break;
         }
         size_t l_payload_item_size = dap_gossip_msg_get_size(l_msg) + sizeof(g_node_addr) + sizeof(struct gossip_msg_item);
+        HASH_DEL(s_gossip_last_msgs, l_payload_item);
         l_payload_item_new = DAP_REALLOC(l_payload_item, l_payload_item_size);
         if (!l_payload_item_new) {
             log_it(L_CRITICAL, "%s", c_error_memory_alloc);
             pthread_rwlock_unlock(&s_gossip_lock);
             break;
         }
-        HASH_DEL(s_gossip_last_msgs, l_payload_item);
         l_payload_item = l_payload_item_new;
         HASH_ADD_BYHASHVALUE(hh, s_gossip_last_msgs, payload_hash, sizeof(dap_hash_t), l_hash_value, l_payload_item);
         l_payload_item->with_payload = true;