diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c
index a53a53ed498f859abdbd0f53bacfa53536eca3e3..a999d40a22a99bb6982503a75b57c964f5c59d6f 100644
--- a/dap_chain_node_cli.c
+++ b/dap_chain_node_cli.c
@@ -782,7 +782,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config)
             "node alias {<node address> | -alias <node alias>}\n\n"
                     "node connect {<node address> | -alias <node alias>}\n\n"
                     "node handshake {<node address> | -alias <node alias>}\n"
-                    "node dump -net <net name> [ -addr <node address> | -alias <node alias>]\n\n"
+                    "node dump -net <net name> [ -addr <node address> | -alias <node alias>] [-full]\n\n"
                                         );
     dap_chain_node_cli_cmd_item_create ("ping", com_ping, "Send ICMP ECHO_REQUEST to network hosts",
             "ping [-c <count>] host\n");
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 75802c9796eaab53009f9c9d46d324e24fb05f65..088153c34dca08fe32629e9473ca80583142c453 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -439,35 +439,100 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in
  * str_reply[out] for reply
  * return 0 Ok, -1 error
  */
-static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_addr_t * a_addr, const char *a_alias, char **a_str_reply)
+static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_addr_t * a_addr, bool a_is_full, const char *a_alias, char **a_str_reply)
 {
     int l_ret = 0;
-    dap_string_t *l_string_reply = dap_string_new("Node dump:\n");
+    dap_string_t *l_string_reply = dap_string_new("Node dump:");
 
-    if( (a_addr && a_addr->uint64 ) || a_alias) {
+    if((a_addr && a_addr->uint64) || a_alias) {
         dap_chain_node_addr_t *l_addr;
-        if (a_addr && a_addr->uint64){
+        if(a_addr && a_addr->uint64) {
             l_addr = DAP_NEW(dap_chain_node_addr_t);
             l_addr->uint64 = a_addr->uint64;
-        } else if (a_alias) {
-            l_addr = dap_chain_node_alias_find(a_net,a_alias);
+        } else if(a_alias) {
+            l_addr = dap_chain_node_alias_find(a_net, a_alias);
         }
-        if ( l_addr ) {
+        if(!l_addr) {
+            dap_chain_node_cli_set_reply_text(a_str_reply, "addr not found");
+            dap_string_free(l_string_reply, true);
+            return -1;
+        }
+        // read node
+        dap_chain_node_info_t *node_info_read = node_info_read_and_reply(a_net, l_addr, a_str_reply);
+
+        // get aliases in form of string
+        dap_string_t *aliases_string = dap_string_new(NULL);
+        dap_list_t *list_aliases = get_aliases_by_name(a_net, l_addr);
+        if(list_aliases)
+        {
+            dap_list_t *list = list_aliases;
+            while(list)
+            {
+                const char *alias = (const char *) list->data;
+                dap_string_append_printf(aliases_string, "\nalias %s", alias);
+                list = dap_list_next(list);
+            }
+            dap_list_free_full(list_aliases, (dap_callback_destroyed_t) free);
         }
+        else
+            dap_string_append(aliases_string, "\nno aliases");
+
+        const int hostlen = 128;
+        char *host4 = (char*) alloca(hostlen);
+        char *host6 = (char*) alloca(hostlen);
+        struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = node_info_read->hdr.ext_addr_v4 };
+        const char* str_ip4 = inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host4, hostlen);
+
+        struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = node_info_read->hdr.ext_addr_v6 };
+        const char* str_ip6 = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host6, hostlen);
+
+        // get links in form of string
+        dap_string_t *links_string = dap_string_new(NULL);
+        for(unsigned int i = 0; i < node_info_read->hdr.links_number; i++) {
+            dap_chain_node_addr_t link_addr = node_info_read->links[i];
+            dap_string_append_printf(links_string, "\nlink%02d address : " NODE_ADDR_FP_STR, i,
+                    NODE_ADDR_FP_ARGS_S(link_addr));
+        }
+
+        dap_string_append_printf(l_string_reply, "\n");
+        // set short reply with node param
+        if(!a_is_full)
+            dap_string_append_printf(l_string_reply,
+                    "node address "NODE_ADDR_FP_STR"\tcell 0x%016llx\tipv4 %s\tnumber of links %u",
+                    NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address),
+                    node_info_read->hdr.cell_id.uint64, str_ip4,
+                    node_info_read->hdr.links_number);
+        else
+            // set full reply with node param
+            dap_string_append_printf(l_string_reply,
+                    "node address " NODE_ADDR_FP_STR "\ncell 0x%016llx%s\nipv4 %s\nipv6 %s\nlinks %u%s",
+                    NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address),
+                    node_info_read->hdr.cell_id.uint64,
+                    str_ip4, str_ip6, aliases_string->str,
+                    node_info_read->hdr.links_number, links_string->str);
+        dap_string_free(aliases_string, true);
+        dap_string_free(links_string, true);
+
+        DAP_DELETE(l_addr);
+        DAP_DELETE(node_info_read);
+
+
     }else { // Dump list
-        dap_global_db_obj_t **l_objs = NULL;
+        dap_global_db_obj_t *l_objs = NULL;
         size_t l_nodes_count = 0;
         dap_chain_node_info_t *l_node_info;
+        dap_string_append(l_string_reply, "\n");
         // read all node
         l_objs = dap_chain_global_db_gr_load( a_net->pub.gdb_nodes, &l_nodes_count);
 
         if(!l_nodes_count || !l_objs) {
             dap_string_append_printf(l_string_reply, "No records\n");
+            dap_string_free(l_string_reply, true);
             l_ret = -1;
         }else {
             dap_string_append_printf(l_string_reply,"Got %u records:\n",l_nodes_count);
             for(size_t i = 0; i < l_nodes_count; i++) {
-                dap_chain_node_info_t *node_info =  (dap_chain_node_info_t *) l_objs[i]->value;
+                dap_chain_node_info_t *node_info =  (dap_chain_node_info_t *) l_objs[i].value;
                 // find addr by alias or addr_str
                 dap_chain_node_addr_t *address = node_info_get_addr(a_net, node_info, &node_info->hdr.address, a_alias);
                 if(!address) {
@@ -518,7 +583,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add
                 if(i)
                     dap_string_append_printf(l_string_reply, "\n");
                 // set short reply with node param
-                if(l_objs)
+                if(!a_is_full)
                     dap_string_append_printf(l_string_reply,
                             "node address "NODE_ADDR_FP_STR"\tcell 0x%016llx\tipv4 %s\tnumber of links %u",
                             NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address),
@@ -690,6 +755,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-alias", &alias_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str);
+    bool l_is_full = dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-full", NULL);
 
     if (l_addr_str)
         if ( dap_chain_node_addr_from_str(&l_node_addr,l_addr_str) != 0 )
@@ -712,7 +778,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
     case CMD_DUMP:{
         // handler of command 'global_db node dump'
 
-        return node_info_dump_with_reply(l_net, &l_node_addr , alias_str, a_str_reply);
+        return node_info_dump_with_reply(l_net, &l_node_addr , l_is_full, alias_str, a_str_reply);
     }
     // add alias
     case CMD_ALIAS: