diff --git a/dap_chain_mempool.c b/dap_chain_mempool.c
index 7348370b70fd604e73d6ec1f10a5bca563a6e120..6eb5ce839e2cb50def0b72e58c9ee4024f3026fc 100755
--- a/dap_chain_mempool.c
+++ b/dap_chain_mempool.c
@@ -444,17 +444,19 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a
  *
  * return 0 Ok, -2 not enough funds to transfer, -1 other Error
  */
-int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
+dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
-        const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_cond,
-        const dap_chain_addr_t* a_addr_fee, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size)
+        const dap_chain_addr_t* a_addr_from,
+        const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
+        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size)
 {
+    dap_ledger_t * l_ledger = a_net ? dap_chain_ledger_by_net_name( a_net->pub.name ) : NULL;
     // check valid param
-    if(!a_chain || !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
-            !dap_chain_addr_check_sum(a_addr_from) || !dap_chain_addr_check_sum(a_addr_cond) ||
-            (a_addr_fee && !dap_chain_addr_check_sum(a_addr_fee)) || !a_value)
-        return -1;
+    if(!a_net || ! l_ledger || !a_key_from || !a_key_from->priv_key_data || !a_key_from->priv_key_data_size ||
+            !dap_chain_addr_check_sum(a_addr_from) ||
+            !a_value)
+        return NULL;
 
     // find the transactions from which to take away coins
     dap_list_t *l_list_used_out = NULL; // list of transaction with 'out' items
@@ -465,7 +467,7 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
         while(l_value_transfer < l_value_need)
         {
             // Get the transaction in the cache by the addr in out item
-            dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_addr(a_chain->ledger, a_token_ticker,a_addr_from,
+            dap_chain_datum_tx_t *l_tx = dap_chain_ledger_tx_find_by_addr(l_ledger, a_token_ticker,a_addr_from,
                     &l_tx_cur_hash);
             if(!l_tx)
                 break;
@@ -481,7 +483,7 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
                 if(out_item &&  !memcmp(a_addr_from, &out_item->addr, sizeof(dap_chain_addr_t))) {
 
                     // Check whether used 'out' items
-                    if(!dap_chain_ledger_tx_hash_is_used_out_item(a_chain->ledger, &l_tx_cur_hash, l_out_idx_tmp)) {
+                    if(!dap_chain_ledger_tx_hash_is_used_out_item(l_ledger, &l_tx_cur_hash, l_out_idx_tmp)) {
 
                         list_used_item_t *item = DAP_NEW(list_used_item_t);
                         memcpy(&item->tx_hash_fast, &l_tx_cur_hash, sizeof(dap_chain_hash_fast_t));
@@ -505,7 +507,8 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
         // nothing to tranfer (not enough funds)
         if(!l_list_used_out || l_value_transfer < l_value_need) {
             dap_list_free_full(l_list_used_out, free);
-            return -2;
+            log_it( L_ERROR, "nothing to tranfer (not enough funds)");
+            return NULL;
         }
     }
 
@@ -528,13 +531,12 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
     // add 'out_cond' and 'out' items
     {
         uint64_t l_value_pack = 0; // how much coin add to 'out' items
-        if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, (dap_chain_addr_t*) a_addr_cond, a_value, a_cond,
+        if(dap_chain_datum_tx_add_out_cond_item(&l_tx, a_key_cond, a_srv_uid, a_value, a_value_per_unit_max, a_unit, a_cond,
                 a_cond_size) == 1) {
             l_value_pack += a_value;
             // transaction fee
-            if(a_addr_fee) {
-                if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_fee, a_value_fee) == 1)
-                    l_value_pack += a_value_fee;
+            if(a_value_fee) {
+                // TODO add condition with fee for mempool-as-service
             }
         }
         // coin back
@@ -542,7 +544,8 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
         if(l_value_back) {
             if(dap_chain_datum_tx_add_out_item(&l_tx, a_addr_from, l_value_back) != 1) {
                 dap_chain_datum_tx_delete(l_tx);
-                return -1;
+                log_it( L_ERROR, "Cant add coin back output");
+                return NULL;
             }
         }
     }
@@ -550,26 +553,27 @@ int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
     // add 'sign' items
     if(dap_chain_datum_tx_add_sign_item(&l_tx, a_key_from) != 1) {
         dap_chain_datum_tx_delete(l_tx);
-        return -1;
+        log_it( L_ERROR, "Can't add sign output");
+        return NULL;
     }
 
-    size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx);
-    dap_chain_datum_t *l_datum = dap_chain_datum_create(DAP_CHAIN_DATUM_TX, l_tx, l_tx_size);
+    size_t l_tx_size = dap_chain_datum_tx_get_size( l_tx );
+    dap_chain_datum_t *l_datum = dap_chain_datum_create( DAP_CHAIN_DATUM_TX, l_tx, l_tx_size );
 
-    dap_chain_hash_fast_t l_key_hash;
-    dap_hash_fast(l_tx, l_tx_size, &l_key_hash);
-    DAP_DELETE(l_tx);
+    dap_chain_hash_fast_t *l_key_hash = DAP_NEW_Z( dap_chain_hash_fast_t );
+    dap_hash_fast( l_tx, l_tx_size, l_key_hash );
+    DAP_DELETE( l_tx );
 
-    char * l_key_str = dap_chain_hash_fast_to_str_new(&l_key_hash);
-    char * l_gdb_group = dap_chain_net_get_gdb_group_mempool(a_chain);
-    if(dap_chain_global_db_gr_set(l_key_str, (uint8_t *) l_datum, dap_chain_datum_size(l_datum)
-            , l_gdb_group)) {
+    char * l_key_str = dap_chain_hash_fast_to_str_new( l_key_hash );
+    char * l_gdb_group = dap_chain_net_get_gdb_group_mempool_by_chain_type( a_net ,CHAIN_TYPE_TX);
+    if( dap_chain_global_db_gr_set( l_key_str, (uint8_t *) l_datum, dap_chain_datum_size(l_datum)
+                                   , l_gdb_group ) ) {
         log_it(L_NOTICE, "Transaction %s placed in mempool", l_key_str);
     }
     DAP_DELETE(l_gdb_group);
     DAP_DELETE(l_key_str);
 
-    return 0;
+    return l_key_hash;
 }
 
 /**
diff --git a/dap_chain_mempool.h b/dap_chain_mempool.h
index 1114285ec060ceca63370f4606bf1d7dfd2b0d0c..a078ccf164116bb6709d9162592be36d5def158f 100755
--- a/dap_chain_mempool.h
+++ b/dap_chain_mempool.h
@@ -2,6 +2,7 @@
 
 #include <stdint.h>
 #include "dap_chain_datum.h"
+#include "dap_chain_net.h"
 #include "dap_chain_ledger.h"
 #include "dap_http.h"
 /*
@@ -49,11 +50,12 @@ int dap_chain_mempool_tx_create(dap_chain_t * a_chain, dap_enc_key_t *a_key_from
         uint64_t a_value, uint64_t a_value_fee);
 
 // Make transfer transaction & insert to cache
-int dap_chain_mempool_tx_create_cond(dap_chain_t * a_chain,
+dap_chain_hash_fast_t* dap_chain_mempool_tx_create_cond(dap_chain_net_t * a_net,
         dap_enc_key_t *a_key_from, dap_enc_key_t *a_key_cond,
-        const dap_chain_addr_t* a_addr_from, const dap_chain_addr_t* a_addr_cond,
-        const dap_chain_addr_t* a_addr_fee, const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
-        uint64_t a_value, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size);
+        const dap_chain_addr_t* a_addr_from,
+        const char a_token_ticker[DAP_CHAIN_TICKER_SIZE_MAX],
+        uint64_t a_value,uint64_t a_value_per_unit_max, dap_chain_net_srv_price_unit_uid_t a_unit,
+        dap_chain_net_srv_uid_t a_srv_uid, uint64_t a_value_fee, const void *a_cond, size_t a_cond_size);
 
 int dap_chain_mempool_datum_add(dap_chain_datum_t * a_datum);
 int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a_key_from,