diff --git a/avrestream/avrestream.c b/avrestream/avrestream.c
index 56e8d6deeb559040a9fc2bf59408dc106d50d9c6..6991adcd03b22d9b2665c4054eec7ae30f1526eb 100644
--- a/avrestream/avrestream.c
+++ b/avrestream/avrestream.c
@@ -33,7 +33,7 @@
 
 #ifdef  DAP_SYS_DEBUG
     #ifndef DAP_VERSION
-        #define DAP_VERSION 0.9-15
+        #define DAP_VERSION "0.9-15"
     #endif
 #endif
 
diff --git a/core/src/dap_common.c b/core/src/dap_common.c
index 75ff8be87c6ab952e30683783b9e67fb6d789de3..e0059835b68a663307d113516c8920b984220ce6 100755
--- a/core/src/dap_common.c
+++ b/core/src/dap_common.c
@@ -152,7 +152,7 @@ static char s_last_error[LAST_ERROR_MAX]    = {'\0'},
 static enum dap_log_level s_dap_log_level = L_DEBUG;
 static FILE *s_log_file = NULL;
 
-#define LOG_FORMAT_LEN 12800
+#define LOG_FORMAT_LEN 4096
 
 static char* s_appname = NULL;
 
@@ -317,7 +317,7 @@ int dap_common_init( const char *a_console_title, const char *a_log_file_path, c
             fprintf( stderr, "Can't open log file %s \n", a_log_file_path );
             return -1;   //switch off show log in cosole if file not open
         }
-        setvbuf(s_log_file, NULL, _IOLBF, LOG_FORMAT_LEN * 4);
+        setvbuf(s_log_file, NULL, _IOLBF, LOG_FORMAT_LEN / 2);
         if (a_log_dirpath != s_log_dir_path)
             dap_stpcpy(s_log_dir_path,  a_log_dirpath);
         if (a_log_file_path != s_log_file_path)
@@ -390,7 +390,7 @@ void _log_it(const char * func_name, int line_num, const char *a_log_tag, enum d
             ? snprintf(s_format + offset, LOG_FORMAT_LEN - offset,"%s[%s][%s:%d] %s\n", s_log_level_tag[a_ll], a_log_tag, func_name, line_num, a_fmt)
             : snprintf(s_format + offset, LOG_FORMAT_LEN - offset, "%s[%s] %s\n", s_log_level_tag[a_ll], a_log_tag, a_fmt);
     if (offset >= LOG_FORMAT_LEN) {
-        return;
+        dap_strncpy(s_format + LOG_FORMAT_LEN - 5, "...\n", 4);
     }
     va_list va;
     va_start(va, a_fmt);
diff --git a/core/src/dap_strfuncs.c b/core/src/dap_strfuncs.c
index 9c153339f84dc5ab4ea1661631620a344e7f0770..06fe9371edca191e38a95682c5b32c003cf66988 100755
--- a/core/src/dap_strfuncs.c
+++ b/core/src/dap_strfuncs.c
@@ -421,13 +421,14 @@ char *dap_strncpy(char *a_dst, const char *a_src, size_t a_limit)
 {
     dap_return_val_if_fail(a_dst && a_src, NULL);
     do {
-        *a_dst++ = *a_src;
-        a_limit--;
-    } while (*a_src++ != '\0' && a_limit);
-    --a_dst;
-    if (*a_dst != '\0')
-        *a_dst = '\0';
-    return a_dst;
+        if (a_limit--)
+            *a_dst++ = *a_src;
+        else {
+            *a_dst++ = '\0';
+            break;
+        }
+    } while (*a_src++ != '\0');
+    return --a_dst;
 }
 
 /**
diff --git a/global-db/include/dap_global_db_driver.h b/global-db/include/dap_global_db_driver.h
index bf75c43c284e560f320a525058996089fb888fc9..42fb98225f3c7be2835678620b62b5aa2c176694 100644
--- a/global-db/include/dap_global_db_driver.h
+++ b/global-db/include/dap_global_db_driver.h
@@ -95,7 +95,7 @@ DAP_STATIC_INLINE int dap_store_obj_driver_hash_compare(dap_store_obj_t *a_obj1,
 
 DAP_STATIC_INLINE const char *dap_global_db_driver_hash_print(dap_global_db_driver_hash_t a_hash)
 {
-    return dap_uint128_to_hex_str(*(uint128_t *)&a_hash);
+    return dap_uint128_to_hex_str(GET_128_FROM_64_64(a_hash.becrc, a_hash.bets));
 }
 
 extern const dap_global_db_driver_hash_t c_dap_global_db_driver_hash_blank;
diff --git a/io/dap_events_socket.c b/io/dap_events_socket.c
index c338c5986ebe1e323f41f757b032ae9c464684f1..bb366824ca8ceb728536c776c19d72777d92a035 100644
--- a/io/dap_events_socket.c
+++ b/io/dap_events_socket.c
@@ -1440,7 +1440,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *a_esocket, bool
                 .sin_addr   = {{ .S_addr = INADDR_ANY }}
             };
             if ( bind(a_esocket->socket, (PSOCKADDR)&l_addr_any, sizeof(l_addr_any)) == SOCKET_ERROR ) {
-                log_it(L_ERROR, "Failed to create socket for accept()'ing, errno %d", WSAGetLastError());
+                log_it(L_ERROR, "Failed to create socket for connect()'ing, errno %d", WSAGetLastError());
                 return;
             }
             l_res   = pfn_ConnectEx(a_esocket->socket, (PSOCKADDR)&a_esocket->addr_storage, sizeof(SOCKADDR),
diff --git a/io/dap_net.c b/io/dap_net.c
index be9da69cf36c63f0fd98a29eb9c12fe7200da50f..ae510726d6092f45dcab76c9b9f9b2e172cb816a 100644
--- a/io/dap_net.c
+++ b/io/dap_net.c
@@ -26,57 +26,81 @@
 #include <errno.h>
 #include <string.h>
 #include "dap_net.h"
-
+#include "dap_strfuncs.h"
 #define LOG_TAG "dap_net"
 
 #ifdef _WIN32
   #define poll WSAPoll
 #endif
 
-/**
- * @brief dap_net_resolve_host
- * @param a_host hostname
- * @param ai_family AF_INET  for ipv4 or AF_INET6 for ipv6
- * @param a_addr_out out addr (struct in_addr or struct in6_addr)
- * @param return 0 of OK, <0 Error
- */
-int dap_net_resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out)
+int dap_net_resolve_host(const char *a_host, const char *a_port, struct sockaddr_storage *a_addr_out, bool a_passive_flag)
 {
-    struct addrinfo l_hints, *l_res;
-    void *l_cur_addr = NULL;
+    dap_return_val_if_fail(a_addr_out && a_host, -1);
+    int l_ret = 0;
+    struct addrinfo l_hints = {
+        .ai_flags   = a_passive_flag
+            ? AI_CANONNAME | AI_PASSIVE | AI_V4MAPPED | AI_ADDRCONFIG
+            : AI_CANONNAME | AI_V4MAPPED | AI_ADDRCONFIG,
+        .ai_family  = AF_UNSPEC,
+        .ai_socktype= SOCK_STREAM,
+    }, *l_res;
 
-    memset(&l_hints, 0, sizeof(l_hints));
-    l_hints.ai_family = ai_family == AF_INET ? PF_INET : PF_INET6;
-    l_hints.ai_socktype = SOCK_STREAM;
-    l_hints.ai_flags = AI_CANONNAME;
+    if (( l_ret = getaddrinfo(a_host, a_port, &l_hints, &l_res) ))
+        return l_ret;
 
-    int l_res_code = getaddrinfo(a_host, NULL, &l_hints, &l_res);
-    if (l_res_code)
-        return l_res_code;
-
-    while(l_res)
+    // for (struct addrinfo *l_res_it = l_res; l_res_it; l_res_it = l_res_it->ai_next) // What shall we do?
     {
-        if(ai_family == l_res->ai_family)
-            switch (l_res->ai_family)
-            {
-            case AF_INET:
-                l_cur_addr = &((struct sockaddr_in *) l_res->ai_addr)->sin_addr;
-                memcpy(a_addr_out, l_cur_addr, sizeof(struct in_addr));
-                break;
-            case AF_INET6:
-                l_cur_addr = &((struct sockaddr_in6 *) l_res->ai_addr)->sin6_addr;
-                memcpy(a_addr_out, l_cur_addr, sizeof(struct in6_addr));
-                break;
-            }
-        if(l_cur_addr) {
-            freeaddrinfo(l_res);
-            return 0;
-        }
-        l_res = l_res->ai_next;
+        memset(a_addr_out, 0, sizeof(*a_addr_out));
+        memcpy(a_addr_out, l_res->ai_addr, l_res->ai_addrlen);
+    }
+    freeaddrinfo(l_res);
+    return 0;
+}
+
+
+int dap_net_parse_hostname(const char *a_src, char *a_addr, uint16_t *a_port) {
+    if (!a_src)
+        return -1;
+    if (!a_addr && !a_port)
+        return log_it(L_ERROR, "No output buffers provided!"), -2;
+        
+    char l_type = 0, *l_cpos = NULL, *l_bpos = NULL;
+    /*  
+        type 4,5 - hostname or IPv4 (no port, with port)
+        type 6,7 - IPv6 (no port, with port)
+    */
+    if ((l_cpos = strrchr(a_src, ':') )) {
+        l_type = strchr(a_src, ':') == l_cpos ? 5 : 6;
+    } else
+        l_type = 4;
+
+    if (*a_src == '[') {   // It's likely an IPv6 with port, see https://www.ietf.org/rfc/rfc2732.txt
+        if ( l_type != 6 || !(l_bpos = strrchr(a_src, ']')) || l_cpos < l_bpos )
+            return -1;
+        a_src++;
+        l_type = 7;
+    } else if ( (l_bpos = strrchr(a_src, ']')) )
+        return -1;
+    
+    int l_len;
+    switch (l_type) {
+    case 4:
+    case 6:
+        l_len = strlen(a_src);
+        if (a_port)
+            *a_port = 0;
+        break;
+    case 5:
+        l_bpos = l_cpos;
+    case 7:
+        if (a_port)
+            *a_port = strtoul(l_cpos + 1, NULL, 10);
+        l_len = l_bpos - a_src;
+        break;
+    default:
+        return -1;
     }
-    if (l_res)
-        freeaddrinfo(l_res);
-    return -1;
+    return l_len > 0xFF ? -2 : ( dap_strncpy(a_addr, a_src, l_len), 0 );
 }
 
 /**
diff --git a/io/dap_server.c b/io/dap_server.c
index d2e24dba8839cf2086ef34b1a8afdf9a7c8db783..4aa2e8dec0c5f2fe011ca927dc7c4ab3a95382bd 100644
--- a/io/dap_server.c
+++ b/io/dap_server.c
@@ -70,6 +70,7 @@
 #include "dap_server.h"
 #include "dap_worker.h"
 #include "dap_events.h"
+#include "dap_net.h"
 #include "dap_strfuncs.h"
 
 #define LOG_TAG "dap_server"
@@ -236,16 +237,13 @@ int dap_server_listen_addr_add(dap_server_t *a_server, const char *a_addr, uint1
         log_it(L_WARNING, "Can't set up REUSEPORT flag to the socket");
 #endif
 
-    struct addrinfo l_hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }, *l_addr_res;
-    if ( getaddrinfo(a_addr, dap_itoa(l_es->listener_port), &l_hints, &l_addr_res) ) {
+    if ( dap_net_resolve_host(a_addr, dap_itoa(l_es->listener_port), &l_es->addr_storage, true) ) {
         log_it(L_ERROR, "Wrong listen address '%s : %u'", a_addr, l_es->listener_port);
         goto clean_n_quit;
     }
-    memcpy(&l_es->addr_storage, l_addr_res->ai_addr, l_addr_res->ai_addrlen);
-    freeaddrinfo(l_addr_res);
 
     if (a_server->type != DAP_SERVER_LOCAL) {
-        strncpy(l_es->listener_addr_str, a_addr, sizeof(l_es->listener_addr_str)); // If NULL we listen everything
+        dap_strncpy(l_es->listener_addr_str, a_addr, INET6_ADDRSTRLEN - 1); // If NULL we listen everything
     }
 #ifdef DAP_OS_UNIX
     else {
@@ -306,35 +304,17 @@ dap_server_t *dap_server_new(char **a_addrs, uint16_t a_count, dap_server_type_t
     };
 
     l_server->type = a_type;
-    char l_curr_ip[INET6_ADDRSTRLEN] = {0};
-// func work
-    for(size_t i = 0; i < a_count; ++i) {
-        // parsing full addr
-        int l_ret = -1;
+    char l_cur_ip[INET6_ADDRSTRLEN] = { '\0' }; uint16_t l_cur_port = 0;
+
+    for (size_t i = 0; i < a_count; ++i) {
+        int l_add_res = 0;
         if (l_server->type != DAP_SERVER_LOCAL) {
-            const char *l_curr_port_str = strstr(a_addrs[i], ":");
-            uint16_t l_curr_port = 0;
-            if (l_curr_port_str) {
-                memset(l_curr_ip, 0, sizeof(l_curr_ip));
-                strncpy(l_curr_ip, a_addrs[i], dap_min((size_t)(l_curr_port_str - a_addrs[i]), sizeof(l_curr_ip) - 1));
-                l_curr_port = atol(++l_curr_port_str);
-            } else {
-                l_curr_port = atol(a_addrs[i]);
+            if ( dap_net_parse_hostname(a_addrs[i], l_cur_ip, &l_cur_port) )
+                log_it( L_ERROR, "Incorrect format of address \"%s\", fix net config and restart node", a_addrs[i] );
+            else {
+                if (( l_add_res = dap_server_listen_addr_add(l_server, l_cur_ip, l_cur_port, &l_callbacks) ))
+                    log_it( L_ERROR, "Can't add address \"%s : %u\" to listen in server, errno %d", l_cur_ip, l_cur_port, l_add_res);
             }
-            switch (l_server->type) {
-                case DAP_SERVER_TCP:
-                case DAP_SERVER_UDP:
-                    if (!l_curr_ip[0])
-                        strcpy(l_curr_ip, "0.0.0.0");  // If NULL we listen everything
-                    break;
-                case DAP_SERVER_TCP_V6:
-                    if (!l_curr_ip[0])
-                        strcpy(l_curr_ip, "::0");
-                    break;
-                default:
-                    break;
-            }
-            l_ret = dap_server_listen_addr_add(l_server, l_curr_ip, l_curr_port, &l_callbacks);
         }
 #ifdef DAP_OS_UNIX
         else {
@@ -348,12 +328,14 @@ dap_server_t *dap_server_new(char **a_addrs, uint16_t a_count, dap_server_type_t
                 strncpy(l_curr_path, a_addrs[i], dap_min((size_t)(l_curr_mode_str - a_addrs[i]), sizeof(l_curr_path) - 1));
                 sscanf(l_curr_mode_str,"%ou", &l_listen_unix_socket_permissions );
             }
-            l_ret = dap_server_listen_addr_add(l_server, l_curr_path, l_listen_unix_socket_permissions, &l_callbacks);
+            if (( l_add_res = dap_server_listen_addr_add(l_server, l_curr_path, l_listen_unix_socket_permissions, &l_callbacks) )) {
+                log_it( L_ERROR, "Can't add path \"%s ( %d )\" to listen in server, errno %d",
+                        l_curr_path, l_listen_unix_socket_permissions, l_add_res );
+            }
         }
 #endif
-        if (l_ret)
-            continue;
     }
+
     if (!l_server->es_listeners) {
         log_it(L_ERROR, "Server not created");
         DAP_DELETE(l_server);
@@ -486,7 +468,7 @@ static void s_es_server_accept(dap_events_socket_t *a_es_listener, SOCKET a_remo
     }
     l_es_new = dap_events_socket_wrap_no_add(a_remote_socket, &l_server->client_callbacks);
     l_es_new->server = l_server;
-    unsigned short int l_family = a_remote_addr->ss_family;
+    unsigned short l_family = a_remote_addr->ss_family;
     
     l_es_new->type = DESCRIPTOR_TYPE_SOCKET_CLIENT;
     l_es_new->addr_storage = *a_remote_addr;
diff --git a/io/include/dap_net.h b/io/include/dap_net.h
index 3a5c8350eb4cc0a172f62275f9518d710c84f490..6e9c69cddfee07c18aff94ceaebf1394ff8faa3e 100644
--- a/io/include/dap_net.h
+++ b/io/include/dap_net.h
@@ -45,5 +45,6 @@
 #include "dap_common.h"
 #include "dap_events_socket.h"
 
-int dap_net_resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out);
+int dap_net_resolve_host(const char *a_host, const char *a_port, struct sockaddr_storage *a_addr_out, bool a_passive_flag);
+int dap_net_parse_hostname(const char *a_src, char *a_addr, uint16_t *a_port);
 long dap_net_recv(SOCKET sd, unsigned char *buf, size_t bufsize, int timeout);
diff --git a/net/client/dap_client_http.c b/net/client/dap_client_http.c
index 5b7adb4850decd7834b399c0ccc6ceb44d2cbd70..b088bec927bc3ee3d13c4721bd665c15ef5bef33 100644
--- a/net/client/dap_client_http.c
+++ b/net/client/dap_client_http.c
@@ -609,7 +609,7 @@ dap_client_http_t * dap_client_http_request_custom (
         l_client_http->request_size = a_request_size;
         memcpy(l_client_http->request, a_request, a_request_size);
     }
-    strncpy(l_client_http->uplink_addr, a_uplink_addr, INET_ADDRSTRLEN - 1);
+    dap_strncpy(l_client_http->uplink_addr, a_uplink_addr, 0xFF);
     l_client_http->uplink_port = a_uplink_port;
     l_client_http->cookie = a_cookie;
     l_client_http->request_custom_headers = dap_strdup(a_custom_headers);
@@ -625,20 +625,17 @@ dap_client_http_t * dap_client_http_request_custom (
     l_client_http->worker = a_worker;
     l_client_http->is_over_ssl = a_over_ssl;
 
-    struct addrinfo l_hints = { .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }, *l_addr_res;
-    if ( getaddrinfo(a_uplink_addr, dap_itoa(a_uplink_port), &l_hints, &l_addr_res) ) {
+    if ( dap_net_resolve_host(a_uplink_addr, dap_itoa(a_uplink_port), &l_ev_socket->addr_storage, false) ) {
         log_it(L_ERROR, "Wrong remote address '%s : %u'", a_uplink_addr, a_uplink_port);
             s_client_http_delete(l_client_http);
             l_ev_socket->_inheritor = NULL;
             dap_events_socket_delete_unsafe( l_ev_socket, true);
             if(a_error_callback)
                 a_error_callback(errno, a_callbacks_arg);
-            return NULL;
+        return NULL;
     }
-    memcpy(&l_ev_socket->addr_storage, l_addr_res->ai_addr, l_addr_res->ai_addrlen);
-    freeaddrinfo(l_addr_res);
 
-    strncpy(l_ev_socket->remote_addr_str, a_uplink_addr, INET6_ADDRSTRLEN);
+    dap_strncpy(l_ev_socket->remote_addr_str, a_uplink_addr, INET6_ADDRSTRLEN - 1);
     l_ev_socket->remote_port = a_uplink_port;
 
     // connect
diff --git a/net/client/dap_client_pvt.c b/net/client/dap_client_pvt.c
index 059e7ba9e60391f0cc33c468cb19922992b31e9e..5dc015ecc4df9c4895cfb05e9fa975bcf1ad1178 100644
--- a/net/client/dap_client_pvt.c
+++ b/net/client/dap_client_pvt.c
@@ -55,6 +55,7 @@
 #include "dap_stream_ch_pkt.h"
 #include "dap_stream_pkt.h"
 #include "dap_http_client.h"
+#include "dap_net.h"
 #include "dap_link_manager.h"
 
 #define LOG_TAG "dap_client_pvt"
@@ -383,7 +384,7 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt)
                 case STAGE_ENC_INIT: {
                     log_it(L_INFO, "Go to stage ENC: prepare the request");
 
-                    if (!a_client_pvt->client->uplink_addr || !a_client_pvt->client->uplink_addr[0] || !a_client_pvt->client->uplink_port) {
+                    if (!a_client_pvt->client->uplink_addr || !*a_client_pvt->client->uplink_addr || !a_client_pvt->client->uplink_port) {
                         log_it(L_ERROR, "Wrong remote address %s : %u", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port);
                         a_client_pvt->stage_status = STAGE_STATUS_ERROR;
                         a_client_pvt->last_error = ERROR_WRONG_ADDRESS;
@@ -516,19 +517,20 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt)
                     l_es->flags |= DAP_SOCK_READY_TO_WRITE;
                 #endif
                     l_es->_inheritor = a_client_pvt->client;
-                    struct addrinfo l_hints = (struct addrinfo){ .ai_family = AF_UNSPEC, .ai_socktype = SOCK_STREAM }, *l_addr_res;
-                    if ( getaddrinfo(a_client_pvt->client->uplink_addr, dap_itoa(a_client_pvt->client->uplink_port), &l_hints, &l_addr_res) ) {
+                    if ( dap_net_resolve_host(a_client_pvt->client->uplink_addr,
+                                              dap_itoa(a_client_pvt->client->uplink_port),
+                                              &l_es->addr_storage,
+                                              false)
+                    ) {
                         log_it(L_ERROR, "Wrong remote address '%s : %u'", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port);
                         a_client_pvt->stage_status = STAGE_STATUS_ERROR;
                         a_client_pvt->last_error = ERROR_WRONG_ADDRESS;
                         s_stage_status_after(a_client_pvt);
                         break;
                     }
-                    memcpy(&l_es->addr_storage, l_addr_res->ai_addr, l_addr_res->ai_addrlen);
-                    freeaddrinfo(l_addr_res);
 
                     l_es->remote_port = a_client_pvt->client->uplink_port;
-                    strncpy(l_es->remote_addr_str, a_client_pvt->client->uplink_addr, INET_ADDRSTRLEN);
+                    dap_strncpy(l_es->remote_addr_str, a_client_pvt->client->uplink_addr, 0xFF);
 
                     a_client_pvt->stream = dap_stream_new_es_client(l_es, &DAP_LINK(a_client_pvt->client)->node_addr);
                     a_client_pvt->stream->authorized = a_client_pvt->authorized;
@@ -542,7 +544,7 @@ static void s_stage_status_after(dap_client_pvt_t *a_client_pvt)
 
                     // connect
                 #ifdef DAP_EVENTS_CAPS_IOCP
-                    log_it(L_DEBUG, "Stream connecting to remote %s:%u", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port);
+                    log_it(L_DEBUG, "Stream connecting to remote %s : %u", a_client_pvt->client->uplink_addr, a_client_pvt->client->uplink_port);
                     dap_worker_add_events_socket(l_worker, a_client_pvt->stream_es);
                     dap_events_socket_uuid_t *l_stream_es_uuid_ptr = DAP_NEW_Z(dap_events_socket_uuid_t);
                     *l_stream_es_uuid_ptr = a_client_pvt->stream_es->uuid;
diff --git a/net/client/include/dap_client.h b/net/client/include/dap_client.h
index d388eba247623585faf4ddb479c5b0df8896b617..141df2914237da8f741cbbd8d8ea655daffbf191 100644
--- a/net/client/include/dap_client.h
+++ b/net/client/include/dap_client.h
@@ -83,7 +83,7 @@ typedef void (*dap_client_callback_data_size_t) (dap_client_t *, void *, size_t)
 typedef struct dap_client {
     char *active_channels;
 
-    char uplink_addr[INET6_ADDRSTRLEN];;
+    char uplink_addr[0xFF + 1];
     uint16_t uplink_port;
 
     dap_cert_t *auth_cert;
diff --git a/net/client/include/dap_client_http.h b/net/client/include/dap_client_http.h
index 686f0b74f5066d21a24f413ded10d4231cdd2b6a..373ef00cafdfa221492ece6790506860df61db09 100644
--- a/net/client/include/dap_client_http.h
+++ b/net/client/include/dap_client_http.h
@@ -56,7 +56,7 @@ typedef struct dap_client_http {
     size_t response_size_max;
 
     // Request args
-    char uplink_addr[INET_ADDRSTRLEN];
+    char uplink_addr[0xFF + 1];
     uint16_t uplink_port;
     char *method;
     char *request_content_type;
diff --git a/net/link_manager/dap_link_manager.c b/net/link_manager/dap_link_manager.c
index 5e1dcbfd54ff3110637981cde6f110da4bb784b3..1d05f0b5d22fef53e0fa0bcc0e140fd76e94814e 100644
--- a/net/link_manager/dap_link_manager.c
+++ b/net/link_manager/dap_link_manager.c
@@ -474,7 +474,7 @@ void dap_link_manager_set_net_status(uint64_t a_net_id, bool a_status)
 void dap_link_manager_add_links_cluster(dap_stream_node_addr_t *a_addr, dap_cluster_t *a_cluster)
 {
     dap_return_if_pass(!s_link_manager || !a_addr || !a_cluster);
-    dap_link_t *l_link = dap_link_manager_link_create_or_update(a_addr, NULL, NULL, 0);
+    dap_link_t *l_link = dap_link_manager_link_create_or_update(a_addr, NULL, 0);
     l_link->links_clusters = dap_list_append(l_link->links_clusters, a_cluster);
     dap_list_t *l_item = NULL;
     if (a_cluster->role == DAP_CLUSTER_ROLE_EMBEDDED)
@@ -527,8 +527,7 @@ void dap_link_manager_remove_links_cluster(dap_stream_node_addr_t *a_addr, dap_c
  * @param a_port - host port
  * @return if ERROR null, other - pointer to dap_link_t
  */
-dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, 
-    struct in_addr *a_addr_v4, struct in6_addr *a_addr_v6, uint16_t a_port)
+dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, const char *a_host, uint16_t a_port)
 {
 // sanity check
     dap_return_val_if_pass(!a_node_addr || !a_node_addr->uint64, NULL);
@@ -543,24 +542,22 @@ dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_nod
                 pthread_rwlock_unlock(&s_link_manager->links_lock);
                 return NULL;
             }
-            l_ret->node_addr.uint64 = a_node_addr->uint64;
-            l_ret->link_manager = s_link_manager;
-            l_ret->client = dap_client_new(s_client_delete_callback, s_client_error_callback, NULL);
-            dap_client_set_is_always_reconnect(l_ret->client, false);
-            dap_client_set_active_channels_unsafe(l_ret->client, "CGND");
+            dap_client_t *l_client = dap_client_new(s_client_delete_callback, s_client_error_callback, NULL);
+            dap_client_set_is_always_reconnect(l_client, false);
+            dap_client_set_active_channels_unsafe(l_client, "CGND");
+            *l_ret = (dap_link_t) {
+                .node_addr.uint64 = a_node_addr->uint64,
+                .client = l_client,
+                .link_manager = s_link_manager
+            };
             l_ret->client->_inheritor = l_ret;
             HASH_ADD(hh, s_link_manager->links, node_addr, sizeof(l_ret->node_addr), l_ret);
         }
-        // fill addr
-        if(a_addr_v4 && a_addr_v4->s_addr){
-            inet_ntop(AF_INET, a_addr_v4, l_ret->client->uplink_addr, INET_ADDRSTRLEN);
-        } else if (a_addr_v6) {
-            inet_ntop(AF_INET6, a_addr_v6, l_ret->client->uplink_addr, INET6_ADDRSTRLEN);
-        }
+        if (a_host)
+            dap_strncpy(l_ret->client->uplink_addr, a_host, 0xFF);
         if (a_port)
             l_ret->client->uplink_port = a_port;
-        l_ret->node_addr.uint64 = a_node_addr->uint64;
-        l_ret->valid = l_ret->client->uplink_port && (strlen(l_ret->client->uplink_addr) && strcmp(l_ret->client->uplink_addr, "::"));
+        l_ret->valid = l_ret->client->uplink_addr && *l_ret->client->uplink_addr && l_ret->client->uplink_port && dap_strcmp(a_host, "::");
         if (l_ret->valid) {
             log_it(L_INFO, "Create link to node " NODE_ADDR_FP_STR " with address %s : %d", NODE_ADDR_FP_ARGS_S(l_ret->node_addr), l_ret->client->uplink_addr, l_ret->client->uplink_port);
         }
@@ -612,7 +609,7 @@ int dap_link_manager_downlink_add(dap_stream_node_addr_t *a_node_addr)
 // sanity check
     dap_return_val_if_pass(!a_node_addr || !a_node_addr->uint64 || !s_link_manager->active || !s_check_active_nets(), -1);
 // func work
-    dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, NULL, 0);
+    dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, 0);
     if (l_link->state != LINK_STATE_DISCONNECTED) {
         log_it(L_WARNING, "Get dowlink from "NODE_ADDR_FP_STR" with existed link", NODE_ADDR_FP_ARGS(a_node_addr));
         return -3;
@@ -689,7 +686,7 @@ void dap_link_manager_add_static_links_cluster(dap_stream_node_addr_t *a_node_ad
     dap_return_if_pass_err(!s_link_manager, s_init_error);
     dap_return_if_pass(!a_node_addr || !a_cluster);
 // func work
-    dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, NULL, 0);
+    dap_link_t *l_link = dap_link_manager_link_create_or_update(a_node_addr, NULL, 0);
     dap_return_if_pass(!l_link);
     l_link->static_links_clusters = dap_list_append(l_link->static_links_clusters, a_cluster);
 }
diff --git a/net/link_manager/include/dap_link_manager.h b/net/link_manager/include/dap_link_manager.h
index e9c859eb337a6748eba241c5278a5e72b02de8f5..e701212566838684c0691eeb9e8c5063c5bbbb51 100644
--- a/net/link_manager/include/dap_link_manager.h
+++ b/net/link_manager/include/dap_link_manager.h
@@ -90,7 +90,7 @@ void dap_link_manager_add_links_cluster(dap_stream_node_addr_t *a_addr, dap_clus
 void dap_link_manager_remove_links_cluster(dap_stream_node_addr_t *a_addr, dap_cluster_t *a_cluster);
 void dap_link_manager_add_static_links_cluster(dap_stream_node_addr_t *a_node_addr, dap_cluster_t *a_cluster);
 void dap_link_manager_remove_static_links_cluster_all(dap_cluster_t *a_cluster);
-dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, struct in_addr *a_addr_v4, struct in6_addr *a_addr_v6, uint16_t a_port);
+dap_link_t *dap_link_manager_link_create_or_update(dap_stream_node_addr_t *a_node_addr, const char *a_host, uint16_t a_port);
 int dap_link_manager_link_add(uint64_t a_net_id, dap_link_t *a_link);
 int dap_link_manager_downlink_add(dap_stream_node_addr_t *a_node_addr);
 void dap_accounting_downlink_in_net(uint64_t a_net_id, dap_stream_node_addr_t *a_node_addr);
diff --git a/net/server/http_server/dap_http_simple.c b/net/server/http_server/dap_http_simple.c
index b136033f986dcd069d3b5176695c8eeaf6922b6e..ee7917228a8af2d5bc7d0bc0f7e114847fbb9722 100644
--- a/net/server/http_server/dap_http_simple.c
+++ b/net/server/http_server/dap_http_simple.c
@@ -47,6 +47,7 @@ See more details here <http://www.gnu.org/licenses/>.
 #include "dap_config.h"
 #include "dap_worker.h"
 #include "dap_events.h"
+#include "dap_strfuncs.h"
 #include "dap_proc_thread.h"
 #include "dap_http_server.h"
 #include "dap_http_client.h"
@@ -391,8 +392,7 @@ static void s_http_client_headers_read( dap_http_client_t *a_http_client, void U
 {
     assert(a_http_client->esocket->server);
     if (a_http_client->esocket->server->type == DAP_SERVER_TCP || a_http_client->esocket->server->type == DAP_SERVER_UDP) {
-        if ( dap_http_ban_list_client_check_ipv4( ((struct sockaddr_in*)&a_http_client->esocket->addr_storage)->sin_addr ) ) {
-            // TODO make it universal for IPv6
+        if ( dap_http_ban_list_client_check(a_http_client->esocket->remote_addr_str, NULL, NULL) ) {
             a_http_client->reply_status_code = Http_Status_Forbidden;
             return;
         }
@@ -407,7 +407,7 @@ static void s_http_client_headers_read( dap_http_client_t *a_http_client, void U
     l_http_simple->worker = a_http_client->esocket->worker;
     l_http_simple->reply_size_max = DAP_HTTP_SIMPLE_URL_PROC( a_http_client->proc )->reply_size_max;
     l_http_simple->reply_byte = DAP_NEW_Z_SIZE(uint8_t, DAP_HTTP_SIMPLE(a_http_client)->reply_size_max );
-    strncpy(l_http_simple->es_hostaddr, l_http_simple->esocket->remote_addr_str, INET6_ADDRSTRLEN);
+    dap_strncpy(l_http_simple->es_hostaddr, l_http_simple->esocket->remote_addr_str, INET6_ADDRSTRLEN);
 //    Made a temporary solution to handle simple CORS requests.
 //    This is necessary in order to be able to request information using JavaScript obtained from another source.
     dap_http_header_t* l_header_origin = dap_http_header_find(a_http_client->in_headers, "Origin");
diff --git a/net/server/http_server/http_client/dap_http_ban_list_client.c b/net/server/http_server/http_client/dap_http_ban_list_client.c
index e57f9a02036bdcef923ddcd24568af2839bfce89..56299d1e10e2918f1b0e3d604cc7b0e97ba53735 100644
--- a/net/server/http_server/http_client/dap_http_ban_list_client.c
+++ b/net/server/http_server/http_client/dap_http_ban_list_client.c
@@ -1,123 +1,99 @@
 #include "dap_http_ban_list_client.h"
+#include "dap_strfuncs.h"
+#include "dap_hash.h"
 
-//IP V4
-static dap_http_ban_list_client_record_t *s_ipv4_ban_list = NULL;
-static pthread_rwlock_t s_ipv4_ban_list_rwlock;
+typedef struct ban_record {
+    dap_hash_fast_t decree_hash;
+    dap_time_t ts_created;
+    UT_hash_handle hh;
+    char addr[];
+} ban_record_t;
 
-bool dap_http_ban_list_client_check_ipv4(struct in_addr a_ip) {
-    pthread_rwlock_rdlock(&s_ipv4_ban_list_rwlock);
-    dap_http_ban_list_client_record_t *l_record = NULL;
-    HASH_FIND(hh, s_ipv4_ban_list, &a_ip, sizeof (struct in_addr), l_record);
-    pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock);
-    return l_record ? true : false;
-}
-
-void dap_http_ban_list_client_add_ipv4(struct in_addr a_ip, dap_hash_fast_t a_decree_hash, dap_time_t a_ts_created) {
-    dap_http_ban_list_client_record_t *l_record = DAP_NEW(dap_http_ban_list_client_record_t);
-    l_record->ip_v4 = a_ip;
-    l_record->decree_hash = a_decree_hash;
-    l_record->ts_created = a_ts_created;
-    pthread_rwlock_wrlock(&s_ipv4_ban_list_rwlock);
-    HASH_ADD(hh, s_ipv4_ban_list, ip_v4, sizeof(struct in_addr), l_record);
-    pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock);
-}
+pthread_rwlock_t s_ban_list_lock = PTHREAD_RWLOCK_INITIALIZER;
+ban_record_t *s_ban_list;
 
-void dap_http_ban_list_client_remove_ipv4(struct in_addr a_ip){
-    pthread_rwlock_wrlock(&s_ipv4_ban_list_rwlock);
-    dap_http_ban_list_client_record_t *l_record = NULL, *tmp = NULL;
-    HASH_FIND(hh, s_ipv4_ban_list, &a_ip, sizeof (struct in_addr), l_record);
-    if (l_record) {
-        HASH_DEL(s_ipv4_ban_list, l_record);
-        DAP_DELETE(l_record);
+bool dap_http_ban_list_client_check(const char *a_addr, dap_hash_fast_t *a_decree_hash, dap_time_t *a_ts) {
+    ban_record_t *l_rec = NULL;
+    pthread_rwlock_rdlock(&s_ban_list_lock);
+    HASH_FIND_STR(s_ban_list, a_addr, l_rec);
+    pthread_rwlock_unlock(&s_ban_list_lock);
+    if (l_rec) {
+        if (a_decree_hash) *a_decree_hash = l_rec->decree_hash;
+        if (a_ts) *a_ts = l_rec->ts_created;
+        return true;
     }
-    pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock);
+    return false;
 }
 
-void dap_http_ban_list_client_ipv4_print(dap_string_t *a_str_out){
-    a_str_out = dap_string_append(a_str_out, "\t IP v4.\n\n");
-    pthread_rwlock_rdlock(&s_ipv4_ban_list_rwlock);
-    if (!s_ipv4_ban_list) {
-        a_str_out = dap_string_append(a_str_out, "\t\t Not found.\n");
-        return;
-    }
-    int number = 1;
-    dap_http_ban_list_client_record_t *l_record = NULL, *l_tmp = NULL;
-    HASH_ITER(hh, s_ipv4_ban_list, l_record, l_tmp) {
-        char l_tm[85];
-        char l_tm_ip[INET_ADDRSTRLEN];
-        dap_time_to_str_rfc822(l_tm, 85, l_record->ts_created);
-        dap_string_append_printf(a_str_out, "\t\t%d) %s\n"
-                                            "\t\t\tIP: %s\n"
-                                            "\t\t\tCreated: %s\n\n",
-                                number++, dap_chain_hash_fast_to_str_static(&l_record->decree_hash),
-                                inet_ntop(AF_INET, &l_record->ip_v4, l_tm_ip, INET_ADDRSTRLEN), l_tm);
-    }
-    pthread_rwlock_unlock(&s_ipv4_ban_list_rwlock);
+int dap_http_ban_list_client_add(const char *a_addr, dap_hash_fast_t a_decree_hash, dap_time_t a_ts) {
+    if ( dap_http_ban_list_client_check(a_addr, NULL, NULL) )
+        return -1;
+    ban_record_t *l_rec = DAP_NEW_Z_SIZE( ban_record_t, sizeof(ban_record_t) + strlen(a_addr) + 1);
+    *l_rec = (ban_record_t) {
+        .decree_hash = a_decree_hash,
+        .ts_created = a_ts,
+    };
+    strcpy(l_rec->addr, a_addr);
+    pthread_rwlock_wrlock(&s_ban_list_lock);
+    HASH_ADD_STR(s_ban_list, addr, l_rec);
+    pthread_rwlock_unlock(&s_ban_list_lock);
+    return 0;
 }
 
-//IP V6
-
-static dap_http_ban_list_client_record_t *s_ipv6_ban_list = NULL;
-static pthread_rwlock_t s_ipv6_ban_list_rwlock;
-
-bool dap_http_ban_list_client_check_ipv6(struct in6_addr a_ip_v6) {
-    pthread_rwlock_rdlock(&s_ipv6_ban_list_rwlock);
-    dap_http_ban_list_client_record_t *l_record = NULL;
-    HASH_FIND(hh, s_ipv6_ban_list, &a_ip_v6, sizeof(struct in6_addr), l_record);
-    pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock);
-    return l_record ? true : false;
+int dap_http_ban_list_client_remove(const char *a_addr) {
+    ban_record_t *l_rec = NULL;
+    int l_ret = 0;
+    pthread_rwlock_wrlock(&s_ban_list_lock);
+    HASH_FIND_STR(s_ban_list, a_addr, l_rec);
+    if (l_rec) {
+        HASH_DEL(s_ban_list, l_rec);
+        DAP_DELETE(l_rec);
+    } else
+        l_ret = -1;
+    pthread_rwlock_unlock(&s_ban_list_lock);
+    return l_ret;
 }
 
-void dap_http_ban_list_client_add_ipv6(struct in6_addr a_ip_v6, dap_hash_fast_t a_decree_hash, dap_time_t a_ts_created) {
-    dap_http_ban_list_client_record_t *l_record = DAP_NEW(dap_http_ban_list_client_record_t);
-    l_record->ip_v6 = a_ip_v6;
-    l_record->decree_hash = a_decree_hash;
-    l_record->ts_created = a_ts_created;
-    pthread_rwlock_wrlock(&s_ipv6_ban_list_rwlock);
-    HASH_ADD(hh, s_ipv6_ban_list, ip_v6, sizeof(struct in6_addr), l_record);
-    pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock);
-}
-void dap_http_ban_list_client_remove_ipv6(struct in6_addr a_ip_v6) {
-    pthread_rwlock_wrlock(&s_ipv6_ban_list_rwlock);
-    dap_http_ban_list_client_record_t *l_record = NULL;
-    HASH_FIND(hh, s_ipv6_ban_list, &a_ip_v6, sizeof(struct in6_addr), l_record);
-    if (l_record) {
-        HASH_DEL(s_ipv6_ban_list, l_record);
-        DAP_DELETE(l_record);
-    }
-    pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock);
+static void s_dap_http_ban_list_client_dump_single(ban_record_t *a_rec, dap_string_t *a_str) {
+    char *l_decree_hash_str = dap_hash_fast_to_str_static(&a_rec->decree_hash),
+        l_ts[80] = { '\0' };
+    dap_time_to_str_rfc822(l_ts, sizeof(l_ts), a_rec->ts_created);
+    dap_string_append_printf(a_str, "%s\n\t\t\tAddress: %s\n\t\t\tCreated at %s\n\n",
+        l_decree_hash_str, a_rec->addr, l_ts);
 }
 
-void dap_http_ban_list_client_ipv6_print(dap_string_t *a_str_out) {
-    a_str_out = dap_string_append(a_str_out, "\t IP v6.\n");
-    pthread_rwlock_rdlock(&s_ipv6_ban_list_rwlock);
-    if (!s_ipv6_ban_list) {
-        a_str_out = dap_string_append(a_str_out, "\t\t Not found.\n\n");
-        return;
+char *dap_http_ban_list_client_dump(const char *a_addr) {
+    int num = 1;
+    ban_record_t *l_rec = NULL, *l_tmp = NULL;
+    dap_string_t *l_res = dap_string_new(NULL);
+    pthread_rwlock_rdlock(&s_ban_list_lock);
+    if (a_addr) {
+        HASH_FIND_STR(s_ban_list, a_addr, l_rec);
+        if (l_rec)
+            s_dap_http_ban_list_client_dump_single(l_rec, l_res);
+        else
+            dap_string_append_printf(l_res, "Address %s is not banlisted", a_addr);
+    } else {
+        HASH_ITER(hh, s_ban_list, l_rec, l_tmp) {
+            dap_string_append_printf(l_res, "\t\t%d. ", num++);
+            s_dap_http_ban_list_client_dump_single(l_rec, l_res);
+        }
     }
-    int number = 1;
-    dap_http_ban_list_client_record_t *l_record = NULL, *tmp = NULL;
-    HASH_ITER(hh, s_ipv6_ban_list, l_record, tmp) {
-        char l_tm[85];
-        char l_tm_ip[INET6_ADDRSTRLEN];
-        dap_time_to_str_rfc822(l_tm, 85, l_record->ts_created);
-        dap_string_append_printf(a_str_out, "\t\t%d) %s\n"
-                                            "\t\t\tIP: %s\n"
-                                            "\t\t\tCreated: %s\n\n",
-                                number++, dap_chain_hash_fast_to_str_static(&l_record->decree_hash),
-                                inet_ntop(AF_INET6, &l_record->ip_v6, l_tm_ip, INET6_ADDRSTRLEN), l_tm);
-    }
-    pthread_rwlock_unlock(&s_ipv6_ban_list_rwlock);
+    pthread_rwlock_unlock(&s_ban_list_lock);
+    return dap_string_free(l_res, false);
 }
 
 int dap_http_ban_list_client_init() {
-    s_ipv4_ban_list = NULL;
-    s_ipv6_ban_list = NULL;
-    pthread_rwlock_init(&s_ipv4_ban_list_rwlock, NULL);
-    pthread_rwlock_init(&s_ipv6_ban_list_rwlock, NULL);
     return 0;
 }
+
 void dap_http_ban_list_client_deinit() {
-    pthread_rwlock_destroy(&s_ipv4_ban_list_rwlock);
-    pthread_rwlock_destroy(&s_ipv6_ban_list_rwlock);
+    ban_record_t *l_rec = NULL, *l_tmp = NULL;
+    pthread_rwlock_wrlock(&s_ban_list_lock);
+    HASH_ITER(hh, s_ban_list, l_rec, l_tmp) {
+        HASH_DEL(s_ban_list, l_rec);
+        DAP_DELETE(l_rec);
+    }
+    pthread_rwlock_unlock(&s_ban_list_lock);
+    pthread_rwlock_destroy(&s_ban_list_lock);
 }
diff --git a/net/server/http_server/http_client/include/dap_http_ban_list_client.h b/net/server/http_server/http_client/include/dap_http_ban_list_client.h
index 9c5c51c16b2bee42d0d1cb452464092dd490a865..ba699f363d530cff3d3ab150509de65e2502cc1e 100644
--- a/net/server/http_server/http_client/include/dap_http_ban_list_client.h
+++ b/net/server/http_server/http_client/include/dap_http_ban_list_client.h
@@ -5,7 +5,7 @@
 #include "dap_time.h"
 #include "dap_string.h"
 #include "uthash.h"
-#ifdef WIN32
+#ifdef DAP_OS_WINDOWS
 #include <winsock2.h>
 #include <in6addr.h>
 #include <ws2tcpip.h>
@@ -14,25 +14,11 @@
 #include <arpa/inet.h>
 #endif
 
-typedef struct dap_http_ban_list_client_record{
-    dap_hash_fast_t decree_hash;
-    dap_time_t ts_created;
-    union {
-        struct in_addr ip_v4;
-        struct in6_addr ip_v6;
-    };
-    UT_hash_handle hh;
-}dap_http_ban_list_client_record_t;
-
 int dap_http_ban_list_client_init();
 void dap_http_ban_list_client_deinit();
 
-bool dap_http_ban_list_client_check_ipv4(struct in_addr);
-void dap_http_ban_list_client_add_ipv4(struct in_addr, dap_hash_fast_t, dap_time_t);
-void dap_http_ban_list_client_remove_ipv4(struct in_addr);
-void dap_http_ban_list_client_ipv4_print(dap_string_t *a_str_out);
+bool dap_http_ban_list_client_check(const char *a_addr, dap_hash_fast_t *a_decree_hash, dap_time_t *a_ts);
+int dap_http_ban_list_client_add(const char *a_addr, dap_hash_fast_t a_decree_hash, dap_time_t a_ts);
+int dap_http_ban_list_client_remove(const char *a_addr);
+char *dap_http_ban_list_client_dump(const char *a_addr);
 
-bool dap_http_ban_list_client_check_ipv6(struct in6_addr);
-void dap_http_ban_list_client_add_ipv6(struct in6_addr, dap_hash_fast_t, dap_time_t);
-void dap_http_ban_list_client_remove_ipv6(struct in6_addr);
-void dap_http_ban_list_client_ipv6_print(dap_string_t *a_str_out);