diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 37b0b25d47ec8e6019c5961ad0ebcb3e57401e71..d18a5063bafbf8177e08607c1cefbce9ebf4ba3b 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -298,6 +298,7 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c
     if (!a_arg) {
         return;
     }
+    dap_chain_node_mempool_autoproc_notify(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len);
     dap_chain_net_sync_gdb_broadcast(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len);
     if (s_srv_callback_notify) {
         s_srv_callback_notify(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len);
diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c
index 749937380ec332edeabf35a7b4b59ca6087787c6..22484d478b6ae9870866abafc8c1b1719b48faba 100644
--- a/modules/net/dap_chain_node.c
+++ b/modules/net/dap_chain_node.c
@@ -239,53 +239,38 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha
     return node_info;
 }*/
 
-int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role)
+bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum)
 {
-    char *l_gdb_group_mempool = NULL;
-    if (!a_chain) {
-        return -1;
+    bool l_need_process = false;
+    for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) {
+        if (a_datum->header.type_id == a_chain->autoproc_datum_types[j]) {
+            l_need_process = true;
+            break;
+        }
     }
-    l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(a_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);
-    if (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;
-            bool l_need_process = false;
-            for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) {
-                if (l_datum->header.type_id == a_chain->autoproc_datum_types[j]) {
-                    l_need_process = true;
-                    break;
-                }
+    if (!l_need_process)
+        return false;
+    if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
+        dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data;
+        dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL);
+        // Is not it a base transaction?
+        if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) {
+            if (a_role.enums == NODE_ROLE_ROOT) {
+                return false;
             }
-            if (!l_need_process)
-                continue;
-            if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) {
-                dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data;
-                dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL);
-                // Is not it a base transaction?
-                if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) {
-                    if (a_role.enums == NODE_ROLE_ROOT) {
-                        continue;
-                    }
-                }
-            }
-            if (a_chain->callback_datums_pool_proc(a_chain, &l_datum, 1) != 1) {
-                continue;
-            } // Delete processed objects
-            dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
         }
-        dap_chain_global_db_objs_delete(l_objs, l_objs_size);
     }
-    DAP_DELETE(l_gdb_group_mempool);
-    return 0;
+    if (a_chain->callback_datums_pool_proc(a_chain, &a_datum, 1) != 1) {
+        return false;
+    }
+    return true;
 }
 
-void dap_chain_node_mempool_periodic(void *a_param)
+static bool s_mempool_auto = false;
+
+bool dap_chain_node_mempool_autoproc_init()
 {
-    UNUSED(a_param);
     uint16_t l_net_count;
-    bool l_mempool_auto;
     bool l_mempool_auto_default = false;
     dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count);
     for (uint16_t i = 0; i < l_net_count; i++) {
@@ -299,44 +284,67 @@ void dap_chain_node_mempool_periodic(void *a_param)
                 l_mempool_auto_default = true;
                 break;
             default:
-                l_mempool_auto_default = false;
+                break;
         }
-
-        l_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default);
-        if (l_mempool_auto) {
+        s_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default);
+        if (s_mempool_auto) {
             dap_chain_t *l_chain;
             DL_FOREACH(l_net_list[i]->pub.chains, l_chain) {
-                dap_chain_node_mempool_process(l_chain, l_role);
+                if (!l_chain) {
+                    continue;
+                }
+                char *l_gdb_group_mempool = NULL;
+                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);
+                if (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;
+                        if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) {
+                            // Delete processed objects
+                            dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
+                        }
+                    }
+                    dap_chain_global_db_objs_delete(l_objs, l_objs_size);
+                }
+                DAP_DELETE(l_gdb_group_mempool);
             }
         }
     }
     DAP_DELETE(l_net_list);
+    return s_mempool_auto;
 }
 
-static void *s_mempool_timer = NULL;
-
 /**
- * @brief dap_chain_node_mempool_init
- * @return
+ * @brief dap_chain_node_mempool_deinit
  */
-int dap_chain_node_mempool_init()
+void dap_chain_node_mempool_autoproc_deinit()
 {
-    s_mempool_timer = dap_interval_timer_create(DAP_CHAIN_NODE_MEMPOOL_INTERVAL, dap_chain_node_mempool_periodic, 0);
-    if (s_mempool_timer) {
-        return 0;
-    } else {
-        return -1;
-    }
+    s_mempool_auto = false;
 }
 
-/**
- * @brief dap_chain_node_mempool_deinit
- */
-void dap_chain_node_mempool_deinit()
+void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group,
+                                             const char *a_key, const void *a_value, const size_t a_value_len)
 {
-    if (s_mempool_timer) {
-        dap_interval_timer_delete(s_mempool_timer);
-        s_mempool_timer = NULL;
+    UNUSED(a_prefix);
+    UNUSED(a_value_len);
+    if (!a_arg || !a_value || !s_mempool_auto || a_op_code != 'a') {
+        return;
+    }
+    dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;
+    dap_chain_t *l_chain;
+    DL_FOREACH(l_net->pub.chains, l_chain) {
+        if (!l_chain) {
+            continue;
+        }
+        char *l_gdb_group_str = dap_chain_net_get_gdb_group_mempool(l_chain);
+        if (!strcmp(a_group, l_gdb_group_str)) {
+            dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value;
+            dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net);
+            if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) {
+                dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str);
+            }
+        }
+        DAP_DELETE(l_gdb_group_str);
     }
 }
-
diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h
index 78931e2864782a8b0b015598f505bda2635dc3b0..0277aefb71f3b59b11f3e64c2ad20cb77556bdd0 100644
--- a/modules/net/include/dap_chain_node.h
+++ b/modules/net/include/dap_chain_node.h
@@ -141,6 +141,8 @@ inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *addre
     return a_key;
 }
 
-int dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role);
-int dap_chain_node_mempool_init();
-void dap_chain_node_mempool_deinit();
+bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum);
+bool dap_chain_node_mempool_autoproc_init();
+void dap_chain_node_mempool_autoproc_deinit();
+void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group,
+                                             const char *a_key, const void *a_value, const size_t a_value_len);
diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c
index 948ec9a6d09a74172d4f099fd38fac44fb9d430a..8aba700a30215b038b580b8d0ee49744bd6684e3 100644
--- a/modules/net/srv/dap_chain_net_srv_order.c
+++ b/modules/net/srv/dap_chain_net_srv_order.c
@@ -514,10 +514,9 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d
 static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group,
                                    const char *a_key, const void *a_value, const size_t a_value_len)
 {
-    (void) a_op_code;
     UNUSED(a_prefix);
     UNUSED(a_value_len);
-    if (!a_arg || !a_value || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) {
+    if (!a_arg || !a_value || a_op_code != 'a' || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) {
         return;
     }
     dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;