diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+0.1.0.16
+--------
+
+* Add compatibility with shadowsocks for UDP port forwarding
+
 0.1.0.15
 --------
 * Add UDP port forwarding
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.15
+version:            0.1.0.16
 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
@@ -4,7 +4,6 @@
 module Network.MoeSocks.App where
 
 import Control.Concurrent
-import Control.Exception
 import Control.Lens
 import Control.Monad
 import Control.Monad.Except
@@ -16,7 +15,6 @@
 import Data.Text (Text)
 import Data.Text.Lens
 import Data.Text.Strict.Lens (utf8)
-import Network.MoeSocks.BuilderAndParser
 import Network.MoeSocks.Config
 import Network.MoeSocks.Constant
 import Network.MoeSocks.Helper
@@ -37,39 +35,7 @@
 import qualified System.IO as IO
 import qualified System.Log.Handler as LogHandler
 
-processLocalSocks5Request :: Socket -> IO (ClientRequest, ByteString)
-processLocalSocks5Request aSocket = do
-  (_partialBytesAfterGreeting, r) <- 
-      parseSocket "clientGreeting" mempty pure greetingParser aSocket
 
-  when (not - _No_authentication `elem` (r ^. authenticationMethods)) - 
-    throwIO - ParseException
-               "Client does not support no authentication method"
-
-  send_ aSocket - builder_To_ByteString greetingReplyBuilder 
-
-  (_partialBytesAfterClientRequest, _clientRequest) <- parseSocket 
-                                "clientRequest" 
-                                _partialBytesAfterGreeting
-                                pure
-                                connectionParser
-                                aSocket
-
-
-  pure - (_clientRequest, _partialBytesAfterClientRequest)
-
-localSocks5RequestHandler :: MoeConfig -> ByteString -> (Socket, SockAddr) 
-                                                                    -> IO ()
-localSocks5RequestHandler aConfig _ (aSocket,_) = do
-  _r <- processLocalSocks5Request aSocket 
-  localTCPRequestHandler aConfig _r True aSocket
-
-
-
-
-
-
-
 parseConfig :: Text -> MoeMonadT MoeConfig
 parseConfig aFilePath = do
   _configFile <- io - TIO.readFile - aFilePath ^. _Text
@@ -187,7 +153,7 @@
   updateGlobalLogger "moe" - addHandler formattedHandler
   updateGlobalLogger "moe" - setLevel aLevel
 
-data AppType = TCPApp | UDPApp 
+data AppType = TCP_App | UDP_App 
   deriving (Show, Eq)
 
 moeApp:: MoeMonadT ()
@@ -219,12 +185,11 @@
         logSA "L loop" (pure s) - \(_localSocket, _localAddr) -> do
           _say - "L " <> aID <> ": nyaa!"
             
-
+          setSocketOption _localSocket ReuseAddr 1
+          bindSocket _localSocket _localAddr
+          
           case aAppType of
-            TCPApp -> do
-              setSocketOption _localSocket ReuseAddr 1
-              bindSocket _localSocket _localAddr
-              
+            TCP_App -> do
               listen _localSocket maxListenQueue
 
               let handleLocal _socket = do
@@ -239,10 +204,7 @@
 
               forever - handleLocal _localSocket
 
-            UDPApp -> do
-              setSocketOption _localSocket ReuseAddr 1
-              bindSocket _localSocket _localAddr
-
+            UDP_App -> do
               let handleLocal = do
                     (_msg, _sockAddr) <- 
                         recvFrom _localSocket _ReceiveLength
@@ -254,15 +216,12 @@
                     forkIO - catchExceptAsyncLog "L UDP thread" - 
                                 aHandler _msg _s
 
-
-
-
               forever handleLocal
               
 
   let localSocks5App :: (Socket, SockAddr) -> IO ()
-      localSocks5App = localAppBuilder TCPApp "socks5" - 
-                            localSocks5RequestHandler _config
+      localSocks5App = localAppBuilder TCP_App "socks5" - 
+                            local_Socks5_RequestHandler _config
 
       showForwarding :: Forward -> String
       showForwarding (Forward _localPort _remoteHost _remotePort) =
@@ -274,21 +233,23 @@
                       <> show _remotePort
                       <> "]"
 
-      forwardTCPApp :: Forward -> (Socket, SockAddr) 
+      forward_TCP_App :: Forward -> (Socket, SockAddr) 
                                 -> IO ()
-      forwardTCPApp _f _s = do
+      forward_TCP_App _f _s = do
         let _m = showForwarding _f
-        localAppBuilder TCPApp  ("TCP forwarding " <> _m)
-                                (forwardTCPRequestHandler _config _f) _s
+        localAppBuilder TCP_App  ("TCP forwarding " <> _m)
+                                (local_TCP_ForwardRequestHandler _config _f) 
+                                _s
 
-      forwardUDPApp :: Forward -> (Socket, SockAddr) -> IO ()
-      forwardUDPApp _f _s = do
+      forward_UDP_App :: Forward -> (Socket, SockAddr) -> IO ()
+      forward_UDP_App _f _s = do
         let _m = showForwarding _f 
-        localAppBuilder UDPApp  ("UDP forwarding " <> _m)
-                                (forwardUDPRequestHandler _config _f) _s
+        localAppBuilder UDP_App  ("UDP forwarding " <> _m)
+                                (local_UDP_ForwardRequestHandler _config _f) 
+                                _s
       
-  let remoteTCPApp :: (Socket, SockAddr) -> IO ()
-      remoteTCPApp s = logSA "R loop" (pure s) -
+  let remote_TCP_App :: (Socket, SockAddr) -> IO ()
+      remote_TCP_App s = logSA "R loop" (pure s) -
         \(_remoteSocket, _remoteAddr) -> do
           _say "R TCP: nyaa!"
 
@@ -307,12 +268,12 @@
                 
                 forkIO - catchExceptAsyncLog "R thread" - 
                             logSocket "R remote socket" (pure _newSocket) -
-                              remoteTCPRequestHandler _config 
+                              remote_TCP_RequestHandler _config 
 
           forever - handleRemote _remoteSocket
 
-  let remoteUDPApp :: (Socket, SockAddr) -> IO ()
-      remoteUDPApp s = logSA "R loop" (pure s) -
+  let remote_UDP_App :: (Socket, SockAddr) -> IO ()
+      remote_UDP_App s = logSA "R loop" (pure s) -
         \(_remoteSocket, _remoteAddr) -> do
           _say "R UDP: nyaa!"
 
@@ -328,7 +289,7 @@
 
 
                 forkIO - catchExceptAsyncLog "R thread" - 
-                            remoteUDPRequestHandler _config _msg _s
+                            remote_UDP_RequestHandler _config _msg _s
 
                 
 
@@ -338,42 +299,42 @@
   let 
       remoteRun :: IO ()
       remoteRun = do
-        let _TCPApp = foreverRun - catchExceptAsyncLog "R TCP app" - do
+        let __TCP_App = foreverRun - catchExceptAsyncLog "R TCP app" - do
               getSocket (_c ^. remote) (_c ^. remotePort) Stream
-                >>= remoteTCPApp 
+                >>= remote_TCP_App 
 
-        let _UDPApp = foreverRun - catchExceptAsyncLog "R UDP app" - do
+        let __UDP_App = foreverRun - catchExceptAsyncLog "R UDP app" - do
               getSocket (_c ^. remote) (_c ^. remotePort) Datagram
-                >>= remoteUDPApp 
+                >>= remote_UDP_App 
 
-        waitBoth _TCPApp _UDPApp
+        waitBoth __TCP_App __UDP_App
 
           
         
       localRun :: IO ()
       localRun = do
-        let _forwardTCPApps = do
+        let _forward_TCP_Apps = do
               forM_ (_options ^. forwardTCP) - \forwarding -> forkIO - do
                   foreverRun - catchExceptAsyncLog "L TCPForwarding app" - do
                     getSocket (_c ^. local) 
                       (forwarding ^. forwardLocalPort) 
                       Stream
-                    >>= forwardTCPApp forwarding
+                    >>= forward_TCP_App forwarding
           
-        let _forwardUDPApps = do
+        let _forward_UDP_Apps = do
               forM_ (_options ^. forwardUDP) - \forwarding -> forkIO - do
                   foreverRun - catchExceptAsyncLog "L UDPForwarding app" - do
                     getSocket (_c ^. local) 
                       (forwarding ^. forwardLocalPort) 
                       Datagram
-                    >>= forwardUDPApp forwarding
+                    >>= forward_UDP_App forwarding
         
         let _socks5App = foreverRun - catchExceptAsyncLog "L socks5 app" - do
               getSocket (_c ^. local) (_c ^. localPort) Stream
                 >>= localSocks5App 
 
-        _forwardTCPApps
-        _forwardUDPApps
+        _forward_TCP_Apps
+        _forward_UDP_Apps
         _socks5App
 
       debugRun :: IO ()
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
@@ -29,5 +29,5 @@
   , _configFile = ""
   , _verbosity = DEBUG
   , _forwardTCP = []
-  , _forwardUDP = pure (Forward 5301 "localhost" 53)
+  , _forwardUDP = []
   } 
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
@@ -20,6 +20,7 @@
 import Data.Monoid
 import Data.Text (Text)
 import Data.Text.Lens
+import Data.Time.Clock
 import Network.Socket hiding (send, recv)
 import Network.Socket.ByteString
 import Prelude hiding (take, (-)) 
@@ -30,8 +31,6 @@
 import qualified Data.ByteString as S
 import qualified Data.ByteString.Builder as B
 import qualified Data.ByteString.Lazy as LB
-
-import Data.Time.Clock
 
 -- BEGIN backports
 
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
@@ -50,7 +50,8 @@
 
   let _forwardTCP :: O.Parser String
       _forwardTCP = ( strOption -
-                          short 'L'
+                          short 'T'
+                      <>  long "tcp"
                       <>  metavar "port:host:hostport"
                       <>  help (""
                                 <> "Specify that the given TCP port on the "
@@ -66,7 +67,7 @@
       _forwardUDP :: O.Parser String
       _forwardUDP = ( strOption -
                           short 'U'
-                      <>  long "LUDP"
+                      <>  long "udp"
                       <>  metavar "port:host:hostport"
                       <>  help (""
                                 <> "Specify that the given UDP port on the "
@@ -122,6 +123,6 @@
 opts = info (helper <*> optionParser) - 
         fullDesc
     <>  progDesc "A socks5 proxy using the client / server architecture"
-    <>  header "moesocks - moe for all"
+    <>  header "A functional firewall killer"
 
 
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
@@ -10,31 +10,56 @@
 import Control.Monad.Writer hiding (listen)
 import Data.ByteString (ByteString)
 import Network.MoeSocks.BuilderAndParser
-import Network.MoeSocks.Helper
 import Network.MoeSocks.Common
+import Network.MoeSocks.Constant
+import Network.MoeSocks.Helper
 import Network.MoeSocks.Type
 import Network.Socket hiding (send, recv, recvFrom, sendTo)
 import Prelude hiding ((-), take)
 import qualified Data.List as L
 
 
-forwardTCPRequestHandler :: MoeConfig -> Forward -> 
+local_Socks5_RequestHandler :: MoeConfig -> ByteString -> (Socket, SockAddr) 
+                                                                    -> IO ()
+local_Socks5_RequestHandler aConfig _ (aSocket,_) = do
+  (_partialBytesAfterGreeting, _r) <- 
+      parseSocket "clientGreeting" mempty pure greetingParser aSocket
+
+  when (not - _No_authentication `elem` (_r ^. authenticationMethods)) - 
+    throwIO - ParseException
+               "Client does not support no authentication method"
+
+  send_ aSocket - builder_To_ByteString greetingReplyBuilder 
+
+  _parsedRequest <- parseSocket 
+                                "clientRequest" 
+                                _partialBytesAfterGreeting
+                                pure
+                                connectionParser
+                                aSocket
+
+  local_TCP_RequestHandler aConfig _parsedRequest True aSocket
+
+
+
+local_TCP_ForwardRequestHandler :: MoeConfig -> Forward -> 
                                   ByteString -> (Socket, SockAddr) -> IO ()
-forwardTCPRequestHandler aConfig aForwarding _ (aSocket,_) = do
+local_TCP_ForwardRequestHandler aConfig aForwarding _ (aSocket,_) = do
   let _clientRequest = ClientRequest
                           TCP_IP_stream_connection
                           (Domain_name - aForwarding ^. 
                             forwardRemoteHost)
                           (aForwarding ^. forwardRemotePort)
               
-  localTCPRequestHandler aConfig (_clientRequest, mempty) False aSocket
+  local_TCP_RequestHandler aConfig (mempty, _clientRequest) False aSocket
 
 
 
-localTCPRequestHandler :: MoeConfig -> (ClientRequest, ByteString) -> 
+local_TCP_RequestHandler :: MoeConfig -> (ByteString, ClientRequest) -> 
                         Bool -> Socket -> IO ()
-localTCPRequestHandler aConfig (_clientRequest, _partialBytesAfterClientRequest) 
-                    shouldReplyClient aSocket = do
+local_TCP_RequestHandler aConfig 
+                        (_partialBytesAfterClientRequest, _clientRequest) 
+                        shouldReplyClient aSocket = do
   let 
       _c = aConfig 
       _initSocket = 
@@ -110,7 +135,7 @@
                 finally
                   (
                     connectMarket (Just - _logId "L --> +", _produce)
-                                      (Just - _logId "L --> -", _consume)
+                                  (Just - _logId "L --> -", _consume)
                   ) -
                   pure ()
 
@@ -131,7 +156,7 @@
                 finally 
                   (
                     connectMarket (Just - _logId "L <-- +", _produce)
-                                      (Just - _logId "L <-- -", _consume)
+                                  (Just - _logId "L <-- -", _consume)
                   ) -
                   pure ()
 
@@ -143,8 +168,8 @@
     handleLocal _remoteSocket
 
 
-remoteTCPRequestHandler:: MoeConfig -> Socket -> IO ()
-remoteTCPRequestHandler aConfig aSocket = do
+remote_TCP_RequestHandler:: MoeConfig -> Socket -> IO ()
+remote_TCP_RequestHandler aConfig aSocket = do
   (_encrypt, _decrypt) <- getCipher
                             (aConfig ^. method)
                             (aConfig ^. password)
@@ -212,7 +237,7 @@
                 finally
                   (
                     connectMarket (Just - _logId "R --> +", _produce)
-                                      (Just - _logId "R --> -", _consume)
+                                  (Just - _logId "R --> -", _consume)
                   ) -
                   pure ()
 
@@ -236,7 +261,7 @@
                 finally 
                   (
                     connectMarket (Just - _logId "R <-- +", _produce)
-                                      (Just - _logId "R <-- -", _consume)
+                                  (Just - _logId "R <-- -", _consume)
                   ) -
                   pure ()
 
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
@@ -18,11 +18,23 @@
 import Prelude hiding ((-), take)
 
 
+buildShadowSocksRequest :: ClientRequest -> ByteString -> ByteString
+buildShadowSocksRequest aClientRequest aMessage =
+  let _header = shadowSocksRequestBuilder aClientRequest
+  in  
+  builder_To_ByteString _header <> aMessage
 
+parseShadowSocksRequest :: ByteString -> IO (ByteString, ClientRequest)
+parseShadowSocksRequest aMessage =
+  case parse (shadowSocksRequestParser UDP_port) aMessage of
+    Done _i _r -> pure (_i, _r)
+    _ -> throwIO - ParseException -
+            "R Failed to parse UDP request"
 
-forwardUDPRequestHandler :: MoeConfig -> Forward -> 
+
+local_UDP_ForwardRequestHandler :: MoeConfig -> Forward -> 
                                   ByteString -> (Socket,SockAddr) -> IO ()
-forwardUDPRequestHandler aConfig aForwarding aMessage 
+local_UDP_ForwardRequestHandler aConfig aForwarding aMessage 
                                                     (aSocket, aSockAddr) = do
 
   let _c = aConfig
@@ -47,25 +59,22 @@
 
       {-let (_encrypt, _decrypt) = (pure, pure)-}
 
-      let 
-          _header = shadowSocksRequestBuilder _clientRequest
-      
-      
-      let _msg = builder_To_ByteString _header <> aMessage
+      let _msg = buildShadowSocksRequest _clientRequest aMessage
 
       puts - "L UDP: " <> show _msg
       
       send_ _remoteSocket =<< _encrypt _msg
 
-      _r <- recv_ _remoteSocket >>= _decrypt
+      (_r, _) <- recv_ _remoteSocket >>= _decrypt >>= parseShadowSocksRequest
 
       puts - "L UDP <--: " <> show _r
       when (_r & isn't _Empty) - do
         sendAllTo aSocket _r aSockAddr
 
-remoteUDPRequestHandler:: MoeConfig -> ByteString -> (Socket, SockAddr) 
+
+remote_UDP_RequestHandler:: MoeConfig -> ByteString -> (Socket, SockAddr) 
                                                                       -> IO ()
-remoteUDPRequestHandler aConfig aMessage (aSocket, aSockAddr) = do
+remote_UDP_RequestHandler aConfig aMessage (aSocket, aSockAddr) = do
   (_encrypt, _decrypt) <- getCipher
                             (aConfig ^. method)
                             (aConfig ^. password)
@@ -75,11 +84,7 @@
   
   _msg <- _decrypt aMessage
 
-  (_decryptedMessage, _clientRequest) <-
-    case parse (shadowSocksRequestParser UDP_port) _msg of
-      Done _i _r -> pure (_i, _r)
-      _ -> throwIO - ParseException -
-            "R Failed to parse UDP request"
+  (_decryptedMessage, _clientRequest) <- parseShadowSocksRequest _msg
   
   puts - "R UDP: " <> show _clientRequest
   puts - "R UDP: " <> show _decryptedMessage
@@ -93,7 +98,7 @@
     
     send_ _clientSocket _decryptedMessage
 
-    _r <- recv_ _clientSocket
+    _r <- buildShadowSocksRequest _clientRequest <$> recv_ _clientSocket
 
     puts - "R UDP <--: " <> show _r
 
