diff --git a/dap_chain_gdb.c b/dap_chain_gdb.c
index b30f214baabacf9284153b977353619e2d58ba5d..17d9aabcdbf54250ea88111ea53d890d989daafd 100644
--- a/dap_chain_gdb.c
+++ b/dap_chain_gdb.c
@@ -63,7 +63,7 @@ typedef struct dap_chain_gdb_private
     dap_chain_gdb_datum_hash_item_t * hash_items;
 } dap_chain_gdb_private_t;
 
-#define PVT(a) ( (dap_chain_gdb_private_t* ) (a)->_internal )
+#define PVT(a) ( (a) ? (dap_chain_gdb_private_t* ) (a)->_internal : NULL)
 
 static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net);
 
@@ -93,6 +93,9 @@ static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts(dap_chain_atom
 
 static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
         size_t a_datums_size);
+static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
+        size_t a_datums_size, const char *a_group);
+
 
 /**
  * Stub for consensus
@@ -190,6 +193,7 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
 
     a_chain->callback_atom_find_by_hash = s_chain_callback_atom_iter_find_by_hash;
     a_chain->callback_datums_pool_proc = s_chain_callback_datums_pool_proc;
+    a_chain->callback_datums_pool_proc_with_group = s_chain_callback_datums_pool_proc_with_group;
 
     // Linear pass through
     a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain
@@ -217,6 +221,21 @@ void dap_chain_gdb_delete(dap_chain_t * a_chain)
     a_chain->_inheritor = NULL;
 }
 
+/**
+ * @brief dap_chain_gdb_get_group
+ * @param a_chain
+ * @return group name for ledger
+ */
+const char* dap_chain_gdb_get_group(dap_chain_t * a_chain)
+{
+    if(!a_chain)
+        return NULL;
+    dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain);
+    dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb);
+    return l_gdb_priv->group_datums;
+}
+
+
 /**
  * @brief compare_datum_items
  * @param l_a
@@ -286,6 +305,14 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain
     return a_datums_count;
 }
 
+static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums,
+        size_t a_datums_count, const char *a_group)
+{
+    if(dap_strcmp(dap_chain_gdb_get_group(a_chain), a_group))
+        return 0;
+    s_chain_callback_datums_pool_proc(a_chain, a_datums, a_datums_count);
+}
+
 /**
  * @brief s_chain_callback_datums_add
  * @param a_chain
diff --git a/dap_chain_gdb.h b/dap_chain_gdb.h
index fdab44a1d5b0b31896f10ec6614e71ab29bfbf78..e40ae2184e63b48f74f699755053ed77c5420eb5 100644
--- a/dap_chain_gdb.h
+++ b/dap_chain_gdb.h
@@ -33,9 +33,10 @@ typedef struct dap_chain_gdb {
     void * _inheritor; // inheritor object
 
 } dap_chain_gdb_t;
-#define DAP_CHAIN_GDB(a) ( (dap_chain_gdb_t *) (a)->_inheritor)
+#define DAP_CHAIN_GDB(a) ( (a) ? (dap_chain_gdb_t *) (a)->_inheritor : NULL)
 
 int dap_chain_gdb_init(void);
 int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
 void dap_chain_gdb_delete(dap_chain_t * a_chain);
+const char* dap_chain_gdb_get_group(dap_chain_t * a_chain);