diff --git a/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp b/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp
index 91691e4067f8a010c2c98eeca67d0bede97f5b83..3362f4b248edb1d846ce3cfe53e1e7554954bca4 100644
--- a/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp
+++ b/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.cpp
@@ -214,15 +214,15 @@ ChChainNetSrvVpn::ChChainNetSrvVpn(DapStreamer * a_streamer, DapSession * mainDa
 {
     tun = new DapTunNative();
     m_fdListener = nullptr;
-    connect(tun, &DapTunNative::created, this, &ChChainNetSrvVpn::tunCreated);
-    connect(tun, &DapTunNative::destroyed, this, &ChChainNetSrvVpn::tunDestroyed);
-    connect(tun, &DapTunNative::error , this, &ChChainNetSrvVpn::tunError);
-    connect(tun, &DapTunNative::packetOut, this, &ChChainNetSrvVpn::packetOut);
-    connect(tun, &DapTunNative::sendCmd, this, &ChChainNetSrvVpn::sendCmdAll);
-    connect(tun, &DapTunNative::bytesRead, this, &ChChainNetSrvVpn::bytesRead);
-    connect(tun, &DapTunNative::bytesWrite, this, &ChChainNetSrvVpn::bytesWrite);
-    connect(tun, &DapTunNative::nativeCreateRequest, this, &ChChainNetSrvVpn::sigTunNativeCreate);
-    connect(tun, &DapTunNative::nativeDestroyRequest, this, &ChChainNetSrvVpn::sigNativeDestroy);
+    connect(tun, &DapTunNative::created,                this, &ChChainNetSrvVpn::tunCreated);
+    connect(tun, &DapTunNative::destroyed,              this, &ChChainNetSrvVpn::tunDestroyed);
+    connect(tun, &DapTunNative::error,                  this, &ChChainNetSrvVpn::tunError);
+    connect(tun, &DapTunNative::packetOut,              this, &ChChainNetSrvVpn::packetOut);
+    connect(tun, &DapTunNative::sendCmd,                this, &ChChainNetSrvVpn::sendCmdAll);
+    connect(tun, &DapTunNative::bytesRead,              this, &ChChainNetSrvVpn::bytesRead);
+    connect(tun, &DapTunNative::bytesWrite,             this, &ChChainNetSrvVpn::bytesWrite);
+    connect(tun, &DapTunNative::nativeCreateRequest,    this, &ChChainNetSrvVpn::sigTunNativeCreate);
+    connect(tun, &DapTunNative::nativeDestroyRequest,   this, &ChChainNetSrvVpn::sigNativeDestroy);
 }
 
 /**
@@ -257,13 +257,11 @@ void ChChainNetSrvVpn::packetOut(Dap::Stream::Packet *pkt)
  */
 void ChChainNetSrvVpn::requestIP(quint32 a_usageId)
 {
-    emit netConfigRequested();
     Dap::Stream::Packet * pktOut = reinterpret_cast<Dap::Stream::Packet*>(::calloc(1 ,sizeof(pktOut->header)));
     pktOut->header.op_code=STREAM_SF_PACKET_OP_CODE_RAW_L3_ADDR_REQUEST;
     pktOut->header.usage_id = a_usageId;
     qInfo() << "Request for IP with usage_id: " << pktOut->header.usage_id;
     packetOut(pktOut);
-    emit ipRequested();
 }
 
 /**
@@ -273,7 +271,6 @@ void ChChainNetSrvVpn::netConfigClear()
 {
     m_addr.clear();
     m_gw.clear();
-    emit netConfigCleared();
 }
 
 /**
@@ -309,6 +306,11 @@ void ChChainNetSrvVpn::tunCreate()
         QThread::msleep(1000);
         tunSocket = QtAndroid::androidService().callMethod<jint>("getTunSocket");
     }
+    if (tunSocket == -1) {
+        qCritical() << "Permission denied!";
+        emit androidPermissionDenied();
+        return;
+    }
     qInfo() << "Socket num: " << tunSocket;
     workerStart(tunSocket);
 #else
@@ -318,6 +320,11 @@ void ChChainNetSrvVpn::tunCreate()
 
 //
 
+void ChChainNetSrvVpn::tunStandby()
+{
+    tun->standby();
+}
+
 void ChChainNetSrvVpn::tunDestroy()
 {
     tun->destroy();
@@ -334,6 +341,10 @@ void ChChainNetSrvVpn::workerStart(int a_tunSocket)
     tun->workerStart(); // start loop
 }
 
+int ChChainNetSrvVpn::tunSocket() {
+    return tun->m_tunSocket;
+}
+
 /**
  * @brief ChChainNetSrvVpn::onPktIn
  * @param pkt
diff --git a/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.h b/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.h
index f31ee99b062c27eac2f4b9df70a3b6dcd00b386a..268476cf5237616c2c52423ef3efa6563675be17 100644
--- a/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.h
+++ b/stream/ch/chain/net/srv/vpn/DapStreamChChainNetSrvVpn.h
@@ -106,15 +106,17 @@ namespace Dap {
             void sigTunNativeCreate();
             void sigNativeDestroy();
 
-
         public:
             ChChainNetSrvVpn(DapStreamer * a_streamer, DapSession * mainDapSession);
 
             bool isTunCreated(){return tun->isCreated();}
+            void addNewUpstreamRoute(const QString &a_dest) {
+                tun->addNewUpstreamRoute(a_dest);
+            }
 
             void tunCreate (const QString& a_addr, const QString& a_gw);
             void workerStart(int a_tunSocket);
-
+            int tunSocket();
             quint16 addForwarding(const QString remoteAddr, quint16 remotePort, quint16 localPort);
             void delForwarding(int sockId);
             void delForwardingAll();
@@ -123,16 +125,13 @@ namespace Dap {
         signals:
 
             void netConfigReceived(QString,QString);
-            void netConfigRequested();
             void netConfigReceivedSame();
-            void netConfigCleared();
             void tunCreated();
             void tunDestroyed();
             void tunError(const QString&);
+            void androidPermissionDenied();
             void tunWriteData();
 
-            void ipRequested();
-
             void sendCmdAll(const QString&);
         public slots:
             void onPktIn(DapChannelPacket *pkt) override;
@@ -143,6 +142,7 @@ namespace Dap {
 
             void tunCreate(); // create with all predefined before values
             void tunDestroy();
+            void tunStandby();
         };
 
     }