diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c
index be05de54de7711e1c61ffed55571418f4b137330..c51072d2830f55eb89833676b988392c21d25f31 100644
--- a/modules/mempool/dap_chain_mempool.c
+++ b/modules/mempool/dap_chain_mempool.c
@@ -657,7 +657,12 @@ dap_chain_hash_fast_t* dap_chain_proc_tx_create_cond(dap_chain_net_t * a_net,
         dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size)
 {
 
-    dap_chain_t *l_chain = dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX);
+    dap_chain_t *l_chain = NULL;
+    if(a_net->pub.default_chain)
+        l_chain = a_net->pub.default_chain;
+    else
+        dap_chain_net_get_chain_by_chain_type(a_net, CHAIN_TYPE_TX);
+
     if(!l_chain)
             return NULL;
     // Make transfer transaction
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 2ccacb4614cf84997de23c7443371090955ae018..0864c057da64d0c68dfb7a46f57cdb194c8d8622 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1661,6 +1661,12 @@ int s_net_load(const char * a_net_name)
             }
             dap_list_free(l_prior_list);
 
+            const char* l_default_chain_name = dap_config_get_item_str(l_cfg , "general" , "default_chain");
+            if(l_default_chain_name)
+                l_net->pub.default_chain = dap_chain_net_get_chain_by_name(l_net, l_default_chain_name);
+            else
+                l_net->pub.default_chain = NULL;
+
         } else {
             log_it(L_ERROR,"Can't any chains for network %s",l_net->pub.name);
             PVT(l_net)->load_mode = false;
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index b11b20a1503bbf9b54bb33aba8b997295786aafd..3465ff818ac15aa88af1228e8dbf3440dd4f93da 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -75,6 +75,7 @@ typedef struct dap_chain_net{
         char * gdb_nodes;
 
         dap_chain_t * chains; // double-linked list of chains
+        dap_chain_t * default_chain;
         dap_ledger_t  *ledger;
     } pub;
     uint8_t pvt[];
diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c
index 2b66650d17abe9ac2afda7b5fe91a9b25e71b70b..7f6f5be091435e0c1dc16af5a153ddcd6542001c 100644
--- a/modules/service/vpn/dap_chain_net_srv_vpn.c
+++ b/modules/service/vpn/dap_chain_net_srv_vpn.c
@@ -449,6 +449,7 @@ static void s_tun_create(void)
             log_it(L_CRITICAL, "ioctl(TUNSETIFF) error: '%s' ", strerror(errno));
             close(s_raw_server->tun_ctl_fd);
             s_raw_server->tun_ctl_fd = -1;
+            s_raw_server->tun_fd = -1;
         } else {
             char buf[256];
             log_it(L_NOTICE, "Bringed up %s virtual network interface (%s/%s)", s_raw_server->ifr.ifr_name,
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 698a24fe7af91cc236bf5bdff48423c423b2f59a..fa5d5b1a7118ad69ebb8054ed21e4d2203cc9c06 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -114,6 +114,7 @@ static dap_chain_datum_t* s_chain_callback_datum_iter_get_next( dap_chain_datum_
 */
 
 static int s_cli_dag(int argc, char ** argv, void *arg_func, char **str_reply);
+void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_item_t * a_event_item);
 
 static bool s_seed_mode = false;
 /**
@@ -244,7 +245,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain)
         DAP_DELETE(l_dag->_pvt);
 }
 
-int dap_chain_add_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){
+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);
   switch (l_datum->header.type_id) {
@@ -279,6 +280,18 @@ int dap_chain_add_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger,
   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 ){
+    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);
+
+    int res = a_dag->callback_cs_verify(a_dag,a_event_item->event);
+
+    if(res == 0)
+        res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item);
+
+    return res;
+}
+
 /**
  * @brief s_chain_callback_atom_add Accept new event in dag
  * @param a_chain DAG object
@@ -318,62 +331,18 @@ static int s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t
         DAP_DELETE(l_hash_str);
         return -3;
     }
-    HASH_ADD(hh, l_events,hash,sizeof (l_event_item->hash),  l_event_item);
-    // save l_events to dag_pvt
-    if(l_add_to_threshold)
-        PVT(l_dag)->events_treshold = l_events;
-    else
-        PVT(l_dag)->events = l_events;
-
-    //HASH_ADD(hh, PVT(l_dag)->events_treshold, hash, sizeof(l_event_item->hash), l_event_item);
-    pthread_rwlock_unlock( l_events_rwlock );
-    if ( l_events == PVT(l_dag)->events){
-        dap_chain_cs_dag_event_item_t * l_event_last = NULL;
-        // Check the events and update the lasts
-        for ( dap_chain_hash_fast_t * l_link_hash = (dap_chain_hash_fast_t *) l_event->hashes_n_datum_n_signs ;
-                  l_link_hash < ( dap_chain_hash_fast_t *) (
-                  l_event->hashes_n_datum_n_signs + l_event->header.hash_count*sizeof (*l_link_hash) );
-                  l_link_hash += sizeof (dap_chain_hash_fast_t ) ) {
-            l_event_last = NULL;
-            pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
-            HASH_FIND(hh,PVT(l_dag)->events_lasts_unlinked,l_link_hash,sizeof(*l_link_hash), l_event_last);
-            if ( l_event_last ){ // If present in unlinked - remove
-                HASH_DEL(PVT(l_dag)->events_lasts_unlinked,l_event_last);
-                DAP_DEL_Z(l_event_last);
-            }
-            pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
 
-        }
-        // and then adds itself
-        l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
-        l_event_last->ts_added = l_event_item->ts_added;
-        l_event_last->event = l_event;
-        dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_last->hash );
-        pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
-        HASH_ADD(hh,PVT(l_dag)->events_lasts_unlinked,hash,sizeof (l_event_last->hash),l_event_last);
-        pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
+    int res = 0;
+    if(l_add_to_threshold){
+        HASH_ADD(hh, PVT(l_dag)->events_treshold,hash,sizeof (l_event_item->hash),  l_event_item);
+    }else{
+        res = s_dap_chain_add_atom_to_events_table(l_dag, a_chain->ledger, l_event_item);
     }
 
-    if(!l_add_to_threshold){
-      int ret_cs = l_dag->callback_cs_verify(l_dag,l_event);
-      if ( ret_cs != 0 ){
-        log_it(L_WARNING,"Consensus can't accept the event, verification returned %d",ret_cs);
-        return  -2;
-      }
-      pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
-      int res_ledger = dap_chain_add_to_ledger(l_dag, a_chain->ledger, l_event_item);
-      pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
-
-      if(res_ledger < 0)
-        return res_ledger;
-    }
-
-    // Now check the treshold if some events now are ready to move to the main table
-    pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock);
     while(dap_chain_cs_dag_proc_treshold(l_dag, a_chain->ledger));
-    pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock);
+    pthread_rwlock_unlock( l_events_rwlock );
 
-    return 0;
+    return res;
 }
 
 /**
@@ -645,16 +614,26 @@ void s_dag_events_lasts_delete_linked_with_event(dap_chain_cs_dag_t * a_dag, dap
     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_item = NULL;
-        pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock);
         HASH_FIND(hh, PVT(a_dag)->events_lasts_unlinked ,l_hash ,sizeof (*l_hash),  l_event_item);
         if ( l_event_item ){
             HASH_DEL(PVT(a_dag)->events_lasts_unlinked,l_event_item);
             DAP_DEL_Z(l_event_item);
         }
-        pthread_rwlock_wrlock(&PVT(a_dag)->events_rwlock);
     }
 }
 
+void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_item_t * a_event_item){
+    //delete linked with event
+    s_dag_events_lasts_delete_linked_with_event(a_dag, a_event_item->event);
+
+    //add self
+    dap_chain_cs_dag_event_item_t * l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t);
+    l_event_last->ts_added = a_event_item->ts_added;
+    l_event_last->event = a_event_item->event;
+    dap_hash_fast(l_event_last->event, dap_chain_cs_dag_event_calc_size(l_event_last->event),&l_event_last->hash );
+    HASH_ADD(hh,PVT(a_dag)->events_lasts_unlinked,hash, sizeof(l_event_last->hash),l_event_last);
+}
+
 
 typedef enum{
   DAP_THRESHOLD_OK = 0,
@@ -719,13 +698,11 @@ bool dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a
             HASH_DEL(PVT(a_dag)->events_treshold,l_event_item);
 
             if(ret == DAP_THRESHOLD_OK){
-                HASH_ADD(hh, PVT(a_dag)->events, hash,sizeof (l_event_item->hash),  l_event_item);
-                int l_ledger_ret = dap_chain_add_to_ledger(a_dag, a_ledger, l_event_item);
+                s_dap_chain_add_atom_to_events_table(a_dag, a_ledger, l_event_item);
                 res = true;
             }else if(ret == DAP_THRESHOLD_CONFLICTING)
                 HASH_ADD(hh, PVT(a_dag)->events_treshold_conflicted, hash,sizeof (l_event_item->hash),  l_event_item);
 
-            s_dag_events_lasts_delete_linked_with_event(a_dag, l_event);
         }
     }
     return res;