diff --git a/CMakeLists.txt b/CMakeLists.txt
index a712896a4d58e89358f9a492b1bf05775507f5a3..a10ddcdb4c1f8b1cbc0953281e719973f11a4f5d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 2.8)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.5-24")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.5-25")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 
 set(DAPSDK_MODULES "")
diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c
index 5a3ca7692c94c91b10a17f7e2d2401813e52ce60..3eb3a14148778e6d94193e62e9f712b783018c73 100644
--- a/dap-sdk/net/client/dap_client_pvt.c
+++ b/dap-sdk/net/client/dap_client_pvt.c
@@ -852,9 +852,10 @@ void dap_client_pvt_request_enc(dap_client_pvt_t * a_client_internal, const char
         }
     }
 
-    size_t l_key_hdr_str_size_max = strlen(a_client_internal->session_key_id) + 10;
+    size_t l_key_hdr_str_size_max = a_client_internal->session_key_id ? strlen(a_client_internal->session_key_id) + 10 : 12;
     char *l_key_hdr_str = DAP_NEW_Z_SIZE(char, l_key_hdr_str_size_max);
-    snprintf(l_key_hdr_str, l_key_hdr_str_size_max, "KeyID: %s", a_client_internal->session_key_id);
+    snprintf(l_key_hdr_str, l_key_hdr_str_size_max, "KeyID: %s",
+             a_client_internal->session_key_id ? a_client_internal->session_key_id : "NULL");
 
     char *a_custom_new[2];
     size_t a_custom_count = 1;
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index fa171cb1b43c8064f775b710e2e4a41c93a6a9a8..aca8f087bca238c7ce5ad50cf5ea17966d71d042 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -69,11 +69,8 @@ static  pthread_rwlock_t s_verificators_rwlock;
 #define MAX_OUT_ITEMS   10
 typedef struct dap_chain_ledger_token_emission_item {
     dap_chain_hash_fast_t datum_token_emission_hash;
-    // while these are not needed
-    //dap_chain_hash_fast_t datum_tx_token_hash;
-    //dap_chain_tx_token_t * tx_token;
-
     dap_chain_datum_token_emission_t *datum_token_emission;
+    size_t datum_token_emission_size;
     UT_hash_handle hh;
 } dap_chain_ledger_token_emission_item_t;
 
@@ -315,23 +312,51 @@ int dap_chain_ledger_token_add(dap_ledger_t * a_ledger,  dap_chain_datum_token_t
  * @brief s_treshold_emissions_proc
  * @param a_ledger
  */
-static void s_treshold_emissions_proc( dap_ledger_t * a_ledger)
-{
-    UNUSED(a_ledger);
-    // TODO
+static void s_treshold_emissions_proc(dap_ledger_t * a_ledger)
+{ 
+    bool l_success;
+    do {
+        l_success = false;
+        dap_chain_ledger_token_emission_item_t *l_emission_item, *l_emission_tmp;
+        HASH_ITER(hh, PVT(a_ledger)->treshold_emissions, l_emission_item, l_emission_tmp) {
+            int l_res = dap_chain_ledger_token_emission_add(a_ledger, l_emission_item->datum_token_emission,
+                                                            l_emission_item->datum_token_emission_size);
+            if (!l_res) {
+                pthread_rwlock_wrlock(&PVT(a_ledger)->treshold_emissions_rwlock);
+                HASH_DEL(PVT(a_ledger)->treshold_emissions, l_emission_item);
+                pthread_rwlock_unlock(&PVT(a_ledger)->treshold_emissions_rwlock);
+                DAP_DELETE(l_emission_item->datum_token_emission);
+                DAP_DELETE(l_emission_item);
+                l_success = true;
+            }
+        }
+    } while (l_success); 
 }
 
 /**
  * @brief s_treshold_txs_proc
  * @param a_ledger
  */
-static void s_treshold_txs_proc( dap_ledger_t * a_ledger)
-{
-    UNUSED(a_ledger);
-    // TODO
+static void s_treshold_txs_proc( dap_ledger_t *a_ledger)
+{  
+    bool l_success;
+    do {
+        l_success = false;
+        dap_chain_ledger_tx_item_t *l_tx_item, *l_tx_tmp;
+        HASH_ITER(hh, PVT(a_ledger)->treshold_txs, l_tx_item, l_tx_tmp) {
+            int l_res = dap_chain_ledger_tx_add(a_ledger, l_tx_item->tx);
+            if (!l_res) {
+                pthread_rwlock_wrlock(&PVT(a_ledger)->treshold_txs_rwlock);
+                HASH_DEL(PVT(a_ledger)->treshold_txs, l_tx_item);
+                pthread_rwlock_unlock(&PVT(a_ledger)->treshold_txs_rwlock);
+                DAP_DELETE(l_tx_item->tx);
+                DAP_DELETE(l_tx_item);
+                l_success = true;
+            }
+        }
+    } while (l_success);
 }
 
-
 /**
  * @brief dap_chain_ledger_create
  * @param a_check_flags
@@ -430,6 +455,7 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger,
             memcpy(l_token_emission_item->datum_token_emission, a_token_emission, a_token_emission_size);
             memcpy(&l_token_emission_item->datum_token_emission_hash,
                     l_token_emission_hash_ptr, sizeof(l_token_emission_hash));
+            l_token_emission_item->datum_token_emission_size = a_token_emission_size;
             dap_chain_ledger_token_emission_item_t * l_token_emissions =  l_token_item ?
                         l_token_item->token_emissions : l_ledger_priv->treshold_emissions;
             HASH_ADD(hh, l_token_emissions ,
@@ -454,8 +480,10 @@ int dap_chain_ledger_token_emission_add(dap_ledger_t *a_ledger,
             ret = -2;
         }
     } else {
-        log_it(L_ERROR, "Can't add token emission datum of %llu %s ( %s )",
+        if (l_token_item) {
+            log_it(L_ERROR, "Can't add token emission datum of %llu %s ( %s )",
                 a_token_emission->hdr.value, c_token_ticker, l_hash_str);
+        }
         ret = -1;
     }
     pthread_rwlock_unlock(l_token_item ?
@@ -776,7 +804,7 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
         bound_item->item_out = l_item_out;
         if(!l_tx_prev) { // First transaction
             log_it(L_DEBUG,"No previous transaction was found for hash %s",l_tx_prev_hash_str);
-            l_err_num = -5;
+            l_err_num = DAP_CHAIN_LEDGER_TX_NO_PREVIOUS;
             break;
         }
         //log_it(L_INFO,"Previous transaction was found for hash %s",l_tx_prev_hash_str);
@@ -1072,39 +1100,53 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx)
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
     dap_list_t *l_list_bound_items = NULL;
     dap_list_t *l_list_tx_out = NULL;
+    dap_chain_ledger_tx_item_t *l_item_tmp = NULL;
 
     dap_chain_hash_fast_t *l_tx_hash = dap_chain_node_datum_tx_calc_hash(a_tx);
     char l_tx_hash_str[70];
     dap_chain_hash_fast_to_str(l_tx_hash,l_tx_hash_str,sizeof(l_tx_hash_str));
 
-    int l_ret_check;
-    if( (l_ret_check = dap_chain_ledger_tx_cache_check(
-             a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0){
-        log_it (L_WARNING, "dap_chain_ledger_tx_add() tx %s not passed the check: code %d ",l_tx_hash_str, l_ret_check);
-        return l_ret_check*100;
-    }
-    log_it ( L_DEBUG, "dap_chain_ledger_tx_add() check passed for tx %s",l_tx_hash_str);
-
-
-    char *l_token_ticker = NULL, *l_token_ticker_old = NULL;
-    dap_chain_ledger_tx_item_t *l_item_tmp = NULL;
     pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock);
-    HASH_FIND(hh, l_ledger_priv->ledger_items, l_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp); // tx_hash already in the hash?
+    HASH_FIND(hh, l_ledger_priv->ledger_items, l_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp);
+    pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
     // transaction already present in the cache list
-    if(l_item_tmp) {
-        // delete transaction from the cache list
-        //ret = dap_chain_ledger_tx_remove(a_ledger, l_tx_hash);
-        // there should be no duplication
-        char * l_hash_str = dap_chain_hash_fast_to_str_new(l_tx_hash);
-        log_it(L_WARNING, "Transaction (hash=%s)  deleted from cache because there is an attempt to add it to cache",
-               l_hash_str);
-        DAP_DELETE(l_hash_str);
+    if (l_item_tmp) {
+        log_it(L_WARNING, "Transaction %s already present in the cache", l_tx_hash_str);
         ret = 1;
         goto FIN;
     }
-    if (ret == -1) {
+
+    int l_ret_check;
+    l_item_tmp = NULL;
+    if( (l_ret_check = dap_chain_ledger_tx_cache_check(
+             a_ledger, a_tx, &l_list_bound_items, &l_list_tx_out)) < 0) {
+        if (l_ret_check == DAP_CHAIN_LEDGER_TX_NO_PREVIOUS) {
+            HASH_FIND(hh, l_ledger_priv->treshold_txs, l_tx_hash, sizeof(*l_tx_hash), l_item_tmp);
+            if (!l_item_tmp) {
+                if (HASH_COUNT(l_ledger_priv->treshold_txs) >= s_treshold_txs_max) {
+                    log_it(L_WARNING,"Treshold for tranactions is overfulled (%lu max), dropping down new data, added nothing",
+                                   s_treshold_txs_max);
+                } else {
+                    l_item_tmp = DAP_NEW_Z(dap_chain_ledger_tx_item_t);
+                    memcpy(&l_item_tmp->tx_hash_fast, l_tx_hash, sizeof(dap_chain_hash_fast_t));
+                    size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
+                    l_item_tmp->tx = DAP_NEW_SIZE(dap_chain_datum_tx_t, l_tx_size);
+                    memcpy(l_item_tmp->tx, a_tx, l_tx_size);
+                    pthread_rwlock_wrlock(&l_ledger_priv->treshold_txs_rwlock);
+                    HASH_ADD(hh, l_ledger_priv->treshold_txs, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_tmp);
+                    pthread_rwlock_unlock(&l_ledger_priv->treshold_txs_rwlock);
+                    log_it (L_DEBUG, "Tx %s added to threshold", l_tx_hash_str);
+                }
+            }
+        } else {
+            log_it (L_WARNING, "dap_chain_ledger_tx_add() tx %s not passed the check: code %d ",l_tx_hash_str, l_ret_check);
+        }
+        ret = l_ret_check;
         goto FIN;
     }
+    log_it ( L_DEBUG, "dap_chain_ledger_tx_add() check passed for tx %s",l_tx_hash_str);
+
+    char *l_token_ticker = NULL, *l_token_ticker_old = NULL;
     bool l_multichannel = false;
     // Mark 'out' items in cache if they were used & delete previous transactions from cache if it need
     // find all bound pairs 'in' and 'out'
@@ -1168,14 +1210,14 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx)
             int res = dap_chain_ledger_tx_remove(a_ledger, &l_tx_prev_hash_to_del);
             if(res == -2) {
                 log_it(L_ERROR, "Can't delete previous transactions because hash=0x%x not found", l_tx_prev_hash_str);
-                ret = -2;
+                ret = -100;
                 DAP_DELETE(l_tx_prev_hash_str);
                 dap_list_free_full(l_list_bound_items, free);
                 goto FIN;
             }
             else if(res != 1) {
                 log_it(L_ERROR, "Can't delete previous transactions with hash=0x%x", l_tx_prev_hash_str);
-                ret = -3;
+                ret = -101;
                 DAP_DELETE(l_tx_prev_hash_str);
                 dap_list_free_full(l_list_bound_items, free);
                 goto FIN;
@@ -1307,14 +1349,16 @@ int dap_chain_ledger_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx)
         }
         if (l_token_ticker && !l_multichannel)
             strncpy(l_item_tmp->token_tiker, l_token_ticker, sizeof(l_item_tmp->token_tiker) - 1);
-
-        memcpy(l_item_tmp->tx, a_tx, dap_chain_datum_tx_get_size(a_tx));
+        size_t l_tx_size = dap_chain_datum_tx_get_size(a_tx);
+        memcpy(l_item_tmp->tx, a_tx, l_tx_size);
+        pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock);
         HASH_ADD(hh, l_ledger_priv->ledger_items, tx_hash_fast, sizeof(dap_chain_hash_fast_t), l_item_tmp); // tx_hash_fast: name of key field
+        pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
+
+        s_treshold_txs_proc(a_ledger);
         ret = 1;
     }
 FIN:
-    pthread_rwlock_tryrdlock (&l_ledger_priv->ledger_rwlock);
-    pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
     DAP_DELETE(l_tx_hash);
     return ret;
 }
@@ -1335,18 +1379,16 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
     HASH_FIND(hh, l_ledger_priv->ledger_items, a_tx_hash, sizeof(dap_chain_hash_fast_t), l_item_tmp);
     if(l_item_tmp != NULL) {
         HASH_DEL(l_ledger_priv->ledger_items, l_item_tmp);
+        // delete transaction
+        DAP_DELETE(l_item_tmp->tx);
+        // del struct for hash
+        DAP_DELETE(l_item_tmp);
         l_ret = 1;
     }
     else
         // hash not found in the cache
         l_ret = -2;
     pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
-    if(!l_ret) {
-        // delete transaction
-        DAP_DELETE(l_item_tmp->tx);
-        // del struct for hash
-        DAP_DELETE(l_item_tmp);
-    }
     return l_ret;
 }
 
@@ -1356,14 +1398,53 @@ int dap_chain_ledger_tx_remove(dap_ledger_t *a_ledger, dap_chain_hash_fast_t *a_
 void dap_chain_ledger_purge(dap_ledger_t *a_ledger)
 {
     dap_ledger_private_t *l_ledger_priv = PVT(a_ledger);
-    dap_chain_ledger_tx_item_t *l_iter_current, *l_item_tmp;
     pthread_rwlock_wrlock(&l_ledger_priv->ledger_rwlock);
-    HASH_ITER(hh, l_ledger_priv->ledger_items , l_iter_current, l_item_tmp)
-    {
-        // delete transaction
-        DAP_DELETE(l_iter_current->tx);
-        // del struct for hash
-        HASH_DEL(l_ledger_priv->ledger_items, l_iter_current);
+    pthread_rwlock_wrlock(&l_ledger_priv->tokens_rwlock);
+    pthread_rwlock_wrlock(&l_ledger_priv->treshold_emissions_rwlock);
+    pthread_rwlock_wrlock(&l_ledger_priv->treshold_txs_rwlock);
+
+    // delete transactions
+    dap_chain_ledger_tx_item_t *l_item_current, *l_item_tmp;
+    HASH_ITER(hh, l_ledger_priv->ledger_items , l_item_current, l_item_tmp) {
+        DAP_DELETE(l_item_current->tx);
+        HASH_DEL(l_ledger_priv->ledger_items, l_item_current);
+        DAP_DELETE(l_item_current);
+    }
+
+    // delete threshold txs
+    HASH_ITER(hh, l_ledger_priv->treshold_txs, l_item_current, l_item_tmp) {
+        HASH_DEL(l_ledger_priv->treshold_txs, l_item_current);
+        DAP_DELETE(l_item_current->tx);
+        DAP_DELETE(l_item_current);
+    }
+
+    // delete balances
+    dap_ledger_wallet_balance_t *l_balance_current, *l_balance_tmp;
+    HASH_ITER(hh, l_ledger_priv->balance_accounts, l_balance_current, l_balance_tmp) {
+        DAP_DELETE(l_balance_current->key);
+        DAP_DELETE(l_balance_current);
+    }
+
+    // delete threshold emissions
+    dap_chain_ledger_token_emission_item_t *l_emission_current, *l_emission_tmp;
+    HASH_ITER(hh, l_ledger_priv->treshold_emissions, l_emission_current, l_emission_tmp) {
+        HASH_DEL(l_ledger_priv->treshold_emissions, l_emission_current);
+        DAP_DELETE(l_emission_current->datum_token_emission);
+        DAP_DELETE(l_emission_current);
+    }
+
+    // delete tokens & its emissions
+    dap_chain_ledger_token_item_t *l_token_current, *l_token_tmp;
+    HASH_ITER(hh, l_ledger_priv->tokens, l_token_current, l_token_tmp) {
+        HASH_DEL(l_ledger_priv->tokens, l_token_current);
+        HASH_ITER(hh, l_token_current->token_emissions, l_emission_current, l_emission_tmp) {
+            HASH_DEL(l_token_current->token_emissions, l_emission_current);
+            DAP_DELETE(l_emission_current->datum_token_emission);
+            DAP_DELETE(l_emission_current);
+        }
+        DAP_DELETE(l_token_current->datum_token);
+        pthread_rwlock_destroy(&l_token_current->token_emissions_rwlock);
+        DAP_DELETE(l_token_current);
     }
     pthread_rwlock_unlock(&l_ledger_priv->ledger_rwlock);
 }
diff --git a/modules/chain/include/dap_chain_ledger.h b/modules/chain/include/dap_chain_ledger.h
index 29b7b7e9f0ecf06987174d0b66e1ca87b3370b82..7fe973442df58c40a14ceb658ad0d16dcb882bea 100644
--- a/modules/chain/include/dap_chain_ledger.h
+++ b/modules/chain/include/dap_chain_ledger.h
@@ -52,6 +52,9 @@ typedef bool (* dap_chain_ledger_verificator_callback_t)(dap_chain_tx_out_cond_t
 // Check the double spending  in all cells
 #define DAP_CHAIN_LEDGER_CHECK_CELLS_DS          0x0100
 
+// Error code for no previous transaction (candidate to threshold)
+#define DAP_CHAIN_LEDGER_TX_NO_PREVIOUS          -5
+
 dap_ledger_t* dap_chain_ledger_create(uint16_t a_check_flags);
 
 // Remove dap_ledger_t structure
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index 26db4a4a6c3f6f922ad73af80d2520b143f023e4..57e3241a72fc33c604a8a5b3a297c71a0f75fd11 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -229,21 +229,18 @@ bool s_chain_pkt_callback(dap_proc_thread_t *a_thread, void *a_arg)
         size_t l_atom_size =0;
         if ( l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash, &l_atom_size) == NULL ) {
             dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy, l_atom_copy_size);
-            if ((l_atom_add_res == ATOM_ACCEPT || l_atom_add_res == ATOM_MOVE_TO_THRESHOLD) &&
-                    dap_chain_has_file_store(l_chain)) {
+            if (l_atom_add_res == ATOM_ACCEPT && dap_chain_has_file_store(l_chain)) {
                 // append to file
                 dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(l_chain, l_ch_chain->request_cell_id);
                 int l_res;
                 if (l_cell) {
-                    if (l_atom_add_res == ATOM_ACCEPT) {
-                        // add one atom only
-                        l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size);
-                        // rewrite all file
-                        //l_res = dap_chain_cell_file_update(l_cell);
-                        if(l_res < 0) {
-                            log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash,
-                                    l_cell ? l_cell->file_storage_path : "[null]");
-                        }
+                    // add one atom only
+                    l_res = dap_chain_cell_file_append(l_cell, l_atom_copy, l_atom_copy_size);
+                    // rewrite all file
+                    //l_res = dap_chain_cell_file_update(l_cell);
+                    if(l_res < 0) {
+                        log_it(L_ERROR, "Can't save event 0x%x to the file '%s'", l_atom_hash,
+                                l_cell ? l_cell->file_storage_path : "[null]");
                     }
                     // add all atoms from treshold
                     if (l_chain->callback_atom_add_from_treshold){
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 48342a194ee44b9a94fc64070d8dea0516c37327..c0bcabc50b19da206d90237004ffbae31516aa1f 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -256,42 +256,40 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
         DAP_DELETE(l_dag->_pvt);
 }
 
-static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){
-
-  dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size);
-  switch (l_datum->header.type_id) {
-    case DAP_CHAIN_DATUM_TOKEN_DECL: {
-      dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
-      return dap_chain_ledger_token_add(a_ledger, l_token, l_datum->header.data_size);
-    }
-      break;
-    case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
-      dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data;
-      return dap_chain_ledger_token_emission_add(a_ledger, l_token_emission, l_datum->header.data_size);
-    }
-      break;
-    case DAP_CHAIN_DATUM_TX: {
-      dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
-      // don't save bad transactions to base
-      int l_ret = dap_chain_ledger_tx_add(a_ledger, l_tx);
-      if( l_ret !=0 ) {
-        return l_ret;
-      }
-      dap_chain_cs_dag_event_item_t * l_tx_event= DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
-      l_tx_event->ts_added = a_event_item->ts_added;
-      l_tx_event->event = a_event_item->event;
-      l_tx_event->event_size = a_event_item->event_size;
-      memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) );
-
-      HASH_ADD(hh,PVT(a_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event);
-
+static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item)
+{
+    dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size);
+    switch (l_datum->header.type_id) {
+        case DAP_CHAIN_DATUM_TOKEN_DECL: {
+            dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data;
+            return dap_chain_ledger_token_add(a_ledger, l_token, l_datum->header.data_size);
+            }
+        break;
+        case DAP_CHAIN_DATUM_TOKEN_EMISSION: {
+            dap_chain_datum_token_emission_t *l_token_emission = (dap_chain_datum_token_emission_t*) l_datum->data;
+            return dap_chain_ledger_token_emission_add(a_ledger, l_token_emission, l_datum->header.data_size);
+            }
+        break;
+        case DAP_CHAIN_DATUM_TX: {
+            dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t*) l_datum->data;
+            // don't save bad transactions to base
+            int l_ret = dap_chain_ledger_tx_add(a_ledger, l_tx);
+            if( l_ret != 1 ) {
+                return l_ret;
+            }
+            dap_chain_cs_dag_event_item_t * l_tx_event= DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
+            l_tx_event->ts_added = a_event_item->ts_added;
+            l_tx_event->event = a_event_item->event;
+            l_tx_event->event_size = a_event_item->event_size;
+            memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) );
 
+            HASH_ADD(hh,PVT(a_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event);
+            }
+        break;
+        default:
+            return -1;
     }
-      break;
-    default:
-      return -1;
-  }
-  return 0;
+    return 0;
 }
 
 static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item )
@@ -302,7 +300,11 @@ static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_
     dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1);
     if (res == 0 || memcmp( &a_event_item->hash, &a_dag->static_genesis_event_hash, sizeof(a_event_item->hash) ) == 0) {
         log_it(L_DEBUG,"Dag event %s checked, add it to ledger", l_buf_hash);
-        s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item);
+        res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item);
+        if (res) {
+            log_it(L_DEBUG,"Dag event %s checked, but ledger declined", l_buf_hash);
+            return res;
+        }
         //All correct, no matter for result
         HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item);
         s_dag_events_lasts_process_new_last_event(a_dag, a_event_item);
@@ -376,7 +378,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha
         int l_consensus_check = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item);
         if(!l_consensus_check){
              log_it(L_DEBUG, "... added");
-        }else if (l_consensus_check == -5){
+        }else if (l_consensus_check == DAP_CHAIN_LEDGER_TX_NO_PREVIOUS){
+            HASH_ADD(hh, PVT(l_dag)->events_treshold, hash, sizeof(l_event_item->hash), l_event_item);
             log_it(L_DEBUG, "... tresholded");
             ret = ATOM_MOVE_TO_THRESHOLD;
         }else{