diff --git a/dap_chain_net_srv_vpn.c b/dap_chain_net_srv_vpn.c
index 873cd02d798057416bc2a4ea0fc1344632a66112..80c776a5b60f4ad302dbac7233bc903cd6ecd422 100755
--- a/dap_chain_net_srv_vpn.c
+++ b/dap_chain_net_srv_vpn.c
@@ -63,6 +63,7 @@
 
 #include "dap_chain_net.h"
 #include "dap_chain_net_srv_vpn.h"
+#include "dap_chain_net_vpn_client.h"
 #include "dap_chain_ledger.h"
 
 #define LOG_TAG "dap_chain_net_srv_vpn"
@@ -142,7 +143,7 @@ int dap_chain_net_srv_vpn_init(dap_config_t * g_config)
         pthread_cond_init(&s_sf_socks_cond, NULL);
         pthread_create(&srv_sf_socks_raw_pid, NULL, srv_ch_sf_thread_raw, NULL);
         pthread_create(&srv_sf_socks_pid, NULL, srv_ch_sf_thread, NULL);
-        dap_stream_ch_proc_add(SERVICE_CHANNEL_ID, s_new, srv_ch_sf_delete, srv_ch_sf_packet_in,
+        dap_stream_ch_proc_add(DAP_STREAM_CH_ID_NET_SRV_VPN, s_new, srv_ch_sf_delete, srv_ch_sf_packet_in,
                 srv_ch_sf_packet_out);
         return 0;
     }
@@ -400,140 +401,176 @@ void srv_ch_sf_packet_in(dap_stream_ch_t* ch, void* arg)
 {
     dap_stream_ch_pkt_t * pkt = (dap_stream_ch_pkt_t *) arg;
 
-    static bool client_connected = false;
-    ch_vpn_pkt_t * sf_pkt = (ch_vpn_pkt_t *) pkt->data;
+    if ( pkt->hdr.type == DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_CLIENT )
+        dap_chain_net_vpn_client_pkt_in( ch, pkt);
+    else {
+        static bool client_connected = false;
+        ch_vpn_pkt_t * sf_pkt = (ch_vpn_pkt_t *) pkt->data;
 
-    int remote_sock_id = sf_pkt->header.sock_id;
+        int remote_sock_id = sf_pkt->header.sock_id;
 
-    //log_it(L_DEBUG, "Got SF packet with id %d op_code 0x%02x", remote_sock_id, sf_pkt->header.op_code);
-    if(sf_pkt->header.op_code >= 0xb0) { // Raw packets
-        switch (sf_pkt->header.op_code) {
-        case VPN_PACKET_OP_CODE_VPN_ADDR_REQUEST: { // Client request after L3 connection the new IP address
-            log_it(L_DEBUG, "Got SF packet with id %d op_code 0x%02x", remote_sock_id, sf_pkt->header.op_code);
-            struct in_addr n_addr = { 0 };
+        //log_it(L_DEBUG, "Got SF packet with id %d op_code 0x%02x", remote_sock_id, sf_pkt->header.op_code);
+        if(sf_pkt->header.op_code >= 0xb0) { // Raw packets
+            switch (sf_pkt->header.op_code) {
+            case VPN_PACKET_OP_CODE_VPN_ADDR_REQUEST: { // Client request after L3 connection the new IP address
+                log_it(L_DEBUG, "Got SF packet with id %d op_code 0x%02x", remote_sock_id, sf_pkt->header.op_code);
+                struct in_addr n_addr = { 0 };
 
-            if(n_addr.s_addr == 0) { // If the addres still in the network
+                if(n_addr.s_addr == 0) { // If the addres still in the network
 
-                pthread_mutex_lock(&s_raw_server->clients_mutex);
+                    pthread_mutex_lock(&s_raw_server->clients_mutex);
+
+                    int count_free_addr = -1;
+                    list_addr_element *el;
+                    LL_COUNT(list_addr_head, el, count_free_addr);
+
+                    dap_stream_ch_vpn_remote_single_t * n_client = (dap_stream_ch_vpn_remote_single_t*) calloc(1,
+                            sizeof(dap_stream_ch_vpn_remote_single_t));
+                    n_client->ch = ch;
+
+                    if(count_free_addr > 0) {
+                        n_addr.s_addr = list_addr_head->addr.s_addr;
+                        LL_DELETE(list_addr_head, list_addr_head);
+                    }
+                    else
+                    {
+                        n_addr.s_addr = ntohl(s_raw_server->client_addr_last.s_addr);
+                        n_addr.s_addr++;
+                        n_addr.s_addr = ntohl(n_addr.s_addr);
+                    }
 
-                int count_free_addr = -1;
-                list_addr_element *el;
-                LL_COUNT(list_addr_head, el, count_free_addr);
+                    n_client->addr = n_addr.s_addr;
+                    s_raw_server->client_addr_last.s_addr = n_addr.s_addr;
+                    ch->stream->session->tun_client_addr.s_addr = n_addr.s_addr;
+                    HASH_ADD_INT(s_raw_server->clients, addr, n_client);
 
-                dap_stream_ch_vpn_remote_single_t * n_client = (dap_stream_ch_vpn_remote_single_t*) calloc(1,
-                        sizeof(dap_stream_ch_vpn_remote_single_t));
-                n_client->ch = ch;
+                    pthread_mutex_unlock(&s_raw_server->clients_mutex);
 
-                if(count_free_addr > 0) {
-                    n_addr.s_addr = list_addr_head->addr.s_addr;
-                    LL_DELETE(list_addr_head, list_addr_head);
+                    log_it(L_NOTICE, "VPN client address %s leased", inet_ntoa(n_addr));
+                    log_it(L_INFO, "\tgateway %s", inet_ntoa(s_raw_server->client_addr_host));
+                    log_it(L_INFO, "\tmask %s", inet_ntoa(s_raw_server->client_addr_mask));
+                    log_it(L_INFO, "\taddr %s", inet_ntoa(s_raw_server->client_addr));
+                    log_it(L_INFO, "\tlast_addr %s", inet_ntoa(s_raw_server->client_addr_last));
+
+                    ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1,
+                            sizeof(pkt_out->header) + sizeof(n_addr) + sizeof(s_raw_server->client_addr_host));
+                    pkt_out->header.sock_id = s_raw_server->tun_fd;
+                    pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
+                    pkt_out->header.op_data.data_size = sizeof(n_addr) + sizeof(s_raw_server->client_addr_host);
+
+                    memcpy(pkt_out->data, &n_addr, sizeof(n_addr));
+                    memcpy(pkt_out->data + sizeof(n_addr), &s_raw_server->client_addr_host,
+                            sizeof(s_raw_server->client_addr_host));
+                    dap_stream_ch_pkt_write(ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out,
+                            pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
+                    stream_sf_socket_ready_to_write(ch, true);
+
+                    //ch_sf_raw_write(n_addr.s_addr,STREAM_SF_PACKET_OP_CODE_RAW_L3_ADDR_REPLY,&n_addr,sizeof(n_addr));
+                } else { // All the network is filled with clients, can't lease a new address
+                    log_it(L_WARNING, "All the network is filled with clients, can't lease a new address");
+                    ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
+                    pkt_out->header.sock_id = s_raw_server->tun_fd;
+                    pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM;
+                    pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_NO_FREE_ADDR;
+                    dap_stream_ch_pkt_write(ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out,
+                            pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
+                    stream_sf_socket_ready_to_write(ch, true);
                 }
-                else
-                {
-                    n_addr.s_addr = ntohl(s_raw_server->client_addr_last.s_addr);
-                    n_addr.s_addr++;
-                    n_addr.s_addr = ntohl(n_addr.s_addr);
+            }
+                break;
+            case VPN_PACKET_OP_CODE_VPN_SEND: {
+                struct in_addr in_saddr, in_daddr;
+                in_saddr.s_addr = ((struct iphdr*) sf_pkt->data)->saddr;
+                in_daddr.s_addr = ((struct iphdr*) sf_pkt->data)->daddr;
+
+                char str_daddr[42], str_saddr[42];
+                strncpy(str_saddr, inet_ntoa(in_saddr), sizeof(str_saddr));
+                strncpy(str_daddr, inet_ntoa(in_daddr), sizeof(str_daddr));
+                int ret;
+                //if( ch_sf_raw_write(STREAM_SF_PACKET_OP_CODE_RAW_SEND, sf_pkt->data, sf_pkt->op_data.data_size)<0){
+                struct sockaddr_in sin = { 0 };
+                sin.sin_family = AF_INET;
+                sin.sin_port = 0;
+                sin.sin_addr.s_addr = in_daddr.s_addr;
+
+                //if((ret=sendto(CH_SF(ch)->raw_l3_sock , sf_pkt->data,sf_pkt->header.op_data.data_size,0,(struct sockaddr *) &sin, sizeof (sin)))<0){
+                if((ret = write(s_raw_server->tun_fd, sf_pkt->data, sf_pkt->header.op_data.data_size)) < 0) {
+                    log_it(L_ERROR, "write() returned error %d : '%s'", ret, strerror(errno));
+                    //log_it(L_ERROR,"raw socket ring buffer overflowed");
+                    ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
+                    pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM;
+                    pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_PACKET_LOST;
+                    pkt_out->header.sock_id = s_raw_server->tun_fd;
+                    dap_stream_ch_pkt_write(ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out,
+                            pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
+                    stream_sf_socket_ready_to_write(ch, true);
+                } else {
+                    //log_it(L_DEBUG, "Raw IP packet daddr:%s saddr:%s  %u from %d bytes sent to tun/tap interface",
+                    //        str_saddr, str_daddr, sf_pkt->header.op_data.data_size, ret);
+                    //log_it(L_DEBUG, "Raw IP sent %u bytes ", ret);
                 }
-
-                n_client->addr = n_addr.s_addr;
-                s_raw_server->client_addr_last.s_addr = n_addr.s_addr;
-                ch->stream->session->tun_client_addr.s_addr = n_addr.s_addr;
-                HASH_ADD_INT(s_raw_server->clients, addr, n_client);
-
-                pthread_mutex_unlock(&s_raw_server->clients_mutex);
-
-                log_it(L_NOTICE, "VPN client address %s leased", inet_ntoa(n_addr));
-                log_it(L_INFO, "\tgateway %s", inet_ntoa(s_raw_server->client_addr_host));
-                log_it(L_INFO, "\tmask %s", inet_ntoa(s_raw_server->client_addr_mask));
-                log_it(L_INFO, "\taddr %s", inet_ntoa(s_raw_server->client_addr));
-                log_it(L_INFO, "\tlast_addr %s", inet_ntoa(s_raw_server->client_addr_last));
-
-                ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1,
-                        sizeof(pkt_out->header) + sizeof(n_addr) + sizeof(s_raw_server->client_addr_host));
-                pkt_out->header.sock_id = s_raw_server->tun_fd;
-                pkt_out->header.op_code = VPN_PACKET_OP_CODE_VPN_ADDR_REPLY;
-                pkt_out->header.op_data.data_size = sizeof(n_addr) + sizeof(s_raw_server->client_addr_host);
-                memcpy(pkt_out->data, &n_addr, sizeof(n_addr));
-                memcpy(pkt_out->data + sizeof(n_addr), &s_raw_server->client_addr_host,
-                        sizeof(s_raw_server->client_addr_host));
-                dap_stream_ch_pkt_write(ch, DATA_CHANNEL_ID, pkt_out,
-                        pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
-                stream_sf_socket_ready_to_write(ch, true);
-
-                //ch_sf_raw_write(n_addr.s_addr,STREAM_SF_PACKET_OP_CODE_RAW_L3_ADDR_REPLY,&n_addr,sizeof(n_addr));
-            } else { // All the network is filled with clients, can't lease a new address
-                log_it(L_WARNING, "All the network is filled with clients, can't lease a new address");
-                ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
-                pkt_out->header.sock_id = s_raw_server->tun_fd;
-                pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM;
-                pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_NO_FREE_ADDR;
-                dap_stream_ch_pkt_write(ch, DATA_CHANNEL_ID, pkt_out,
-                        pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
-                stream_sf_socket_ready_to_write(ch, true);
+                //}
             }
-        }
-            break;
-        case VPN_PACKET_OP_CODE_VPN_SEND: {
-            struct in_addr in_saddr, in_daddr;
-            in_saddr.s_addr = ((struct iphdr*) sf_pkt->data)->saddr;
-            in_daddr.s_addr = ((struct iphdr*) sf_pkt->data)->daddr;
-
-            char str_daddr[42], str_saddr[42];
-            strncpy(str_saddr, inet_ntoa(in_saddr), sizeof(str_saddr));
-            strncpy(str_daddr, inet_ntoa(in_daddr), sizeof(str_daddr));
-            int ret;
-            //if( ch_sf_raw_write(STREAM_SF_PACKET_OP_CODE_RAW_SEND, sf_pkt->data, sf_pkt->op_data.data_size)<0){
-            struct sockaddr_in sin = { 0 };
-            sin.sin_family = AF_INET;
-            sin.sin_port = 0;
-            sin.sin_addr.s_addr = in_daddr.s_addr;
-
-            //if((ret=sendto(CH_SF(ch)->raw_l3_sock , sf_pkt->data,sf_pkt->header.op_data.data_size,0,(struct sockaddr *) &sin, sizeof (sin)))<0){
-            if((ret = write(s_raw_server->tun_fd, sf_pkt->data, sf_pkt->header.op_data.data_size)) < 0) {
-                log_it(L_ERROR, "write() returned error %d : '%s'", ret, strerror(errno));
-                //log_it(L_ERROR,"raw socket ring buffer overflowed");
-                ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
-                pkt_out->header.op_code = VPN_PACKET_OP_CODE_PROBLEM;
-                pkt_out->header.op_problem.code = VPN_PROBLEM_CODE_PACKET_LOST;
-                pkt_out->header.sock_id = s_raw_server->tun_fd;
-                dap_stream_ch_pkt_write(ch, DATA_CHANNEL_ID, pkt_out,
-                        pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
-                stream_sf_socket_ready_to_write(ch, true);
-            } else {
-                //log_it(L_DEBUG, "Raw IP packet daddr:%s saddr:%s  %u from %d bytes sent to tun/tap interface",
-                //        str_saddr, str_daddr, sf_pkt->header.op_data.data_size, ret);
-                //log_it(L_DEBUG, "Raw IP sent %u bytes ", ret);
+                break;
+            default:
+                log_it(L_WARNING, "Can't process SF type 0x%02x", sf_pkt->header.op_code);
             }
-            //}
-        }
-            break;
-        default:
-            log_it(L_WARNING, "Can't process SF type 0x%02x", sf_pkt->header.op_code);
-        }
-    } else { // All except CONNECT
-        ch_vpn_socket_proxy_t * sf_sock = NULL;
-        if(sf_pkt->header.op_code != VPN_PACKET_OP_CODE_CONNECT) {
+        } else { // All except CONNECT
+            ch_vpn_socket_proxy_t * sf_sock = NULL;
+            if(sf_pkt->header.op_code != VPN_PACKET_OP_CODE_CONNECT) {
+
+                pthread_mutex_lock(&( CH_VPN(ch)->mutex));
+                //      log_it(L_DEBUG,"Looking in hash table with %d",remote_sock_id);
+                HASH_FIND_INT((CH_VPN(ch)->socks), &remote_sock_id, sf_sock);
+                pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
+
+                if(sf_sock != NULL) {
+                    pthread_mutex_lock(&sf_sock->mutex); // Unlock it in your case as soon as possible to reduce lock time
+                    sf_sock->time_lastused = time(NULL);
+                    switch (sf_pkt->header.op_code) {
+                    case VPN_PACKET_OP_CODE_SEND: {
+                        if(client_connected == false)
+                        {
+                            log_it(L_WARNING, "Drop Packet! User not connected!"); // Client need send
+                            pthread_mutex_unlock(&s_sf_socks_mutex);
+                            break;
+                        }
+                        int ret;
+                        if((ret = send(sf_sock->sock, sf_pkt->data, sf_pkt->header.op_data.data_size, 0)) < 0) {
+                            log_it(L_INFO, "Disconnected from the remote host");
+                            pthread_mutex_unlock(&sf_sock->mutex);
+                            pthread_mutex_lock(&( CH_VPN(ch)->mutex));
+                            HASH_DEL(CH_VPN(ch)->socks, sf_sock);
+                            pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
 
-            pthread_mutex_lock(&( CH_VPN(ch)->mutex));
-            //      log_it(L_DEBUG,"Looking in hash table with %d",remote_sock_id);
-            HASH_FIND_INT((CH_VPN(ch)->socks), &remote_sock_id, sf_sock);
-            pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
+                            pthread_mutex_lock(&s_sf_socks_mutex);
+                            HASH_DELETE(hh2, sf_socks, sf_sock);
+                            HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
 
-            if(sf_sock != NULL) {
-                pthread_mutex_lock(&sf_sock->mutex); // Unlock it in your case as soon as possible to reduce lock time
-                sf_sock->time_lastused = time(NULL);
-                switch (sf_pkt->header.op_code) {
-                case VPN_PACKET_OP_CODE_SEND: {
-                    if(client_connected == false)
-                    {
-                        log_it(L_WARNING, "Drop Packet! User not connected!"); // Client need send
-                        pthread_mutex_unlock(&s_sf_socks_mutex);
-                        break;
+                            struct epoll_event ev;
+                            ev.data.fd = sf_sock->sock;
+                            ev.events = EPOLLIN;
+                            if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
+                                log_it(L_ERROR, "Can't remove sock_id %d from the epoll fd", remote_sock_id);
+                                //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=0x%02x result=-2",sf_pkt->sock_id, sf_pkt->op_code);
+                            } else {
+                                log_it(L_NOTICE, "Removed sock_id %d from the the epoll fd", remote_sock_id);
+                                //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=0x%02x result=0",sf_pkt->sock_id, sf_pkt->op_code);
+                            }
+                            pthread_mutex_unlock(&s_sf_socks_mutex);
+
+                            stream_sf_socket_delete(sf_sock);
+                        } else {
+                            sf_sock->bytes_sent += ret;
+                            pthread_mutex_unlock(&sf_sock->mutex);
+                        }
+                        //log_it(L_INFO, "Send action from %d sock_id (sf_packet size %lu,  ch packet size %lu, have sent %d)"
+                        //        , sf_sock->id, sf_pkt->header.op_data.data_size, pkt->hdr.size, ret);
                     }
-                    int ret;
-                    if((ret = send(sf_sock->sock, sf_pkt->data, sf_pkt->header.op_data.data_size, 0)) < 0) {
-                        log_it(L_INFO, "Disconnected from the remote host");
-                        pthread_mutex_unlock(&sf_sock->mutex);
+                        break;
+                    case VPN_PACKET_OP_CODE_DISCONNECT: {
+                        log_it(L_INFO, "Disconnect action from %d sock_id", sf_sock->id);
+
                         pthread_mutex_lock(&( CH_VPN(ch)->mutex));
                         HASH_DEL(CH_VPN(ch)->socks, sf_sock);
                         pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
@@ -541,139 +578,108 @@ void srv_ch_sf_packet_in(dap_stream_ch_t* ch, void* arg)
                         pthread_mutex_lock(&s_sf_socks_mutex);
                         HASH_DELETE(hh2, sf_socks, sf_sock);
                         HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
-
                         struct epoll_event ev;
                         ev.data.fd = sf_sock->sock;
                         ev.events = EPOLLIN;
                         if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
-                            log_it(L_ERROR, "Can't remove sock_id %d from the epoll fd", remote_sock_id);
-                            //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=0x%02x result=-2",sf_pkt->sock_id, sf_pkt->op_code);
+                            log_it(L_ERROR, "Can't remove sock_id %d to the epoll fd", remote_sock_id);
+                            //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=%uc result=-2",sf_pkt->sock_id, sf_pkt->op_code);
                         } else {
-                            log_it(L_NOTICE, "Removed sock_id %d from the the epoll fd", remote_sock_id);
-                            //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=0x%02x result=0",sf_pkt->sock_id, sf_pkt->op_code);
+                            log_it(L_NOTICE, "Removed sock_id %d from the epoll fd", remote_sock_id);
+                            //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=%uc result=0",sf_pkt->sock_id, sf_pkt->op_code);
                         }
                         pthread_mutex_unlock(&s_sf_socks_mutex);
 
+                        pthread_mutex_unlock(&sf_sock->mutex);
                         stream_sf_socket_delete(sf_sock);
-                    } else {
-                        sf_sock->bytes_sent += ret;
+                    }
+                        break;
+                    default: {
+                        log_it(L_WARNING, "Unprocessed op code 0x%02x", sf_pkt->header.op_code);
                         pthread_mutex_unlock(&sf_sock->mutex);
                     }
-                    //log_it(L_INFO, "Send action from %d sock_id (sf_packet size %lu,  ch packet size %lu, have sent %d)"
-                    //        , sf_sock->id, sf_pkt->header.op_data.data_size, pkt->hdr.size, ret);
-                }
-                    break;
-                case VPN_PACKET_OP_CODE_DISCONNECT: {
-                    log_it(L_INFO, "Disconnect action from %d sock_id", sf_sock->id);
-
-                    pthread_mutex_lock(&( CH_VPN(ch)->mutex));
-                    HASH_DEL(CH_VPN(ch)->socks, sf_sock);
-                    pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
-
-                    pthread_mutex_lock(&s_sf_socks_mutex);
-                    HASH_DELETE(hh2, sf_socks, sf_sock);
-                    HASH_DELETE(hh_sock, sf_socks_client, sf_sock);
-                    struct epoll_event ev;
-                    ev.data.fd = sf_sock->sock;
-                    ev.events = EPOLLIN;
-                    if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_DEL, sf_sock->sock, &ev) < 0) {
-                        log_it(L_ERROR, "Can't remove sock_id %d to the epoll fd", remote_sock_id);
-                        //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=%uc result=-2",sf_pkt->sock_id, sf_pkt->op_code);
-                    } else {
-                        log_it(L_NOTICE, "Removed sock_id %d from the epoll fd", remote_sock_id);
-                        //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=%uc result=0",sf_pkt->sock_id, sf_pkt->op_code);
                     }
-                    pthread_mutex_unlock(&s_sf_socks_mutex);
-
-                    pthread_mutex_unlock(&sf_sock->mutex);
-                    stream_sf_socket_delete(sf_sock);
-                }
-                    break;
-                default: {
-                    log_it(L_WARNING, "Unprocessed op code 0x%02x", sf_pkt->header.op_code);
-                    pthread_mutex_unlock(&sf_sock->mutex);
-                }
-                }
-            } //else
-              //  log_it(L_WARNING, "Packet input: packet with sock_id %d thats not present in current stream channel",
-              //          remote_sock_id);
-        } else {
-            HASH_FIND_INT(CH_VPN(ch)->socks, &remote_sock_id, sf_sock);
-            if(sf_sock) {
-                log_it(L_WARNING, "Socket id %d is already used, take another number for socket id", remote_sock_id);
-            } else { // Connect action
-                struct sockaddr_in remote_addr;
-                char addr_str[1024];
-                size_t addr_str_size =
-                        (sf_pkt->header.op_connect.addr_size > (sizeof(addr_str) - 1)) ?
-                                (sizeof(addr_str) - 1) :
-                                sf_pkt->header.op_connect.addr_size;
-                memset(&remote_addr, 0, sizeof(remote_addr));
-                remote_addr.sin_family = AF_INET;
-                remote_addr.sin_port = htons(sf_pkt->header.op_connect.port);
-
-                memcpy(addr_str, sf_pkt->data, addr_str_size);
-                addr_str[addr_str_size] = 0;
-
-                log_it(L_DEBUG, "Connect action to %s:%u (addr_size %lu)", addr_str, sf_pkt->header.op_connect.port,
-                        sf_pkt->header.op_connect.addr_size);
-                if(inet_pton(AF_INET, addr_str, &(remote_addr.sin_addr)) < 0) {
-                    log_it(L_ERROR, "Wrong remote address '%s:%u'", addr_str, sf_pkt->header.op_connect.port);
-                } else {
-                    int s;
-                    if((s = socket(AF_INET, SOCK_STREAM, 0)) >= 0) {
-                        log_it(L_DEBUG, "Socket is created (%d)", s);
-                        if(connect(s, (struct sockaddr *) &remote_addr, sizeof(remote_addr)) >= 0) {
-                            fcntl(s, F_SETFL, O_NONBLOCK);
-                            log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", addr_str,
-                                    sf_pkt->header.op_connect.port, remote_sock_id);
-                            ch_vpn_socket_proxy_t * sf_sock = NULL;
-                            sf_sock = DAP_NEW_Z(ch_vpn_socket_proxy_t);
-                            sf_sock->id = remote_sock_id;
-                            sf_sock->sock = s;
-                            sf_sock->ch = ch;
-                            pthread_mutex_init(&sf_sock->mutex, NULL);
-
-                            pthread_mutex_lock(&s_sf_socks_mutex);
-                            pthread_mutex_lock(&( CH_VPN(ch)->mutex));
-                            HASH_ADD_INT(CH_VPN(ch)->socks, id, sf_sock);
-                            log_it(L_DEBUG, "Added %d sock_id with sock %d to the hash table", sf_sock->id,
-                                    sf_sock->sock);
-                            HASH_ADD(hh2, sf_socks, id, sizeof(sf_sock->id), sf_sock);
-                            log_it(L_DEBUG, "Added %d sock_id with sock %d to the hash table", sf_sock->id,
-                                    sf_sock->sock);
-                            HASH_ADD(hh_sock, sf_socks_client, sock, sizeof(int), sf_sock);
-                            //log_it(L_DEBUG,"Added %d sock_id with sock %d to the socks hash table",sf->id,sf->sock);
-                            pthread_mutex_unlock(&s_sf_socks_mutex);
-                            pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
-
-                            struct epoll_event ev;
-                            ev.data.fd = s;
-                            ev.events = EPOLLIN | EPOLLERR;
-
-                            if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_ADD, s, &ev) == -1) {
-                                log_it(L_ERROR, "Can't add sock_id %d to the epoll fd", remote_sock_id);
-                                //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=%uc result=-2",sf_pkt->sock_id, sf_pkt->op_code);
+                } //else
+                  //  log_it(L_WARNING, "Packet input: packet with sock_id %d thats not present in current stream channel",
+                  //          remote_sock_id);
+            } else {
+                HASH_FIND_INT(CH_VPN(ch)->socks, &remote_sock_id, sf_sock);
+                if(sf_sock) {
+                    log_it(L_WARNING, "Socket id %d is already used, take another number for socket id", remote_sock_id);
+                } else { // Connect action
+                    struct sockaddr_in remote_addr;
+                    char addr_str[1024];
+                    size_t addr_str_size =
+                            (sf_pkt->header.op_connect.addr_size > (sizeof(addr_str) - 1)) ?
+                                    (sizeof(addr_str) - 1) :
+                                    sf_pkt->header.op_connect.addr_size;
+                    memset(&remote_addr, 0, sizeof(remote_addr));
+                    remote_addr.sin_family = AF_INET;
+                    remote_addr.sin_port = htons(sf_pkt->header.op_connect.port);
+
+                    memcpy(addr_str, sf_pkt->data, addr_str_size);
+                    addr_str[addr_str_size] = 0;
+
+                    log_it(L_DEBUG, "Connect action to %s:%u (addr_size %lu)", addr_str, sf_pkt->header.op_connect.port,
+                            sf_pkt->header.op_connect.addr_size);
+                    if(inet_pton(AF_INET, addr_str, &(remote_addr.sin_addr)) < 0) {
+                        log_it(L_ERROR, "Wrong remote address '%s:%u'", addr_str, sf_pkt->header.op_connect.port);
+                    } else {
+                        int s;
+                        if((s = socket(AF_INET, SOCK_STREAM, 0)) >= 0) {
+                            log_it(L_DEBUG, "Socket is created (%d)", s);
+                            if(connect(s, (struct sockaddr *) &remote_addr, sizeof(remote_addr)) >= 0) {
+                                fcntl(s, F_SETFL, O_NONBLOCK);
+                                log_it(L_INFO, "Remote address connected (%s:%u) with sock_id %d", addr_str,
+                                        sf_pkt->header.op_connect.port, remote_sock_id);
+                                ch_vpn_socket_proxy_t * sf_sock = NULL;
+                                sf_sock = DAP_NEW_Z(ch_vpn_socket_proxy_t);
+                                sf_sock->id = remote_sock_id;
+                                sf_sock->sock = s;
+                                sf_sock->ch = ch;
+                                pthread_mutex_init(&sf_sock->mutex, NULL);
+
+                                pthread_mutex_lock(&s_sf_socks_mutex);
+                                pthread_mutex_lock(&( CH_VPN(ch)->mutex));
+                                HASH_ADD_INT(CH_VPN(ch)->socks, id, sf_sock);
+                                log_it(L_DEBUG, "Added %d sock_id with sock %d to the hash table", sf_sock->id,
+                                        sf_sock->sock);
+                                HASH_ADD(hh2, sf_socks, id, sizeof(sf_sock->id), sf_sock);
+                                log_it(L_DEBUG, "Added %d sock_id with sock %d to the hash table", sf_sock->id,
+                                        sf_sock->sock);
+                                HASH_ADD(hh_sock, sf_socks_client, sock, sizeof(int), sf_sock);
+                                //log_it(L_DEBUG,"Added %d sock_id with sock %d to the socks hash table",sf->id,sf->sock);
+                                pthread_mutex_unlock(&s_sf_socks_mutex);
+                                pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
+
+                                struct epoll_event ev;
+                                ev.data.fd = s;
+                                ev.events = EPOLLIN | EPOLLERR;
+
+                                if(epoll_ctl(sf_socks_epoll_fd, EPOLL_CTL_ADD, s, &ev) == -1) {
+                                    log_it(L_ERROR, "Can't add sock_id %d to the epoll fd", remote_sock_id);
+                                    //stream_ch_pkt_write_f(ch,'i',"sock_id=%d op_code=%uc result=-2",sf_pkt->sock_id, sf_pkt->op_code);
+                                } else {
+                                    log_it(L_NOTICE, "Added sock_id %d  with sock %d to the epoll fd", remote_sock_id, s);
+                                    log_it(L_NOTICE, "Send Connected packet to User");
+                                    ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
+                                    pkt_out->header.sock_id = remote_sock_id;
+                                    pkt_out->header.op_code = VPN_PACKET_OP_CODE_CONNECTED;
+                                    dap_stream_ch_pkt_write(ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_CLIENT, pkt_out,
+                                            pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
+                                    free(pkt_out);
+                                    client_connected = true;
+                                }
+                                stream_sf_socket_ready_to_write(ch, true);
                             } else {
-                                log_it(L_NOTICE, "Added sock_id %d  with sock %d to the epoll fd", remote_sock_id, s);
-                                log_it(L_NOTICE, "Send Connected packet to User");
-                                ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header));
-                                pkt_out->header.sock_id = remote_sock_id;
-                                pkt_out->header.op_code = VPN_PACKET_OP_CODE_CONNECTED;
-                                dap_stream_ch_pkt_write(ch, SERVICE_CHANNEL_ID, pkt_out,
-                                        pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
-                                free(pkt_out);
-                                client_connected = true;
+                                log_it(L_INFO, "Can't connect to the remote server %s", addr_str);
+                                dap_stream_ch_pkt_write_f(ch, 'i', "sock_id=%d op_code=%c result=-1",
+                                        sf_pkt->header.sock_id, sf_pkt->header.op_code);
+                                stream_sf_socket_ready_to_write(ch, true);
                             }
-                            stream_sf_socket_ready_to_write(ch, true);
                         } else {
-                            log_it(L_INFO, "Can't connect to the remote server %s", addr_str);
-                            dap_stream_ch_pkt_write_f(ch, 'i', "sock_id=%d op_code=%c result=-1",
-                                    sf_pkt->header.sock_id, sf_pkt->header.op_code);
-                            stream_sf_socket_ready_to_write(ch, true);
+                            log_it(L_ERROR, "Can't create the socket");
                         }
-                    } else {
-                        log_it(L_ERROR, "Can't create the socket");
                     }
                 }
             }
@@ -871,7 +877,7 @@ void* srv_ch_sf_thread_raw(void *arg)
                         pkt_out->header.sock_id = s_raw_server->tun_fd;
                         pkt_out->header.op_data.data_size = read_ret;
                         memcpy(pkt_out->data, tmp_buf, read_ret);
-                        dap_stream_ch_pkt_write(raw_client->ch, DATA_CHANNEL_ID, pkt_out,
+                        dap_stream_ch_pkt_write(raw_client->ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out,
                                 pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
                         stream_sf_socket_ready_to_write(raw_client->ch, true);
                     }
@@ -912,7 +918,7 @@ void srv_ch_sf_packet_out(dap_stream_ch_t* ch, void* arg)
             for(i = 0; i < cur->pkt_out_size; i++) {
                 ch_vpn_pkt_t * pout = cur->pkt_out[i];
                 if(pout) {
-                    if(dap_stream_ch_pkt_write(ch, DATA_CHANNEL_ID, pout,
+                    if(dap_stream_ch_pkt_write(ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pout,
                             pout->header.op_data.data_size + sizeof(pout->header))) {
                         isSmthOut = true;
                         free(pout);
diff --git a/dap_chain_net_srv_vpn.h b/dap_chain_net_srv_vpn.h
index 477455f1688990c23f4be5e9b5e82a3e91f62fbd..115faaaec4390e2a22d93591ef4871189c2feac8 100755
--- a/dap_chain_net_srv_vpn.h
+++ b/dap_chain_net_srv_vpn.h
@@ -28,6 +28,12 @@
 #include "dap_config.h"
 #include "dap_chain_net_srv.h"
 
+
+#define DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_CLIENT    0x01
+#define DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA      0x02
+
+#define DAP_STREAM_CH_ID_NET_SRV_VPN        'S'
+
 #define DAP_CHAIN_NET_SRV_VPN_ID            0x0000000000000001
 
 #define VPN_PACKET_OP_CODE_CONNECTED        0x000000a9
diff --git a/dap_chain_net_vpn_client.c b/dap_chain_net_vpn_client.c
index d5aea4b84e458773c5df6ea35cef9de5f916b1b3..6ffa1cf15aa45c33d5fba3202e315c2edb701a21 100644
--- a/dap_chain_net_vpn_client.c
+++ b/dap_chain_net_vpn_client.c
@@ -68,14 +68,49 @@ static pthread_mutex_t sf_socks_mutex;
 static dap_chain_node_info_t *s_node_info = NULL;
 static dap_chain_node_client_t *s_vpn_client = NULL;
 
-dap_stream_ch_t* dap_chain_net_vpn_client_get_stream(void)
+dap_stream_ch_t* dap_chain_net_vpn_client_get_stream_ch(void)
 {
     if(!s_vpn_client)
         return NULL;
-    dap_stream_ch_t *l_stream = dap_client_get_stream_ch(s_vpn_client->client, VPN_CLIENT_ID);
+    dap_stream_ch_t *l_stream = dap_client_get_stream_ch(s_vpn_client->client, DAP_STREAM_CH_ID_NET_SRV_VPN );
     return l_stream;
 }
 
+
+
+/// TODO convert below callback to processor of stage
+/*
+void s_stage_callback()
+{
+    char* l_full_path = NULL;
+    const char * l_path = "stream";
+    const char *l_suburl = "globaldb";
+    int l_full_path_size = snprintf(l_full_path, 0, "%s/%s?session_id=%s", DAP_UPLINK_PATH_STREAM, l_suburl,
+            dap_client_get_stream_id(a_client_pvt->client));
+    l_full_path = DAP_NEW_Z_SIZE(char, l_full_path_size + 1);
+    snprintf(l_full_path, l_full_path_size + 1, "%s/%s?session_id=%s", DAP_UPLINK_PATH_STREAM, l_suburl,
+            dap_client_get_stream_id(a_client_pvt->client));
+
+    //dap_client_request(a_client_pvt->client, l_full_path, "12345", 0, m_stream_response, m_stream_error);
+
+    const char *l_add_str = "";
+    // if connect to vpn server
+    const char l_active_vpn_channels[] = { VPN_CLIENT_ID, 0 };
+    if(!dap_strcmp(a_client_pvt->active_channels, l_active_vpn_channels))
+        l_add_str = "\r\nService-Key: test";
+
+    {
+        char *l_message = dap_strdup_printf("GET /%s HTTP/1.1\r\nHost: %s:%d%s\r\n\r\n",
+                l_full_path, a_client_pvt->uplink_addr, a_client_pvt->uplink_port, l_add_str);
+        size_t l_message_size = dap_strlen(l_message);
+        int count = send(a_client_pvt->stream_socket, l_message, l_message_size, 0);
+        DAP_DELETE(l_message);
+    }
+    DAP_DELETE(l_full_path);
+
+}*/
+
+
 /**
  * Start VPN client
  *
@@ -101,11 +136,14 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st
     s_node_info->hdr.ext_port = a_port;
 
     dap_client_stage_t l_stage_target = STAGE_STREAM_STREAMING; //DAP_CLIENT_STAGE_STREAM_CTL;//STAGE_STREAM_STREAMING;
-    const char l_active_channels[] = { VPN_CLIENT_ID, 0 };
+    const char l_active_channels[] = { DAP_STREAM_CH_ID_NET_SRV_VPN , 0 };
     if(a_ipv4_str)
         inet_pton(AF_INET, a_ipv4_str, &(s_node_info->hdr.ext_addr_v4));
     if(a_ipv6_str)
         inet_pton(AF_INET6, a_ipv6_str, &(s_node_info->hdr.ext_addr_v6));
+
+
+
     s_vpn_client = dap_chain_client_connect(s_node_info, l_stage_target, l_active_channels);
     if(!s_vpn_client) {
         log_it(L_ERROR, "Can't connect to VPN server=%s:%d", a_ipv4_str, a_port);
@@ -132,8 +170,8 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st
     // send first packet to server
 //    if(0)
     {
-        dap_stream_ch_t *l_stream = dap_chain_net_vpn_client_get_stream();
-        if(l_stream) { // Is present in hash table such destination address
+        dap_stream_ch_t *l_ch = dap_chain_net_vpn_client_get_stream_ch();
+        if(l_ch) { // Is present in hash table such destination address
             size_t l_ipv4_str_len = 0; //dap_strlen(a_ipv4_str);
             ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + l_ipv4_str_len);
 
@@ -142,9 +180,9 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st
             //pkt_out->header.op_connect.addr_size = l_ipv4_str_len; //remoteAddrBA.length();
             //pkt_out->header.op_connect.port = a_port;
             //memcpy(pkt_out->data, a_ipv4_str, l_ipv4_str_len);
-            dap_stream_ch_pkt_write(l_stream, DATA_CHANNEL_ID, pkt_out,
+            dap_stream_ch_pkt_write(l_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out,
                     pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
-            dap_stream_ch_set_ready_to_write(l_stream, true);
+            dap_stream_ch_set_ready_to_write(l_ch, true);
             DAP_DELETE(pkt_out);
         }
     }
@@ -240,62 +278,16 @@ static void send_pong_pkt(dap_stream_ch_t* a_ch)
 }
 
 /**
- * @brief ch_sf_new Callback to constructor of object of Ch
- * @param ch
- * @param arg
- */
-static void ch_sf_new(dap_stream_ch_t* a_ch, void* arg)
-{
-    log_it(L_INFO, "SF channel created");
-
-    a_ch->internal = DAP_NEW_Z(dap_chain_net_srv_vpn_t);
-    dap_chain_net_srv_vpn_t * l_sf = CH_VPN(a_ch);
-    l_sf->ch = a_ch;
-    pthread_mutex_init(&l_sf->mutex, NULL);
-
-    pthread_mutex_lock(&( CH_VPN(a_ch)->mutex));
-    pthread_mutex_unlock(&( CH_VPN(a_ch)->mutex));
-
-    l_sf->raw_l3_sock = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
-    //a_ch->stream->events_socket->is_pingable = true; //set up connection to be pingable by main loop
-
-}
-
-/**
- * @brief ch_sf_delete
- * @param ch
- * @param arg
- */
-static void ch_sf_delete(dap_stream_ch_t* a_ch, void* arg)
-{
-
-    log_it(L_DEBUG, "ch_sf_delete()");
-    /*    ch_vpn_socket_proxy_t * cur, *tmp;
-     ch_sf_tun_delete(CH_SF(a_ch));
-     HASH_ITER(hh, CH_SF(a_ch)->socks , cur, tmp) {
-     log_it(L_DEBUG,"delete socket: %i", cur->sock);
-     HASH_DEL(CH_SF(a_ch)->socks,cur);
-     if (cur)
-     free(cur);
-     }*/
-    pthread_mutex_unlock(&( CH_VPN(a_ch)->mutex));
-    if(CH_VPN(a_ch)->raw_l3_sock)
-        close(CH_VPN(a_ch)->raw_l3_sock);
-}
-
-/**
- * @brief ch_sf_packet_in
- * @param ch
- * @param arg
+ * @brief dap_chain_net_vpn_client_pkt_in
+ * @param a_ch
+ * @param a_arg
  */
-static void ch_sf_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
+void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t* a_pkt)
 {
-    dap_stream_ch_pkt_t * l_pkt = (dap_stream_ch_pkt_t *) a_arg;
-
-    ch_vpn_pkt_t * l_sf_pkt = (ch_vpn_pkt_t *) l_pkt->data;
-    size_t l_sf_pkt_data_size = l_pkt->hdr.size - sizeof(l_sf_pkt->header);
+    ch_vpn_pkt_t * l_sf_pkt = (ch_vpn_pkt_t *) a_pkt->data;
+    size_t l_sf_pkt_data_size = a_pkt->hdr.size - sizeof(l_sf_pkt->header);
 
-    if(!l_pkt->hdr.size) {
+    if(!a_pkt->hdr.size) {
         log_it(L_WARNING, "Bad input packet");
         return;
     }
@@ -381,7 +373,7 @@ static void ch_sf_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
                         pthread_mutex_unlock(&sf_sock->mutex);
                     }
                     log_it(L_INFO, "Send action from %d sock_id (sf_packet size %lu,  ch packet size %lu, have sent %d)"
-                            , sf_sock->id, l_sf_pkt->header.op_data.data_size, l_pkt->hdr.size, ret);
+                            , sf_sock->id, l_sf_pkt->header.op_data.data_size, a_pkt->hdr.size, ret);
                 }
                     break;
                 case VPN_PACKET_OP_CODE_DISCONNECT: {
@@ -530,61 +522,60 @@ static void ch_sf_packet_in(dap_stream_ch_t* a_ch, void* a_arg)
 }
 
 /**
- * @brief stream_sf_packet_out Packet Out Ch callback
- * @param ch
- * @param arg
+ * @brief dap_chain_net_vpn_client_pkt_out
+ * @param a_ch
  */
-static void ch_sf_packet_out(dap_stream_ch_t* ch, void* arg)
+void dap_chain_net_vpn_client_pkt_out(dap_stream_ch_t* a_ch)
 {
-    ch_vpn_socket_proxy_t * cur = NULL, *tmp;
-    bool isSmthOut = false;
+    ch_vpn_socket_proxy_t * l_cur = NULL, *l_tmp;
+    bool l_is_smth_out = false;
 //    log_it(L_DEBUG,"Socket forwarding packet out callback: %u sockets in hashtable", HASH_COUNT(CH_VPN(ch)->socks) );
-    HASH_ITER(hh, CH_VPN(ch)->socks , cur, tmp)
+    HASH_ITER(hh, CH_VPN(a_ch)->socks , l_cur, l_tmp)
     {
-        bool signalToBreak = false;
-        pthread_mutex_lock(&(cur->mutex));
+        bool l_signal_to_break = false;
+        pthread_mutex_lock(&(l_cur->mutex));
         int i;
 //        log_it(L_DEBUG,"Socket with id %d has %u packets in output buffer", cur->id, cur->pkt_out_size );
-        if(cur->pkt_out_size) {
-            for(i = 0; i < cur->pkt_out_size; i++) {
-                ch_vpn_pkt_t * pout = cur->pkt_out[i];
+        if(l_cur->pkt_out_size) {
+            for(i = 0; i < l_cur->pkt_out_size; i++) {
+                ch_vpn_pkt_t * pout = l_cur->pkt_out[i];
                 if(pout) {
-                    if(dap_stream_ch_pkt_write(ch, 'd', pout, pout->header.op_data.data_size + sizeof(pout->header))) {
-                        isSmthOut = true;
+                    if(dap_stream_ch_pkt_write(a_ch, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pout, pout->header.op_data.data_size + sizeof(pout->header))) {
+                        l_is_smth_out = true;
                         if(pout)
                             free(pout);
-                        cur->pkt_out[i] = NULL;
+                        l_cur->pkt_out[i] = NULL;
                     } else {
                         log_it(L_WARNING,
                                 "Buffer is overflowed, breaking cycle to let the upper level cycle drop data to the output socket");
-                        isSmthOut = true;
-                        signalToBreak = true;
+                        l_is_smth_out = true;
+                        l_signal_to_break = true;
                         break;
                     }
                 }
             }
         }
 
-        if(signalToBreak) {
-            pthread_mutex_unlock(&(cur->mutex));
+        if(l_signal_to_break) {
+            pthread_mutex_unlock(&(l_cur->mutex));
             break;
         }
-        cur->pkt_out_size = 0;
-        if(cur->signal_to_delete) {
-            log_it(L_NOTICE, "Socket id %d got signal to be deleted", cur->id);
-            pthread_mutex_lock(&( CH_VPN(ch)->mutex));
-            HASH_DEL(CH_VPN(ch)->socks, cur);
-            pthread_mutex_unlock(&( CH_VPN(ch)->mutex));
+        l_cur->pkt_out_size = 0;
+        if(l_cur->signal_to_delete) {
+            log_it(L_NOTICE, "Socket id %d got signal to be deleted", l_cur->id);
+            pthread_mutex_lock(&( CH_VPN(a_ch)->mutex));
+            HASH_DEL(CH_VPN(a_ch)->socks, l_cur);
+            pthread_mutex_unlock(&( CH_VPN(a_ch)->mutex));
 
             pthread_mutex_lock(&(sf_socks_mutex));
-            HASH_DELETE(hh2, sf_socks, cur);
-            HASH_DELETE(hh_sock, sf_socks_client, cur);
+            HASH_DELETE(hh2, sf_socks, l_cur);
+            HASH_DELETE(hh_sock, sf_socks_client, l_cur);
             pthread_mutex_unlock(&(sf_socks_mutex));
 
-            pthread_mutex_unlock(&(cur->mutex));
-            vpn_socket_delete(cur);
+            pthread_mutex_unlock(&(l_cur->mutex));
+            vpn_socket_delete(l_cur);
         } else
-            pthread_mutex_unlock(&(cur->mutex));
+            pthread_mutex_unlock(&(l_cur->mutex));
     }
     /*    ch->writable = isSmthOut;
      if(isSmthOut) {
@@ -597,8 +588,6 @@ int dap_chain_net_vpn_client_init(dap_config_t * g_config)
 {
     pthread_mutex_init(&sf_socks_mutex, NULL);
 
-    dap_stream_ch_proc_add(VPN_CLIENT_ID, ch_sf_new, ch_sf_delete, ch_sf_packet_in,
-            ch_sf_packet_out);
     return 0;
 }
 
diff --git a/dap_chain_net_vpn_client.h b/dap_chain_net_vpn_client.h
index e31a0b9cef417bdb581b9e680e6a1b2bb2d48fe2..a75a307f737ace6e859c22fe88ee3bd58e9719b8 100644
--- a/dap_chain_net_vpn_client.h
+++ b/dap_chain_net_vpn_client.h
@@ -25,9 +25,11 @@
 #pragma once
 
 #include "dap_stream_ch.h"
+#include "dap_stream_ch_pkt.h"
 #include "dap_chain_net.h"
+#include "dap_chain_net_srv_vpn.h"
 
-dap_stream_ch_t* dap_chain_net_vpn_client_get_stream(void);
+dap_stream_ch_t* dap_chain_net_vpn_client_get_stream_ch(void);
 
 int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_str, const char *a_ipv6_str, int a_port);
 int dap_chain_net_vpn_client_stop(void);
@@ -35,3 +37,7 @@ int dap_chain_net_vpn_client_status(void);
 
 int dap_chain_net_vpn_client_init(dap_config_t * g_config);
 void dap_chain_net_vpn_client_deinit();
+
+
+void dap_chain_net_vpn_client_pkt_out(dap_stream_ch_t* a_ch);
+void dap_chain_net_vpn_client_pkt_in(dap_stream_ch_t* a_ch, dap_stream_ch_pkt_t* a_pkt);
diff --git a/dap_chain_net_vpn_client_tun.c b/dap_chain_net_vpn_client_tun.c
index 68ad35486d3f76597720a88d93014a1bd0b78668..d77b8c35b50867dde707b4e95c1563a9a2a8bbe5 100644
--- a/dap_chain_net_vpn_client_tun.c
+++ b/dap_chain_net_vpn_client_tun.c
@@ -310,7 +310,7 @@ static void* thread_read_tun(void *arg)
                     //                  HASH_ADD_INT(CH_SF(ch)->socks, id, sf_sock );
                     //                  HASH_DEL(CH_SF(ch)->socks,sf_sock);
 //                    if(l_stream) { // Is present in hash table such destination address
-                    dap_stream_ch_t *l_stream = dap_chain_net_vpn_client_get_stream();
+                    dap_stream_ch_t *l_stream = dap_chain_net_vpn_client_get_stream_ch();
                     if(l_stream) {
                         // form packet to vpn-server
                         ch_vpn_pkt_t *pkt_out = (ch_vpn_pkt_t*) calloc(1, sizeof(pkt_out->header) + read_ret);
@@ -321,7 +321,7 @@ static void* thread_read_tun(void *arg)
 
                         pthread_mutex_lock(&s_clients_mutex);
                         // sent packet to vpn server
-                        dap_stream_ch_pkt_write(l_stream, DATA_CHANNEL_ID, pkt_out,
+                        dap_stream_ch_pkt_write(l_stream, DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA, pkt_out,
                                 pkt_out->header.op_data.data_size + sizeof(pkt_out->header));
                         dap_stream_ch_set_ready_to_write(l_stream, true);
                         pthread_mutex_unlock(&s_clients_mutex);