diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 6f5403d431b1f072df23084709d57f4c2e069f5e..ec020ed75a6f71f883e5cb13f857fc4c40ae2425 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -90,6 +90,7 @@
 #include "dap_chain_net.h"
 #include "dap_chain_net_tx.h"
 #include "dap_chain_net_srv.h"
+#include "dap_chain_net_balancer.h"
 #include "dap_chain_pvt.h"
 #include "dap_chain_node_client.h"
 #include "dap_chain_node_cli.h"
@@ -271,6 +272,8 @@ static int s_cli_net(int argc, char ** argv, char **str_reply);
 static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash);
 static bool s_balancer_start_dns_request(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_info, bool a_link_replace);
 static bool s_balancer_start_http_request(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_info, bool a_link_replace);
+static void s_prepare_links_from_balancer(dap_chain_net_t *a_net);
+static bool s_new_balancer_link_request(dap_chain_net_t *a_net);
 
 static bool s_seed_mode = false;
 
@@ -695,15 +698,14 @@ static dap_chain_node_info_t *s_get_balancer_link_from_cfg(dap_chain_net_t *a_ne
         dap_chain_node_addr_t *l_remote_addr = dap_chain_node_alias_find(a_net, l_net_pvt->seed_aliases[i]);
         if (l_remote_addr){
             dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(a_net, l_remote_addr);
-            if(l_remote_node_info){
-                l_node_adrr = l_remote_node_info->hdr.address.uint64;
-                l_addr.s_addr = l_remote_node_info ? l_remote_node_info->hdr.ext_addr_v4.s_addr : 0;
-                DAP_DELETE(l_remote_node_info);
-                l_port = DNS_LISTEN_PORT;
-            }else{
+            if (l_remote_node_info) {
+                dap_chain_node_info_t *l_ret = l_remote_node_info->hdr.ext_addr_v4.s_addr ? l_remote_node_info : NULL;
+                if (!l_ret)
+                    DAP_DELETE(l_remote_node_info);
+                return l_ret;
+            } else
                 log_it(L_WARNING,"Can't find node info for node addr "NODE_ADDR_FP_STR,
                        NODE_ADDR_FP_ARGS(l_remote_addr));
-            }
         }else{
             log_it(L_WARNING,"Can't find alias info for seed alias %s",l_net_pvt->seed_aliases[i]);
         }
@@ -713,10 +715,6 @@ static dap_chain_node_info_t *s_get_balancer_link_from_cfg(dap_chain_net_t *a_ne
         l_addr = l_net_pvt->bootstrap_nodes_addrs[i];
         l_port = l_net_pvt->bootstrap_nodes_ports[i];
     }
-    if (!l_addr.s_addr){
-        log_it(L_WARNING,"Can't find address to connect at all");
-        return NULL;
-    }
     dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t);
     if(! l_link_node_info){
         log_it(L_CRITICAL,"Can't allocate memory for node link info");
@@ -1000,6 +998,14 @@ static void s_net_links_complete_and_start(dap_chain_net_t *a_net, dap_worker_t
     dap_chain_net_pvt_t * l_net_pvt = PVT(a_net);
     pthread_rwlock_rdlock(&l_net_pvt->balancer_lock);
     if (--l_net_pvt->balancer_link_requests == 0){ // It was the last one
+        // No links obtained from DNS
+        if (HASH_COUNT(l_net_pvt->net_links) == 0 && !l_net_pvt->balancer_http) {
+            // Try to get links from HTTP balancer
+            l_net_pvt->balancer_http = true;
+            s_prepare_links_from_balancer(a_net);
+             pthread_rwlock_unlock(&l_net_pvt->balancer_lock);
+             return;
+        }
         if (HASH_COUNT(l_net_pvt->net_links) < l_net_pvt->max_links_count)
             s_fill_links_from_root_aliases(a_net);  // Comlete the sentence
         pthread_rwlock_wrlock(&l_net_pvt->states_lock);
@@ -1032,15 +1038,9 @@ static void s_net_balancer_link_prepare_success(dap_worker_t * a_worker, dap_cha
     int l_res = s_net_link_add(l_net, a_node_info);
     if (l_res < 0) {    // Can't add this link
         debug_if(s_debug_more, L_DEBUG, "Can't add link "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address));
-        if (l_balancer_request->link_replace) {
+        if (l_balancer_request->link_replace)
             // Just try a new one
-            dap_chain_node_info_t *l_link_node_info = s_get_balancer_link_from_cfg(l_net);
-            if (l_link_node_info) {
-                if (!s_balancer_start_dns_request(l_net, l_link_node_info, true))
-                    log_it(L_ERROR, "Can't process node info dns request");
-                DAP_DELETE(l_link_node_info);
-            }
-        }
+            s_new_balancer_link_request(l_net);
     } else if (l_res == 0) {
         struct json_object *l_json = s_net_states_json_collect(l_net);
         char l_err_str[128] = { };
@@ -1096,6 +1096,8 @@ static void s_net_balancer_link_prepare_error(dap_worker_t * a_worker, void * a_
     json_object_put(l_json);
     if (!l_balancer_request->link_replace)
         s_net_links_complete_and_start(l_net, a_worker);
+    else
+        s_new_balancer_link_request(l_net);
     DAP_DELETE(l_node_info);
     DAP_DELETE(l_balancer_request);
 }
@@ -1106,18 +1108,10 @@ void s_net_http_link_prepare_success(void *a_response, size_t a_response_size, v
     struct balancer_link_request *l_balancer_request = (struct balancer_link_request *)a_arg;
     if (a_response_size != sizeof(dap_chain_node_info_t)) {
         log_it(L_ERROR, "Invalid balancer response size %zu (expect %zu)", a_response_size, sizeof(dap_chain_node_info_t));
-        dap_chain_net_t * l_net = l_balancer_request->net;
-        dap_chain_net_pvt_t * l_net_pvt = PVT(l_net);
-        if (!l_balancer_request->link_replace) {
-            if (l_net_pvt->balancer_link_requests)
-                l_net_pvt->balancer_link_requests--;
-        } else {
-            dap_chain_node_info_t *l_link_node_info = s_get_balancer_link_from_cfg(l_net);
-            s_balancer_start_http_request(l_net, l_link_node_info, true);
-        }
+        s_new_balancer_link_request(l_balancer_request->net);
         return;
     }
-    s_net_balancer_link_prepare_success(l_balancer_request->worker, (dap_chain_node_info_t *)&a_response, a_arg);
+    s_net_balancer_link_prepare_success(l_balancer_request->worker, (dap_chain_node_info_t *)a_response, a_arg);
 }
 
 void s_net_http_link_prepare_error(int a_error_code, void *a_arg)
@@ -1173,23 +1167,43 @@ static bool s_balancer_start_http_request(dap_chain_net_t *a_net, dap_chain_node
     l_balancer_request->link_info = DAP_DUP(a_link_node_info);
     l_balancer_request->worker = dap_events_worker_get_auto();
     l_balancer_request->link_replace = a_link_replace;
-    const char l_request[] = "/f0intlt4eyl03htogu?version=1,method=random";
-    int l_ret = dap_client_http_request(l_balancer_request->worker, l_node_addr_str, a_link_node_info->hdr.ext_port,
-                                        "GET", "text/text", DAP_UPLINK_PATH_BALANCER,
-                                        l_request, sizeof(l_request), NULL,
+    char *l_request = dap_strdup_printf("%s/%s?version=1,method=r,net=%s",
+                                           DAP_UPLINK_PATH_BALANCER,
+                                           DAP_BALANCER_URI_HASH,
+                                           a_net->pub.name);
+    if (dap_client_http_request(l_balancer_request->worker, l_node_addr_str, a_link_node_info->hdr.ext_port,
+                                        "GET", "text/text", l_request,
+                                        NULL, 0, NULL,
                                         s_net_http_link_prepare_success, s_net_http_link_prepare_error,
-                                        l_balancer_request, NULL);
-    if (l_ret) {
-        l_net_pvt->balancer_link_requests++;
-        return true;
+                                        l_balancer_request, NULL)) {
+        log_it(L_ERROR, "Can't process balancer link HTTP request");
+        DAP_DELETE(l_balancer_request->link_info);
+        DAP_DELETE(l_balancer_request);
+        DAP_DELETE(l_request);
+        return false;
     }
-    log_it(L_ERROR, "Can't process balancer link HTTP request");
-    DAP_DELETE(l_balancer_request->link_info);
-    DAP_DELETE(l_balancer_request);
-    return false;
+    DAP_DELETE(l_request);
+    l_net_pvt->balancer_link_requests++;
+    return true;
+}
+
+static bool s_new_balancer_link_request(dap_chain_net_t *a_net)
+{
+    bool ret = false;
+    dap_chain_node_info_t *l_link_node_info = s_get_balancer_link_from_cfg(a_net);
+    if (l_link_node_info) {
+        if (PVT(a_net)->balancer_http)
+            ret = s_balancer_start_http_request(a_net, l_link_node_info, true);
+        else {
+            l_link_node_info->hdr.ext_port = DNS_LISTEN_PORT;
+            ret = s_balancer_start_dns_request(a_net, l_link_node_info, true);
+        }
+        DAP_DELETE(l_link_node_info);
+    }
+    return ret;
 }
 
-static void s_prepare_links_from_balancer(dap_chain_net_t *a_net, bool a_over_http)
+static void s_prepare_links_from_balancer(dap_chain_net_t *a_net)
 {
     // Get list of the unique links for l_net
     size_t l_max_links_count = PVT(a_net)->max_links_count * 2;   // Not all will be success
@@ -1200,11 +1214,7 @@ static void s_prepare_links_from_balancer(dap_chain_net_t *a_net, bool a_over_ht
         if (!l_link_node_info)
             continue;
         // Start connect to link hubs
-        if (a_over_http)
-            s_balancer_start_http_request(a_net, l_link_node_info, false);
-        else
-            s_balancer_start_dns_request(a_net, l_link_node_info, false);
-        DAP_DELETE(l_link_node_info);
+        s_new_balancer_link_request(a_net);
         l_cur_links_count++;
     }
 }
@@ -1316,7 +1326,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
             }
             // Get DNS request result from root nodes as synchronization links
             if (!l_net_pvt->only_static_links)
-                s_prepare_links_from_balancer(l_net, false);
+                s_prepare_links_from_balancer(l_net);
             else {
                 log_it(L_ATT, "Not use bootstrap addresses, fill seed nodelist from root aliases");
                 // Add other root nodes as synchronization links
diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
new file mode 100644
index 0000000000000000000000000000000000000000..25528122362ffa64c2834b2ac3f6cee25655ced2
--- /dev/null
+++ b/modules/net/dap_chain_net_balancer.c
@@ -0,0 +1,118 @@
+/*
+* Authors:
+* Dmitriy Gerasimov <naeper@demlabs.net>
+* Cellframe       https://cellframe.net
+* DeM Labs Inc.   https://demlabs.net
+* Copyright  (c) 2017-2019
+* All rights reserved.
+
+This file is part of CellFrame SDK the open source project
+
+CellFrame SDK is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+CellFrame SDK is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "dap_chain_net_balancer.h"
+#include "dap_chain_net.h"
+#include "http_status_code.h"
+
+#define LOG_TAG "dap_chain_net_balancer"
+
+dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
+{
+    dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name);
+    if (l_net == NULL) {
+        uint16_t l_nets_count;
+        dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count);
+        if (!l_nets_count) {
+            log_it(L_WARNING, "No chain network present");
+            return NULL;
+        }
+        l_net = l_nets[rand() % l_nets_count];
+    }
+    // get nodes list from global_db
+    dap_global_db_obj_t *l_objs = NULL;
+    size_t l_nodes_count = 0;
+    // read all node
+    l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count);
+    if (!l_nodes_count || !l_objs)
+        return NULL;
+    dap_chain_node_info_t *l_node_candidate;
+    for (int i = 0; i < 50; i++) {
+        // 50 tryes for non empty address & port
+        size_t l_node_num = rand() % l_nodes_count;
+        l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value;
+        if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port)
+            break;
+    }
+    if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
+        return NULL;
+    dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t);
+    memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t));
+    dap_global_db_objs_delete(l_objs, l_nodes_count);
+    log_it(L_DEBUG, "Network balancer issues ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4));
+    return l_node_info;
+}
+
+void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg)
+{
+    log_it(L_DEBUG,"Proc enc http request");
+    http_status_code_t *l_return_code = (http_status_code_t *)a_arg;
+
+    if (strcmp(a_http_simple->http_client->url_path, DAP_BALANCER_URI_HASH)) {
+        log_it(L_ERROR, "Wrong path '%s' in the request to dap_chain_net_balancer module",
+                                                            a_http_simple->http_client->url_path);
+        *l_return_code = Http_Status_BadRequest;
+        return;
+    }
+    int l_protocol_version = 0;
+    char l_issue_method = 0;
+    const char l_net_token[] = "net=";
+    dap_sscanf(a_http_simple->http_client->in_query_string, "version=%d,method=%c,net=",
+                                                            &l_protocol_version, &l_issue_method);
+    if (l_protocol_version != 1 || l_issue_method != 'r') {
+        log_it(L_ERROR, "Unsupported prorocol version/method in the request to dap_chain_net_balancer module");
+        *l_return_code = Http_Status_MethodNotAllowed;
+        return;
+    }
+    char *l_net_str = strstr(a_http_simple->http_client->in_query_string, l_net_token);
+    if (!l_net_str) {
+        log_it(L_ERROR, "Net name token not found in the request to dap_chain_net_balancer module");
+        *l_return_code = Http_Status_NotFound;
+        return;
+    }
+    l_net_str += sizeof(l_net_token) - 1;
+    char l_net_name[128] = {};
+    strncpy(l_net_name, l_net_str, 127);
+    log_it(L_DEBUG, "HTTP balancer parser retrieve netname %s", l_net_name);
+    dap_chain_node_info_t *l_node_info = s_balancer_issue_link(l_net_name);
+    if (!l_node_info) {
+        log_it(L_WARNING, "Can't issue link for network %s, no acceptable links found", l_net_name);
+        *l_return_code = Http_Status_NotFound;
+        return;
+    }
+    *l_return_code = Http_Status_OK;
+    dap_http_simple_reply(a_http_simple, l_node_info, sizeof(*l_node_info));
+    DAP_DELETE(l_node_info);
+}
+
+/**
+ * @brief dap_dns_resolve_hostname
+ * @param str
+ * @return
+ */
+dap_chain_node_info_t *dap_chain_net_balancer_dns_issue_link(char *a_str)
+{
+    log_it(L_DEBUG, "DNS balancer parser retrieve netname %s", a_str);
+    return s_balancer_issue_link(a_str);
+}
diff --git a/modules/net/dap_chain_net_remote.c b/modules/net/dap_chain_net_remote.c
deleted file mode 100644
index 65ecddbf07ec61c836dcb3f52cca6c7c35d12f88..0000000000000000000000000000000000000000
--- a/modules/net/dap_chain_net_remote.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-* Authors:
-* Dmitriy Gerasimov <naeper@demlabs.net>
-* Cellframe       https://cellframe.net
-* DeM Labs Inc.   https://demlabs.net
-* Copyright  (c) 2017-2019
-* All rights reserved.
-
-This file is part of CellFrame SDK the open source project
-
-CellFrame SDK is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-CellFrame SDK is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/licenses/>.
-*/
-#include "dap_common.h"
-#include "dap_chain_net_remote.h"
-
-#define LOG_TAG "dap_chain_net_remote"
diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c
index 6529f934aff7f3c1cd0366a1072562e27690582b..04404537e8b3dd62802b9b0dd0b06d7b98d4cc9a 100644
--- a/modules/net/dap_chain_node_cli.c
+++ b/modules/net/dap_chain_node_cli.c
@@ -71,14 +71,6 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
         return 0;
     }
 
-#ifdef __WIN32
-    WSADATA wsaData;
-    int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
-    if (ret != 0) {
-        log_it(L_CRITICAL, "Couldn't init Winsock DLL, error: %d", ret);
-        return 2;
-    }
-#endif
     uint16_t l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port_tcp",0); // For backward compatibility
     if(l_listen_port == 0)
         l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port",0);
diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c
index a6863afee79cd3378f44b3a133d621a12e4cc628..1601f8087bb460b56600bee6a33653268f2f68a5 100644
--- a/modules/net/dap_chain_node_dns_client.c
+++ b/modules/net/dap_chain_node_dns_client.c
@@ -33,7 +33,6 @@
 struct dns_client
 {
     dap_events_socket_t * parent;
-    dap_chain_node_info_t *result;
     struct in_addr addr;
     uint16_t port;
     char *name;
@@ -96,7 +95,7 @@ static void s_dns_client_esocket_read_callback(dap_events_socket_t * a_esocket,
         l_result.hdr.address.uint64 = be64toh(*(uint64_t *)l_cur);
     }
 
-    l_dns_client->callback_success(a_esocket->context->worker,l_dns_client->result,l_dns_client->callbacks_arg);
+    l_dns_client->callback_success(a_esocket->context->worker ,&l_result, l_dns_client->callbacks_arg);
     l_dns_client->is_callbacks_called = true;
     a_esocket->flags |= DAP_SOCK_SIGNAL_CLOSE;
     a_esocket->buf_in_size = a_esocket->buf_out_size = 0;
diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c
index 1c5c06078fc5a2bb0983cefaa59df3c9efcee51c..6b04324e136d5822d88220bbdc1a18a3094f8a5f 100644
--- a/modules/net/dap_chain_node_dns_server.c
+++ b/modules/net/dap_chain_node_dns_server.c
@@ -33,6 +33,7 @@
 #include "dap_string.h"
 #include "dap_global_db.h"
 #include "dap_chain_global_db_remote.h"
+#include "dap_chain_net_balancer.h"
 
 #define LOG_TAG "dap_chain_node_dns_server"
 #define BUF_SIZE 1024
@@ -266,7 +267,7 @@ void dap_dns_server_start( uint16_t a_port)
         log_it(L_ERROR, "Can't start DNS server");
         return;
     }
-    dap_dns_zone_register(&s_root_alias[0], dap_dns_resolve_hostname);  // root resolver
+    dap_dns_zone_register(&s_root_alias[0], dap_chain_net_balancer_dns_issue_link);  // root resolver
     log_it(L_NOTICE,"DNS server started");
 }
 
@@ -284,45 +285,3 @@ void dap_dns_server_stop() {
     dap_server_delete(s_dns_server->instance);
     DAP_DELETE(s_dns_server);
 }
-
-/**
- * @brief dap_dns_resolve_hostname
- * @param str
- * @return
- */
-dap_chain_node_info_t *dap_dns_resolve_hostname(char *str)
-{
-    log_it(L_DEBUG, "DNS parser retrieve hostname %s", str);
-    dap_chain_net_t *l_net = dap_chain_net_by_name(str);
-    if (l_net == NULL) {
-        uint16_t l_nets_count;
-        dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count);
-        if (!l_nets_count) {
-            log_it(L_WARNING, "No chain network present");
-            return NULL;
-        }
-        l_net = l_nets[rand() % l_nets_count];
-    }
-    // get nodes list from global_db
-    dap_global_db_obj_t *l_objs = NULL;
-    size_t l_nodes_count = 0;
-    // read all node
-    l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count);
-    if (!l_nodes_count || !l_objs)
-        return NULL;
-    dap_chain_node_info_t *l_node_candidate;
-    for (int i = 0; i < 50; i++) {
-        // 50 tryes for non empty address & port
-        size_t l_node_num = rand() % l_nodes_count;
-        l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value;
-        if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port)
-            break;
-    }
-    if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
-        return NULL;
-    dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t);
-    memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t));
-    dap_global_db_objs_delete(l_objs, l_nodes_count);
-    log_it(L_DEBUG, "DNS resolver find ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4));
-    return l_node_info;
-}
diff --git a/modules/net/include/dap_chain_net_remote.h b/modules/net/include/dap_chain_net_balancer.h
similarity index 70%
rename from modules/net/include/dap_chain_net_remote.h
rename to modules/net/include/dap_chain_net_balancer.h
index e3e35be850eb3ec77cc4bc2d27ee4867abc52230..9b4f5450788d017552176ac2407143ec0ae055c2 100644
--- a/modules/net/include/dap_chain_net_remote.h
+++ b/modules/net/include/dap_chain_net_balancer.h
@@ -1,9 +1,9 @@
 /*
 * Authors:
-* Dmitriy Gerasimov <naeper@demlabs.net>
+* Roman Khlopkov <roman.khlopkov@demlabs.net>
 * Cellframe       https://cellframe.net
 * DeM Labs Inc.   https://demlabs.net
-* Copyright  (c) 2017-2019
+* Copyright  (c) 2017-2022
 * All rights reserved.
 
 This file is part of CellFrame SDK the open source project
@@ -23,9 +23,10 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 */
 #pragma once
 
-#include "dap_chain_common.h"
+#include "dap_chain_node.h"
+#include "dap_http_simple.h"
 
-typedef struct dap_chain_net_remote {
-    dap_chain_node_addr_t remote_addr;
-    char                  remote_channel;
-} dap_chain_net_remote_t;
+#define DAP_BALANCER_URI_HASH "f0intlt4eyl03htogu"
+
+void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg);
+dap_chain_node_info_t *dap_chain_net_balancer_dns_issue_link(char *a_str);
diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h
index c621b8df2b0f19f6a9297406353dc4ea0c06ebc3..94984ee154555b6f3d010f2909eeb834f0d26770 100755
--- a/modules/net/srv/include/dap_chain_net_srv.h
+++ b/modules/net/srv/include/dap_chain_net_srv.h
@@ -27,7 +27,6 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_chain_net.h"
 #include "dap_chain_common.h"
 #include "dap_chain_datum_decree.h"
-#include "dap_chain_net_remote.h"
 #include "dap_chain_wallet.h"
 #include "dap_common.h"
 #include "dap_config.h"
@@ -195,7 +194,6 @@ typedef struct dap_chain_net_srv_client_remote
     time_t ts_created;
     dap_stream_worker_t * stream_worker;
     int session_id;
-    dap_chain_net_remote_t *net_remote; // For remotes
     uint64_t bytes_received;
     uint64_t bytes_sent;
     struct dap_chain_net_srv_client_remote *prev;
diff --git a/modules/net/srv/include/dap_chain_net_srv_client.h b/modules/net/srv/include/dap_chain_net_srv_client.h
index 815880d96824eae4984a056b40cfda809d85919b..b5da5a6b9532e5eda2ef87124830cbd16de2bebe 100644
--- a/modules/net/srv/include/dap_chain_net_srv_client.h
+++ b/modules/net/srv/include/dap_chain_net_srv_client.h
@@ -30,7 +30,6 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 #include "dap_enc_key.h"
 #include "dap_stream_worker.h"
 #include "dap_chain_net_srv.h"
-#include "dap_chain_net_remote.h"
 #include "dap_chain_node_client.h"
 
 typedef struct dap_chain_net_srv_client dap_chain_net_srv_client_t;