diff --git a/modules/net/dap_chain_node_rpc.c b/modules/net/dap_chain_node_rpc.c
index 92b38785ca4a58e16c51ed8995bc576d3d3c984b..a6f3c9b0a12847db2441217427c8c99498677130 100644
--- a/modules/net/dap_chain_node_rpc.c
+++ b/modules/net/dap_chain_node_rpc.c
@@ -27,17 +27,9 @@
 #include <stdint.h>
 #include <string.h>
 
-#ifdef WIN32
-#include <winsock2.h>
-#include <windows.h>
-#include <mswsock.h>
-#include <ws2tcpip.h>
-#include <io.h>
-#include <pthread.h>
-#else
-#include <sys/socket.h>
-#include <netinet/in.h>
-#endif
+
+#include <sys/sysinfo.h>
+#include <sys/vfs.h>
 
 #include "dap_hash.h"
 #include "dap_chain_net.h"
@@ -47,18 +39,19 @@
 #include "dap_chain_ledger.h"
 
 #define LOG_TAG "dap_chain_node_rpc"
-#define DAP_RPC_CLUSTER_GLOBAL           ".rpc"
-#define DAP_RPC_DB_CLUSTER_GLOBAL       DAP_RPC_CLUSTER_GLOBAL ".*"
+#define DAP_RPC_CLUSTER_GLOBAL ".rpc"
+#define DAP_RPC_DB_CLUSTER_GLOBAL DAP_RPC_CLUSTER_GLOBAL ".*"
 #define DAP_CHAIN_NODE_RPC_STATES_INFO_CURRENT_VERSION 1
-typedef struct dap_chain_node_rpc_states_info {
+typedef struct dap_chain_node_rpc_states_info
+{
     uint32_t version;
     dap_chain_node_addr_t address;
+    uint32_t location;
+    uint32_t links_count;
     uint32_t cli_thread_count;
-    uint32_t cpu;
-    uint64_t mem;
+    struct sysinfo sysinfo;
 } DAP_ALIGN_PACKED dap_chain_node_rpc_states_info_t;
 
-
 static const uint64_t s_timer_update_states_info = 10 /*sec*/ * 1000;
 static const char s_states_group[] = ".rpc.states";
 static dap_global_db_cluster_t *s_global_cluster = NULL;
@@ -69,29 +62,25 @@ static dap_global_db_cluster_t *s_global_cluster = NULL;
  */
 static void s_update_node_rpc_states_info(UNUSED_ARG void *a_arg)
 {
-    for (dap_chain_net_t *l_net = dap_chain_net_iter_start(); l_net; l_net = dap_chain_net_iter_next(l_net)) {
-        if(dap_chain_net_get_state(l_net) == NET_STATE_ONLINE) {
-            size_t
-                l_uplinks_count = 0,
-                l_downlinks_count = 0,
-                l_info_size = 0;
-            dap_chain_node_rpc_states_info_t *l_info = DAP_NEW_Z_RET_IF_FAIL(dap_chain_node_rpc_states_info_t);
-            l_info->version = DAP_CHAIN_NODE_RPC_STATES_INFO_CURRENT_VERSION;
-            l_info->address.uint64 = g_node_addr.uint64;
-
-            char *l_gdb_group = dap_strdup_printf("%s%s", l_net->pub.gdb_groups_prefix, s_states_group);
-            const char *l_node_addr_str = dap_stream_node_addr_to_str_static(l_info->address);
-            dap_global_db_set_sync(l_gdb_group, l_node_addr_str, l_info, l_info_size, false);
-            DAP_DEL_MULTY(l_info, l_gdb_group);
-        }
-    }
+    dap_chain_node_rpc_states_info_t *l_info = DAP_NEW_Z_RET_IF_FAIL(dap_chain_node_rpc_states_info_t);
+    l_info->version = DAP_CHAIN_NODE_RPC_STATES_INFO_CURRENT_VERSION;
+    l_info->address.uint64 = g_node_addr.uint64;
+    l_info->links_count = dap_stream_get_links_count();
+    sysinfo(&l_info->sysinfo);
+
+    struct statfs buf;
+    statfs("/opt/cellframe-node/bin/cellframe-node", &buf);
+
+    // const char *l_node_addr_str = dap_stream_node_addr_to_str_static(l_info->address);
+    // dap_global_db_set_sync(l_gdb_group, l_node_addr_str, l_info, l_info_size, false);
+    // DAP_DELETE(l_info);
 }
 
 static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr_str, dap_string_t *l_info_str)
 {
-// sanity check
+    // sanity check
     dap_return_if_pass(!a_net || !a_node_addr_str || !l_info_str);
-// func work
+    // func work
     // dap_nanotime_t l_timestamp = 0;
     // size_t l_data_size = 0;
     // char *l_gdb_group = dap_strdup_printf("%s%s", a_net->pub.gdb_groups_prefix, s_states_group);
@@ -104,7 +93,7 @@ static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr
     //     if ( (l_data_size - sizeof(dap_chain_node_net_states_info_v1_t)) % sizeof(dap_chain_node_addr_t) )
     //         return DAP_DELETE(l_node_info_data), log_it(L_ERROR, "Irrelevant size of node %s info", a_node_addr_str);
     //     dap_chain_node_net_states_info_v1_t *l_info_old = (dap_chain_node_net_states_info_v1_t*)l_node_info_data;
-    //     l_node_info = DAP_NEW_Z_SIZE( dap_chain_node_rpc_states_info_t, sizeof(dap_chain_node_rpc_states_info_t) 
+    //     l_node_info = DAP_NEW_Z_SIZE( dap_chain_node_rpc_states_info_t, sizeof(dap_chain_node_rpc_states_info_t)
     //                                   + (l_info_old->uplinks_count + l_info_old->downlinks_count) * sizeof(dap_chain_node_addr_t) );
     //     l_node_info->version_info = 1;
     //     memcpy( (byte_t*)l_node_info + node_info_v1_shift, l_info_old, l_data_size );
@@ -116,7 +105,7 @@ static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr
     // dap_string_append_printf(l_info_str,
     //     "Record timestamp: %s\nRecord version: %u\nNode version: %s\nNode addr: %s\nNet: %s\nRole: %s\n"
     //     "Events count: %"DAP_UINT64_FORMAT_U"\nAtoms count: %"DAP_UINT64_FORMAT_U"\nUplinks count: %u\nDownlinks count: %u\n",
-    //     l_ts, l_node_info->version_info, l_node_info->version_node, a_node_addr_str, a_net->pub.name, 
+    //     l_ts, l_node_info->version_info, l_node_info->version_node, a_node_addr_str, a_net->pub.name,
     //     dap_chain_node_role_to_str(l_node_info->role), l_node_info->info_v1.events_count, l_node_info->info_v1.atoms_count,
     //     l_node_info->info_v1.uplinks_count, l_node_info->info_v1.downlinks_count);
     // size_t l_max_links = dap_max(l_node_info->info_v1.uplinks_count, l_node_info->info_v1.downlinks_count);
@@ -127,10 +116,10 @@ static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr
     //     "-----------------------------------------------------------------\n");
     // }
     // for (size_t i = 0; i < l_max_links; ++i) {
-    //     char *l_upnlink_str = i < l_node_info->info_v1.uplinks_count 
+    //     char *l_upnlink_str = i < l_node_info->info_v1.uplinks_count
     //         ? dap_stream_node_addr_to_str(l_node_info->info_v1.links_addrs[i], false)
     //         : dap_strdup("\t\t");
-    //     char *l_downlink_str = i < l_node_info->info_v1.downlinks_count 
+    //     char *l_downlink_str = i < l_node_info->info_v1.downlinks_count
     //         ? dap_stream_node_addr_to_str(l_node_info->info_v1.links_addrs[i + l_node_info->info_v1.uplinks_count], false)
     //         : dap_strdup("\t\t");
     //     dap_string_append_printf(l_info_str, "|\t%s\t|\t%s\t|\n", l_upnlink_str, l_downlink_str);
@@ -140,14 +129,13 @@ static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr
     // DAP_DELETE(l_node_info);
 }
 
-
 void dap_chain_node_rpc_init()
 {
-    if ( !(s_global_cluster = dap_global_db_cluster_add(
-        dap_global_db_instance_get_default(), DAP_RPC_CLUSTER_GLOBAL,
-        *(dap_guuid_t*)&uint128_0, DAP_RPC_DB_CLUSTER_GLOBAL,
-        0,
-        true, DAP_GDB_MEMBER_ROLE_GUEST, DAP_CLUSTER_TYPE_VIRTUAL)))
+    if (!(s_global_cluster = dap_global_db_cluster_add(
+              dap_global_db_instance_get_default(), DAP_RPC_CLUSTER_GLOBAL,
+              *(dap_guuid_t *)&uint128_0, DAP_RPC_DB_CLUSTER_GLOBAL,
+              0,
+              true, DAP_GDB_MEMBER_ROLE_GUEST, DAP_CLUSTER_TYPE_VIRTUAL)))
         return;
     if (dap_proc_thread_timer_add(NULL, s_update_node_rpc_states_info, NULL, s_timer_update_states_info))
         log_it(L_ERROR, "Can't activate timer on node states update");
@@ -184,4 +172,3 @@ void dap_chain_node_rpc_init()
 //     }
 //     return l_ret;
 // }
-