diff --git a/dap_chain_net_srv_common.c b/dap_chain_net_srv_common.c
index cd1709eef82484bf4919439e5851c57512d953e1..bbb4c4cb6471220dfb2db990bfcfd9a97eaf1932 100755
--- a/dap_chain_net_srv_common.c
+++ b/dap_chain_net_srv_common.c
@@ -1,20 +1,48 @@
 #include <stdint.h>
+#include "dap_strfuncs.h"
 #include "rand/dap_rand.h"
 #include "dap_chain_net_srv_common.h"
 #include "dap_chain_datum_tx_items.h"
 #include "dap_chain_utxo.h"
 
+/**
+ * copy a_value_dst to a_uid_src
+ */
+void dap_chain_net_srv_uid_set(dap_chain_net_srv_uid_t *a_uid_src, uint128_t a_value_dst)
+{
+    memset(a_uid_src->raw, 0, sizeof(a_uid_src->raw));
+    memcpy(a_uid_src->raw, &a_value_dst, min(sizeof(a_uid_src->raw), sizeof(uint128_t)));
+}
+
 /**
  * Generate unique id for service
  */
-bool dap_chain_net_srv_gen_uid(dap_chain_net_srv_uid_t *a_srv)
+bool dap_chain_net_srv_gen_uid(uint8_t *a_srv, size_t a_srv_size)
 {
     if(!a_srv)
         return false;
-    randombytes(a_srv, sizeof(dap_chain_net_srv_uid_t));
+    randombytes(a_srv, a_srv_size);
     return true;
 }
 
+/**
+ *  Initialize dap_chain_net_srv_abstract_t structure
+ */
+void dap_chain_net_srv_abstract_set(dap_chain_net_srv_abstract_t *a_cond, uint8_t a_class, uint128_t a_type_id,
+        uint64_t a_price, uint8_t a_price_units, const char *a_decription)
+{
+    memset(a_cond, 0, sizeof(dap_chain_net_srv_abstract_t));
+    // generate unique proposal_id
+    dap_chain_net_srv_gen_uid((uint8_t*) &a_cond->proposal_id, sizeof(a_cond->proposal_id));
+    // fill structure
+    a_cond->class = a_class;
+    dap_chain_net_srv_uid_set(&a_cond->type_id, a_type_id);
+    a_cond->price = a_price;
+    a_cond->price_units = a_price_units;
+    if(a_decription)
+        strncpy(a_cond->decription, a_decription, sizeof(a_cond->decription) - 1);
+}
+
 /**
  *
  */
@@ -23,9 +51,11 @@ uint64_t dap_chain_net_srv_client_auth(char *a_addr_base58, uint8_t *a_sign, siz
 {
     dap_chain_addr_t *l_addr = (a_addr_base58) ? dap_chain_str_to_addr(a_addr_base58) : NULL;
     dap_chain_tx_out_cond_t *l_tx_out_cond = NULL;
-
+    dap_chain_sign_type_t l_sig_type;
+    if(l_addr)
+        memcpy(&l_sig_type, &l_addr->sig_type, sizeof(dap_chain_sign_type_t));
     // Search all value in transactions with l_addr in 'out_cond' item
-    uint64_t l_value = 0;//!!!dap_chain_node_datum_tx_cache_get_out_cond_value(l_addr, &l_tx_out_cond);
+    uint64_t l_value = dap_chain_utxo_tx_cache_get_out_cond_value(l_addr, &l_tx_out_cond);
     DAP_DELETE(l_addr);
     // not found transaction with l_addr in 'out_cond' item
     if(!l_value)
@@ -33,13 +63,13 @@ uint64_t dap_chain_net_srv_client_auth(char *a_addr_base58, uint8_t *a_sign, siz
 
     size_t l_pkey_size = 0;
     size_t l_cond_size = 0;
-    uint8_t *l_cond = dap_chain_datum_tx_out_cond_item_get_pkey(l_tx_out_cond, &l_cond_size);
-    uint8_t *l_pkey = dap_chain_datum_tx_out_cond_item_get_cond(l_tx_out_cond, &l_pkey_size);
+    uint8_t *l_cond = dap_chain_datum_tx_out_cond_item_get_cond(l_tx_out_cond, &l_cond_size);
+    uint8_t *l_pkey = dap_chain_datum_tx_out_cond_item_get_pkey(l_tx_out_cond, &l_pkey_size);
 
     // create l_chain_sign for check a_sign
     dap_chain_sign_t *l_chain_sign = DAP_NEW_Z_SIZE(dap_chain_sign_t,
             sizeof(dap_chain_sign_t) + a_sign_size + l_pkey_size);
-    l_chain_sign->header.type = l_addr->sig_type;
+    l_chain_sign->header.type = l_sig_type;
     l_chain_sign->header.sign_size = l_pkey_size;
     l_chain_sign->header.sign_pkey_size = l_pkey_size;
     // write serialized public key to dap_chain_sign_t
diff --git a/dap_chain_net_srv_common.h b/dap_chain_net_srv_common.h
index ee6835544d2aff9491dac791246f37e8d1670cc5..9600c48046144c62b193270815ff99564b607377 100755
--- a/dap_chain_net_srv_common.h
+++ b/dap_chain_net_srv_common.h
@@ -5,16 +5,15 @@
 #include "dap_math_ops.h"
 
 #define DAP_CHAIN_NET_SRV_UID_SIZE 16
-typedef union{
+typedef union {
     uint8_t raw[DAP_CHAIN_NET_SRV_UID_SIZE];
-#if DAP_CHAIN_NET_SRV_UID_SIZE == 8
+    #if DAP_CHAIN_NET_SRV_UID_SIZE == 8
     uint64_t raw_ui64[1];
 #elif DAP_CHAIN_NET_SRV_UID_SIZE == 16
     uint64_t raw_ui64[2];
     dap_uint128_t raw_ui128[1];
 #endif
-}  dap_chain_net_srv_uid_t;
-
+} dap_chain_net_srv_uid_t;
 
 //Classes of services
 enum {
@@ -27,12 +26,18 @@ enum {
     SERV_ID_VPN = 1,
 };
 
+//Units of service
+enum {
+    SERV_UNIT_MB = 1, // megabytes
+    SERV_UNIT_SEC = 2 // seconds
+};
+
 typedef struct dap_chain_net_srv_abstract
 {
-    uint64_t proposal_id; // id trade proposal. Must be unique to the node.
+    uint128_t proposal_id; // id trade proposal. Must be unique to the network
 
-    uint8_t class; //Class of service
-    uint8_t type_id; //Type of service
+    uint8_t class; //Class of service (once or permanent)
+    dap_chain_net_srv_uid_t type_id; //Type of service
     union {
         struct {
             int bandwith;
@@ -40,8 +45,8 @@ typedef struct dap_chain_net_srv_abstract
             int limit_bytes;
         } vpn;
         /*struct {
-            int value;
-        } another_srv;*/
+         int value;
+         } another_srv;*/
     } proposal_params;
 
     //size_t pub_key_data_size;
@@ -50,10 +55,18 @@ typedef struct dap_chain_net_srv_abstract
     uint64_t price; //  service price, for SERV_CLASS_ONCE ONCE for the whole service, for SERV_CLASS_PERMANENT  for one unit.
     uint8_t price_units; // Unit of service (seconds, megabytes, etc.) Only for SERV_CLASS_PERMANENT
     char decription[128];
-} DAP_ALIGN_PACKED dap_chain_net_srv_abstract_t;
+}DAP_ALIGN_PACKED dap_chain_net_srv_abstract_t;
+
+// Initialize dap_chain_net_srv_abstract_t structure
+void dap_chain_net_srv_abstract_set(dap_chain_net_srv_abstract_t *a_cond, uint8_t a_class, uint128_t a_type_id,
+        uint64_t a_price, uint8_t a_price_units, const char *a_decription);
+
+// copy a_value_dst to a_uid_src
+void dap_chain_net_srv_uid_set(dap_chain_net_srv_uid_t *a_uid_src, uint128_t a_value_dst);
 
 // generate new dap_chain_net_srv_uid_t
-bool dap_chain_net_srv_gen_uid(dap_chain_net_srv_uid_t *a_srv);
+bool dap_chain_net_srv_gen_uid(uint8_t *a_srv, size_t a_srv_size);
+
 
 uint64_t dap_chain_net_srv_client_auth(char *a_addr_base58, uint8_t *a_sign, size_t a_sign_size,
         const dap_chain_net_srv_abstract_t **a_cond_out);