diff --git a/moesocks.cabal b/moesocks.cabal
--- a/moesocks.cabal
+++ b/moesocks.cabal
@@ -1,6 +1,6 @@
 name:               moesocks
 category:           Network
-version:            1.0.0.42
+version:            1.0.0.43
 license:            Apache-2.0
 synopsis:           A functional firewall killer
 description:        A SOCKS5 proxy using the client / server architecture.
@@ -9,7 +9,7 @@
 author:             Jinjing Wang
 maintainer:         Jinjing Wang <nfjinjing@gmail.com>
 build-type:         Simple
-cabal-version:      >=1.10
+cabal-version:      >=1.18
 copyright:          Copyright (C) 2015 Jinjing Wang
 tested-with:        GHC == 8.0.2
 
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
@@ -3,16 +3,16 @@
 
 module Network.MoeSocks.App where
 
-import Control.Concurrent.Async hiding (waitBoth)
-import Control.Lens
-import Control.Monad
-import Network.MoeSocks.Bootstrap (loadConfig)
-import Network.MoeSocks.Handler (runRemoteRelay, runLocalService)
-import Network.MoeSocks.Helper
-import Network.MoeSocks.Runtime (initRuntime)
-import Network.MoeSocks.Type
-import Prelude hiding ((-), take)
+import           Control.Concurrent.Async hiding (waitBoth)
+import           Control.Lens
+
+import           Network.MoeSocks.Bootstrap (loadConfig)
+import           Network.MoeSocks.Handler (runRemoteRelay, runLocalService)
+import           Network.MoeSocks.Helper ((-), io, error_, foreverRun)
+import           Network.MoeSocks.Runtime (initRuntime)
+import           Network.MoeSocks.Type (Env, Job(..), MoeMonad, env, jobs)
 import qualified Network.MoeSocks.Type.Bootstrap.Option as O
+import           Prelude hiding ((-), take)
 
 
 runJob :: Env -> Job -> IO ()
diff --git a/src/Network/MoeSocks/Bootstrap.hs b/src/Network/MoeSocks/Bootstrap.hs
--- a/src/Network/MoeSocks/Bootstrap.hs
+++ b/src/Network/MoeSocks/Bootstrap.hs
@@ -3,25 +3,26 @@
 
 module Network.MoeSocks.Bootstrap where
 
-import Control.Lens
-import Control.Monad
-import Control.Monad.Except
-import Control.Monad.Writer hiding (listen)
-import Data.Aeson hiding (Result)
-import Data.Aeson.Lens
-import Data.Maybe (fromMaybe)
-import Data.Text (Text)
-import Data.Text.Lens
-import Network.MoeSocks.Default
-import Network.MoeSocks.Encrypt (safeMethods, unsafeMethods)
-import Network.MoeSocks.Helper
-import Prelude hiding ((-), take)
+import           Control.Lens
+import           Control.Monad.Except (ExceptT, throwError)
+import           Control.Monad.Writer hiding (listen)
+import           Data.Aeson hiding (Result)
+import           Data.Aeson.Lens (_Object, _JSON)
+import           Data.Maybe (fromMaybe)
+import           Data.Text (Text)
+import           Data.Text.Lens (_Text)
 import qualified Data.HashMap.Strict as H
 import qualified Data.Map as Map
 import qualified Data.Text as T
 import qualified Data.Text.IO as TIO
+
 import qualified Network.MoeSocks.Type.Bootstrap.Config as C
 import qualified Network.MoeSocks.Type.Bootstrap.Option as O
+import           Network.MoeSocks.Default (defaultConfig)
+import           Network.MoeSocks.Encrypt (safeMethods, unsafeMethods)
+
+import           Network.MoeSocks.Helper ((-), debug_, io, toHaskellNamingConvention)
+import           Prelude hiding ((-), take)
 
 
 asList :: ([(Text, Value)] -> [(Text, Value)]) -> Value -> Value
diff --git a/src/Network/MoeSocks/BuilderAndParser.hs b/src/Network/MoeSocks/BuilderAndParser.hs
--- a/src/Network/MoeSocks/BuilderAndParser.hs
+++ b/src/Network/MoeSocks/BuilderAndParser.hs
@@ -2,21 +2,24 @@
 
 module Network.MoeSocks.BuilderAndParser where
 
-import Control.Lens
-import Data.Attoparsec.ByteString
-import Data.Binary
-import Data.Binary.Put
-import Data.Maybe
-import Data.Monoid
-import Data.Text.Lens
-import Data.Text.Strict.Lens (utf8)
-import Network.MoeSocks.Helper
-import Network.MoeSocks.Type
-import Network.Socket
-import Prelude hiding ((-), take)
+import           Control.Lens
+import           Data.Attoparsec.ByteString (Parser, anyWord8, word8, take, count)
+import           Data.Attoparsec.ByteString (satisfy, choice)
+import           Data.Binary (Word16, Word8, decode, put)
+import           Data.Binary.Put (runPut)
+import           Data.Maybe (fromMaybe)
+import           Data.Monoid ((<>))
+import           Data.Text.Lens
+import           Data.Text.Strict.Lens (utf8)
+import           Network.Socket (SockAddr(..))
 import qualified Data.ByteString as S
 import qualified Data.ByteString.Builder as B
 import qualified Prelude as P
+
+import           Network.MoeSocks.Type
+
+import           Network.MoeSocks.Helper ((-), flip4, portPairToInt)
+import           Prelude hiding ((-), take)
 
 
 _No_authentication :: Word8
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
@@ -5,12 +5,16 @@
 
 import Control.Lens
 import Control.Monad.Writer hiding (listen)
-import Data.IP
-import Data.Maybe
+import Data.IP (IPRange, isMatchedTo)
+import Data.Maybe (isJust)
 import Data.Text.Lens
-import Network.MoeSocks.Helper
+import Network.Socket (SockAddr(..), Socket(..), SocketType(..), Family(..))
+import Network.Socket (setSocketOption, SocketOption(..))
+
 import Network.MoeSocks.Type
-import Network.Socket hiding (send, recv, recvFrom, sendTo)
+
+import Network.MoeSocks.Helper ((-), tryIO, error_)
+import Network.MoeSocks.Helper (setSocket_TCP_NOTSENT_LOWAT, getSocketWithHint)
 import Prelude hiding ((-), take)
 
 
diff --git a/src/Network/MoeSocks/Default.hs b/src/Network/MoeSocks/Default.hs
--- a/src/Network/MoeSocks/Default.hs
+++ b/src/Network/MoeSocks/Default.hs
@@ -2,15 +2,16 @@
 
 module Network.MoeSocks.Default where
 
-import Control.Lens
-import Control.Monad.Writer
-import Data.IP
-import Data.Text (Text)
-import Data.Text.Lens
-import Network.MoeSocks.Encrypt (constCipherBox)
-import Network.MoeSocks.Type
-import System.Log.Logger
+import           Control.Lens
+import           Control.Monad.Writer (execWriter, tell)
+import           Data.IP (IPRange)
+import           Data.Text (Text)
+import           Data.Text.Lens
+import           System.Log.Logger (Priority(DEBUG))
 import qualified Data.Text as T
+
+import           Network.MoeSocks.Encrypt (constCipherBox)
+import           Network.MoeSocks.Type
 import qualified Network.MoeSocks.Type.Bootstrap.Config as C
 import qualified Network.MoeSocks.Type.Bootstrap.Option as O
 
diff --git a/src/Network/MoeSocks/Encrypt.hs b/src/Network/MoeSocks/Encrypt.hs
--- a/src/Network/MoeSocks/Encrypt.hs
+++ b/src/Network/MoeSocks/Encrypt.hs
@@ -16,23 +16,24 @@
 )
 where
 
-import Control.Lens
-import Control.Monad.Except
-import Crypto.Hash.MD5 (hash)
-import Data.ByteString (ByteString)
-import Data.Map
-import Data.Monoid ((<>))
-import Data.Text (Text)
-import Data.Text.Lens
-import Data.Text.Strict.Lens (utf8)
-import OpenSSL (withOpenSSL)
-import OpenSSL.EVP.Cipher (getCipherByName, CryptoMode(..))
-import OpenSSL.EVP.Internal (cipherIvLength)
-import OpenSSL.Random (randBytes)
-import Prelude hiding ((-))
+import           Control.Lens
+import           Control.Monad.Except (ExceptT, runExceptT, liftIO, throwError)
+import           Crypto.Hash.MD5 (hash)
+import           Data.ByteString (ByteString)
 import qualified Data.ByteString as S
+import           Data.Map (Map,fromList)
+import           Data.Monoid ((<>))
 import qualified Data.Strict as S
+import           Data.Text (Text)
+import           Data.Text.Lens
+import           Data.Text.Strict.Lens (utf8)
+import           OpenSSL (withOpenSSL)
+import           OpenSSL.EVP.Cipher (getCipherByName, CryptoMode(..))
+import           OpenSSL.EVP.Internal (cipherIvLength)
 import qualified OpenSSL.EVP.Internal as E
+import           OpenSSL.Random (randBytes)
+
+import           Prelude hiding ((-))
 
 -- BEGIN backports
 
diff --git a/src/Network/MoeSocks/Handler.hs b/src/Network/MoeSocks/Handler.hs
--- a/src/Network/MoeSocks/Handler.hs
+++ b/src/Network/MoeSocks/Handler.hs
@@ -3,20 +3,25 @@
 
 module Network.MoeSocks.Handler where
 
-import Control.Concurrent
+import Control.Concurrent (forkIO)
 import Control.Lens
-import Control.Monad
-import Control.Monad.Writer hiding (listen)
+import Control.Monad.Writer (forever, when)
+import Data.Monoid ((<>))
 import Data.ByteString (ByteString)
 import Data.Text (Text)
 import Data.Text.Lens
-import Network.MoeSocks.Common
-import Network.MoeSocks.Helper
-import Network.MoeSocks.TCP
+import Network.Socket (Socket, SockAddr, SocketType(Stream, Datagram), bind)
+import Network.Socket (SocketOption(ReuseAddr), setSocketOption, accept, maxListenQueue)
+import Network.Socket (listen)
+import Network.Socket.ByteString (recvFrom)
+
+import Network.MoeSocks.Common (setSocketConfig)
+import Network.MoeSocks.TCP (local_SOCKS5_RequestHandler, local_TCP_ForwardRequestHandler)
+import Network.MoeSocks.TCP (remote_TCP_RequestHandler)
 import Network.MoeSocks.Type
-import Network.MoeSocks.UDP
-import Network.Socket hiding (send, recv, recvFrom, sendTo)
-import Network.Socket.ByteString
+import Network.MoeSocks.UDP (local_UDP_ForwardRequestHandler, remote_UDP_RequestHandler)
+
+import Network.MoeSocks.Helper
 import Prelude hiding ((-), take)
 
 _PacketLength :: Int
@@ -35,7 +40,7 @@
   logSA "L loop" (pure s) - \(_localSocket, _localAddr) -> do
 
     setSocketOption _localSocket ReuseAddr 1
-    bindSocket _localSocket _localAddr
+    bind _localSocket _localAddr
 
     case aServiceType of
       TCP_Service -> do
@@ -125,7 +130,7 @@
     info_ - "RT: TCP relay " <> showWrapped _remoteAddr <> " nyaa!"
 
     setSocketOption _remoteSocket ReuseAddr 1
-    bindSocket _remoteSocket _remoteAddr
+    bind _remoteSocket _remoteAddr
 
     when (_env ^. fastOpen) -
       setSocket_TCP_FAST_OPEN _remoteSocket
@@ -149,7 +154,7 @@
     info_ - "RU: UDP relay " <> showWrapped _remoteAddr <> " nyaa!"
 
     setSocketOption _remoteSocket ReuseAddr 1
-    bindSocket _remoteSocket _remoteAddr
+    bind _remoteSocket _remoteAddr
 
     let handleRemote = do
           (_msg, _sockAddr) <- recvFrom _remoteSocket _PacketLength
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
@@ -3,38 +3,49 @@
 
 module Network.MoeSocks.Helper where
 
-import Control.Concurrent
-import Control.Concurrent.Async
-import Control.Concurrent.STM
-import Control.Exception
-import Control.Lens
-import Control.Monad
-import Control.Monad.IO.Class
-import Data.Attoparsec.ByteString hiding (try)
-import Data.Binary
-import Data.Binary.Put
-import Data.ByteString (ByteString)
-import Data.Char (isUpper)
-import Data.Foldable (for_)
-import Data.List (sortOn)
-import Data.Maybe
-import Data.Monoid
-import Data.Text (Text)
-import Data.Text.Lens
-import Data.Time.Clock
-import Debug.Trace (trace)
-import Network.MoeSocks.Internal.Socket (sendAllToFastOpen)
-import Network.Socket hiding (send, recv)
-import Network.Socket.ByteString
-import Prelude hiding (take, (-))
-import System.Log.Logger
-import System.Random
-import System.Timeout (timeout)
+import           Control.Concurrent (threadDelay, yield)
+import           Control.Concurrent.Async (concurrently, race_)
+import           Control.Concurrent.STM (TBQueue, readTBQueue, writeTBQueue, atomically)
+import           Control.Exception (Exception, SomeException, IOException, AsyncException)
+import           Control.Exception (catches, bracket, Handler(Handler))
+import           Control.Exception (try, onException, throw, throwIO, catch)
+import           Control.Lens
+import           Control.Monad (forever, when)
+import           Control.Monad.IO.Class (MonadIO, liftIO)
+import           Data.Attoparsec.ByteString (IResult(Partial, Fail, Done), Result)
+import           Data.Attoparsec.ByteString (Parser, parse)
+import           Data.Binary (Word8, Word16, put, decode)
+import           Data.Binary.Put (runPut)
+import           Data.ByteString (ByteString)
 import qualified Data.ByteString as S
 import qualified Data.ByteString.Builder as B
 import qualified Data.ByteString.Lazy as LB
+import           Data.Char (isUpper)
+import           Data.Foldable (for_)
+import           Data.List (sortOn)
+import           Data.Maybe (fromMaybe)
+import           Data.Monoid ((<>))
 import qualified Data.Strict as S
+import           Data.Text (Text)
 import qualified Data.Text as T
+import           Data.Text.Lens
+import           Data.Time.Clock (getCurrentTime, diffUTCTime)
+import           Debug.Trace (trace)
+import           Network.Socket (AddrInfoFlag(AI_NUMERICSERV, AI_ADDRCONFIG))
+import           Network.Socket (ShutdownCmd(ShutdownSend, ShutdownReceive))
+import           Network.Socket (Socket, SockAddr, SocketType(Stream))
+import           Network.Socket (SocketOption(CustomSockOpt, NoDelay), setSocketOption)
+import           Network.Socket (addrFamily, addrFlags, addrSocketType, shutdown, close)
+import           Network.Socket (defaultHints, socket, addrAddress, addrProtocol)
+import           Network.Socket (getAddrInfo, Family(AF_UNSPEC))
+import           Network.Socket.ByteString (recv, sendAll)
+import           System.Log.Logger  (noticeM, debugM, errorM, warningM, infoM)
+import           System.Random (randomRIO)
+import           System.Timeout (timeout)
+
+import           Network.MoeSocks.Internal.Socket (sendAllToFastOpen)
+
+import           Prelude hiding (take, (-))
 
 -- BEGIN backports
 
diff --git a/src/Network/MoeSocks/Internal/Socket.hs b/src/Network/MoeSocks/Internal/Socket.hs
--- a/src/Network/MoeSocks/Internal/Socket.hs
+++ b/src/Network/MoeSocks/Internal/Socket.hs
@@ -2,15 +2,15 @@
 
 module Network.MoeSocks.Internal.Socket where
 
-import Control.Monad
-import Data.ByteString (ByteString)
-import Data.ByteString.Unsafe (unsafeUseAsCStringLen)
-import Foreign.C.Types
-import Foreign.Ptr (Ptr)
-import Network.Socket
-import Network.Socket.ByteString
-import Network.Socket.Internal (withSockAddr)
+import           Control.Monad (liftM, when)
+import           Data.ByteString (ByteString)
 import qualified Data.ByteString as S
+import           Data.ByteString.Unsafe (unsafeUseAsCStringLen)
+import           Foreign.C.Types (CSize(..), CInt(..))
+import           Foreign.Ptr (Ptr)
+import           Network.Socket (Socket(MkSocket), SockAddr, )
+import           Network.Socket.ByteString (sendAll)
+import           Network.Socket.Internal (withSockAddr)
 
 foreign import ccall unsafe "sendto" c_sendto ::
   CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> CInt -> IO CInt
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
@@ -2,24 +2,26 @@
 
 module Network.MoeSocks.Options where
 
-import Control.Lens
-import Data.Aeson
-import Data.Maybe
-import Data.Text (Text)
-import Data.Text.Lens
-import Network.MoeSocks.Default
-import Network.MoeSocks.Helper
-import Network.MoeSocks.Type.Bootstrap.Option
-import Network.MoeSocks.Type.Common
-import Options.Applicative hiding (Parser)
-import Prelude hiding ((-), takeWhile)
-import System.Log.Logger
+import           Control.Lens
+import           Data.Aeson (Value, toJSON)
+import           Data.Attoparsec.Text (Parser, takeWhile, char, decimal)
+import           Data.Attoparsec.Text (skipSpace, parseOnly, many', choice)
+import           Data.Maybe (catMaybes)
+import           Data.Monoid ((<>))
+import           Data.Text (Text)
 import qualified Data.Text as T
-import qualified Network.MoeSocks.Type.Bootstrap.Config as C
+import           Data.Text.Lens
 import qualified Options.Applicative as O
-import Data.Attoparsec.Text (Parser, takeWhile, char, decimal, skipSpace,
-                              parseOnly, many', choice)
-import Data.Monoid ((<>))
+import           Options.Applicative hiding (Parser)
+import           System.Log.Logger (Priority(DEBUG, INFO))
+
+import           Network.MoeSocks.Default (defaultConfig)
+import qualified Network.MoeSocks.Type.Bootstrap.Config as C
+import           Network.MoeSocks.Type.Bootstrap.Option (Options(..), RunningMode(..))
+import           Network.MoeSocks.Type.Common (Forward(Forward))
+
+import           Network.MoeSocks.Helper ((-))
+import           Prelude hiding ((-), takeWhile)
 
 textOption :: O.Mod O.OptionFields String -> O.Parser Text
 textOption x = strOption x <&> review _Text
diff --git a/src/Network/MoeSocks/Runtime.hs b/src/Network/MoeSocks/Runtime.hs
--- a/src/Network/MoeSocks/Runtime.hs
+++ b/src/Network/MoeSocks/Runtime.hs
@@ -3,28 +3,29 @@
 
 module Network.MoeSocks.Runtime where
 
-import Control.Lens
-import Control.Monad.Except
-import Control.Monad.Writer hiding (listen)
-import Data.IP
-{-import Data.List (intercalate)-}
-{-import Data.Text (Text)-}
-import Data.Text.IO as T
-import Data.Text.Lens
-import Network.MoeSocks.Bootstrap
-import Network.MoeSocks.Default
-import Network.MoeSocks.Encrypt
-import Network.MoeSocks.Helper
-import Network.MoeSocks.Type
-import Prelude hiding ((-), take)
-import System.Log.Formatter
-import System.Log.Handler.Simple
-import System.Log.Logger
+import           Control.Lens
+import           Control.Monad.Except (ExceptT, throwError)
+import           Data.IP (IPRange)
+import           Data.Monoid ((<>))
 import qualified Data.Text as T
+import           Data.Text.IO as T
+import           Data.Text.Lens (_Text)
 import qualified Network.MoeSocks.Type.Bootstrap.Config as C
 import qualified Network.MoeSocks.Type.Bootstrap.Option as O
 import qualified System.IO as IO
+import           System.Log.Formatter (simpleLogFormatter)
 import qualified System.Log.Handler as LogHandler
+import           System.Log.Handler.Simple (streamHandler)
+import           System.Log.Logger (Priority(DEBUG), removeHandler, addHandler, setLevel)
+import           System.Log.Logger (updateGlobalLogger, rootLoggerName)
+
+import           Network.MoeSocks.Bootstrap (loadConfig)
+import           Network.MoeSocks.Default (defaultRuntime, parseIPRangeList, defaultEnv)
+import           Network.MoeSocks.Encrypt (initCipherBox)
+import           Network.MoeSocks.Type
+
+import           Prelude hiding ((-), take)
+import           Network.MoeSocks.Helper ((-), debug_, io, is)
 
 initLogger :: Priority -> IO ()
 initLogger aLevel = do
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
@@ -2,22 +2,35 @@
 
 module Network.MoeSocks.TCP where
 
-import Control.Concurrent.STM
-import Control.Exception
-import Control.Lens
-import Control.Monad.Writer hiding (listen)
-import Data.ByteString (ByteString)
-import Data.Text (Text)
-import Network.MoeSocks.BuilderAndParser
-import Network.MoeSocks.Common
-import Network.MoeSocks.Encrypt (identityCipher)
-import Network.MoeSocks.Helper
-import Network.MoeSocks.Type
-import Network.Socket hiding (send, recv, recvFrom, sendTo)
-import Network.Socket.ByteString (recv)
-import Prelude hiding ((-), take)
+import           Control.Concurrent.STM (newTBQueueIO)
+import           Control.Exception (throwIO, finally)
+import           Control.Lens
+import           Control.Monad (when)
+import           Data.ByteString (ByteString)
 import qualified Data.ByteString as S
+import           Data.Monoid ((<>))
 import qualified Data.Strict as S
+import           Data.Text (Text)
+import           Network.Socket (Socket, SockAddr, SocketType(Stream))
+import           Network.Socket (connect, getPeerName, getSocketName)
+import           Network.Socket.ByteString (recv)
+
+import           Network.MoeSocks.BuilderAndParser (greetingParser, greetingReplyBuilder)
+import           Network.MoeSocks.BuilderAndParser (shadowSocksRequestParser)
+import           Network.MoeSocks.BuilderAndParser (shadowSocksRequestBuilder)
+import           Network.MoeSocks.BuilderAndParser (connectionParser, connectionReplyBuilder)
+import           Network.MoeSocks.BuilderAndParser (sockAddr_To_Pair, _No_authentication)
+import           Network.MoeSocks.Common (showRelay, getIPLists, initTarget)
+import           Network.MoeSocks.Common (withChecked_IP_List, setSocketConfig)
+import           Network.MoeSocks.Encrypt (identityCipher)
+import           Network.MoeSocks.Type
+
+import           Network.MoeSocks.Helper ((-), connectMarket, consumeLoop, produceLoop)
+import           Network.MoeSocks.Helper (sendBytes, connectTunnel, send_, sendFast)
+import           Network.MoeSocks.Helper (info_, debug_, logSA, parseSocket)
+import           Network.MoeSocks.Helper (builder_To_ByteString, getSocket)
+import           Network.MoeSocks.Helper (ParseException(ParseException))
+import           Prelude hiding ((-), take)
 
 _NoThrottle :: Maybe a
 _NoThrottle = Nothing
diff --git a/src/Network/MoeSocks/Type/Bootstrap/Config.hs b/src/Network/MoeSocks/Type/Bootstrap/Config.hs
--- a/src/Network/MoeSocks/Type/Bootstrap/Config.hs
+++ b/src/Network/MoeSocks/Type/Bootstrap/Config.hs
@@ -4,7 +4,7 @@
 module Network.MoeSocks.Type.Bootstrap.Config where
 
 import Control.Lens
-import Data.Aeson
+import Data.Aeson (FromJSON, ToJSON)
 import Data.Text (Text)
 import GHC.Generics (Generic)
 
diff --git a/src/Network/MoeSocks/Type/Bootstrap/Option.hs b/src/Network/MoeSocks/Type/Bootstrap/Option.hs
--- a/src/Network/MoeSocks/Type/Bootstrap/Option.hs
+++ b/src/Network/MoeSocks/Type/Bootstrap/Option.hs
@@ -4,10 +4,10 @@
 module Network.MoeSocks.Type.Bootstrap.Option where
 
 import Control.Lens
-import Data.Aeson
+import Data.Aeson (Value)
 import Data.Text (Text)
-import Network.MoeSocks.Type.Common
-import System.Log.Logger
+import Network.MoeSocks.Type.Common (Forward)
+import System.Log.Logger (Priority)
 
 data RunningMode = RemoteMode | LocalMode | DebugMode
       deriving (Show, Eq)
diff --git a/src/Network/MoeSocks/Type/Runtime.hs b/src/Network/MoeSocks/Type/Runtime.hs
--- a/src/Network/MoeSocks/Type/Runtime.hs
+++ b/src/Network/MoeSocks/Type/Runtime.hs
@@ -3,17 +3,17 @@
 
 module Network.MoeSocks.Type.Runtime where
 
-import Control.Lens
-import Control.Monad.Except
-import Data.ByteString (ByteString)
-import Data.Text (Text)
-import Data.Text.Lens
-import Data.Word
-import Data.IP
-import Network.MoeSocks.Type.Common
-import Numeric (showHex)
+import           Control.Lens
+import           Control.Monad.Except
+import           Data.ByteString (ByteString)
+import           Data.IP
 import qualified Data.List as L
 import qualified Data.Strict as S
+import           Data.Text (Text)
+import           Data.Text.Lens
+import           Data.Word (Word8, Word16)
+import           Network.MoeSocks.Type.Common
+import           Numeric (showHex)
 
 data ClientGreeting = ClientGreeting
   {
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
@@ -2,22 +2,29 @@
 
 module Network.MoeSocks.UDP where
 
-import Control.Exception
-import Control.Lens
-import Control.Monad
-import Control.Monad.Writer hiding (listen)
-import Data.Attoparsec.ByteString
-import Data.ByteString (ByteString)
-import Data.Text (Text)
-import Network.MoeSocks.BuilderAndParser
-import Network.MoeSocks.Common
-import Network.MoeSocks.Helper
-import Network.MoeSocks.Type
-import Network.Socket hiding (send, recv, recvFrom, sendTo)
-import Network.Socket.ByteString
-import Prelude hiding ((-), take)
+import           Control.Exception (throwIO)
+import           Control.Lens
+import           Control.Monad (when)
+import           Data.Monoid ((<>))
+import           Data.Attoparsec.ByteString (IResult(Done), parse)
+import           Data.ByteString (ByteString)
 import qualified Data.ByteString as S
 import qualified Data.Strict as S
+import           Data.Text (Text)
+import           Network.Socket (Socket, SockAddr)
+import           Network.Socket (connect, SocketType(Datagram))
+import           Network.Socket.ByteString (sendAllTo)
+
+import           Network.MoeSocks.BuilderAndParser (shadowSocksRequestParser)
+import           Network.MoeSocks.BuilderAndParser (shadowSocksRequestBuilder)
+import           Network.MoeSocks.BuilderAndParser (sockAddr_To_Pair)
+import           Network.MoeSocks.Common (withChecked_IP_List, showRelay, initTarget, getIPLists)
+import           Network.MoeSocks.Type
+
+import           Network.MoeSocks.Helper ((-), recv_UDP, info_, debug_, send_)
+import           Network.MoeSocks.Helper (logSA, getSocket, ParseException(ParseException))
+import           Network.MoeSocks.Helper (builder_To_ByteString)
+import           Prelude hiding ((-), take)
 
 
 buildShadowSocksRequest :: ClientRequest -> ByteString -> ByteString
