diff --git a/CMakeLists.txt b/CMakeLists.txt
index 91e6b111ae10f3855a95b4c24cc40d6f5024a128..d22b714389fc48416863033c9c0018a1d115ded2 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,6 @@ set(DAP_CHAIN_DAG_HEADERS
 add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_DAG_SRCS} ${DAP_CHAIN_DAG_HEADERS})
 
 
-target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_crypto dap_chain_global_db)
+target_link_libraries(dap_chain_cs_dag dap_core dap_crypto dap_chain dap_chain_net dap_chain_crypto dap_chain_global_db)
 target_include_directories(dap_chain_cs_dag INTERFACE .)
 
diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c
index 734f548574b2f4a4022086b736efb9bbdd3c6e80..eb70ffc82cbbb8f45cfd03d8d764e937eb4533e2 100755
--- a/dap_chain_cs_dag.c
+++ b/dap_chain_cs_dag.c
@@ -21,19 +21,23 @@
     You should have received a copy of the GNU General Public License
     along with any DAP based project.  If not, see <http://www.gnu.org/licenses/>.
 */
-#include <stdint.h>
+#include <stdlib.h>
 #include <time.h>
 #include <pthread.h>
 #include "uthash.h"
 
 #include "dap_common.h"
+#include "dap_strfuncs.h"
 #include "dap_hash.h"
 #include "dap_chain_datum.h"
 #include "dap_chain_cs.h"
 #include "dap_chain_cs_dag.h"
+#include "dap_chain_global_db.h"
+#include "dap_chain_node_cli.h"
 
 #define LOG_TAG "dap_chain_cs_dag"
 
+
 typedef struct dap_chain_cs_dag_event_item {
     dap_chain_hash_fast_t hash;
     time_t ts_added;
@@ -42,35 +46,39 @@ typedef struct dap_chain_cs_dag_event_item {
 } dap_chain_cs_dag_event_item_t;
 
 typedef struct dap_chain_cs_dag_pvt {
-    dap_chain_cs_dag_event_item_t * events;
-    pthread_rwlock_t events_rwlock;
+    dap_enc_key_t* datum_add_sign_key;
 
+
+    pthread_rwlock_t events_rwlock;
+    dap_chain_cs_dag_event_item_t * events;
     dap_chain_cs_dag_event_item_t * events_treshold;
-    pthread_rwlock_t events_treshold_rwlock;
     dap_chain_cs_dag_event_item_t * events_lasts;
+
 } dap_chain_cs_dag_pvt_t;
 
 #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt )
 
 // Atomic element organization callbacks
-static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t *);                      //    Accept new event in dag
-static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t *);                   //    Verify new event in dag
-static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_t *);                                 //    Get dag event size
-static size_t s_chain_callback_atom_get_static_hdr_size();                               //    Get dag event header size
+static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t *);                      //    Accept new event in dag
+static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t *);                   //    Verify new event in dag
+static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t *);                                 //    Get dag event size
+static size_t s_chain_callback_atom_get_static_hdr_size(void);                               //    Get dag event header size
 
 static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain );              //    Get the fisrt event from dag
-static dap_chain_atom_t* s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); //    Get the fisrt event from dag
-static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter );  //    Get the next event from dag
+static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); //    Get the fisrt event from dag
+static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter );  //    Get the next event from dag
 static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter );                  //    Get the fisrt event from dag
 
+static size_t s_chain_callback_datum_pool_proc(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t ** a_datums, size_t a_datums_size);
 // Datum ops
-
+/*
 static dap_chain_datum_iter_t* s_chain_callback_datum_iter_create(dap_chain_t * a_chain );
 static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t * a_iter );
 static dap_chain_datum_t* s_chain_callback_datum_iter_get_first( dap_chain_datum_iter_t * a_datum_iter ); // Get the fisrt datum from dag
 static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter ); // Get the next datum from dag
+*/
 
-
+static int s_cli_dag(int argc, const char ** argv, char **str_reply);
 
 /**
  * @brief dap_chain_cs_dag_init
@@ -78,8 +86,22 @@ static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_
  */
 int dap_chain_cs_dag_init(void)
 {
+    srand((unsigned int) time(NULL));
     dap_chain_class_add( "dag", dap_chain_cs_dag_new );
 
+    dap_chain_node_cli_cmd_item_create ("dag", s_cli_dag, "DAG commands",
+                                        "Create event from datum mempool element\n"
+        "\tdag net_name <chain net name> chain_name <chain name> event create datum_hash <datum hash>\n\n"
+                                        "Remove event from forming new round and put back its datum to mempool\n\n"
+        "dag net_name <chain net name> chain_name <chain name> event cancel event_hash <event hash>\n\n"
+                                        "Dump event info"
+        "dag net_name <chain net name> chain_name <chain name> event dump event_hash <event hash>\n"
+                                        "Show event list"
+        "dag net_name <chain net name> chain_name <chain name> event list\n\n"
+                                        "\t<datum hash> Datum hash from mempool\n"
+                                        "\t<event hash> Event hash from forming new round, must return back datum to mempool\n"
+                                        );
+    log_it(L_NOTICE,"Initialized DAG chain items organization class");
     return 0;
 }
 
@@ -103,7 +125,6 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     l_dag->chain = a_chain;
 
     pthread_rwlock_init(& PVT(l_dag)->events_rwlock,NULL);
-    pthread_rwlock_init(& PVT(l_dag)->events_treshold_rwlock,NULL);
 
     a_chain->callback_delete = dap_chain_cs_dag_delete;
 
@@ -118,20 +139,28 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg)
     a_chain->callback_atom_iter_get_first = s_chain_callback_atom_iter_get_first; // Get the fisrt element from chain
     a_chain->callback_atom_iter_get_next = s_chain_callback_atom_iter_get_next; // Get the next element from chain from the current one
 
+    a_chain->callback_datums_pool_proc = s_chain_callback_datum_pool_proc;
+
     // Datum operations callbacks
+/*
     a_chain->callback_datum_iter_create = s_chain_callback_datum_iter_create; // Datum iterator create
     a_chain->callback_datum_iter_delete = s_chain_callback_datum_iter_delete; // Datum iterator delete
     a_chain->callback_datum_iter_get_first = s_chain_callback_datum_iter_get_first; // Get the fisrt datum from chain
     a_chain->callback_datum_iter_get_next = s_chain_callback_datum_iter_get_next; // Get the next datum from chain from the current one
-
+*/
     // Others
     a_chain->_inheritor = l_dag;
 
     l_dag->is_single_line = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_single_line",false);
-    if ( l_dag->is_single_line )
+    l_dag->is_celled = dap_config_get_item_bool_default(a_chain_cfg,"dag","is_celled",false);
+    l_dag->datum_add_hashes_count = dap_config_get_item_uint16_default(a_chain_cfg,"dag","datum_add_hashes_count",1);
+    l_dag->events_round_new_gdb_group = strdup( dap_config_get_item_str_default(a_chain_cfg,"dag","gdb_group_events_round_new",
+                                                                        "events.round.new"));
+    if ( l_dag->is_single_line ) {
         log_it (L_NOTICE, "DAG chain initialized (single line)");
-    else
+    } else {
         log_it (L_NOTICE, "DAG chain initialized (multichain)");
+    }
 
     return 0;
 }
@@ -145,7 +174,6 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
 {
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG ( a_chain );
     pthread_rwlock_destroy(& PVT(l_dag)->events_rwlock);
-    pthread_rwlock_destroy(& PVT(l_dag)->events_treshold_rwlock);
 
     if(l_dag->callback_delete )
         l_dag->callback_delete(l_dag);
@@ -161,7 +189,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
  * @param a_atom
  * @return 0 if verified and added well, otherwise if not
  */
-static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a_atom)
+static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t * a_atom)
 {
     int ret = s_chain_callback_atom_verify (a_chain, a_atom);
     if ( ret < 0 ){
@@ -171,7 +199,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
     dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom;
 
-    ret = l_dag->callback_cs_input(l_dag,l_event);
+    ret = l_dag->callback_cs_verify(l_dag,l_event);
     if ( ret != 0 ){
         log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret);
         return  -2;
@@ -180,11 +208,10 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a
     l_event_item->event = l_event;
     dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_item->hash );
 
-
     // Put in main table or in the treshhold if not all the rest linked event are present
     dap_chain_cs_dag_event_item_t * l_event_search = NULL;
     dap_chain_cs_dag_event_item_t * l_events =( ret==0 ? PVT(l_dag)->events : PVT(l_dag)->events_treshold );
-    pthread_rwlock_t * l_events_rwlock =( ret==0 ? &PVT(l_dag)->events_rwlock : &PVT(l_dag)->events_treshold_rwlock );
+    pthread_rwlock_t * l_events_rwlock = &PVT(l_dag)->events_rwlock ;
     pthread_rwlock_wrlock( l_events_rwlock );
     HASH_FIND(hh, l_events,&l_event_item->hash,sizeof (l_event_search->hash),  l_event_search);
     if ( l_event_search ) {
@@ -203,6 +230,94 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a
     return 0;
 }
 
+/**
+ * @brief s_chain_callback_datums_add
+ * @param a_chain
+ * @param a_datums
+ * @param a_datums_size
+ */
+static size_t s_chain_callback_datum_pool_proc(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t ** a_datums, size_t a_datums_count)
+{
+    dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
+    size_t l_datum_processed =0;
+    size_t l_events_round_new_size = 0;
+    // Load current events new round pool
+    dap_global_db_obj_t ** l_events_round_new = dap_chain_global_db_gr_load(l_dag->events_round_new_gdb_group, &l_events_round_new_size );
+    // Prepare hashes
+    size_t l_hashes_int_size = ( l_events_round_new_size + a_datums_count )> l_dag->datum_add_hashes_count ?
+                                   l_dag->datum_add_hashes_count :
+                                   l_events_round_new_size+a_datums_count;
+    size_t l_hashes_ext_size = 1; // Change in cfg
+    dap_chain_hash_fast_t * l_hashes = DAP_NEW_Z_SIZE(dap_chain_hash_fast_t,
+                                             sizeof(dap_chain_hash_fast_t) *
+                                             (l_hashes_int_size+l_hashes_ext_size)  );
+
+    for (size_t d = 0; d <a_datums_count ; d++){
+        dap_chain_datum_t * l_datum = a_datums[d];
+        // Linking randomly with current new round set
+        size_t l_hashes_linked = 0;
+        size_t l_rnd_steps;
+        // Linking events inside round
+        l_rnd_steps = 0;
+        do{
+            int l_index = rand() % (int) l_events_round_new_size;
+            dap_chain_hash_fast_t l_hash;
+            dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_events_round_new[l_index]->value;
+            size_t l_event_size = dap_chain_cs_dag_event_calc_size(l_event);
+            dap_hash_fast(l_event, l_event_size,&l_hash);
+
+            bool l_is_already_in_event = false;
+            for (int i=0; i<l_hashes_linked;i++ ){ // check if we already added it
+                if (memcmp(&l_hashes[i],&l_hash,sizeof (l_hash) )==0 ){
+                    l_is_already_in_event = true;
+                    break;
+                }
+            }
+
+            if ( ! l_is_already_in_event ){
+                memcpy(&l_hashes[l_hashes_linked],&l_hash,sizeof (l_hash) );
+                l_hashes_linked++;
+            }
+            l_rnd_steps++;
+            if (l_rnd_steps > 100) // Too many attempts
+                break;
+        } while (l_hashes_linked <(l_hashes_int_size) );
+        if (l_hashes_linked<l_hashes_int_size ){
+            log_it(L_ERROR,"Can't link new events randomly for 100 attempts");
+            break;
+        }
+        // Now link with ext events
+        if ( PVT(l_dag)->events ){
+
+        }
+        dap_chain_cs_dag_event_t * l_event_new = dap_chain_cs_dag_event_new(a_chain->id,a_cell_id,l_datum,NULL,&l_hashes,l_hashes_ext_size+l_hashes_int_size);
+    }
+    log_it (L_NOTICE,"");
+//        dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create(l_dag,a_cell_id,a_datums[i],l_hashes,l_dag->datum_add_hashes_count);
+  //      s_chain_callback_atom_add(a_chain,(dap_chain_atom_t *)l_event );
+
+
+    return  l_datum_processed;
+}
+
+
+/**
+ * @brief dap_chain_cs_dag_find_event_by_hash
+ * @param a_dag
+ * @param a_hash
+ * @return
+ */
+dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * a_dag, dap_chain_hash_fast_t * a_hash)
+{
+    dap_chain_cs_dag_event_item_t* l_event_item = NULL;
+    pthread_rwlock_rdlock( &PVT(a_dag)->events_rwlock );
+    HASH_FIND(hh, PVT(a_dag)->events ,a_hash,sizeof(*a_hash), l_event_item);
+    dap_chain_cs_dag_event_t * l_event = l_event_item->event;
+    pthread_rwlock_unlock( &PVT(a_dag)->events_rwlock );
+    return  l_event;
+}
+
+
 
 /**
  * @brief s_chain_callback_atom_verify Verify atomic element
@@ -210,7 +325,7 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a
  * @param a_atom
  * @return
  */
-static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t *  a_atom)
+static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t *  a_atom)
 {
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
     dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom;
@@ -232,13 +347,54 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t
     }
 }
 
+
+int dap_chain_cs_dag_event_verify_hashes_with_treshold(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event)
+{
+    bool l_is_events_all_hashes = true;
+    bool l_is_events_main_hashes = true;
+    for (size_t i = 0; i< a_event->header.hash_count; i++) {
+        dap_chain_hash_fast_t * l_hash =  ((dap_chain_hash_fast_t *) a_event->hashes_n_datum_n_signs) + i;
+        dap_chain_cs_dag_event_item_t * l_event_search = NULL;
+        HASH_FIND(hh, PVT(a_dag)->events ,l_hash ,sizeof (*l_hash),  l_event_search);
+        if ( l_event_search == NULL ){ // If not found in events - search in treshhold
+            l_is_events_main_hashes = false;
+            HASH_FIND(hh, PVT(a_dag)->events_treshold ,l_hash ,sizeof (*l_hash),  l_event_search);
+            if( l_event_search == NULL ){ // Hash is not in events or treshold table, keep the current item where it is
+                l_is_events_all_hashes = false;
+                break;
+            }
+        }
+    }
+    if( l_is_events_all_hashes && l_is_events_main_hashes ){
+        return  0;
+    }else if ( ! l_is_events_all_hashes) {
+        return  -1;
+    }else {
+        return  1;
+    }
+}
+
 /**
  * @brief dap_chain_cs_dag_proc_treshold
  * @param a_dag
  */
 void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag)
 {
+    // TODO Process finish treshold. For now - easiest from possible
+    pthread_rwlock_rdlock(&PVT(a_dag)->events_rwlock);
+    dap_chain_cs_dag_event_item_t * l_event_item = NULL, * l_event_item_tmp = NULL;
+    HASH_ITER(hh,PVT(a_dag)->events_treshold,l_event_item, l_event_item_tmp){
+        dap_chain_cs_dag_event_t * l_event = l_event_item->event;
+        int ret = dap_chain_cs_dag_event_verify_hashes_with_treshold (a_dag,l_event);
+        if ( ret == 0){ // All its hashes are in main table, move thats one too into it
+            pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock);
+            pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock);
+            HASH_DEL(PVT(a_dag)->events_treshold,l_event_item);
+            HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash),  l_event_item);
 
+        }
+    }
+    pthread_rwlock_unlock(&PVT(a_dag)->events_rwlock);
 }
 
 
@@ -247,7 +403,7 @@ void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag)
  * @param a_atom
  * @return
  */
-static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_t * a_atom)
+static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t * a_atom)
 {
     return dap_chain_cs_dag_event_calc_size( (dap_chain_cs_dag_event_t * ) a_atom);
 }
@@ -269,7 +425,9 @@ static size_t s_chain_callback_atom_get_static_hdr_size()
  */
 static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain )
 {
-    return NULL; // TODO
+    dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t);
+    l_atom_iter->chain = a_chain;
+    return l_atom_iter;
 }
 
 /**
@@ -277,9 +435,12 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_
  * @param a_atom_iter
  * @return
  */
-static dap_chain_atom_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter )
+static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter )
 {
-    return NULL; // TODO
+    a_atom_iter->cur =  a_atom_iter->cur ?
+                (dap_chain_cs_dag_event_t*) PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events->event : NULL;
+    a_atom_iter->cur_item = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events;
+    return a_atom_iter->cur;
 }
 
 /**
@@ -287,9 +448,25 @@ static dap_chain_atom_t* s_chain_callback_atom_iter_get_first(dap_chain_atom_ite
  * @param a_atom_iter
  * @return
  */
-static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter )
+static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter )
 {
-    return NULL; // TODO
+    if (a_atom_iter->cur ){
+        dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
+        a_atom_iter->cur_item = l_event_item->hh.next;
+        l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item;
+        if ( a_atom_iter->cur_item)
+            a_atom_iter->cur = l_event_item->event;
+        else {
+            dap_chain_cs_dag_event_item_t * l_event_search = NULL;
+            dap_chain_cs_dag_pvt_t * l_dag_pvt = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain));
+            HASH_FIND(hh,l_dag_pvt->events,&l_event_item->hash,sizeof(l_event_item->hash),l_event_search);
+            if (l_event_search){
+                a_atom_iter->cur_item = l_dag_pvt->events_treshold;
+                a_atom_iter->cur = l_dag_pvt->events_treshold ? l_dag_pvt->events_treshold->event : NULL ;
+            }
+        }
+    }
+    return a_atom_iter->cur;
 }
 
 /**
@@ -298,48 +475,69 @@ static dap_chain_atom_t* s_chain_callback_atom_iter_get_next( dap_chain_atom_ite
  */
 static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter )
 {
-    // TODO
+    DAP_DELETE(a_atom_iter);
 }
 
-
-
 /**
- * @brief s_chain_callback_datum_iter_create Create datum iterator
- * @param a_chain
+ * @brief s_cli_dag
+ * @param argc
+ * @param argv
+ * @param str_reply
  * @return
  */
-static dap_chain_datum_iter_t* s_chain_callback_datum_iter_create(dap_chain_t * a_chain )
+static int s_cli_dag(int argc, const char ** argv, char **str_reply)
 {
-    return NULL; // TODO
-}
+    enum {
+        SUBCMD_EVENT_CREATE,
+        SUBCMD_EVENT_CANCEL,
+        SUBCMD_EVENT_LIST,
+        SUBCMD_UNDEFINED=0
+    } l_subcmd={0};
+//  "dag net_name <chain net name> chain_name <chain name> event create datum_hash <datum hash from pool>\n"
+//    "dag net_name <chain net name> chain_name <chain name> event cancel event_hash <event hash from round_new>\n"
+//    "dag net_name <chain net name> chain_name <chain name> event list
 
-/**
- * @brief s_chain_callback_datum_iter_get_first Get the first datum
- * @param a_datum_iter
- * @return
- */
-static dap_chain_datum_t* s_chain_callback_datum_iter_get_first(dap_chain_datum_iter_t * a_datum_iter )
-{
-    return NULL; // TODO
-}
+    int arg_index = 1;
+    const char *str_tmp = NULL;
+    char *str_reply_tmp = NULL;
 
-/**
- * @brief s_chain_callback_datum_iter_get_next Get the next dag event datum
- * @param a_datum_iter
- * @return
- */
-static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_iter_t * a_datum_iter )
-{
-    return NULL; // TODO
-}
+    const char * l_net_name = NULL;
 
-/**
- * @brief s_chain_callback_datum_iter_delete Delete dag event datum iterator
- * @param a_datum_iter
- */
-static void s_chain_callback_datum_iter_delete(dap_chain_datum_iter_t * a_datum_iter )
-{
-    // TODO
-}
+    const char * l_chain_name = NULL;
+
+    const char * l_event_cmd_str = NULL;
+
+    const char* l_event_hash_str = NULL;
 
+    const char * l_datum_hash_str = NULL;
 
+
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "net_name", &l_net_name);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "chain_name", &l_chain_name);
+    dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event", &l_event_cmd_str);
+
+    if ( l_event_cmd_str &&  ( strcmp( l_event_cmd_str, "create" ) == 0 ) ) {
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "event_hash", &l_event_hash_str);
+        l_subcmd = SUBCMD_EVENT_CREATE;
+    } else if ( l_event_cmd_str &&  ( strcmp( l_event_cmd_str, "cancel" ) == 0 ) ) {
+        dap_chain_node_cli_find_option_val(argv, arg_index, argc, "datum_hash", &l_datum_hash_str);
+        l_subcmd = SUBCMD_EVENT_CANCEL;
+    } else if ( l_event_cmd_str &&  ( strcmp( l_event_cmd_str, "list" ) == 0 ) ) {
+        l_subcmd = SUBCMD_EVENT_LIST;
+    }
+
+    switch ( l_subcmd ){
+        case SUBCMD_EVENT_CREATE:{
+
+        }break;
+        case SUBCMD_EVENT_CANCEL:{
+
+        }break;
+        case SUBCMD_EVENT_LIST:{
+
+        }break;
+        default: {
+
+        }
+    }
+}
diff --git a/dap_chain_cs_dag.h b/dap_chain_cs_dag.h
index af2604fddc75e25652aa365346b357dff340c20b..a50f675b55ff6a75aea12f57eea9e3973623905f 100755
--- a/dap_chain_cs_dag.h
+++ b/dap_chain_cs_dag.h
@@ -30,12 +30,23 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
 typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *);
 typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *);
 
+typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *,
+                                                                               dap_chain_cell_id_t,
+                                                                               dap_chain_datum_t *,
+                                                                               dap_chain_hash_fast_t *,
+                                                                               size_t);
+
 typedef struct dap_chain_cs_dag
 {
     dap_chain_t * chain;
     bool is_single_line;
+    bool is_celled;
+
+    uint16_t datum_add_hashes_count;
+    char * events_round_new_gdb_group;
+
     dap_chain_cs_dag_callback_t callback_delete;
-    dap_chain_cs_dag_callback_event_t callback_cs_input;
+    dap_chain_cs_dag_callback_event_create_t callback_cs_event_create;
     dap_chain_cs_dag_callback_event_t callback_cs_verify;
 
     void * _pvt;
@@ -51,3 +62,5 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg);
 void dap_chain_cs_dag_delete(dap_chain_t * a_chain);
 
 void dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag);
+dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * a_dag,
+                                                              dap_chain_hash_fast_t * a_hash);
diff --git a/dap_chain_cs_dag_event.c b/dap_chain_cs_dag_event.c
index f42ce2752ff2e479c3a11eba6224124f90eb22bd..ae6d3401bf238c1c304e72da1170b8db28ca3f0a 100755
--- a/dap_chain_cs_dag_event.c
+++ b/dap_chain_cs_dag_event.c
@@ -35,14 +35,15 @@
 
 /**
  * @brief dap_chain_cs_dag_event_new
- * @param a_dag
+ * @param a_chain_id
+ * @param a_cell_id
  * @param a_datum
  * @param a_key
  * @param a_hashes
  * @param a_hashes_count
  * @return
  */
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datum
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum
                                                 ,dap_enc_key_t * a_key ,
                                                 dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count)
 {
@@ -55,7 +56,9 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datu
     l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t,
                                                          l_event_size
                                                          );
-    l_event_new->header.timestamp = (uint64_t) timegm(NULL);
+    l_event_new->header.ts_created = (uint64_t) timegm(NULL);
+    l_event_new->header.cell_id.uint64 = a_cell_id.uint64;
+    l_event_new->header.chain_id.uint64 = a_chain_id.uint64;
     memcpy(l_event_new->hashes_n_datum_n_signs, a_hashes, l_hashes_size );
     memcpy(l_event_new->hashes_n_datum_n_signs+l_hashes_size, a_datum,l_datum_size );
 
diff --git a/dap_chain_cs_dag_event.h b/dap_chain_cs_dag_event.h
index dcb92022db9792839e37012abb757c4264ffd33e..1c8bb07c6b2a8d17748a3e268d9729daac87a5e3 100755
--- a/dap_chain_cs_dag_event.h
+++ b/dap_chain_cs_dag_event.h
@@ -33,7 +33,9 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
 
 typedef struct dap_chain_class_dag_event_hdr {
         uint16_t version;
-        uint64_t timestamp;
+        uint64_t ts_created;
+        dap_chain_id_t chain_id;
+        dap_chain_cell_id_t cell_id; // Cell id if celled dag
         uint16_t hash_count; // Number of hashes
         uint16_t signs_count; // Number of signs nested with event
 } DAP_ALIGN_PACKED dap_chain_class_dag_event_hdr_t;
@@ -44,7 +46,7 @@ typedef struct dap_chain_cs_dag_event {
 } DAP_ALIGN_PACKED dap_chain_cs_dag_event_t;
 
 
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datum,
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum,
                                                 dap_enc_key_t * a_key,
                                                 dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count);
 
@@ -84,6 +86,11 @@ static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t *
     return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size;
 }
 
+/**
+ * @brief dap_chain_cs_dag_event_calc_size_excl_signs
+ * @param a_event
+ * @return
+ */
 static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event)
 {
     size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);