diff --git a/dap_chain_cs_dag.c b/dap_chain_cs_dag.c
index f4e2f85e259452480f1ce53af46a0c30d44a21e5..fa733a846396c609754cec7abc9e78a07c9238f3 100755
--- a/dap_chain_cs_dag.c
+++ b/dap_chain_cs_dag.c
@@ -39,6 +39,8 @@ typedef struct dap_chain_cs_dag_event_item {
 
 typedef struct dap_chain_cs_dag_pvt {
     dap_chain_cs_dag_event_item_t * events;
+    dap_chain_cs_dag_event_item_t * events_trashhold;
+
     dap_chain_cs_dag_event_item_t * events_round_new;
     dap_chain_cs_dag_event_item_t * events_round_prev_lasts;
 } dap_chain_cs_dag_pvt_t;
@@ -150,7 +152,34 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
  */
 static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_t * a_atom)
 {
-    return -1; // TODO
+    int ret = s_chain_callback_atom_verify (a_chain, a_atom);
+    if ( ret != 0 ){
+        log_it(L_WARNING,"Wrong event, can't accept, verification returned %d",ret);
+        return  -1;
+    }
+    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);
+    if ( ret != 0 ){
+        log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret);
+        return  -2;
+    }
+    dap_chain_cs_dag_event_item_t * l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
+    l_event_item->event = l_event;
+    dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_item->hash );
+
+    dap_chain_cs_dag_event_item_t * l_event_search = NULL;
+    HASH_FIND(hh, PVT(l_dag)->events,&l_event_item->hash,sizeof (l_event_search->hash),  l_event_search);
+    if ( l_event_search ) {
+        char * l_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash);
+        log_it(L_ERROR, "Dag event %s is already present in dag",l_hash_str);
+        DAP_DELETE(l_event_item);
+        DAP_DELETE(l_hash_str);
+        return -3;
+    }
+    HASH_ADD(hh, PVT(l_dag)->events,hash,sizeof (l_event_item->hash),  l_event_item);
+    return 0;
 }
 
 
@@ -164,7 +193,7 @@ static int s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_t
 {
     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;
-    return l_dag->callback_event_input ( l_dag, l_event );
+    return l_dag->callback_cs_verify ( l_dag, l_event );
 }
 
 /**
diff --git a/dap_chain_cs_dag.h b/dap_chain_cs_dag.h
index a8d79aa1683c146fb794716fdedaba67da8e19d0..994543e279ec517f571458502e4b5f2306ac40b6 100755
--- a/dap_chain_cs_dag.h
+++ b/dap_chain_cs_dag.h
@@ -35,8 +35,8 @@ typedef struct dap_chain_cs_dag
     dap_chain_t * chain;
     bool is_single_line;
     dap_chain_cs_dag_callback_t callback_delete;
-    dap_chain_cs_dag_callback_event_t callback_event_input;
-    dap_chain_cs_dag_callback_event_t callback_event_verify;
+    dap_chain_cs_dag_callback_event_t callback_cs_input;
+    dap_chain_cs_dag_callback_event_t callback_cs_verify;
 
     void * _pvt;
     void * _inheritor;
diff --git a/dap_chain_cs_dag_event.c b/dap_chain_cs_dag_event.c
index 72f05f3ed73b220b3e79cea87cb94ff8b093b7d2..f42ce2752ff2e479c3a11eba6224124f90eb22bd 100755
--- a/dap_chain_cs_dag_event.c
+++ b/dap_chain_cs_dag_event.c
@@ -42,60 +42,43 @@
  * @param a_hashes_count
  * @return
  */
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_cs_dag_t * a_dag,dap_chain_datum_t * a_datum
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datum
                                                 ,dap_enc_key_t * a_key ,
                                                 dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count)
 {
     size_t l_hashes_size = sizeof(*a_hashes)*a_hashes_count;
-    size_t l_datum_size =  dap_chain_datum_data_size(a_datum);
-    size_t l_signs_size = 0;// dap_chain_sign_get_size(a_key);
-    dap_chain_cs_dag_event_t * l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t,
-                                                         sizeof(l_event_new->header)
-                                                         + l_hashes_size
-                                                         + l_signs_size
-                                                         + l_datum_size
+    size_t l_datum_size =  dap_chain_datum_size(a_datum);
+    dap_chain_cs_dag_event_t * l_event_new = NULL;
+    size_t l_event_size = sizeof(l_event_new->header)
+            + l_hashes_size
+            + l_datum_size;
+    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);
-
-    memcpy(l_event_new->hashes_n_signs_n_datum, a_hashes, l_hashes_size );
-
-//    dap_chain_sign_t * l_sign = dap_chain_sign_create(a_key)
-
-//    dap_chain_sign_create(a_key,)
-//    memcpy(l_event_new->hashes_n_signs_n_datum+l_hashes_size, );
-//    a_dag->callback_event_input(a_dag,l_event_new);
-
-}
-
-/**
- * @brief dap_chain_cs_dag_event_delete
- * @param a_dag
- * @param a_event
- */
-void dap_chain_cs_dag_event_delete(dap_chain_cs_dag_t * a_dag,dap_chain_cs_dag_event_t * a_event)
-{
-
-}
-
-
-/**
- * @brief dap_chain_cs_dag_event_get_datum
- * @param a_event
- * @return
- */
-dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event)
-{
-    uint8_t * l_signs = a_event->hashes_n_signs_n_datum
-            +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
-    uint16_t l_signs_offset = 0;
-    uint16_t l_signs_passed;
-    for ( l_signs_passed=0;  l_signs_passed < a_event->header.signs_count; l_signs_passed++){
-        dap_chain_sign_t * l_sign = (dap_chain_sign_t *) l_signs+l_signs_offset;
-        l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header);
+    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 );
+
+    if ( a_key ){
+        dap_chain_sign_t * l_sign = dap_chain_sign_create(a_key,l_event_new,
+                                                          l_hashes_size+  sizeof(l_event_new->header)
+                                                          + l_datum_size ,0);
+        if ( l_sign ){
+            size_t l_sign_size = dap_chain_sign_get_size(l_sign);
+            l_event_new = (dap_chain_cs_dag_event_t* )DAP_REALLOC(l_event_new,l_event_size+l_sign_size );
+            memcpy(l_event_new->hashes_n_datum_n_signs+l_event_size,l_sign,l_sign_size);
+            l_event_size += l_sign_size;
+        }else {
+            log_it(L_ERROR,"Can't sign dag event!");
+            return NULL;
+        }
+    }else {
+        log_it(L_NOTICE, "Created unsigned dag event");
     }
-    return (dap_chain_datum_t*)  l_signs+l_signs_offset;
+    return l_event_new;
 }
 
+
 /**
  * @brief dap_chain_cs_dag_event_get_sign
  * @param a_event
@@ -105,8 +88,8 @@ dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a
 dap_chain_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number)
 {
     if (a_event->header.signs_count < a_sign_number ){
-        uint8_t * l_signs = a_event->hashes_n_signs_n_datum
-                +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
+        size_t l_offset_to_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_event);
+        uint8_t * l_signs = ((uint8_t*) a_event)+l_offset_to_sign;
         uint16_t l_signs_offset = 0;
         uint16_t l_signs_passed;
         for ( l_signs_passed=0;  l_signs_passed < a_sign_number; l_signs_passed++){
diff --git a/dap_chain_cs_dag_event.h b/dap_chain_cs_dag_event.h
index 6edecd6426419b968d3cede825db6afa5eeced28..dcb92022db9792839e37012abb757c4264ffd33e 100755
--- a/dap_chain_cs_dag_event.h
+++ b/dap_chain_cs_dag_event.h
@@ -32,25 +32,33 @@
 typedef struct dap_chain_cs_dag dap_chain_cs_dag_t;
 
 typedef struct dap_chain_class_dag_event_hdr {
-        uint8_t version;
+        uint16_t version;
         uint64_t timestamp;
         uint16_t hash_count; // Number of hashes
         uint16_t signs_count; // Number of signs nested with event
-} dap_chain_class_dag_event_hdr_t;
+} DAP_ALIGN_PACKED dap_chain_class_dag_event_hdr_t;
 
 typedef struct dap_chain_cs_dag_event {
     dap_chain_class_dag_event_hdr_t header;
-    uint8_t hashes_n_signs_n_datum[]; // Hashes, signes and datum
-} dap_chain_cs_dag_event_t;
+    uint8_t hashes_n_datum_n_signs[]; // Hashes, signes and datum
+} DAP_ALIGN_PACKED dap_chain_cs_dag_event_t;
 
 
-dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum,
+dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_datum_t * a_datum,
                                                 dap_enc_key_t * a_key,
                                                 dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count);
 
-void dap_chain_cs_dag_event_delete(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_event);
+/**
+ * @brief dap_chain_cs_dag_event_get_datum
+ * @param a_event
+ * @return
+ */
+static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event)
+{
+    return (dap_chain_datum_t* ) a_event->hashes_n_datum_n_signs
+            +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
+}
 
-dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event);
 dap_chain_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number);
 
 /**
@@ -61,20 +69,32 @@ dap_chain_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a
 static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * a_event)
 {
     size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t);
-    uint8_t * l_signs = a_event->hashes_n_signs_n_datum
-            +l_hashes_size;
+    dap_chain_datum_t * l_datum = (dap_chain_datum_t*) a_event->hashes_n_datum_n_signs + l_hashes_size;
+
+    size_t l_datum_size = dap_chain_datum_size(l_datum);
+    uint8_t * l_signs = a_event->hashes_n_datum_n_signs
+            +l_hashes_size+l_datum_size;
     uint16_t l_signs_offset = 0;
     uint16_t l_signs_passed;
     for ( l_signs_passed=0;  l_signs_passed < a_event->header.signs_count; l_signs_passed++){
         dap_chain_sign_t * l_sign = (dap_chain_sign_t *) l_signs+l_signs_offset;
         l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header);
     }
-    dap_chain_datum_t * l_datum = (dap_chain_datum_t*)  l_signs+l_signs_offset;
-    return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum->header.data_size;
+
+    return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size;
+}
+
+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);
+    dap_chain_datum_t * l_datum = (dap_chain_datum_t*) a_event->hashes_n_datum_n_signs + l_hashes_size;
+    size_t l_datum_size = dap_chain_datum_size(l_datum);
+    return  l_hashes_size + sizeof (a_event->header)+l_datum_size;
 }
 
 /**
  * @brief dap_chain_cs_dag_event_calc_hash
+ * @details Important moment, it calculates hash of everything except signatures
  * @param a_event
  * @param a_event_hash
  */