diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,9 @@
-0.1.0.16
+0.1.0.17
 --------
+* Add `--no-socks5` flag to switch off the socks5 service on local
 
+0.1.0.16
+--------
 * Add compatibility with shadowsocks for UDP port forwarding
 
 0.1.0.15
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -21,9 +21,9 @@
 Not working
 -----------
 * Remote is flaky 
-* Socks4 / Socks4a
-* UDP over Socks5
-* Four times slower then original Python's implementation
+* UDP over Socks5 is not implemented
+* 2.5 times slower then the original Python implementation (measured at 17.6M/s
+    vs 43.6M/s on an Intel P8800, using the AES-256-CFB encryption)
 
 Planning features
 ------------------
@@ -34,7 +34,7 @@
 
 There's a bug that prevents remote from working correctly.
 
-You should use the python implementation of [shadowsocks] on the remote
+You should use the original Python implementation of [shadowsocks] on the remote
 server.
 
 There is an earlier implementation of [shadowsocks in Haskell] by rnons that
diff --git a/moesocks.cabal b/moesocks.cabal
--- a/moesocks.cabal
+++ b/moesocks.cabal
@@ -1,6 +1,6 @@
 name:               moesocks
 category:           Network
-version:            0.1.0.16
+version:            0.1.0.17
 license:            Apache-2.0
 synopsis:           A functional firewall killer
 description:        A socks5 proxy using the client / server architecture.
diff --git a/src/Network/MoeSocks/App.hs b/src/Network/MoeSocks/App.hs
--- a/src/Network/MoeSocks/App.hs
+++ b/src/Network/MoeSocks/App.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ExistentialQuantification #-}
 
 module Network.MoeSocks.App where
 
@@ -335,7 +334,16 @@
 
         _forward_TCP_Apps
         _forward_UDP_Apps
-        _socks5App
+        if (_options ^. disableSocks5) 
+          then 
+            if (_options ^. forwardTCP & isn't _Empty)
+                    || (_options ^. forwardUDP & isn't _Empty)
+              then 
+                forever - sleep 1000
+              else
+                pute "Nothing to run!"
+                
+          else _socks5App
 
       debugRun :: IO ()
       debugRun = do
diff --git a/src/Network/MoeSocks/Common.hs b/src/Network/MoeSocks/Common.hs
--- a/src/Network/MoeSocks/Common.hs
+++ b/src/Network/MoeSocks/Common.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ExistentialQuantification #-}
 
 module Network.MoeSocks.Common where
 
diff --git a/src/Network/MoeSocks/Config.hs b/src/Network/MoeSocks/Config.hs
--- a/src/Network/MoeSocks/Config.hs
+++ b/src/Network/MoeSocks/Config.hs
@@ -16,7 +16,7 @@
   , _password = "moesocks"
   , _method = _DefaultMethod
   , _timeout = 300
-  , _tcpBufferSizeInPacket = 128
+  , _tcpBufferSizeInPacket = 256
   , _throttle = False
   , _throttleSpeed = 8000 -- in Kilobytes
   }
@@ -30,4 +30,5 @@
   , _verbosity = DEBUG
   , _forwardTCP = []
   , _forwardUDP = []
+  , _disableSocks5 = False
   } 
diff --git a/src/Network/MoeSocks/Constant.hs b/src/Network/MoeSocks/Constant.hs
--- a/src/Network/MoeSocks/Constant.hs
+++ b/src/Network/MoeSocks/Constant.hs
@@ -24,3 +24,4 @@
 
 _ReceiveLength :: Int
 _ReceiveLength = 4096
+
diff --git a/src/Network/MoeSocks/Helper.hs b/src/Network/MoeSocks/Helper.hs
--- a/src/Network/MoeSocks/Helper.hs
+++ b/src/Network/MoeSocks/Helper.hs
@@ -1,7 +1,5 @@
-{-# LANGUAGE ExistentialQuantification #-}
 {-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE CPP #-}
-{-# LANGUAGE RecursiveDo #-}
+{-# LANGUAGE LambdaCase #-}
 
 module Network.MoeSocks.Helper where
 
@@ -176,6 +174,11 @@
 connectTunnel :: (Maybe String, IO ()) -> (Maybe String, IO ()) -> IO ()
 connectTunnel = waitBothDebug
 
+{-connectTunnel :: (Maybe String, IO ()) -> (Maybe String, IO ()) -> IO ()-}
+{-connectTunnel x y = -}
+  {-withAsync (logWaitIO x) - const - do-}
+    {-logWaitIO y-}
+
 connectMarket :: (Maybe String, IO ()) -> (Maybe String, IO ()) -> IO ()
 connectMarket = waitBothDebug
 
@@ -273,8 +276,7 @@
       {-puts - "rawBytes: " <> show _rawBytes-}
       _bytes <- _decrypt _rawBytes
 
-      let r =  _parser - _partial <> _bytes
-      case r of
+      case _parser - _partial <> _bytes of
         Done i _r -> pure (i, _r)
         Fail _ _ msg -> throwIO - ParseException -
                     "Failed to parse " <> _id <> ": " <> msg
@@ -284,8 +286,7 @@
 
 timeoutFor :: String -> Timeout -> IO a -> IO a
 timeoutFor aID aTimeout aIO = do
-  _r <- timeout aTimeout aIO
-  case _r of
+  timeout aTimeout aIO >>= \case
     Nothing -> throw - TimeoutException aID
     Just _r -> pure _r
 
@@ -367,8 +368,7 @@
                     <> " miliseconds."
             threadDelay - floor - _sleepTime
 
-        _r <- atomically - readTBQueue aTBQueue 
-        case _r of
+        (atomically - readTBQueue aTBQueue) >>= \case 
           Nothing -> () <$ _shutdown
           Just _data -> do
                           timeoutFor aID aTimeout - sendAll aSocket _data
@@ -390,3 +390,4 @@
 
 tryIO :: String -> IO a -> IO (Either IOException a)
 tryIO _ = try -- . logException aID
+  
diff --git a/src/Network/MoeSocks/Options.hs b/src/Network/MoeSocks/Options.hs
--- a/src/Network/MoeSocks/Options.hs
+++ b/src/Network/MoeSocks/Options.hs
@@ -30,6 +30,14 @@
         | otherwise = DebugMode
   in
 
+  let _disableSocks5 :: O.Parser Bool
+      _disableSocks5 = switch -
+                      long "disable-socks5"
+                  <>  help ("Do not start a socks5 server on local. It can be "
+                          <> "useful to run moesocks only as a secure tunnel")
+                  
+  in
+                            
 
   let _config = ( strOption -
                       short 'c'
@@ -40,8 +48,8 @@
                  
   in
 
-  let __verbosity :: O.Parser Priority 
-      __verbosity = flag INFO DEBUG -
+  let _verbosity :: O.Parser Priority 
+      _verbosity = flag INFO DEBUG -
                           short 'v'
                       <>  long "verbose"
                       <>  help "Turn on logging"
@@ -115,9 +123,10 @@
   MoeOptions 
               <$> fmap parseMode _mode 
               <*> fmap (view packed) _config
-              <*> __verbosity
+              <*> _verbosity
               <*> fmap parseForwarding _forwardTCP
               <*> fmap parseForwarding _forwardUDP
+              <*> _disableSocks5
 
 opts :: ParserInfo MoeOptions
 opts = info (helper <*> optionParser) - 
diff --git a/src/Network/MoeSocks/TCP.hs b/src/Network/MoeSocks/TCP.hs
--- a/src/Network/MoeSocks/TCP.hs
+++ b/src/Network/MoeSocks/TCP.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ExistentialQuantification #-}
 
 module Network.MoeSocks.TCP where
 
@@ -16,9 +15,7 @@
 import Network.MoeSocks.Type
 import Network.Socket hiding (send, recv, recvFrom, sendTo)
 import Prelude hiding ((-), take)
-import qualified Data.List as L
 
-
 local_Socks5_RequestHandler :: MoeConfig -> ByteString -> (Socket, SockAddr) 
                                                                     -> IO ()
 local_Socks5_RequestHandler aConfig _ (aSocket,_) = do
@@ -65,7 +62,7 @@
       _initSocket = 
           getSocket (_c ^. remote) (_c ^. remotePort) Stream 
 
-  puts - "L : " <> show _clientRequest
+  puts - "L: " <> show _clientRequest
   
   logSA "L remote socket" _initSocket - 
     \(_remoteSocket, _remoteAddress) -> do
@@ -80,15 +77,9 @@
       send_ aSocket - builder_To_ByteString _connectionReplyBuilder
     
 
-    let _msg = 
-                concat - L.intersperse " -> " 
-                [ 
-                  show _localPeerAddr
-                , showRequest _clientRequest
-                ]
+    let _msg = show _localPeerAddr <> " -> " <> showRequest _clientRequest
     
-    _log - "L " -- <> showConnectionType (_clientRequest ^. connectionType)
-                <> ": " <> _msg
+    _log - "L T: " <> _msg
 
     let handleLocal __remoteSocket = do
           (_encrypt, _decrypt) <- getCipher
@@ -193,15 +184,9 @@
     _remotePeerAddr <- getPeerName aSocket
     _targetPeerAddr <- getPeerName _targetSocket
 
-    let _msg = 
-                concat - L.intersperse " -> " - 
-                [ 
-                  show _remotePeerAddr
-                , showRequest _clientRequest
-                ]
+    let _msg = show _remotePeerAddr <> " -> " <> showRequest _clientRequest
 
-    _log - "R " -- <> showConnectionType (_clientRequest ^. connectionType)
-                  <> ": " <> _msg
+    _log - "R T: " <> _msg
 
     let 
         handleTarget __leftOverBytes __targetSocket = do
diff --git a/src/Network/MoeSocks/Type.hs b/src/Network/MoeSocks/Type.hs
--- a/src/Network/MoeSocks/Type.hs
+++ b/src/Network/MoeSocks/Type.hs
@@ -90,6 +90,7 @@
   , _verbosity :: Priority
   , _forwardTCP :: [Forward]
   , _forwardUDP :: [Forward]
+  , _disableSocks5 :: Bool
   }
   deriving (Show, Eq)
 
diff --git a/src/Network/MoeSocks/UDP.hs b/src/Network/MoeSocks/UDP.hs
--- a/src/Network/MoeSocks/UDP.hs
+++ b/src/Network/MoeSocks/UDP.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ExistentialQuantification #-}
 
 module Network.MoeSocks.UDP where
 
@@ -45,7 +44,7 @@
                             forwardRemoteHost)
                           (aForwarding ^. forwardRemotePort)
   
-  puts - "L UDP: " <> show _clientRequest
+  {-puts - "L UDP: " <> show _clientRequest-}
 
   _sa <- getSocket (_c ^. remote) (_c ^. remotePort) Datagram
 
@@ -59,15 +58,18 @@
 
       {-let (_encrypt, _decrypt) = (pure, pure)-}
 
-      let _msg = buildShadowSocksRequest _clientRequest aMessage
+      let _bytes = buildShadowSocksRequest _clientRequest aMessage
 
-      puts - "L UDP: " <> show _msg
+      {-puts - "L UDP: " <> show _bytes-}
+
+      let _msg = show aSockAddr <> " -> " <> showRequest _clientRequest
+      _log - "L U: " <> _msg
       
-      send_ _remoteSocket =<< _encrypt _msg
+      send_ _remoteSocket =<< _encrypt _bytes
 
       (_r, _) <- recv_ _remoteSocket >>= _decrypt >>= parseShadowSocksRequest
 
-      puts - "L UDP <--: " <> show _r
+      {-puts - "L UDP <--: " <> show _r-}
       when (_r & isn't _Empty) - do
         sendAllTo aSocket _r aSockAddr
 
@@ -86,13 +88,16 @@
 
   (_decryptedMessage, _clientRequest) <- parseShadowSocksRequest _msg
   
-  puts - "R UDP: " <> show _clientRequest
-  puts - "R UDP: " <> show _decryptedMessage
+  {-puts - "R UDP: " <> show _clientRequest-}
+  {-puts - "R UDP: " <> show _decryptedMessage-}
   
   logSA "R UDP -->:" (initTarget _clientRequest) - \_r -> do
     let (_clientSocket, _clientAddr) = _r
 
-    puts - "R UDP clientSocket: " <> show _r
+    {-puts - "R UDP clientSocket: " <> show _r-}
+    
+    let _msg = show aSockAddr <> " -> " <> showRequest _clientRequest
+    _log - "R U: " <> _msg
 
     connect _clientSocket _clientAddr
     
@@ -100,7 +105,7 @@
 
     _r <- buildShadowSocksRequest _clientRequest <$> recv_ _clientSocket
 
-    puts - "R UDP <--: " <> show _r
+    {-puts - "R UDP <--: " <> show _r-}
 
     when (_r & isn't _Empty) - do
       _encryptedMessage <- _encrypt _r
