diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c
index 31b5d86b1497bb1d94cb920384236e79939f1266..d6ea5cb8544df48284d4b5654fe24d491aa77950 100644
--- a/modules/chain/dap_chain.c
+++ b/modules/chain/dap_chain.c
@@ -67,7 +67,6 @@ int s_prepare_env();
  */
 int dap_chain_init(void)
 {
-    dap_cert_init();
     // Cell sharding init
     dap_chain_cell_init();
     dap_chain_ledger_init();
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 5a281953a5839afb927d6403fcc3de3234961acf..fc7654efc02af9846d8cd0fbc15a9458217053f1 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -170,21 +170,15 @@ typedef struct dap_chain_net_pvt{
     uint16_t reconnect_delay;           // sec
 
     bool load_mode;
-    char ** seed_aliases;
 
     uint16_t bootstrap_nodes_count;
     struct in_addr *bootstrap_nodes_addrs;
     uint16_t *bootstrap_nodes_ports;
 
-    uint16_t gdb_sync_groups_count;
-    uint16_t gdb_sync_nodes_addrs_count;
-    uint16_t gdb_sync_nodes_links_count;
-    char **gdb_sync_groups;
-    dap_chain_node_addr_t *gdb_sync_nodes_addrs;
-    uint32_t *gdb_sync_nodes_links_ips;
-    uint16_t *gdb_sync_nodes_links_ports;
+    uint16_t permanent_links_count;
+    dap_chain_node_addr_t *permanent_links; // TODO realize permanent links from config
 
-    uint16_t seed_aliases_count;
+    uint16_t seed_nodes_count;
     struct in_addr *seed_nodes_addrs_v4;
     uint16_t *seed_nodes_ports;
     uint64_t *seed_nodes_addrs;
@@ -264,25 +258,6 @@ static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash);
 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, int a_link_replace_tries);
 
-static void s_update_my_link_info_timer_callback(void *a_arg)
-{
-    dap_chain_net_t *l_net = (dap_chain_net_t*)a_arg;
-    size_t l_blocks_events = 0;
-    dap_chain_node_info_t *l_node_info = dap_chain_node_info_read(l_net, &g_node_addr);
-    if (!l_node_info)
-        return;
-    dap_chain_t *l_chain;
-    DL_FOREACH(l_net->pub.chains, l_chain) {
-        if(l_chain->callback_count_atom)
-            l_blocks_events += l_chain->callback_count_atom(l_chain);
-    }
-    l_node_info->hdr.blocks_events = l_blocks_events;
-    char *l_key = dap_chain_node_addr_to_hash_str(&g_node_addr);
-    //dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, l_node_info, dap_chain_node_info_get_size(l_node_info), false);
-    DAP_DELETE(l_node_info);
-}
-
-
 /**
  * @brief
  * init network settings from cellrame-node.cfg file
@@ -474,9 +449,9 @@ dap_chain_node_info_t *dap_get_balancer_link_from_cfg(dap_chain_net_t *a_net)
     struct in_addr l_addr = {};
     uint16_t i, l_port = 0;
     uint64_t l_node_adrr = 0;
-    if (l_net_pvt->seed_aliases_count) {
+    if (l_net_pvt->seed_nodes_count) {
         do {
-            i = dap_random_uint16() % l_net_pvt->seed_aliases_count;
+            i = dap_random_uint16() % l_net_pvt->seed_nodes_count;
         } while (l_net_pvt->seed_nodes_addrs[i] == g_node_addr.uint64);
         dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t);
         if(l_link_node_info){
@@ -653,7 +628,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net)
 {
     int ret = 0;
     dap_chain_net_pvt_t *l_pvt_net = PVT(a_net);
-    for (size_t i = 0; i < l_pvt_net->seed_aliases_count; i++) {
+    for (size_t i = 0; i < l_pvt_net->seed_nodes_count; i++) {
         /*
         dap_chain_node_addr_t *l_link_addr = dap_chain_node_alias_find(a_net, l_pvt_net->seed_aliases[i]);
         if (!l_link_addr)
@@ -1020,7 +995,7 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla
                 l_net_link_add = s_net_link_add(a_net, l_node_info + i);
                 switch (l_net_link_add) {
                 case 0:
-                    log_it(L_MSG, "Network LOCAL balancer issues link IP %s, [%ld blocks]", inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->hdr.blocks_events);
+                    log_it(L_MSG, "Network LOCAL balancer issues link IP %s, [%ld blocks]", inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->info.atoms_count);
                     break;
                 case -1:
                     log_it(L_MSG, "Network LOCAL balancer: IP %s is already among links", inet_ntoa((l_node_info + i)->hdr.ext_addr_v4));
@@ -1203,32 +1178,18 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg)
             log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_PREPARE", l_net->pub.name);
             s_net_states_notify(l_net);
             // Extra links from cfg
-            for (int i = 0; i < l_net_pvt->gdb_sync_nodes_links_count; i++) {
-                if (i >= l_net_pvt->gdb_sync_nodes_addrs_count)
-                    break;
-                dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t);
+            for (int i = 0; i < l_net_pvt->permanent_links_count; i++) {
+                dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, l_net_pvt->permanent_links + i);
                 if (!l_link_node_info) {
-                    log_it(L_CRITICAL, "Memory allocation error");
-                    return false;
+                    log_it(L_WARNING, "Can't find addr info for permanent link " NODE_ADDR_FP_STR,
+                           NODE_ADDR_FP_ARGS(l_net_pvt->permanent_links + i));
+                    continue;
                 }
-                l_link_node_info->hdr.address.uint64 = l_net_pvt->gdb_sync_nodes_addrs[i].uint64;
-                l_link_node_info->hdr.ext_addr_v4.s_addr = l_net_pvt->gdb_sync_nodes_links_ips[i];
-                l_link_node_info->hdr.ext_port = l_net_pvt->gdb_sync_nodes_links_ports[i];
                 s_net_link_add(l_net, l_link_node_info);
                 DAP_DELETE(l_link_node_info);
             }
-            // Links from node info structure (currently empty)
-            if (l_net_pvt->node_info) {
-                for (size_t i = 0; i < l_net_pvt->node_info->hdr.links_number; i++) {
-                    dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, &l_net_pvt->node_info->links[i]);
-                    s_net_link_add(l_net, l_link_node_info);
-                    DAP_DEL_Z(l_link_node_info);
-                }
-            } else {
-                log_it(L_WARNING,"No nodeinfo in global_db to prepare links for connecting, try to add links from root servers");
-            }
 
-            if (!l_net_pvt->seed_aliases_count && ! l_net_pvt->bootstrap_nodes_count){
+            if (!l_net_pvt->seed_nodes_count && ! l_net_pvt->bootstrap_nodes_count){
                log_it(L_ERROR, "No root servers present in configuration file. Can't establish DNS requests");
                if (l_net_pvt->net_links) { // We have other links
                    l_net_pvt->state = NET_STATE_LINKS_CONNECTING;
@@ -1409,10 +1370,6 @@ void dap_chain_net_delete(dap_chain_net_t *a_net)
 {
     pthread_mutex_destroy(&PVT(a_net)->uplinks_mutex);
     pthread_mutex_destroy(&a_net->pub.balancer_mutex);
-    if(PVT(a_net)->seed_aliases) {
-        DAP_DELETE(PVT(a_net)->seed_aliases);
-        PVT(a_net)->seed_aliases = NULL;
-    }
     DAP_DELETE(a_net);
 }
 
@@ -1550,7 +1507,7 @@ static bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net)
     DAP_DELETE(l_cache_dir);
     // create file, if it not presented. If file exists, ledger cache operation is stopped
     if (dap_file_simple_test(l_cache_file)) {
-        log_it(L_WARNING, "Cache file '%s' already exists", l_cache_file);
+        log_it(L_NOTICE, "Cache file '%s' already exists", l_cache_file);
         DAP_DELETE(l_cache_file);
         return false;
     }
@@ -1855,7 +1812,7 @@ static int s_cli_net(int argc, char **argv, char **a_str_reply)
                                                     "\t\text_ipv6: %s\n"
                                                     "\t\text_port: %u\n"
                                                     "\t\tstate: %s\n",
-                                                 NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->hdr.alias, l_info->hdr.cell_id.uint64,
+                                                 NODE_ADDR_FP_ARGS_S(l_info->hdr.address), l_info->alias, l_info->hdr.cell_id.uint64,
                                                  l_ext_addr_v4, l_ext_addr_v6, l_info->hdr.ext_port,
                                                  dap_chain_node_client_state_to_str(l_node_client->state) );
                     }
@@ -2155,6 +2112,9 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
             return -1;
         }
     }
+    l_net->pub.gdb_groups_prefix = dap_strdup(
+                dap_config_get_item_str_default(l_cfg, "general", "gdb_groups_prefix",
+                                                dap_config_get_item_str(l_cfg, "general", "name")));
     dap_chain_net_pvt_t *l_net_pvt = PVT(l_net);
     l_net_pvt->load_mode = true;
     l_net_pvt->acl_idx = a_acl_idx;
@@ -2183,21 +2143,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
     HASH_ADD_STR(s_net_items,name,l_net_item);
     HASH_ADD(hh2, s_net_ids, net_id, sizeof(l_net_item->net_id), l_net_item);
 
-    // Check if seed nodes are present in local db alias
-    char **l_seed_aliases = dap_config_get_array_str(l_cfg, "general", "seed_nodes_aliases",
-                                                     &l_net_pvt->seed_aliases_count);
-    if (l_net_pvt->seed_aliases_count)
-        l_net_pvt->seed_aliases = DAP_NEW_Z_SIZE(char*, sizeof(char*) * l_net_pvt->seed_aliases_count);
-    for(size_t i = 0; i < l_net_pvt->seed_aliases_count; i++)
-        l_net_pvt->seed_aliases[i] = dap_strdup(l_seed_aliases[i]);
-    // randomize seed nodes list
-    for (int j = l_net_pvt->seed_aliases_count - 1; j > 0; j--) {
-        short n = dap_random_uint16() % j;
-        char *tmp = l_net_pvt->seed_aliases[n];
-        l_net_pvt->seed_aliases[n] = l_net_pvt->seed_aliases[j];
-        l_net_pvt->seed_aliases[j] = tmp;
-    }
-
     uint16_t l_seed_nodes_addrs_len =0;
     char ** l_seed_nodes_addrs = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_addrs"
                                                          ,&l_seed_nodes_addrs_len);
@@ -2228,12 +2173,12 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
     l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10);
 
     log_it (L_DEBUG, "Read %u aliases, %u address and %u ipv4 addresses, check them",
-            l_net_pvt->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len );
-    PVT(l_net)->seed_nodes_addrs_v4 = DAP_NEW_SIZE(struct in_addr, l_net_pvt->seed_aliases_count * sizeof(struct in_addr));
-    PVT(l_net)->seed_nodes_addrs = DAP_NEW_SIZE(uint64_t, l_net_pvt->seed_aliases_count * sizeof(uint64_t));
-    PVT(l_net)->seed_nodes_ports = DAP_NEW_SIZE(uint16_t, l_net_pvt->seed_aliases_count * sizeof(uint16_t));
+            l_net_pvt->seed_nodes_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len );
+    PVT(l_net)->seed_nodes_addrs_v4 = DAP_NEW_SIZE(struct in_addr, l_net_pvt->seed_nodes_count * sizeof(struct in_addr));
+    PVT(l_net)->seed_nodes_addrs = DAP_NEW_SIZE(uint64_t, l_net_pvt->seed_nodes_count * sizeof(uint64_t));
+    PVT(l_net)->seed_nodes_ports = DAP_NEW_SIZE(uint16_t, l_net_pvt->seed_nodes_count * sizeof(uint16_t));
     // save new nodes from cfg file to db
-    for ( size_t i = 0; i < PVT(l_net)->seed_aliases_count &&
+    for ( size_t i = 0; i < PVT(l_net)->seed_nodes_count &&
                         i < l_seed_nodes_addrs_len &&
                         (
                             ( l_seed_nodes_ipv4_len  && i < l_seed_nodes_ipv4_len  ) ||
@@ -2243,12 +2188,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
         dap_chain_node_addr_t l_seed_node_addr  = { 0 };
         dap_chain_node_info_t l_node_info       = { 0 };
 
-        log_it(L_NOTICE, "Check alias %s in db", l_net_pvt->seed_aliases[i]);
-        snprintf(l_node_info.hdr.alias,sizeof (l_node_info.hdr.alias),"%s", PVT(l_net)->seed_aliases[i]);
-        if (dap_chain_node_addr_from_str(&l_seed_node_addr, l_seed_nodes_addrs[i])) {
-            log_it(L_ERROR,"Wrong address format, must be 0123::4567::89AB::CDEF");
-            continue;
-        }
         if (l_seed_nodes_ipv4_len)
             inet_pton(AF_INET, l_seed_nodes_ipv4[i], &l_node_info.hdr.ext_addr_v4);
         if (l_seed_nodes_ipv6_len)
@@ -2261,6 +2200,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
         if (l_seed_nodes_hostnames_len) {
             struct sockaddr l_sa = {};
             log_it(L_DEBUG, "Resolve %s addr", l_seed_nodes_hostnames[i]);
+            // TODO add IPv6 support
             int l_ret_code = dap_net_resolve_host(l_seed_nodes_hostnames[i], AF_INET, &l_sa);
             if (l_ret_code == 0) {
                 struct in_addr *l_res = (struct in_addr *)&l_sa;
@@ -2271,6 +2211,13 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
                 log_it(L_ERROR, "%s", gai_strerror(l_ret_code));
             }
         }
+        // randomize seed nodes list
+        for (int j = l_net_pvt->seed_nodes_count - 1; j > 0; j--) {
+            short n = dap_random_uint16() % j;
+            struct in_addr tmp = l_net_pvt->seed_nodes_addrs_v4[n];
+            l_net_pvt->seed_nodes_addrs_v4[n] = l_net_pvt->seed_nodes_addrs_v4[j];
+            l_net_pvt->seed_nodes_addrs_v4[j] = tmp;
+        }
     }
 
     dap_chain_net_node_list_init();
@@ -2299,20 +2246,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
         DAP_DELETE(l_bootstrap_name);
     }
 
-    const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general", "node_addr_type", "auto");
-    if (!dap_strcmp(l_node_addr_type, "static")) {
-        const char *l_node_alias_str = dap_config_get_item_str_default(l_cfg, "general", "node-addr",
-                                                                       dap_config_get_item_str(l_cfg, "general", "node-alias"));
-        if (l_node_alias_str) {
-            dap_stream_node_addr_t *l_alias_addr = dap_chain_node_alias_find(l_net, l_node_alias_str);
-            if (!l_alias_addr)
-                dap_chain_node_alias_register(l_net, l_node_alias_str, &g_node_addr);
-        } else
-            log_it(L_ERROR, "Can't read alias for node address from config");
-
-    } else if (dap_strcmp(l_node_addr_type, "auto"))
-        log_it(L_WARNING, "Unknown node address type will be defalted to 'auto'");
-
     l_net_pvt->node_info = dap_chain_node_info_read(l_net, &g_node_addr);
     if ( !l_net_pvt->node_info ) { // If not present - create it
         l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t);
@@ -2337,7 +2270,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx)
     }
     log_it(L_NOTICE, "Net load information: node_addr " NODE_ADDR_FP_STR ", balancers links %u, cell_id 0x%016"DAP_UINT64_FORMAT_X,
            NODE_ADDR_FP_ARGS_S(g_node_addr),
-           l_net_pvt->seed_aliases_count,
+           l_net_pvt->seed_nodes_count,
            l_net_pvt->node_info->hdr.cell_id.uint64);
 
     /* *** Chains init by configs *** */
@@ -2513,9 +2446,6 @@ int s_net_load(dap_chain_net_t *a_net)
             log_it (L_NOTICE, "Initialized chain files");
         }
 
-        if (l_chain->callback_created)
-            l_chain->callback_created(l_chain, l_cfg);
-
         l_chain = l_chain->next;
     }
     // Process thresholds if any
@@ -2592,9 +2522,6 @@ int s_net_load(dap_chain_net_t *a_net)
     l_net_pvt->balancer_http = !dap_config_get_item_bool_default(l_cfg, "general", "use_dns_links", false);
 
     // Init GlobalDB clusters for mempool, service and nodes (with aliases)
-    l_net->pub.gdb_groups_prefix = dap_strdup(
-                dap_config_get_item_str_default(l_cfg, "general", "gdb_groups_prefix",
-                                                dap_config_get_item_str(l_cfg, "general", "name")));
     // Zerochain mempool cluster
     char *l_gdb_mempool_mask = dap_strdup_printf("%s.chain-%s.mempool", l_net->pub.gdb_groups_prefix, l_net->pub.chains->name);
     l_net_pvt->zerochain_cluster = dap_global_db_cluster_add(dap_global_db_instance_get_default(),
@@ -2654,6 +2581,25 @@ int s_net_load(dap_chain_net_t *a_net)
     dap_chain_net_add_poa_certs_to_cluster(l_net, l_net_pvt->nodes_cluster);
     DAP_DELETE(l_gdb_mempool_mask);
 
+    DL_FOREACH(l_net->pub.chains, l_chain)
+        if (l_chain->callback_created)
+            l_chain->callback_created(l_chain, l_cfg);
+
+    // TODO rework alias concept
+    const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general", "node_addr_type", "auto");
+    if (!dap_strcmp(l_node_addr_type, "static")) {
+        const char *l_node_alias_str = dap_config_get_item_str_default(l_cfg, "general", "node-addr",
+                                                                       dap_config_get_item_str(l_cfg, "general", "node-alias"));
+        if (l_node_alias_str) {
+            dap_stream_node_addr_t *l_alias_addr = dap_chain_node_alias_find(l_net, l_node_alias_str);
+            if (!l_alias_addr)
+                dap_chain_node_alias_register(l_net, l_node_alias_str, &g_node_addr);
+        } else
+            log_it(L_ERROR, "Can't read alias for node address from config");
+
+    } else if (dap_strcmp(l_node_addr_type, "auto"))
+        log_it(L_WARNING, "Unknown node address type will be defalted to 'auto'");
+
     uint32_t l_timeout = dap_config_get_item_uint32_default(g_config, "node_client", "timer_update_states", 600);
     PVT(l_net)->main_timer = dap_interval_timer_create(l_timeout * 1000, s_main_timer_callback, l_net);
     log_it(L_INFO, "Chain network \"%s\" initialized",l_net->pub.name);
@@ -2916,59 +2862,12 @@ dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net)
     return  PVT(l_net)->node_info ? &PVT(l_net)->node_info->hdr.cell_id: 0;
 }
 
-
-/**
- * Get nodes list (list of dap_chain_node_addr_t struct)
- */
-dap_list_t* dap_chain_net_get_link_node_list(dap_chain_net_t * l_net, bool a_is_only_cur_cell)
-{
-    dap_list_t *l_node_list = NULL;
-    // get cur node address
-    dap_chain_node_addr_t l_cur_node_addr = { 0 };
-    l_cur_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
-
-    dap_chain_node_info_t *l_cur_node_info = dap_chain_node_info_read(l_net, &l_cur_node_addr);
-    // add links to nodes list only from the same cell
-    if(l_cur_node_info) {
-        for(unsigned int i = 0; i < l_cur_node_info->hdr.links_number; i++) {
-            bool l_is_add = true;
-            dap_chain_node_addr_t *l_remote_address = l_cur_node_info->links + i;
-            if(a_is_only_cur_cell) {
-                // get remote node list
-                dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(l_net, l_remote_address);
-                if(!l_remote_node_info || l_remote_node_info->hdr.cell_id.uint64 != l_cur_node_info->hdr.cell_id.uint64)
-                    l_is_add = false;
-                if (l_remote_node_info)
-                    DAP_DELETE(l_remote_node_info);
-            }
-            if(l_is_add) {
-                dap_chain_node_addr_t *l_address = DAP_NEW_Z(dap_chain_node_addr_t);
-                if (!l_address) {
-                    log_it(L_CRITICAL, "Memory allocation error");
-                    return NULL;
-                }
-                l_address->uint64 = l_cur_node_info->links[i].uint64;
-                l_node_list = dap_list_append(l_node_list, l_address);
-            }
-        }
-        DAP_DELETE(l_cur_node_info);
-    }
-    return l_node_list;
-}
-
 /**
  * Get remote nodes list (list of dap_chain_node_addr_t struct)
  */
 dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net)
 {
     dap_list_t *l_node_list = NULL;
-    /*
-     dap_chain_net_pvt_t *l_net_pvt = PVT(l_net);
-     // get nodes from seed_nodes
-     for(uint16_t i = 0; i < l_net_pvt->seed_aliases_count; i++) {
-     dap_chain_node_addr_t *l_node_address = dap_chain_node_alias_find(l_net, l_net_pvt->seed_aliases[i]);
-     l_node_list = dap_list_append(l_node_list, l_node_address);
-     }*/
 
     // get nodes list from global_db
     dap_global_db_obj_t *l_objs = NULL;
@@ -2998,10 +2897,8 @@ dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net)
 {
     dap_list_t *l_node_list = NULL;
     dap_chain_net_pvt_t *l_pvt_net = PVT(a_net);
-    for(size_t i=0; i < l_pvt_net->seed_aliases_count;i++)
-    {
+    for (size_t i = 0; i < l_pvt_net->seed_nodes_count; i++)
         l_node_list = dap_list_append(l_node_list, &l_pvt_net->seed_nodes_addrs_v4[i]);
-    }
     return l_node_list;
 }
 
@@ -3028,24 +2925,6 @@ bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net)
     return PVT(a_net)->flags &F_DAP_CHAIN_NET_SYNC_FROM_ZERO ;
 }
 
-/**
- * @brief dap_chain_net_get_extra_gdb_group
- * @param a_net
- * @param a_node_addr
- * @return
- */
-bool dap_chain_net_get_extra_gdb_group(dap_chain_net_t *a_net, dap_chain_node_addr_t a_node_addr)
-{
-    if (!a_net || !PVT(a_net)->gdb_sync_nodes_addrs)
-        return false;
-    for(uint16_t i = 0; i < PVT(a_net)->gdb_sync_nodes_addrs_count; i++) {
-        if(a_node_addr.uint64 == PVT(a_net)->gdb_sync_nodes_addrs[i].uint64) {
-            return true;
-        }
-    }
-    return false;
-}
-
 void dap_chain_net_proc_mempool(dap_chain_net_t *a_net)
 {
     dap_chain_t *l_chain;
diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 0dd8131330e0554c1c60b168d11e86e96e9c352f..c355d6015e1bcb29c480853df42b8484350d3182 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -99,8 +99,8 @@ static uint64_t min_count_blocks_events(dap_global_db_obj_t * a_objs,size_t a_no
         }
         for (dap_list_t *node_i = a_node_addr_list; node_i; node_i = node_i->next) {
             if(((struct in_addr*)node_i->data)->s_addr == l_node_cand->hdr.ext_addr_v4.s_addr) {
-                if (!l_blocks_events || l_blocks_events > l_node_cand->hdr.blocks_events)
-                    l_blocks_events = l_node_cand->hdr.blocks_events;
+                if (!l_blocks_events || l_blocks_events > l_node_cand->info.atoms_count)
+                    l_blocks_events = l_node_cand->info.atoms_count;
                 break;
             }
         }
@@ -142,7 +142,7 @@ void dap_chain_net_balancer_prepare_list_links(const char *a_net_name,bool hands
                 dap_chain_node_info_t *l_node_list = (dap_chain_node_info_t *)node_i->data;
                 if(l_node_list->hdr.address.uint64 == l_node_cand->hdr.address.uint64)
                 {
-                   // if(l_node_cand->hdr.blocks_events >= l_blocks_events/2)
+                   // if(l_node_cand->info.atoms_count >= l_blocks_events/2)
                    // {
                         dap_chain_node_info_t * l_node_info = DAP_NEW_Z( dap_chain_node_info_t);
                         *l_node_info = *l_node_cand;
@@ -163,7 +163,7 @@ void dap_chain_net_balancer_prepare_list_links(const char *a_net_name,bool hands
         {
             dap_chain_node_info_t *l_node_cand = (dap_chain_node_info_t *)l_objs[i].value;
             if(!is_it_node_from_list(l_node_addr_list, l_node_cand)){
-                if(l_node_cand->hdr.blocks_events >= l_blocks_events){
+                if(l_node_cand->info.atoms_count >= l_blocks_events){
                     if(dap_chain_net_balancer_handshake(l_node_cand,l_net)){
                         dap_chain_net_balancer_set_link_list(l_node_cand,l_net->pub.name);
                     }
@@ -185,8 +185,8 @@ static int callback_compare_node_list(dap_list_t *a_item1, dap_list_t *a_item2)
         return 0;
     }
 
-    return l_item1->hdr.links_number == l_item2->hdr.links_number
-            ? 0 : l_item1->hdr.links_number > l_item2->hdr.links_number ? 1 : -1;
+    return l_item1->info.links_number == l_item2->info.links_number
+            ? 0 : l_item1->info.links_number > l_item2->info.links_number ? 1 : -1;
 }
 
 dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net_name,uint16_t a_links_need)
@@ -235,7 +235,7 @@ dap_chain_net_node_balancer_t *s_balancer_issue_link(const char *a_net_name, uin
         dap_chain_node_info_t * l_node_info = (dap_chain_node_info_t *)l_link_full_node_list->nodes_info;
         for(size_t i=0;i<l_link_full_node_list->count_node;i++)
         {
-            log_it(L_DEBUG, "Network balancer issues ip %s, [%ld blocks]",inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->hdr.blocks_events);
+            log_it(L_DEBUG, "Network balancer issues ip %s, [%ld blocks]",inet_ntoa((l_node_info + i)->hdr.ext_addr_v4),l_node_info->info.atoms_count);
 
         }
         return l_link_full_node_list;
diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c
index 025f7256a50ac5ed7e8681e89eb5a61ebaac1179..8e01e8dec2f8b945584346d4c5005f289e58d499 100644
--- a/modules/net/dap_chain_net_node_list.c
+++ b/modules/net/dap_chain_net_node_list.c
@@ -78,7 +78,6 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple,
     dap_chain_net_t *l_net = dap_chain_net_by_name(l_net_str);
     dap_chain_node_info_t l_node_info = {
         .hdr.address.uint64 = addr,
-        .hdr.owner_address.uint64 = dap_chain_net_get_cur_addr_int(l_net),
         .hdr.ext_addr_v4.s_addr = ipv4,
         .hdr.ext_port = port
     };
@@ -105,14 +104,13 @@ void dap_chain_net_node_check_http_issue_link(dap_http_simple_t *a_http_simple,
             if(response)
             {
                 size_t l_node_info_size = dap_chain_node_info_get_size(&l_node_info);
-                bool res = dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, (uint8_t*)&l_node_info, l_node_info_size, true) == 0;
+                bool res = dap_global_db_set_sync(l_net->pub.gdb_nodes, l_key, (uint8_t*)&l_node_info, l_node_info_size, false) == 0;
                 if(res)
                 {
                     char l_node_addr_str[INET_ADDRSTRLEN]={};
                     inet_ntop(AF_INET, &l_node_info.hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN);
-                    log_it(L_DEBUG, "Add address"NODE_ADDR_FP_STR" (%s) to node list by "NODE_ADDR_FP_STR"",
-                                NODE_ADDR_FP_ARGS_S(l_node_info.hdr.address),l_node_addr_str,
-                                NODE_ADDR_FP_ARGS_S(l_node_info.hdr.owner_address));
+                    log_it(L_DEBUG, "Add address"NODE_ADDR_FP_STR" (%s) to node list",
+                                NODE_ADDR_FP_ARGS_S(l_node_info.hdr.address),l_node_addr_str);
                     response = 1;
                 }
                 else
@@ -267,29 +265,19 @@ static void s_node_list_callback_notify(dap_global_db_instance_t *a_dbi, dap_sto
     if (!dap_strcmp(a_obj->group, l_net->pub.gdb_nodes)) {
         if (a_obj->value && a_obj->type == DAP_GLOBAL_DB_OPTYPE_ADD) {
             dap_chain_node_info_t *l_node_info = (dap_chain_node_info_t *)a_obj->value;
+            size_t l_size_obj = dap_chain_node_info_get_size(l_node_info);
+            if (l_size_obj_need == l_size_obj) {
+                char l_node_ipv4_str[INET_ADDRSTRLEN]={ '\0' }, l_node_ipv6_str[INET6_ADDRSTRLEN]={ '\0' };
+                inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ipv4_str, INET_ADDRSTRLEN);
+                inet_ntop(AF_INET6, &l_node_info->hdr.ext_addr_v6, l_node_ipv6_str, INET6_ADDRSTRLEN);
+                char l_ts[128] = { '\0' };
+                dap_gbd_time_to_str_rfc822(l_ts, sizeof(l_ts), a_obj->timestamp);
 
-            size_t l_size_obj = (a_obj->value_len - (l_node_info->hdr.links_number * sizeof(dap_chain_node_addr_t)));
-            if(l_size_obj_need == l_size_obj)
-            {
-                if(l_node_info->hdr.owner_address.uint64 == 0){
-                    log_it(L_NOTICE, "Node %s removed, there is not pinners", a_obj->key);
-                    dap_global_db_del_sync(a_obj->group, a_obj->key);
-                } else {
-                    char l_node_ipv4_str[INET_ADDRSTRLEN]={ '\0' }, l_node_ipv6_str[INET6_ADDRSTRLEN]={ '\0' };
-                    inet_ntop(AF_INET, &l_node_info->hdr.ext_addr_v4, l_node_ipv4_str, INET_ADDRSTRLEN);
-                    inet_ntop(AF_INET6, &l_node_info->hdr.ext_addr_v6, l_node_ipv6_str, INET6_ADDRSTRLEN);
-                    char l_ts[128] = { '\0' };
-                    dap_gbd_time_to_str_rfc822(l_ts, sizeof(l_ts), a_obj->timestamp);
-
-                    log_it(L_MSG, "Add node "NODE_ADDR_FP_STR" %s %s, pinned by "NODE_ADDR_FP_STR" at %s\n",
-                                             NODE_ADDR_FP_ARGS_S(l_node_info->hdr.address),
-                                             l_node_ipv4_str, dap_itoa(l_node_info->hdr.ext_port),
-                                             NODE_ADDR_FP_ARGS_S(l_node_info->hdr.owner_address),
-                                             l_ts);
-                }
-            }
-            else
-            {
+                log_it(L_MSG, "Add node "NODE_ADDR_FP_STR" %s %s at %s\n",
+                                         NODE_ADDR_FP_ARGS_S(l_node_info->hdr.address),
+                                         l_node_ipv4_str, dap_itoa(l_node_info->hdr.ext_port),
+                                         l_ts);
+            } else {
                 dap_global_db_del_sync(a_obj->group, a_obj->key);
                 log_it(L_NOTICE, "Wrong size! data size %lu need - (%lu) %s removed ",l_size_obj,
                        l_size_obj_need, a_obj->key);
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index ed40377c87acd91e8eb0c242ae1ef80f6d89eaa8..6519c1026c9ea6c68c45410b142ef0b17710cdbc 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -68,7 +68,7 @@ dap_chain_node_addr_t *dap_chain_node_alias_find(dap_chain_net_t *a_net, const c
     size_t l_addr_size =0;
     dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes_aliases,
                                                                                     a_alias, &l_addr_size, NULL, NULL);
-    if (l_addr_size != sizeof(dap_chain_node_addr_t)) {
+    if (l_addr && l_addr_size != sizeof(dap_chain_node_addr_t)) {
         log_it(L_WARNING, "Address in database is corrupted for alias %s", a_alias);
         DAP_DELETE(l_addr);
         return NULL;
@@ -84,16 +84,6 @@ bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias)
     return dap_global_db_del_sync(a_net->pub.gdb_nodes_aliases, a_alias) == 0;
 }
 
-/**
- * Calculate size of struct dap_chain_node_info_t
- */
-size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info)
-{
-    if(!node_info)
-        return 0;
-    return (sizeof(dap_chain_node_info_t) + node_info->hdr.links_number * sizeof(dap_chain_node_addr_t));
-}
-
 /**
  * Compare addresses of two dap_chain_node_info_t structures
  *
@@ -148,17 +138,17 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n
 dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_chain_node_addr_t *l_address)
 {
     char *l_key = dap_chain_node_addr_to_hash_str(l_address);
-    if(!l_key) {
+    if (!l_key) {
         log_it(L_WARNING,"Can't calculate hash of addr");
         return NULL;
     }
     size_t node_info_size = 0;
     dap_chain_node_info_t *l_node_info;
     // read node
-    l_node_info = (dap_chain_node_info_t *) dap_global_db_get_sync(a_net->pub.gdb_nodes, l_key, &node_info_size, NULL, NULL);
+    l_node_info = (dap_chain_node_info_t *)dap_global_db_get_sync(a_net->pub.gdb_nodes, l_key, &node_info_size, NULL, NULL);
 
-    if(!l_node_info) {
-        log_it(L_INFO, "node with key %s (addr " NODE_ADDR_FP_STR ") not found in base",l_key, NODE_ADDR_FP_ARGS(l_address));
+    if (!l_node_info) {
+        log_it(L_NOTICE, "Node with address %s not found in base", l_key);
         DAP_DELETE(l_key);
         return NULL;
     }
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index 7584b9baa87fff718b072f8aad93952fb9bf121f..23bc259eee04eb7912f797b2de21bbe4c9642fb9 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -360,126 +360,6 @@ static int node_info_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info
     return -1;
 }
 
-
-/**
- * @brief link_add_or_del_with_reply
- * Handler of command 'global_db node link'
- * cmd 'add' or 'del'
- * str_reply[out] for reply
- * return 0 Ok, -1 error
- * @param a_net
- * @param a_node_info
- * @param cmd
- * @param a_alias_str
- * @param link
- * @param a_str_reply
- * @return int
- */
-static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, const char *cmd,
-        const char *a_alias_str,
-        dap_chain_node_addr_t *link, char **a_str_reply)
-{
-    if(!a_node_info->hdr.address.uint64 && !a_alias_str) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "addr not found");
-        return -1;
-    }
-    if(!link->uint64) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "link not found");
-        return -1;
-    }
-    // TODO check the presence of link in the node base
-#ifdef DAP_CHAIN_NODE_CHECK_PRESENSE
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "node 0x%016llx not found in base", link->uint64);
-        return -1;
-#endif
-
-    // find addr by alias or addr_str
-    dap_chain_node_addr_t *l_address = s_node_info_get_addr(a_net, &a_node_info->hdr.address, a_alias_str);
-    if(!l_address) {
-        dap_cli_server_cmd_set_reply_text(a_str_reply, "alias not found");
-        return -1;
-    }
-
-    dap_chain_node_info_t * l_node_info_read = node_info_read_and_reply(a_net, l_address, a_str_reply);
-    size_t l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read);
-    if(!l_node_info_read)
-        return -1;
-
-    int cmd_int = 0;
-    if(!strcmp(cmd, "add"))
-        cmd_int = 1;
-    else if(!strcmp(cmd, "del"))
-        cmd_int = 2;
-
-    // find link in node_info_read
-    int index_link = -1;
-    for(size_t i = 0; i < l_node_info_read->hdr.links_number; i++) {
-        if(l_node_info_read->links[i].uint64 == link->uint64) {
-            // link already present
-            index_link = (int) i;
-            break;
-        }
-    }
-    bool res_successful = false; // is successful whether add/del
-    // add link
-    if(cmd_int == 1) {
-        if(index_link == -1) {
-            l_node_info_read->hdr.links_number++;
-            l_node_info_read_size = dap_chain_node_info_get_size(l_node_info_read);
-            l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size);
-            l_node_info_read->links[l_node_info_read->hdr.links_number-1] = *link;
-            res_successful = true;
-        }
-    }
-    // delete link
-    else if(cmd_int == 2) {
-        // move link list to one item prev
-        if(index_link >= 0) {
-            for(unsigned int j = (unsigned int) index_link; j < (l_node_info_read->hdr.links_number - 1); j++) {
-                l_node_info_read->links[j] = l_node_info_read->links[j + 1];
-            }
-            l_node_info_read->hdr.links_number--;
-            res_successful = true;
-            l_node_info_read = DAP_REALLOC(l_node_info_read, l_node_info_read_size -= sizeof(*link));
-        }
-    }
-    // save edited node_info
-    if(res_successful) {
-        bool res = true;  //node_info_save_and_reply(a_net, l_node_info_read, a_str_reply);
-        if(res) {
-            res_successful = true;
-            if(cmd_int == 1)
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "link added");
-            if(cmd_int == 2)
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "link deleted");
-        }
-        else {
-            res_successful = false;
-        }
-    }
-    else {
-        if(cmd_int == 1) {
-            if(index_link >= 0)
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "link not added because it is already present");
-            else
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "link not added");
-        }
-        if(cmd_int == 2) {
-            if(index_link == -1)
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "link not deleted because not found");
-            else
-                dap_cli_server_cmd_set_reply_text(a_str_reply, "link not deleted");
-        }
-    }
-
-    DAP_DELETE(l_address);
-    DAP_DELETE(l_node_info_read);
-    if(res_successful)
-        return 0;
-    return -1;
-}
-
-
 /**
  * @brief node_info_dump_with_reply Handler of command 'node dump'
  * @param a_net
@@ -616,10 +496,9 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add
                 char l_ts[128] = { '\0' };
                 dap_gbd_time_to_str_rfc822(l_ts, sizeof(l_ts), l_objs[i].timestamp);
 
-                dap_string_append_printf(l_string_reply, NODE_ADDR_FP_STR"    %-20s%-8s"NODE_ADDR_FP_STR"    %-32s\n",
+                dap_string_append_printf(l_string_reply, NODE_ADDR_FP_STR"    %-20s%-8s    %-32s\n",
                                          NODE_ADDR_FP_ARGS_S(l_node_info->hdr.address),
                                          l_node_ipv4_str, dap_itoa(l_node_info->hdr.ext_port),
-                                         NODE_ADDR_FP_ARGS_S(l_node_info->hdr.owner_address),
                                          l_ts);
 
                 // get aliases in form of string
@@ -1143,7 +1022,7 @@ static dap_tsd_t* s_chain_node_cli_com_node_create_tsd_addr(char **a_argv, int a
 int com_node(int a_argc, char ** a_argv, char **a_str_reply)
 {
     enum {
-        CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER,
+        CMD_NONE, CMD_ADD, CMD_DEL, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP, CMD_CONNECTIONS, CMD_BALANCER,
         CMD_BAN, CMD_UNBAN, CMD_BANLIST
     };
     int arg_index = 1;
@@ -1153,13 +1032,8 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     }
     else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "del", NULL)) {
         cmd_num = CMD_DEL;
-    }
-    else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "link", NULL)) {
-        cmd_num = CMD_LINK;
-    }
-    else
-    // find  add parameter ('alias' or 'handshake')
-    if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "handshake", NULL)) {
+    } // find  add parameter ('alias' or 'handshake')
+    else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "handshake", NULL)) {
         cmd_num = CMD_HANDSHAKE;
     }
     else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "connect", NULL)) {
@@ -1173,11 +1047,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     }
     else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "connections", NULL)) {
         cmd_num = CMD_CONNECTIONS;
-//        char *l_str = NULL;
-//        dap_stream_connections_print(&l_str);
-//        dap_cli_server_cmd_set_reply_text(a_str_reply, "%s", l_str);
-//        DAP_DELETE(l_str);
-//        return 0;
     } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index+1), "ban", NULL)) {
         cmd_num = CMD_BAN;
     } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index+1), "unban", NULL)) {
@@ -1217,7 +1086,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     dap_chain_node_addr_t l_link = { 0 };
     dap_chain_node_info_t *l_node_info = NULL;
     size_t l_node_info_size = sizeof(l_node_info->hdr) + sizeof(l_link);
-    if(cmd_num >= CMD_ADD && cmd_num <= CMD_LINK) {
+    if(cmd_num >= CMD_ADD && cmd_num <= CMD_DEL) {
         l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size);
         if (!l_node_info) {
             log_it(L_CRITICAL, "Memory allocation error");
@@ -1301,25 +1170,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         DAP_DELETE(l_node_info);
         return l_ret;
     }
-    case CMD_LINK:
-        if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "add", NULL)) {
-            // handler of command 'node link add -addr <node address> -link <node address>'
-            int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "add", alias_str, &l_link, a_str_reply);
-            DAP_DELETE(l_node_info);
-            return l_ret;
-        }
-        else if(dap_cli_server_cmd_find_option_val(a_argv, arg_index, MIN(a_argc, arg_index + 1), "del", NULL)) {
-            // handler of command 'node link del -addr <node address> -link <node address>'
-            int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "del", alias_str, &l_link, a_str_reply);
-            DAP_DELETE(l_node_info);
-            return l_ret;
-        }
-        else {
-            dap_cli_server_cmd_set_reply_text(a_str_reply, "command not recognize, supported format:\n"
-                    "global_db node link <add|del] [-addr <node address>  | -alias <node alias>] -link <node address>");
-            DAP_DELETE(l_node_info);
-            return -1;
-        }
 
     case CMD_DUMP: {
         // handler of command 'node dump'
@@ -1379,13 +1229,10 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
 
             // get cur node links
             bool a_is_only_cur_cell = false;
-            dap_list_t *l_node_link_list = dap_chain_net_get_link_node_list(l_net, a_is_only_cur_cell);
+            // TODO rewrite this command totally
+            // dap_list_t *l_node_link_list = dap_chain_net_get_link_node_list(l_net, a_is_only_cur_cell);
             // get all nodes list if no links
-            if(!l_node_link_list)
-                l_node_list = dap_chain_net_get_node_list(l_net);
-            else
-                l_node_list = dap_list_concat(l_node_link_list, l_node_list);
-
+            l_node_list = dap_chain_net_get_node_list(l_net);
             // select random node from the list
             l_nodes_count = dap_list_length(l_node_list);
             if(l_nodes_count > 0) {
@@ -1726,7 +1573,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_string_append_printf(l_string_balanc, "node address "NODE_ADDR_FP_STR"  \tipv4 %s \tnumber of links %u\n",
                                      NODE_ADDR_FP_ARGS_S(l_node_link->hdr.address),
                                      inet_ntoa(l_node_link->hdr.ext_addr_v4),
-                                     l_node_link->hdr.links_number);
+                                     l_node_link->info.links_number);
         }
         dap_cli_server_cmd_set_reply_text(a_str_reply, "Balancer link list:\n %s \n",
                                           l_string_balanc->str);
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index e11cb0e92c0d7e811cfffcf83c00f83697f3b59f..f339ea1f7a4ec2f868dc744c66d4a462748f8ab0 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -31,19 +31,22 @@
 #include "dap_chain.h"
 
 typedef struct dap_chain_net dap_chain_net_t;
+
 typedef struct dap_chain_node_info {
     struct {
-        dap_chain_node_addr_t address;        
+        dap_chain_node_addr_t address;
         dap_chain_cell_id_t cell_id;
-        uint32_t links_number;
         struct in_addr ext_addr_v4;
         struct in6_addr ext_addr_v6;
         uint16_t ext_port; // Port thats node listening
-        char alias[240];
-        dap_chain_node_addr_t owner_address;
-        uint64_t blocks_events; /* truncated alias len */
     } DAP_ALIGN_PACKED hdr;
-    dap_chain_node_addr_t links[]; // dap_chain_addr_t
+    struct {
+        uint64_t atoms_count; /* truncated alias len */
+        uint32_t links_number;
+        byte_t other_info_for_future[240];
+    } DAP_ALIGN_PACKED info;
+    uint16_t alias_len;
+    byte_t alias[];
 } DAP_ALIGN_PACKED dap_chain_node_info_t;
 
 typedef dap_stream_node_addr_t dap_chain_node_addr_t;
@@ -54,7 +57,12 @@ typedef dap_stream_node_addr_t dap_chain_node_addr_t;
 /**
  * Calculate size of struct dap_chain_node_info_t
  */
-size_t dap_chain_node_info_get_size(dap_chain_node_info_t *node_info);
+DAP_STATIC_INLINE size_t dap_chain_node_info_get_size(dap_chain_node_info_t *a_node_info)
+{
+    if (!a_node_info)
+        return 0;
+    return (sizeof(dap_chain_node_info_t) + a_node_info->alias_len);
+}
 
 /**
  * Compare addresses of two dap_chain_node_info_t structures
@@ -82,9 +90,9 @@ bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias);
 int dap_chain_node_info_save(dap_chain_net_t * l_net,dap_chain_node_info_t *node_info);
 dap_chain_node_info_t* dap_chain_node_info_read(dap_chain_net_t * l_net, dap_chain_node_addr_t *address);
 
-inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *address)
+inline static char *dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *a_address)
 {
-    return dap_hash_fast_str_new((const uint8_t*) address, sizeof(dap_chain_node_addr_t));
+    return dap_strdup_printf(NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(a_address));
 }
 
 bool dap_chain_node_mempool_need_process(dap_chain_t *a_chain, dap_chain_datum_t *a_datum);