diff --git a/dap_chain_net_srv.c b/dap_chain_net_srv.c
index 53c32b8a3494f9acd67196cd7e35aa9b74c10509..fc9b2f7e9015c9813b567a0b89bd284a33461a48 100755
--- a/dap_chain_net_srv.c
+++ b/dap_chain_net_srv.c
@@ -424,6 +424,43 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_cha
     return l_srv;
 }
 
+/**
+ * @brief dap_chain_net_srv_set_ch_callbacks
+ * @param a_uid
+ * @param a_callback_stream_ch_opened
+ * @param a_callback_stream_ch_read
+ * @param a_callback_stream_ch_write
+ * @param a_callback_stream_ch_closed
+ * @return
+ */
+int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, dap_chain_net_srv_callback_t a_callback_stream_ch_opened,
+                                       dap_chain_net_srv_callback_data_t a_callback_stream_ch_read,
+                                       dap_chain_net_srv_callback_data_t a_callback_stream_ch_write,
+                                       dap_chain_net_srv_callback_t a_callback_stream_ch_closed
+                                       )
+{
+    service_list_t *l_sdata = NULL;
+    int l_ret =0;
+    dap_chain_net_srv_t * l_srv = NULL;
+    dap_chain_net_srv_uid_t l_uid = {.uint64 = a_uid.uint64 }; // Copy to let then compiler to pass args via registers not stack
+
+    pthread_mutex_lock(&s_srv_list_mutex);
+    HASH_FIND(hh, s_srv_list, &l_uid, sizeof(l_uid), l_sdata);
+    if( l_sdata ) {
+        l_srv = l_sdata->srv;
+        l_srv->callback_stream_ch_opened = a_callback_stream_ch_opened;
+        l_srv->callback_stream_ch_read = a_callback_stream_ch_read;
+        l_srv->callback_stream_ch_read = a_callback_stream_ch_write;
+        l_srv->callback_stream_ch_closed = a_callback_stream_ch_closed;
+    }else{
+        log_it(L_ERROR, "Can't find service with 0x%016llX", a_uid.uint64);
+        l_ret= -1;
+    }
+    pthread_mutex_unlock(&s_srv_list_mutex);
+    return l_ret;
+}
+
+
 /**
  * @brief dap_chain_net_srv_del
  * @param a_srv
@@ -440,6 +477,52 @@ void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv)
     pthread_mutex_unlock(&s_srv_list_mutex);
 }
 
+/**
+ * @brief dap_chain_net_srv_call_write_all
+ * @param a_client
+ */
+void dap_chain_net_srv_call_write_all(dap_stream_ch_t * a_client)
+{
+    service_list_t *l_sdata, *l_sdata_tmp;
+    pthread_mutex_lock(&s_srv_list_mutex);
+    HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp)
+    {
+        if ( l_sdata->srv->callback_stream_ch_write)
+         l_sdata->srv->callback_stream_ch_write(l_sdata->srv, a_client);
+    }
+    pthread_mutex_unlock(&s_srv_list_mutex);
+}
+
+/**
+ * @brief dap_chain_net_srv_call_opened_all
+ * @param a_client
+ */
+void dap_chain_net_srv_call_opened_all(dap_stream_ch_t * a_client)
+{
+    service_list_t *l_sdata, *l_sdata_tmp;
+    pthread_mutex_lock(&s_srv_list_mutex);
+    HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp)
+    {
+        if ( l_sdata->srv->callback_stream_ch_opened)
+         l_sdata->srv->callback_stream_ch_opened(l_sdata->srv, a_client);
+    }
+    pthread_mutex_unlock(&s_srv_list_mutex);
+}
+
+void dap_chain_net_srv_call_closed_all(dap_stream_ch_t * a_client)
+{
+    service_list_t *l_sdata, *l_sdata_tmp;
+    pthread_mutex_lock(&s_srv_list_mutex);
+    HASH_ITER(hh, s_srv_list , l_sdata, l_sdata_tmp)
+    {
+        if ( l_sdata->srv->callback_stream_ch_closed)
+         l_sdata->srv->callback_stream_ch_closed(l_sdata->srv, a_client);
+    }
+    pthread_mutex_unlock(&s_srv_list_mutex);
+}
+
+
+
 /**
  * @brief dap_chain_net_srv_del_all
  * @param a_srv
diff --git a/dap_chain_net_srv.h b/dap_chain_net_srv.h
index 0f704288f7679717c05a4a0c6a424ba82fc842df..1d40d3916ccb4038b3543694cb682ab850802328 100755
--- a/dap_chain_net_srv.h
+++ b/dap_chain_net_srv.h
@@ -33,6 +33,7 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_t;
 
 typedef void (*dap_chain_net_srv_callback_t)(dap_chain_net_srv_t *, dap_chain_net_srv_client_t *);
 typedef int (*dap_chain_net_srv_callback_data_t)(dap_chain_net_srv_t *, uint32_t, dap_chain_net_srv_client_t *, const void *, size_t );
+typedef void (*dap_chain_net_srv_callback_ch_t)(dap_chain_net_srv_t *, dap_stream_ch_t *);
 
 typedef struct dap_chain_net_srv
 {
@@ -40,10 +41,26 @@ typedef struct dap_chain_net_srv
     dap_chain_net_srv_abstract_t srv_common;
     dap_chain_net_srv_price_t *pricelist;
     dap_chain_callback_trafic_t callback_trafic;
+
+    // Request for usage
     dap_chain_net_srv_callback_data_t callback_requested;
+
+    // Receipt first sign successfull
     dap_chain_net_srv_callback_data_t callback_receipt_first_success;
+
+    // Response error
     dap_chain_net_srv_callback_data_t callback_response_error;
+
+    // Receipt next sign succesfull
     dap_chain_net_srv_callback_data_t callback_receipt_next_success;
+
+    // Stream CH callbacks - channed opened,ready for read, ready for write and closed
+    dap_chain_net_srv_callback_ch_t      callback_stream_ch_opened;
+    dap_chain_net_srv_callback_data_t callback_stream_ch_read;
+    dap_chain_net_srv_callback_ch_t callback_stream_ch_write;
+    dap_chain_net_srv_callback_ch_t      callback_stream_ch_closed;
+
+    // Pointer to inheritor object
     void * _inhertor;
 } dap_chain_net_srv_t;
 typedef void (*dap_chain_net_srv_callback_new_t)(dap_chain_net_srv_t *, dap_config_t *);
@@ -56,8 +73,20 @@ dap_chain_net_srv_t* dap_chain_net_srv_add(dap_chain_net_srv_uid_t a_uid,dap_cha
                                            dap_chain_net_srv_callback_data_t a_callback_response_error,
                                            dap_chain_net_srv_callback_data_t a_callback_receipt_next_success
                                            );
+
+int dap_chain_net_srv_set_ch_callbacks(dap_chain_net_srv_uid_t a_uid, dap_chain_net_srv_callback_t a_callback_stream_ch_opened,
+                                       dap_chain_net_srv_callback_data_t a_callback_stream_ch_read,
+                                       dap_chain_net_srv_callback_t a_callback_stream_ch_write,
+                                       dap_chain_net_srv_callback_t a_callback_stream_ch_closed
+                                       );
+
 void dap_chain_net_srv_del(dap_chain_net_srv_t * a_srv);
 void dap_chain_net_srv_del_all(void);
+
+void dap_chain_net_srv_call_write_all(dap_stream_ch_t * a_client);
+void dap_chain_net_srv_call_closed_all(dap_stream_ch_t * a_client);
+void dap_chain_net_srv_call_opened_all(dap_stream_ch_t * a_client);
+
 dap_chain_net_srv_t * dap_chain_net_srv_get(dap_chain_net_srv_uid_t a_uid);
 size_t dap_chain_net_srv_count(void);
 const dap_chain_net_srv_uid_t * dap_chain_net_srv_list(void);
diff --git a/dap_chain_net_srv_common.h b/dap_chain_net_srv_common.h
index b20a471bddaae7a0e35ced4cea6bcf69e70fa06d..3a41ae4602d2ab0047b38c1d3bbfd8ab96a6dbcc 100755
--- a/dap_chain_net_srv_common.h
+++ b/dap_chain_net_srv_common.h
@@ -95,11 +95,13 @@ typedef struct dap_chain_net_srv_price
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST                  0x10
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_RESPONSE                 0x11
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_NOTIFY_STOPPED                0x20
+#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_DATA                          0x30
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_SUCCESS              0xf0
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR                0xff
 
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNDEFINED                  0x00000000
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_NOT_FOUND          0x00000100
+#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_SERVICE_CH_NOT_FOUND       0x00000101
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NOT_FOUND          0x00000200
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER          0x00000201
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_USAGE_CANT_ADD             0x00000300
@@ -111,8 +113,8 @@ typedef struct dap_chain_net_srv_price
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SIZE         0x00000405
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_CANT_FIND          0x00000500
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_NO_SIGN            0x00000501
+#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_WRONG_PKEY_HASH    0x00000502
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND            0x00000600
-#define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_RECEIPT_WRONG_PKEY_HASH         0x00000502
 
 #define DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_UNKNOWN                    0xffffffff
 // TYPE_REQUEST
@@ -128,6 +130,18 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_request{
     uint8_t data[];
 } DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_request_t;
 
+// Custom service data packet
+typedef struct dap_stream_ch_chain_net_srv_pkt_data_hdr{
+    dap_chain_net_srv_uid_t srv_uid;
+    uint32_t usage_id;
+} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_hdr_t;
+
+typedef struct dap_stream_ch_chain_net_srv_pkt_data{
+    dap_stream_ch_chain_net_srv_pkt_data_hdr_t hdr;
+    uint8_t data[];
+} DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_data_t;
+
+
 typedef struct dap_stream_ch_chain_net_srv_pkt_success_hdr{
     uint32_t usage_id;
     dap_chain_net_id_t net_id;