diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c
index 5a22a0e5cb6cbbe45e9bacab6c993b9e2c345af6..f457f31cf3c0108797b9ba077ab663785c9b26f3 100644
--- a/modules/chain/dap_chain_ch.c
+++ b/modules/chain/dap_chain_ch.c
@@ -917,6 +917,8 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
         }
         dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id);
         dap_chain_ch_summary_t *l_sum = (dap_chain_ch_summary_t *)l_chain_pkt->data;
+        if(l_chain->atom_num_last < l_sum->num_last)
+            l_chain->atom_num_last = l_sum->num_last;
         debug_if(s_debug_more, L_DEBUG, "In: CHAIN_SUMMARY of %s for net %s from source " NODE_ADDR_FP_STR
                                             " with %" DAP_UINT64_FORMAT_U " atoms to sync from %" DAP_UINT64_FORMAT_U " to %" DAP_UINT64_FORMAT_U,
                                 l_chain ? l_chain->name : "(null)",
diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index ca8986103f08f6929b27d310b2c24c07030a5f2c..4b83efb886aafcd3ab98f56bcfa07a68e139d474 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -150,6 +150,7 @@ typedef struct dap_chain {
     dap_chain_type_t *default_datum_types;
     uint16_t autoproc_datum_types_count;
     uint16_t *autoproc_datum_types;
+    uint64_t atom_num_last;
 
     // To hold it in double-linked lists
     struct dap_chain * next;
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 649ee2142a3b0df6a4cd0e2029349eaacebc7b6e..6918af0098e1be5ceef3407ec5d7e6df2a1da2f5 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -231,7 +231,7 @@ static const dap_link_manager_callbacks_t s_link_manager_callbacks = {
 
 // State machine switchs here
 static bool s_net_states_proc(void *a_arg);
-struct json_object *s_net_states_json_collect(dap_chain_net_t * l_net);
+json_object *s_net_states_json_collect(dap_chain_net_t * l_net);
 static void s_net_states_notify(dap_chain_net_t * l_net);
 static void s_nodelist_change_notify(dap_store_obj_t *a_obj, void *a_arg);
 //static void s_net_proc_kill( dap_chain_net_t * a_net );
@@ -464,7 +464,7 @@ static void s_link_manager_callback_connected(dap_link_t *a_link, uint64_t a_net
     log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name,
            NODE_ADDR_FP_ARGS_S(a_link->addr));
 
-    struct json_object *l_json = s_net_states_json_collect(l_net);
+    json_object *l_json = s_net_states_json_collect(l_net);
     char l_err_str[128] = { };
     snprintf(l_err_str, sizeof(l_err_str)
                  , "Established connection with link " NODE_ADDR_FP_STR
@@ -528,7 +528,7 @@ static void s_link_manager_callback_error(dap_link_t *a_link, uint64_t a_net_id,
     log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR,
            l_net ? l_net->pub.name : "(unknown)", NODE_ADDR_FP_ARGS_S(a_link->addr));
     if (l_net){
-        struct json_object *l_json = s_net_states_json_collect(l_net);
+        json_object *l_json = s_net_states_json_collect(l_net);
         char l_err_str[512] = { };
         snprintf(l_err_str, sizeof(l_err_str)
                      , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d"
@@ -583,9 +583,37 @@ int s_link_manager_fill_net_info(dap_link_t *a_link)
     return 0;
 }
 
-struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
+json_object *s_net_sync_status(dap_chain_net_t *a_net) {
+// sanity check
+    dap_return_val_if_pass(!a_net, NULL);
+// func work
+    json_object *l_ret = json_object_new_object();
+    size_t
+        l_count_el = 0,
+        l_count_el_all = 0,
+        l_node_link_nodes = 0;
+    char *l_gdb_nodes = a_net->pub.gdb_nodes;
+
+    dap_chain_t *l_chain = NULL;
+    DL_FOREACH(a_net->pub.chains, l_chain){
+        l_count_el += l_chain->callback_count_atom(l_chain);
+        l_count_el_all += l_chain->atom_num_last;
+    }
+    double l_percent = l_count_el_all ? (double)(l_count_el * 100) / l_count_el_all : 0;
+    char *l_percent_str = dap_strdup_printf("%.3f", l_percent);
+    json_object *l_jobj_percent = json_object_new_string(l_percent_str);
+    DAP_DELETE(l_percent_str);
+    json_object *l_jobj_total = json_object_new_uint64(l_count_el_all);
+    json_object *l_jobj_current  = json_object_new_uint64(l_count_el);
+    json_object_object_add(l_ret, "current", l_jobj_current);
+    json_object_object_add(l_ret, "total", l_jobj_total);
+    json_object_object_add(l_ret, "percent", l_jobj_percent);
+    return l_ret;
+}
+
+json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
 {
-    struct json_object *l_json = json_object_new_object();
+    json_object *l_json = json_object_new_object();
     json_object_object_add(l_json, "class"            , json_object_new_string("NetStates"));
     json_object_object_add(l_json, "name"             , json_object_new_string((const char*)a_net->pub.name));
     json_object_object_add(l_json, "networkState"     , json_object_new_string(dap_chain_net_state_to_str(PVT(a_net)->state)));
@@ -595,6 +623,10 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
     char l_node_addr_str[24] = {'\0'};
     int l_tmp = snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(g_node_addr));
     json_object_object_add(l_json, "nodeAddress"     , json_object_new_string(l_tmp ? l_node_addr_str : "0000::0000::0000::0000"));
+    if (PVT(a_net)->state == NET_STATE_SYNC_CHAINS) {
+        json_object *l_json_sync_status = s_net_sync_status(a_net);
+        json_object_object_add(l_json, "processed", l_json_sync_status);
+    }
     return l_json;
 }
 
@@ -604,7 +636,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net)
  */
 static void s_net_states_notify(dap_chain_net_t *a_net)
 {
-    struct json_object *l_json = s_net_states_json_collect(a_net);
+    json_object *l_json = s_net_states_json_collect(a_net);
     json_object_object_add(l_json, "errorMessage", json_object_new_string(" ")); // regular notify has no error
     dap_notify_server_send_mt(json_object_get_string(l_json));
     json_object_put(l_json);
@@ -795,20 +827,24 @@ json_object* s_set_reply_text_node_status_json(dap_chain_net_t *a_net) {
     json_object_object_add(l_jobj_ret, "current_addr", l_jobj_cur_node_addr);
     if (PVT(a_net)->state != NET_STATE_OFFLINE) {
         json_object *l_jobj_links = json_object_new_object();
-        json_object *l_jobj_active_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/);  // need adopt to link manager
-        json_object *l_jobj_total_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/);
-        if (!l_jobj_links || !l_jobj_active_links || !l_jobj_total_links) {
+        json_object *l_jobj_active_links = json_object_new_uint64(dap_link_manager_links_count(a_net->pub.id.uint64));
+        json_object *l_jobj_required_links = json_object_new_uint64(dap_link_manager_required_links_count(a_net->pub.id.uint64));
+        if (!l_jobj_links || !l_jobj_active_links || !l_jobj_required_links) {
             json_object_put(l_jobj_ret);
             json_object_put(l_jobj_links);
             json_object_put(l_jobj_active_links);
-            json_object_put(l_jobj_total_links);
+            json_object_put(l_jobj_required_links);
             dap_json_rpc_allocation_error;
             return NULL;
         }
         json_object_object_add(l_jobj_links, "active", l_jobj_active_links);
-        json_object_object_add(l_jobj_links, "total", l_jobj_total_links);
+        json_object_object_add(l_jobj_links, "required", l_jobj_required_links);
         json_object_object_add(l_jobj_ret, "links", l_jobj_links);
     }
+
+    json_object *l_json_sync_status = s_net_sync_status(a_net);
+    json_object_object_add(l_jobj_ret, "processed", l_json_sync_status);
+
     json_object *l_jobj_states = json_object_new_object();
     json_object *l_jobj_current_states = json_object_new_string(c_net_states[PVT(a_net)->state]);
     json_object *l_jobj_target_states = json_object_new_string(c_net_states[PVT(a_net)->state_target]);
@@ -2134,7 +2170,7 @@ bool s_net_load(void *a_arg)
             dap_chain_save_all( l_chain );
             log_it (L_NOTICE, "Initialized chain files");
         }
-
+        l_chain->atom_num_last = l_chain->callback_count_atom(l_chain);
         l_chain = l_chain->next;
     }
     // Process thresholds if any