diff --git a/dap_chain_net.c b/dap_chain_net.c
index 3b28dceff0b5b39afb03d967069ca52721ebf7a8..105ba0022cb5c7f0b5d2f64f1bb42e2adef6e84e 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -1171,9 +1171,10 @@ int s_net_load(const char * a_net_name)
          }
 
         // Init chains
-        size_t l_chains_path_size =strlen(dap_config_path())+1+strlen(l_net->pub.name)+1+strlen("network")+1;
-        char * l_chains_path = DAP_NEW_Z_SIZE (char,l_chains_path_size);
-        dap_snprintf(l_chains_path,l_chains_path_size,"%s/network/%s",dap_config_path(),l_net->pub.name);
+        //size_t l_chains_path_size =strlen(dap_config_path())+1+strlen(l_net->pub.name)+1+strlen("network")+1;
+        //char * l_chains_path = DAP_NEW_Z_SIZE (char,l_chains_path_size);
+        //dap_snprintf(l_chains_path,l_chains_path_size,"%s/network/%s",dap_config_path(),l_net->pub.name);
+        char * l_chains_path = dap_strdup_printf("%s/network/%s", dap_config_path(), l_net->pub.name);
         DIR * l_chains_dir = opendir(l_chains_path);
         DAP_DELETE (l_chains_path);
         if ( l_chains_dir ){
@@ -1182,26 +1183,22 @@ int s_net_load(const char * a_net_name)
                 if (l_dir_entry->d_name[0]=='\0')
                     continue;
                 char * l_entry_name = strdup(l_dir_entry->d_name);
-                l_chains_path_size = strlen(l_net->pub.name)+1+strlen("network")+1+strlen (l_entry_name)-3;
-                l_chains_path = DAP_NEW_Z_SIZE(char, l_chains_path_size);
-
                 if (strlen (l_entry_name) > 4 ){ // It has non zero name excluding file extension
                     if ( strncmp (l_entry_name+ strlen(l_entry_name)-4,".cfg",4) == 0 ) { // its .cfg file
                         l_entry_name [strlen(l_entry_name)-4] = 0;
                         log_it(L_DEBUG,"Open chain config \"%s\"...",l_entry_name);
-                        dap_snprintf(l_chains_path,l_chains_path_size,"network/%s/%s",l_net->pub.name,l_entry_name);
-                        //dap_config_open(l_chains_path);
-
+                        l_chains_path = dap_strdup_printf("network/%s/%s",l_net->pub.name,l_entry_name);
                         // Create chain object
-                        dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name, l_net->pub.id, l_chains_path);
-                        if(l_chain){
-                            DL_APPEND( l_net->pub.chains, l_chain);
+                        dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.ledger, l_net->pub.name,
+                                l_net->pub.id, l_chains_path);
+                        if(l_chain) {
+                            DL_APPEND(l_net->pub.chains, l_chain);
                             if(l_chain->callback_created)
-                                l_chain->callback_created(l_chain,l_cfg);
+                                l_chain->callback_created(l_chain, l_cfg);
                         }
+                        DAP_DELETE (l_chains_path);
                     }
                 }
-                DAP_DELETE (l_chains_path);
                 DAP_DELETE (l_entry_name);
             }
         } else {
@@ -1343,6 +1340,47 @@ dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const ch
    return NULL;
 }
 
+/**
+ * @brief dap_chain_net_get_chain_by_chain_type
+ * @param a_datum_type
+ * @return
+ */
+dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type)
+{
+    dap_chain_t * l_chain;
+    if(!l_net)
+        return NULL;
+    DL_FOREACH(l_net->pub.chains, l_chain)
+    {
+        for(uint16_t i = 0; i < l_chain->datum_types_count; i++) {
+            if(l_chain->datum_types[i] == a_datum_type)
+                return l_chain;
+        }
+    }
+    return NULL;
+}
+
+/**
+ * @brief dap_chain_net_get_gdb_group_mempool_by_chain_type
+ * @param a_datum_type
+ * @return
+ */
+char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type)
+{
+    dap_chain_t * l_chain;
+    if(!l_net)
+        return NULL;
+    DL_FOREACH(l_net->pub.chains, l_chain)
+    {
+        for(uint16_t i = 0; i < l_chain->datum_types_count; i++) {
+            if(l_chain->datum_types[i] == a_datum_type)
+                return dap_chain_net_get_gdb_group_mempool(l_chain);
+        }
+    }
+    return NULL;
+}
+
+
 /**
  * @brief dap_chain_net_get_cur_addr
  * @param l_net
diff --git a/dap_chain_net.h b/dap_chain_net.h
index 27384fbc1e7be732f780da90313f967651fa7401..5a5a5bbeb6c7c028ca2813ff6eae842d9144178d 100644
--- a/dap_chain_net.h
+++ b/dap_chain_net.h
@@ -49,7 +49,6 @@ typedef  enum dap_chain_net_state{
     NET_STATE_SYNC_CHAINS,
 } dap_chain_net_state_t;
 
-
 typedef struct dap_chain_net{
     struct {
         dap_chain_net_id_t id;
@@ -110,3 +109,6 @@ DAP_STATIC_INLINE char * dap_chain_net_get_gdb_group_mempool(dap_chain_t * l_cha
     }
     return NULL;
 }
+
+dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type);
+char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type);
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 75802c9796eaab53009f9c9d46d324e24fb05f65..40abe1583742331299d178c28da94cb3c94c9bf6 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -71,6 +71,7 @@
 #include "dap_chain_node_remote.h"
 #include "dap_chain_node_cli_cmd.h"
 #include "dap_chain_net_srv.h"
+#include "dap_chain_cell.h"
 
 #include "dap_chain_datum.h"
 #include "dap_chain_datum_tx_items.h"
@@ -554,36 +555,57 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add
 int com_global_db(int a_argc, char ** a_argv, char **a_str_reply)
 {
     enum {
-        CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK    };
+        CMD_NONE, CMD_NAME_NODE, CMD_NAME_CELL, CMD_ADD, CMD_DEL, CMD_LINK    };
     //printf("com_global_db\n");
     int arg_index = 1;
+    int cmd_name =  CMD_NONE;
     // find 'node' as first parameter only
     arg_index = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "node", NULL);
+    if(arg_index)
+                cmd_name =  CMD_NAME_NODE;
+    // find 'cells' as first parameter only
+    if(!arg_index) {
+        arg_index = 1;
+        arg_index = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "cells", NULL);
+        if(arg_index)
+            cmd_name =  CMD_NAME_CELL;
+    }
     if(!arg_index || a_argc < 3) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "parameters are not valid");
         return -1;
     }
+    dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, NULL, &l_net) < 0)
+    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, &l_chain, &l_net) < 0)
         return -11;
 
     int arg_index_n = ++arg_index;
     // find command (add, delete, etc) as second parameter only
     int cmd_num = CMD_NONE;
-    if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL))
-            != 0) {
-        cmd_num = CMD_ADD;
-    }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del",
-    NULL))
-            != 0) {
-        cmd_num = CMD_DEL;
-    }
-    else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link",
-    NULL))
-            != 0) {
-        cmd_num = CMD_LINK;
+    switch(cmd_name){
+    case CMD_NAME_NODE:
+        if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL))
+                != 0) {
+            cmd_num = CMD_ADD;
+        }
+        else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del",
+        NULL))
+                != 0) {
+            cmd_num = CMD_DEL;
+        }
+        else if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link",
+        NULL))
+                != 0) {
+            cmd_num = CMD_LINK;
+        }
+        break;
+
+    case CMD_NAME_CELL:
+        if((arg_index_n = dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL))
+                != 0) {
+            cmd_num = CMD_ADD;
+        }
     }
 
     if(cmd_num == CMD_NONE) {
@@ -593,12 +615,13 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply)
     //arg_index = arg_index_n; // no need, they are already equal must be
     assert(arg_index == arg_index_n);
     arg_index++;
-    const char *l_addr_str = NULL, *alias_str = NULL, *l_cell_str = NULL, *l_link_str = NULL;
+    const char *l_addr_str = NULL, *alias_str = NULL, *l_cell_str = NULL, *l_chain_str = NULL, *l_link_str = NULL;
     const char *a_ipv4_str = NULL, *a_ipv6_str = NULL;
     // find addr, alias
     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, "-cell", &l_cell_str);
+    dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-chain", &l_chain_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ipv4", &a_ipv4_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ipv6", &a_ipv6_str);
     dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-link", &l_link_str);
@@ -623,13 +646,29 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply)
     {
     // add new node to global_db
     case CMD_ADD:
-        if(!arg_index || a_argc < 8) {
-            dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters");
-            return -1;
+        if(cmd_name == CMD_NAME_NODE) {
+            if(!arg_index || a_argc < 8) {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters");
+                return -1;
+            }
+            // handler of command 'global_db node add'
+            return node_info_add_with_reply(l_net, l_node_info, alias_str, l_cell_str, a_ipv4_str, a_ipv6_str,
+                    a_str_reply);
+        }
+        else if(cmd_name == CMD_NAME_CELL) {
+            if(!arg_index || a_argc < 7) {
+                dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters");
+                return -1;
+            }
+            dap_chain_cell_t *l_cell = dap_chain_cell_create();
+            l_cell->chain = l_chain;
+            l_cell->id.uint64 = l_node_info->hdr.cell_id.uint64;
+            l_cell->file_storage_path = "234";
+            dap_chain_cell_file_update(l_cell);
+            DAP_DELETE(l_cell);
+
         }
-        // handler of command 'global_db node add'
-        return node_info_add_with_reply(l_net,l_node_info, alias_str, l_cell_str, a_ipv4_str, a_ipv6_str, a_str_reply);
-        //break;
+        break;
 
     case CMD_DEL:
         // handler of command 'global_db node del'
@@ -1174,7 +1213,7 @@ int com_help(int argc, char ** argv, char **str_reply)
  */
 int com_tx_wallet(int argc,  char ** argv, char **str_reply)
 {
-    const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path");
+    const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
     // Get address of wallet
     enum {
         CMD_NONE, CMD_WALLET_NEW, CMD_WALLET_LIST, CMD_WALLET_INFO
@@ -1407,8 +1446,15 @@ int com_token_decl_sign(int argc,  char ** argv, char ** a_str_reply)
 
         dap_chain_net_t * l_net = NULL;
 
-        if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) < 0)
+        dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net);
+        if(!l_net)
             return -1;
+        else {
+            if(*a_str_reply) {
+                DAP_DELETE(*a_str_reply);
+                *a_str_reply = NULL;
+            }
+        }
 
         // Load certs lists
         size_t l_signs_size = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
@@ -1419,7 +1465,13 @@ int com_token_decl_sign(int argc,  char ** argv, char ** a_str_reply)
         }
         size_t l_certs_count = l_certs_size / sizeof(dap_chain_cert_t *);
 
-        char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+        char * l_gdb_group_mempool;// = dap_chain_net_get_gdb_group_mempool(l_chain);
+        if(l_gdb_group_mempool) {
+            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+        }
+        else {
+            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN);
+        }
 
         log_it(L_DEBUG, "Requested to sign token declaration %s in gdb://%s with certs %s",
                 l_gdb_group_mempool, l_datum_hash_str, l_certs_str);
@@ -1570,30 +1622,52 @@ int com_mempool_list(int argc, char ** argv, char ** a_str_reply)
     dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) != 0) {
+    dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net);
+    if(!l_net)
         return -1;
+    else {
+        if(*a_str_reply) {
+            DAP_DELETE(*a_str_reply);
+            *a_str_reply = NULL;
+        }
     }
 
-    if(l_chain && l_net) {
-        char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+    if(l_net) {
+        char * l_gdb_group_mempool = NULL, * l_gdb_group_mempool_tmp;
+        if(l_chain){
+            l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+            l_gdb_group_mempool_tmp = l_gdb_group_mempool;
+        }
         dap_string_t * l_str_tmp = dap_string_new(NULL);
 
-        size_t l_objs_size = 0;
-
-        dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
-        dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name, l_objs_size);
-        for(size_t i = 0; i < l_objs_size; i++) {
-            dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
-            char buf[50];
-            time_t l_ts_create = (time_t) l_datum->header.ts_create;
-            dap_string_append_printf(l_str_tmp, "%s: type_id=%s  data_size=%u ts_create=%s",
-                    l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
-                    l_datum->header.data_size, ctime_r(&l_ts_create, buf));
+        for(dap_chain_type_t i = CHAIN_TYPE_FIRST+1; i < CHAIN_TYPE_LAST; i++) {
+            if(!l_gdb_group_mempool){
+                l_chain = dap_chain_net_get_chain_by_chain_type(l_net, i);
+                l_gdb_group_mempool_tmp = dap_chain_net_get_gdb_group_mempool(l_chain);
+            }
+            size_t l_objs_size = 0;
+            dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool_tmp, &l_objs_size);
+            if(l_objs_size>0)
+                dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name,
+                        l_objs_size);
+            else
+                dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records\n", l_net->pub.name, l_chain->name);
+            for(size_t i = 0; i < l_objs_size; i++) {
+                dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
+                char buf[50];
+                time_t l_ts_create = (time_t) l_datum->header.ts_create;
+                dap_string_append_printf(l_str_tmp, "%s: type_id=%s  data_size=%u ts_create=%s",
+                        l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
+                        l_datum->header.data_size, ctime_r(&l_ts_create, buf));
+            }
+            // Clean up
+            dap_chain_global_db_objs_delete(l_objs, l_objs_size);
+            DAP_DELETE(l_gdb_group_mempool_tmp);
+            // only one time if group defined
+            if(l_gdb_group_mempool)
+                break;
         }
-
-        // Clean up
         dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
-        dap_chain_global_db_objs_delete(l_objs, l_objs_size);
         dap_string_free(l_str_tmp, false);
 
         return 0;
@@ -1656,55 +1730,79 @@ int com_mempool_delete(int argc, char ** argv, char ** a_str_reply)
 int com_mempool_proc(int argc, char ** argv, char ** a_str_reply)
 {
     int arg_index = 1;
-    dap_chain_t * l_chain;
+    dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net) < 0)
+    dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net);
+    if(!l_net)
         return -1;
-    char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
-    size_t l_objs_size = 0;
-    dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
+    else {
+        if(*a_str_reply) {
+            DAP_DELETE(*a_str_reply);
+            *a_str_reply = NULL;
+        }
+    }
+    char * l_gdb_group_mempool = NULL, *l_gdb_group_mempool_tmp;
+    if(l_chain){
+        l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+        l_gdb_group_mempool_tmp = l_gdb_group_mempool;
+    }
+
     dap_string_t * l_str_tmp = dap_string_new(NULL);
-    if(l_objs_size) {
-        dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name);
-
-        size_t l_datums_size = l_objs_size;
-        dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*, sizeof(dap_chain_datum_t*) * l_datums_size);
-        size_t l_objs_size_tmp = (l_objs_size > 15) ? min(l_objs_size, 10) : l_objs_size;
-        for(size_t i = 0; i < l_objs_size; i++) {
-            dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
-            l_datums[i] = l_datum;
-            if(i < l_objs_size_tmp) {
-                char buf[50];
-                time_t l_ts_create = (time_t) l_datum->header.ts_create;
-                dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n",
-                        l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
-                        ctime_r(&l_ts_create, buf), l_datum->header.data_size);
-            }
+    for(dap_chain_type_t i = CHAIN_TYPE_FIRST + 1; i < CHAIN_TYPE_LAST; i++) {
+
+        if(!l_gdb_group_mempool) {
+            l_chain = dap_chain_net_get_chain_by_chain_type(l_net, i);
+            l_gdb_group_mempool_tmp = dap_chain_net_get_gdb_group_mempool(l_chain);
         }
-        if(l_objs_size > 15) {
-            dap_string_append_printf(l_str_tmp, "...\n");
-        }
-        size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size);
-        // Delete processed objects
-        size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
-        for(size_t i = 0; i < l_objs_processed; i++) {
-            dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool);
-            if(i < l_objs_processed_tmp) {
-                dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
-                    l_objs[i].key);
+        size_t l_objs_size = 0;
+        dap_global_db_obj_t * l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool_tmp, &l_objs_size);
+        if(l_objs_size) {
+            dap_string_append_printf(l_str_tmp, "%s.%s: Found %u records :\n", l_net->pub.name, l_chain->name);
+
+            size_t l_datums_size = l_objs_size;
+            dap_chain_datum_t ** l_datums = DAP_NEW_Z_SIZE(dap_chain_datum_t*,
+                    sizeof(dap_chain_datum_t*) * l_datums_size);
+            size_t l_objs_size_tmp = (l_objs_size > 15) ? min(l_objs_size, 10) : l_objs_size;
+            for(size_t i = 0; i < l_objs_size; i++) {
+                dap_chain_datum_t * l_datum = (dap_chain_datum_t*) l_objs[i].value;
+                l_datums[i] = l_datum;
+                if(i < l_objs_size_tmp) {
+                    char buf[50];
+                    time_t l_ts_create = (time_t) l_datum->header.ts_create;
+                    dap_string_append_printf(l_str_tmp, "0x%s: type_id=%s ts_create=%s data_size=%u\n",
+                            l_objs[i].key, c_datum_type_str[l_datum->header.type_id],
+                            ctime_r(&l_ts_create, buf), l_datum->header.data_size);
+                }
+            }
+            if(l_objs_size > 15) {
+                dap_string_append_printf(l_str_tmp, "...\n");
             }
+            size_t l_objs_processed = l_chain->callback_datums_pool_proc(l_chain, l_datums, l_datums_size);
+            // Delete processed objects
+            size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
+            for(size_t i = 0; i < l_objs_processed; i++) {
+                dap_chain_global_db_gr_del(l_objs[i].key, l_gdb_group_mempool);
+                if(i < l_objs_processed_tmp) {
+                    dap_string_append_printf(l_str_tmp, "New event created, removed datum 0x%s from mempool \n",
+                            l_objs[i].key);
+                }
+            }
+            if(l_objs_processed > 15) {
+                dap_string_append_printf(l_str_tmp, "...\n");
+            }
+            dap_chain_global_db_objs_delete(l_objs, l_objs_size);
         }
-        if(l_objs_processed > 15) {
-            dap_string_append_printf(l_str_tmp, "...\n");
+        else {
+            dap_string_append_printf(l_str_tmp, "%s.%s: No records in mempool\n", l_net->pub.name, l_chain->name);
         }
-        dap_chain_global_db_objs_delete(l_objs, l_objs_size);
-
-        dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
-        dap_string_free(l_str_tmp, false);
-    } else {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "%s.^s: No records in mempool", l_net->pub.name, l_chain->name);
+        DAP_DELETE(l_gdb_group_mempool);
+        // only one time if group defined
+        if(l_gdb_group_mempool)
+            break;
     }
+    dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
+    dap_string_free(l_str_tmp, false);
     return 0;
 }
 
@@ -1715,11 +1813,10 @@ int com_mempool_proc(int argc, char ** argv, char ** a_str_reply)
  * @param str_reply
  * @return
  */
-int com_token_decl(int argc, char ** argv, char ** str_reply)
+int com_token_decl(int argc, char ** argv, char ** a_str_reply)
 {
     int arg_index = 1;
     const char *str_tmp = NULL;
-    char *str_reply_tmp = NULL;
     const char * l_ticker = NULL;
 
     const char * l_total_supply_str = NULL;
@@ -1736,11 +1833,18 @@ int com_token_decl(int argc, char ** argv, char ** str_reply)
     dap_chain_cert_t ** l_certs = NULL;
     size_t l_certs_size = 0;
 
-    dap_chain_t * l_chain;
+    dap_chain_t * l_chain = NULL;
     dap_chain_net_t * l_net = NULL;
 
-    if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, str_reply, &l_chain, &l_net) < 0)
+    dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net);
+    if(!l_net)
         return -1;
+    else {
+        if(*a_str_reply) {
+            DAP_DELETE(*a_str_reply);
+            *a_str_reply = NULL;
+        }
+    }
 
     // Total supply value
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "total_supply", &l_total_supply_str);
@@ -1758,12 +1862,12 @@ int com_token_decl(int argc, char ** argv, char ** str_reply)
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "signs_emission", &l_signs_emission_str);
 
     if(!l_total_supply_str) {
-        dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'total_supply'");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter 'total_supply'");
         return -11;
     } else {
         char * l_tmp = NULL;
         if((l_total_supply = strtoull(l_total_supply_str, &l_tmp, 10)) == 0) {
-            dap_chain_node_cli_set_reply_text(str_reply,
+            dap_chain_node_cli_set_reply_text(a_str_reply,
                     "token_create requires parameter 'total_supply' to be unsigned integer value that fits in 8 bytes");
             return -2;
         }
@@ -1771,12 +1875,12 @@ int com_token_decl(int argc, char ** argv, char ** str_reply)
 
     // Signs emission
     if(!l_signs_emission_str) {
-        dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_emission'");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter 'signs_emission'");
         return -3;
     } else {
         char * l_tmp = NULL;
         if((l_signs_emission = (uint16_t) strtol(l_signs_emission_str, &l_tmp, 10)) == 0) {
-            dap_chain_node_cli_set_reply_text(str_reply,
+            dap_chain_node_cli_set_reply_text(a_str_reply,
                     "token_create requires parameter 'signs_emission' to be unsigned integer value that fits in 2 bytes");
             return -4;
         }
@@ -1784,12 +1888,12 @@ int com_token_decl(int argc, char ** argv, char ** str_reply)
 
     // Signs total
     if(!l_signs_total_str) {
-        dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'signs_total'");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "token_create requires parameter 'signs_total'");
         return -31;
     } else {
         char * l_tmp = NULL;
         if((l_signs_total = (uint16_t) strtol(l_signs_total_str, &l_tmp, 10)) == 0) {
-            dap_chain_node_cli_set_reply_text(str_reply,
+            dap_chain_node_cli_set_reply_text(a_str_reply,
                     "token_create requires parameter 'signs_total' to be unsigned integer value that fits in 2 bytes");
             return -41;
         }
@@ -1797,20 +1901,20 @@ int com_token_decl(int argc, char ** argv, char ** str_reply)
 
     // Check for ticker
     if(!l_ticker) {
-        dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter 'token'");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter 'token'");
         return -5;
     }
 
     // Check certs list
     if(!l_certs_str) {
-        dap_chain_node_cli_set_reply_text(str_reply, "token_emit requires parameter 'certs'");
+        dap_chain_node_cli_set_reply_text(a_str_reply, "token_emit requires parameter 'certs'");
         return -6;
     }
 
     // Load certs lists
     size_t l_certs_count = dap_chain_cert_parse_str_list(l_certs_str, &l_certs, &l_certs_size);
     if(!l_certs_size) {
-        dap_chain_node_cli_set_reply_text(str_reply,
+        dap_chain_node_cli_set_reply_text(a_str_reply,
                 "token_create command requres at least one valid certificate to sign the basic transaction of emission");
         return -7;
     }
@@ -1851,18 +1955,23 @@ int com_token_decl(int argc, char ** argv, char ** str_reply)
     char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
 
     // Add datum to mempool with datum_token hash as a key
-    char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+    char * l_gdb_group_mempool;
+    if(l_chain) {
+        l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
+    }
+    else {
+        l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN);
+
+    }
     if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) {
-        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum %s with token %s is placed in datum pool ",
-                str_reply_tmp, l_key_str, l_ticker);
+        dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, l_ticker);
         DAP_DELETE(l_datum);
         DAP_DELETE(l_datum_token);
         DAP_DELETE(l_gdb_group_mempool);
         return 0;
     }
     else {
-        dap_chain_node_cli_set_reply_text(str_reply, "%s\ndatum tx %s is not placed in datum pool ", str_reply_tmp,
-                l_key_str);
+        dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str);
         DAP_DELETE(l_datum);
         DAP_DELETE(l_datum_token);
         DAP_DELETE(l_gdb_group_mempool);
@@ -1972,10 +2081,11 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-chain_base_tx", &l_chain_base_tx_str);
 
     // Select chain emission
-    if(!l_chain_emission_str) {
+    /*if(!l_chain_emission_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter '-chain_emission'");
         return -44;
-    } else {
+    } */
+    if(l_chain_emission_str) {
         if((l_chain_emission = dap_chain_net_get_chain_by_name(l_net, l_chain_emission_str)) == NULL) { // Can't find such chain
             dap_chain_node_cli_set_reply_text(str_reply,
                     "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",
@@ -1985,10 +2095,11 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
     }
 
     // Select chain emission
-    if(!l_chain_base_tx_str) {
+    /*if(!l_chain_base_tx_str) {
         dap_chain_node_cli_set_reply_text(str_reply, "token_create requires parameter 'chain_base_tx'");
         return -46;
-    } else {
+    }*/
+    if(l_chain_base_tx_str) {
         if((l_chain_base_tx = dap_chain_net_get_chain_by_name(l_net, l_chain_base_tx_str)) == NULL) { // Can't find such chain
             dap_chain_node_cli_set_reply_text(str_reply,
                     "token_create requires parameter 'chain_emission' to be valid chain name in chain net %s",
@@ -1997,9 +2108,22 @@ int com_token_emit(int argc, char ** argv, char ** str_reply)
         }
     }
 
-    // Get mempool group for this chain
-    char * l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
-    char * l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx);
+    // Get groups for the chains
+    char * l_gdb_group_mempool_emission, * l_gdb_group_mempool_base_tx;
+    if(l_chain_emission) {
+        l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
+    }
+    else {
+        l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_EMISSION);
+    }
+    if(l_chain_base_tx) {
+        l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx);
+    }
+    else {
+        l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TX);
+    }
+    //char * l_gdb_group_mempool_emission = dap_chain_net_get_gdb_group_mempool(l_chain_emission);
+    //char * l_gdb_group_mempool_base_tx = dap_chain_net_get_gdb_group_mempool(l_chain_base_tx);
 
     // Create emission datum
     // then create datum in memory
@@ -2117,7 +2241,7 @@ int com_tx_cond_create(int argc, char ** argv, char **str_reply)
     (void) argc;
     // test
     const char * l_token_ticker = NULL;
-    const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path");
+    const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
     const char *c_wallet_name_from = "w_tesla"; // where to take coins for service
     const char *c_wallet_name_cond = "w_picnic"; // who will be use service, usually the same address (addr_from)
     const char *c_net_name = "kelvin-testnet";
@@ -2223,17 +2347,20 @@ int com_tx_create(int argc, char ** argv, char **str_reply)
         return -1;
     }
 
-    if(!l_chain_name) {
+/*    if(!l_chain_name) {
         dap_chain_node_cli_set_reply_text(str_reply, "tx_create requires parameter '-chain'");
         return -1;
-    }
+    }*/
     dap_chain_t * l_chain = dap_chain_net_get_chain_by_name(l_net, l_chain_name);
     if ( !l_chain ){
-        dap_chain_node_cli_set_reply_text(str_reply, "not found chain name '%s'", l_chain_name);
+        l_chain = dap_chain_net_get_chain_by_chain_type(l_net, CHAIN_TYPE_TX);
+    }
+    if ( !l_chain ){
+        dap_chain_node_cli_set_reply_text(str_reply, "not found chain name '%s', try use parameter '-chain'", l_chain_name);
         return -1;
     }
 
-    const char *c_wallets_path = dap_config_get_item_str(g_config, "general", "wallets_path");
+    const char *c_wallets_path = dap_chain_wallet_get_path(g_config);
     dap_chain_wallet_t * l_wallet = dap_chain_wallet_open(l_from_wallet_name, c_wallets_path);
 
     if(!l_wallet) {